From 0732628bf7c3e1fafb36d75f1997a8a5b33500a9 Mon Sep 17 00:00:00 2001 From: Rick Yiu Date: Tue, 28 Aug 2018 14:06:46 +0800 Subject: [PATCH 01/12] Add null check for vrManager If VrManagerService is not started, vrManager will be null. Need add check for it. Test: robotests Bug: 116427118 Change-Id: I899337bb5a996efffe82970fa690f2c5d59c1bb5 Merged-In: I899337bb5a996efffe82970fa690f2c5d59c1bb5 --- .../BrightnessLevelPreferenceController.java | 18 +++++++++++++----- ...rightnessLevelPreferenceControllerTest.java | 6 ++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/display/BrightnessLevelPreferenceController.java b/src/com/android/settings/display/BrightnessLevelPreferenceController.java index 4bb0a99b7ff..f45bde6ffbd 100644 --- a/src/com/android/settings/display/BrightnessLevelPreferenceController.java +++ b/src/com/android/settings/display/BrightnessLevelPreferenceController.java @@ -150,13 +150,21 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr return (value - min) / (max - min); } + @VisibleForTesting + IVrManager safeGetVrManager() { + return IVrManager.Stub.asInterface(ServiceManager.getService( + Context.VR_SERVICE)); + } + @VisibleForTesting boolean isInVrMode() { - try { - return IVrManager.Stub.asInterface(ServiceManager.getService(Context.VR_SERVICE)) - .getVrModeState(); - } catch (RemoteException e) { - Log.e(TAG, "Failed to check vr mode!", e); + IVrManager vrManager = safeGetVrManager(); + if (vrManager != null) { + try { + return vrManager.getVrModeState(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to check vr mode!", e); + } } return false; } diff --git a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java index e29ded0ee30..ee20d57d5e0 100644 --- a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java @@ -81,6 +81,12 @@ public class BrightnessLevelPreferenceControllerTest { assertThat(mController.isAvailable()).isTrue(); } + @Test + public void isInVrMode_noVrManager_shouldAlwaysReturnFalse() { + doReturn(null).when(mController).safeGetVrManager(); + assertThat(mController.isInVrMode()).isFalse(); + } + @Test public void onStart_shouldRegisterObserver() { BrightnessLevelPreferenceController controller = From a8192e1cb842fc43a4004964de2f212184e4cf49 Mon Sep 17 00:00:00 2001 From: Adam He Date: Tue, 25 Sep 2018 11:34:19 -0700 Subject: [PATCH 02/12] Use AFM.getAutofillServiceComponentName() in Settings's AutofillPickerTrampolineActivity Fixes: 80189659 Test: m -j Settings && adb sync && adb shell kill `pid com.android.settings` && adb shell am start com.android.settings Change-Id: I3dc4ebd1a8ffb26b131905c3fc4ed59567049925 --- .../AutofillPickerTrampolineActivity.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/applications/autofill/AutofillPickerTrampolineActivity.java b/src/com/android/settings/applications/autofill/AutofillPickerTrampolineActivity.java index 9500fd5ae34..ee58bfea799 100644 --- a/src/com/android/settings/applications/autofill/AutofillPickerTrampolineActivity.java +++ b/src/com/android/settings/applications/autofill/AutofillPickerTrampolineActivity.java @@ -14,9 +14,9 @@ package com.android.settings.applications.autofill; import android.app.Activity; +import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; -import android.os.UserHandle; import android.view.autofill.AutofillManager; import com.android.settings.applications.defaultapps.DefaultAutofillPicker; @@ -34,23 +34,23 @@ public class AutofillPickerTrampolineActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // First check if the current user's service already belongs to the app... - final Intent intent = getIntent(); - final String packageName = intent.getData().getSchemeSpecificPart(); - final String currentService = DefaultAutofillPicker.getDefaultKey( - this, UserHandle.myUserId()); - if (currentService != null && currentService.startsWith(packageName)) { - // ...and succeed right away if it does. - setResult(RESULT_OK); + final AutofillManager afm = getSystemService(AutofillManager.class); + + // First check if the Autofill is available for the current user... + if (afm == null || !afm.hasAutofillFeature() || !afm.isAutofillSupported()) { + // ... and fail right away if it is not. + setResult(RESULT_CANCELED); finish(); return; } - // Then check if the Autofill is available for the current user... - final AutofillManager afm = getSystemService(AutofillManager.class); - if (afm == null || !afm.hasAutofillFeature() || !afm.isAutofillSupported()) { - // ... and fail right away if it is not. - setResult(RESULT_CANCELED); + // Then check if the current user's service already belongs to the app... + final Intent intent = getIntent(); + final String packageName = intent.getData().getSchemeSpecificPart(); + final ComponentName currentService = afm.getAutofillServiceComponentName(); + if (currentService != null && currentService.getPackageName().equals(packageName)) { + // ...and succeed right away if it does. + setResult(RESULT_OK); finish(); return; } From 24aea5dae55c318218468d28b1ca79e27bfac54a Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Mon, 8 Oct 2018 19:29:03 -0700 Subject: [PATCH 03/12] Remove hacks to access framework private resources ag/5200295 now allows framework private resources to be resolved. Test: atest RunSettingsRoboTests Change-Id: Idaf2144bea6d3b44ec133e48d89e6674256b4cbe --- .../shadow/SettingsShadowResources.java | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java index a68c5d38bac..bd21cdc3cb3 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java @@ -30,18 +30,12 @@ import org.robolectric.android.XmlResourceParserImpl; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.annotation.RealObject; -import org.robolectric.res.StyleData; -import org.robolectric.res.StyleResolver; -import org.robolectric.res.ThemeStyleSet; import org.robolectric.shadows.ShadowAssetManager; import org.robolectric.shadows.ShadowResources; import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers.ClassParameter; import org.w3c.dom.Node; -import java.util.List; -import java.util.Map; - /** * Shadow Resources and Theme classes to handle resource references that Robolectric shadows cannot * handle because they are too new or private. @@ -207,46 +201,10 @@ public class SettingsShadowResources extends ShadowResources { if (attributeValue.contains("attr/fingerprint_layout_theme")) { // Workaround for https://github.com/robolectric/robolectric/issues/2641 node.setNodeValue("@style/FingerprintLayoutTheme"); - } else if (attributeValue.startsWith("@*android:string")) { - node.setNodeValue("PLACEHOLDER"); - } else if (attributeValue.startsWith("@*android:dimen")) { - node.setNodeValue("321dp"); - } else if (attributeValue.startsWith("@*android:drawable")) { - node.setNodeValue(""); } } } } - - // Track down all styles and remove all inheritance from private styles. - final Map appliedStylesList = - ReflectionHelpers.getField(mAssetManager, "nativeThemes"); - synchronized (appliedStylesList) { - for (Long idx : appliedStylesList.keySet()) { - final ThemeStyleSet appliedStyles = ReflectionHelpers.getField( - appliedStylesList.get(idx), "themeStyleSet"); - // The Object's below are actually ShadowAssetManager.OverlayedStyle. - // We can't use - - // it here because it's private. - final List overlayedStyles = - ReflectionHelpers.getField(appliedStyles, "styles"); - for (Object appliedStyle : overlayedStyles) { - final StyleResolver styleResolver = ReflectionHelpers.getField(appliedStyle, - "style"); - final List styleDatas = - ReflectionHelpers.getField(styleResolver, "styles"); - for (StyleData styleData : styleDatas) { - if (styleData.getParent() != null && - styleData.getParent().startsWith("@*android:style")) { - ReflectionHelpers.setField(StyleData.class, styleData, "parent", - null); - } - } - } - - } - } return super.obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes); } From fdf06e242abf774da3dfab6b11cb1d3dfccaea07 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Tue, 9 Oct 2018 23:25:44 +0800 Subject: [PATCH 04/12] Remove mocked resources from slice test cases Clean up some resources which are useless for the moment. Bug: 117485451 Test: robotests Change-Id: Id3591178791cc6c9f628a99a8916e9007a399728 --- .../settings/bluetooth/BluetoothSliceBuilderTest.java | 10 +--------- .../flashlight/FlashlightSliceBuilderTest.java | 8 -------- .../homepage/deviceinfo/DataUsageSliceTest.java | 7 ------- .../settings/location/LocationSliceBuilderTest.java | 8 -------- .../mobilenetwork/Enhanced4gLteSliceHelperTest.java | 7 ------- .../settings/notification/ZenModeSliceBuilderTest.java | 8 -------- .../android/settings/slices/SliceBuilderUtilsTest.java | 7 ------- .../src/com/android/settings/wifi/WifiSliceTest.java | 8 -------- .../wifi/calling/WifiCallingSliceHelperTest.java | 7 ------- 9 files changed, 1 insertion(+), 69 deletions(-) diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothSliceBuilderTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothSliceBuilderTest.java index bfbdd7f78a4..faab3bd39a3 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothSliceBuilderTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothSliceBuilderTest.java @@ -19,14 +19,11 @@ package com.android.settings.bluetooth; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; @@ -61,11 +58,6 @@ public class BluetoothSliceBuilderTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); } @@ -98,4 +90,4 @@ public class BluetoothSliceBuilderTest { assertThat(adapter.isEnabled()).isTrue(); } -} \ No newline at end of file +} diff --git a/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceBuilderTest.java b/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceBuilderTest.java index 07296e652c5..6bea0312a71 100644 --- a/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceBuilderTest.java +++ b/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceBuilderTest.java @@ -19,12 +19,9 @@ package com.android.settings.flashlight; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.content.Context; -import android.content.res.Resources; import android.provider.Settings; import androidx.slice.Slice; @@ -55,11 +52,6 @@ public class FlashlightSliceBuilderTest { public void setUp() { mContext = spy(RuntimeEnvironment.application); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); } diff --git a/tests/robotests/src/com/android/settings/homepage/deviceinfo/DataUsageSliceTest.java b/tests/robotests/src/com/android/settings/homepage/deviceinfo/DataUsageSliceTest.java index c03070c5363..c0af3d811dc 100644 --- a/tests/robotests/src/com/android/settings/homepage/deviceinfo/DataUsageSliceTest.java +++ b/tests/robotests/src/com/android/settings/homepage/deviceinfo/DataUsageSliceTest.java @@ -19,12 +19,10 @@ package com.android.settings.homepage.deviceinfo; 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 android.content.Context; -import android.content.res.Resources; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; @@ -60,11 +58,6 @@ public class DataUsageSliceTest { public void setUp() { mContext = spy(RuntimeEnvironment.application); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); diff --git a/tests/robotests/src/com/android/settings/location/LocationSliceBuilderTest.java b/tests/robotests/src/com/android/settings/location/LocationSliceBuilderTest.java index 65b2e878d6a..90222caf2b1 100644 --- a/tests/robotests/src/com/android/settings/location/LocationSliceBuilderTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationSliceBuilderTest.java @@ -2,12 +2,9 @@ package com.android.settings.location; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.content.Context; -import android.content.res.Resources; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; @@ -37,11 +34,6 @@ public class LocationSliceBuilderTest { public void setUp() { mContext = spy(RuntimeEnvironment.application); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); } diff --git a/tests/robotests/src/com/android/settings/mobilenetwork/Enhanced4gLteSliceHelperTest.java b/tests/robotests/src/com/android/settings/mobilenetwork/Enhanced4gLteSliceHelperTest.java index 6d983816040..1943b3630ac 100644 --- a/tests/robotests/src/com/android/settings/mobilenetwork/Enhanced4gLteSliceHelperTest.java +++ b/tests/robotests/src/com/android/settings/mobilenetwork/Enhanced4gLteSliceHelperTest.java @@ -23,7 +23,6 @@ import static android.app.slice.SliceItem.FORMAT_TEXT; 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; @@ -32,7 +31,6 @@ import static org.mockito.Mockito.when; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; import android.telephony.CarrierConfigManager; import androidx.slice.Slice; @@ -98,11 +96,6 @@ public class Enhanced4gLteSliceHelperTest { //setup for SliceBroadcastReceiver test mReceiver = spy(new SliceBroadcastReceiver()); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - mEnhanced4gLteSliceHelper = new FakeEnhanced4gLteSliceHelper(mContext); // Set-up specs for SliceMetadata. diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeSliceBuilderTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeSliceBuilderTest.java index bfc5c428f05..6c43736b816 100644 --- a/tests/robotests/src/com/android/settings/notification/ZenModeSliceBuilderTest.java +++ b/tests/robotests/src/com/android/settings/notification/ZenModeSliceBuilderTest.java @@ -20,14 +20,11 @@ import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; import android.provider.Settings; import androidx.slice.Slice; @@ -60,11 +57,6 @@ public class ZenModeSliceBuilderTest { public void setUp() { mContext = spy(RuntimeEnvironment.application); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); } diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java index 16e9cb737a5..078186af6c8 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java @@ -18,7 +18,6 @@ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -27,7 +26,6 @@ import static org.mockito.Mockito.verify; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; import android.net.Uri; import android.provider.Settings; import android.provider.SettingsSlicesContract; @@ -85,11 +83,6 @@ public class SliceBuilderUtilsTest { mFeatureFactory = FakeFeatureFactory.setupForTest(); mLoggingArgumentCatpor = ArgumentCaptor.forClass(Pair.class); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); } diff --git a/tests/robotests/src/com/android/settings/wifi/WifiSliceTest.java b/tests/robotests/src/com/android/settings/wifi/WifiSliceTest.java index dda5d8fc8f9..5a2f546236d 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiSliceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiSliceTest.java @@ -19,13 +19,10 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; import android.net.wifi.WifiManager; import androidx.core.graphics.drawable.IconCompat; @@ -58,11 +55,6 @@ public class WifiSliceTest { public void setUp() { mContext = spy(RuntimeEnvironment.application); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java index 7e8771188c7..c5c4b672ca5 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java @@ -23,7 +23,6 @@ import static android.app.slice.SliceItem.FORMAT_TEXT; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -33,7 +32,6 @@ import static org.mockito.Mockito.when; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; import android.telephony.CarrierConfigManager; import androidx.slice.Slice; @@ -104,11 +102,6 @@ public class WifiCallingSliceHelperTest { when(mSlicesFeatureProvider.getCustomSliceManager(any(Context.class))) .thenReturn(manager); - // Prevent crash in SliceMetadata. - Resources resources = spy(mContext.getResources()); - doReturn(60).when(resources).getDimensionPixelSize(anyInt()); - doReturn(resources).when(mContext).getResources(); - mWfcSliceHelper = new FakeWifiCallingSliceHelper(mContext); // Set-up specs for SliceMetadata. From 035ea3b0d14ff22a61a384678eaf53573e4d01ac Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Mon, 8 Oct 2018 10:46:04 -0700 Subject: [PATCH 05/12] Use new RestrictedLockUtils API This is made necessary by changes to the SystemAPI the lib relies on. Test: RunSettingsRoboTests Bug: 116798569 Change-Id: I2812ce9e58e3fb15a5579ddc10cd0edf33d0ed44 --- .../settings/MonitoringCertInfoActivity.java | 9 +++- .../settings/RestrictedSettingsFragment.java | 4 +- .../TrustedCredentialsDialogBuilder.java | 2 +- .../RestrictedDashboardFragment.java | 4 +- .../ActionDisabledByAdminDialog.java | 10 ++++- .../ActionDisabledByAdminDialogHelper.java | 43 ++++++++++++++----- .../bluetooth/BluetoothEnablerTest.java | 4 +- ...ActionDisabledByAdminDialogHelperTest.java | 9 ++-- .../ActionDisabledByAdminDialogTest.java | 4 +- 9 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/com/android/settings/MonitoringCertInfoActivity.java b/src/com/android/settings/MonitoringCertInfoActivity.java index 6785b4be541..eadebc1f4fe 100644 --- a/src/com/android/settings/MonitoringCertInfoActivity.java +++ b/src/com/android/settings/MonitoringCertInfoActivity.java @@ -46,10 +46,17 @@ public class MonitoringCertInfoActivity extends Activity implements OnClickListe mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId()); + final UserHandle user; + if (mUserId == UserHandle.USER_NULL) { + user = null; + } else { + user = UserHandle.of(mUserId); + } + DevicePolicyManager dpm = getSystemService(DevicePolicyManager.class); final int numberOfCertificates = getIntent().getIntExtra( Settings.EXTRA_NUMBER_OF_CERTIFICATES, 1); - final int titleId = RestrictedLockUtils.getProfileOrDeviceOwner(this, mUserId) != null + final int titleId = RestrictedLockUtils.getProfileOrDeviceOwner(this, user) != null ? R.plurals.ssl_ca_cert_settings_button // Check certificate : R.plurals.ssl_ca_cert_dialog_title; // Trust or remove certificate final CharSequence title = getResources().getQuantityText(titleId, numberOfCertificates); diff --git a/src/com/android/settings/RestrictedSettingsFragment.java b/src/com/android/settings/RestrictedSettingsFragment.java index df438d54069..13bc9c51147 100644 --- a/src/com/android/settings/RestrictedSettingsFragment.java +++ b/src/com/android/settings/RestrictedSettingsFragment.java @@ -222,8 +222,8 @@ public abstract class RestrictedSettingsFragment extends SettingsPreferenceFragm public EnforcedAdmin getRestrictionEnforcedAdmin() { mEnforcedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(getActivity(), mRestrictionKey, UserHandle.myUserId()); - if (mEnforcedAdmin != null && mEnforcedAdmin.userId == UserHandle.USER_NULL) { - mEnforcedAdmin.userId = UserHandle.myUserId(); + if (mEnforcedAdmin != null && mEnforcedAdmin.user == null) { + mEnforcedAdmin.user = UserHandle.of(UserHandle.myUserId()); } return mEnforcedAdmin; } diff --git a/src/com/android/settings/TrustedCredentialsDialogBuilder.java b/src/com/android/settings/TrustedCredentialsDialogBuilder.java index 6fd846d0135..806da92099b 100644 --- a/src/com/android/settings/TrustedCredentialsDialogBuilder.java +++ b/src/com/android/settings/TrustedCredentialsDialogBuilder.java @@ -229,7 +229,7 @@ class TrustedCredentialsDialogBuilder extends AlertDialog.Builder { && !mDpm.isCaCertApproved(certHolder.getAlias(), certHolder.getUserId()); final boolean isProfileOrDeviceOwner = RestrictedLockUtils.getProfileOrDeviceOwner( - mActivity, certHolder.getUserId()) != null; + mActivity, UserHandle.of(certHolder.getUserId())) != null; // Show trust button only when it requires consumer user (non-PO/DO) to approve CharSequence displayText = mActivity.getText(!isProfileOrDeviceOwner && mNeedsApproval diff --git a/src/com/android/settings/dashboard/RestrictedDashboardFragment.java b/src/com/android/settings/dashboard/RestrictedDashboardFragment.java index ca30247e2f2..f43445ba5dd 100644 --- a/src/com/android/settings/dashboard/RestrictedDashboardFragment.java +++ b/src/com/android/settings/dashboard/RestrictedDashboardFragment.java @@ -215,8 +215,8 @@ public abstract class RestrictedDashboardFragment extends DashboardFragment { public EnforcedAdmin getRestrictionEnforcedAdmin() { mEnforcedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(getActivity(), mRestrictionKey, UserHandle.myUserId()); - if (mEnforcedAdmin != null && mEnforcedAdmin.userId == UserHandle.USER_NULL) { - mEnforcedAdmin.userId = UserHandle.myUserId(); + if (mEnforcedAdmin != null && mEnforcedAdmin.user == null) { + mEnforcedAdmin.user = UserHandle.of(UserHandle.myUserId()); } return mEnforcedAdmin; } diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialog.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialog.java index 104b216b604..11427661cdb 100644 --- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialog.java +++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialog.java @@ -53,12 +53,18 @@ public class ActionDisabledByAdminDialog extends Activity @androidx.annotation.VisibleForTesting EnforcedAdmin getAdminDetailsFromIntent(Intent intent) { - final EnforcedAdmin admin = new EnforcedAdmin(null, UserHandle.myUserId()); + final EnforcedAdmin admin = new EnforcedAdmin(null, UserHandle.of(UserHandle.myUserId())); if (intent == null) { return admin; } admin.component = intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN); - admin.userId = intent.getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId()); + + int userId = intent.getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId()); + if (userId == UserHandle.USER_NULL) { + admin.user = null; + } else { + admin.user = UserHandle.of(userId); + } return admin; } diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java index ac1939ceed0..f5010f9d5d4 100644 --- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java +++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java @@ -16,6 +16,7 @@ package com.android.settings.enterprise; +import android.annotation.UserIdInt; import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; @@ -60,6 +61,14 @@ public class ActionDisabledByAdminDialogHelper { mActivity = activity; } + private @UserIdInt int getEnforcementAdminUserId() { + if (mEnforcedAdmin.user == null) { + return UserHandle.USER_NULL; + } else { + return mEnforcedAdmin.user.getIdentifier(); + } + } + public AlertDialog.Builder prepareDialogBuilder(String restriction, EnforcedAdmin enforcedAdmin) { mEnforcedAdmin = enforcedAdmin; @@ -68,7 +77,7 @@ public class ActionDisabledByAdminDialogHelper { final AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); mDialogView = (ViewGroup) LayoutInflater.from(builder.getContext()).inflate( R.layout.admin_support_details_dialog, null); - initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId, + initializeDialogViews(mDialogView, mEnforcedAdmin.component, getEnforcementAdminUserId(), mRestriction); return builder .setPositiveButton(R.string.okay, null) @@ -86,7 +95,7 @@ public class ActionDisabledByAdminDialogHelper { } mEnforcedAdmin = admin; mRestriction = restriction; - initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId, + initializeDialogViews(mDialogView, mEnforcedAdmin.component, getEnforcementAdminUserId(), mRestriction); } @@ -108,7 +117,15 @@ public class ActionDisabledByAdminDialogHelper { } setAdminSupportTitle(root, restriction); - setAdminSupportDetails(mActivity, root, new EnforcedAdmin(admin, userId)); + + final UserHandle user; + if (userId == UserHandle.USER_NULL) { + user = null; + } else { + user = UserHandle.of(userId); + } + + setAdminSupportDetails(mActivity, root, new EnforcedAdmin(admin, user)); } @VisibleForTesting @@ -152,20 +169,27 @@ public class ActionDisabledByAdminDialogHelper { if (enforcedAdmin == null || enforcedAdmin.component == null) { return; } + + final int userId; + if (enforcedAdmin.user == null) { + userId = UserHandle.USER_NULL; + } else { + userId = enforcedAdmin.user.getIdentifier(); + } + final DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService( Context.DEVICE_POLICY_SERVICE); if (!RestrictedLockUtilsInternal.isAdminInCurrentUserOrProfile(activity, enforcedAdmin.component) || !RestrictedLockUtils.isCurrentUserOrProfile( - activity, enforcedAdmin.userId)) { + activity, userId)) { enforcedAdmin.component = null; } else { - if (enforcedAdmin.userId == UserHandle.USER_NULL) { - enforcedAdmin.userId = UserHandle.myUserId(); + if (enforcedAdmin.user == null) { + enforcedAdmin.user = UserHandle.of(UserHandle.myUserId()); } CharSequence supportMessage = null; if (UserHandle.isSameApp(Process.myUid(), Process.SYSTEM_UID)) { - supportMessage = dpm.getShortSupportMessageForUser( - enforcedAdmin.component, enforcedAdmin.userId); + supportMessage = dpm.getShortSupportMessageForUser(enforcedAdmin.component, userId); } if (supportMessage != null) { final TextView textView = root.findViewById(R.id.admin_support_msg); @@ -183,8 +207,7 @@ public class ActionDisabledByAdminDialogHelper { enforcedAdmin.component); intent.putExtra(DeviceAdminAdd.EXTRA_CALLED_FROM_SUPPORT_DIALOG, true); // DeviceAdminAdd class may need to run as managed profile. - activity.startActivityAsUser(intent, - new UserHandle(enforcedAdmin.userId)); + activity.startActivityAsUser(intent, enforcedAdmin.user); } else { intent.setClass(activity, Settings.DeviceAdminSettingsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java index 6c78c65c889..fe10d3e28c8 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java @@ -31,6 +31,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.UserHandle; import android.os.UserManager; import android.view.View; @@ -67,7 +68,8 @@ public class BluetoothEnablerTest { @BeforeClass public static void beforeClass() { - sFakeEnforcedAdmin = new EnforcedAdmin(new ComponentName("test.package", "test.Class"), 10); + sFakeEnforcedAdmin = new EnforcedAdmin(new ComponentName("test.package", "test.Class"), + UserHandle.of(10)); } @Mock diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java index 9b138a657a3..0a265a11fe3 100644 --- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java @@ -27,6 +27,7 @@ import android.content.ComponentName; import android.content.Intent; import android.content.pm.UserInfo; import android.os.Process; +import android.os.UserHandle; import android.os.UserManager; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -76,7 +77,7 @@ public class ActionDisabledByAdminDialogHelperTest { final int userId = 123; final ComponentName component = new ComponentName("some.package.name", "some.package.name.SomeClass"); - final EnforcedAdmin admin = new EnforcedAdmin(component, userId); + final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(userId)); mHelper.showAdminPolicies(admin, mActivity); @@ -90,7 +91,7 @@ public class ActionDisabledByAdminDialogHelperTest { @Test public void testShowAdminPoliciesWithoutComponent() { final int userId = 123; - final EnforcedAdmin admin = new EnforcedAdmin(null, userId); + final EnforcedAdmin admin = new EnforcedAdmin(null, UserHandle.of(userId)); mHelper.showAdminPolicies(admin, mActivity); final Intent intent = mActivityShadow.getNextStartedActivity(); assertEquals(intent.getComponent(), new ComponentName(mActivity, @@ -146,7 +147,7 @@ public class ActionDisabledByAdminDialogHelperTest { final ViewGroup view = new FrameLayout(mActivity); final ComponentName component = new ComponentName("some.package.name", "some.package.name.SomeClass"); - final EnforcedAdmin admin = new EnforcedAdmin(component, 123); + final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123)); final TextView textView = new TextView(mActivity); textView.setId(R.id.admin_support_msg); @@ -169,7 +170,7 @@ public class ActionDisabledByAdminDialogHelperTest { final ShadowUserManager userManagerShadow = Shadow.extract(userManager); final ComponentName component = new ComponentName("some.package.name", "some.package.name.SomeClass"); - final EnforcedAdmin admin = new EnforcedAdmin(component, 123); + final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123)); dpmShadow.setShortSupportMessageForUser(component, 123, "some message"); dpmShadow.setIsAdminActiveAsUser(false); diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogTest.java index ebdfad695fb..e016a06990c 100644 --- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogTest.java @@ -43,7 +43,7 @@ public class ActionDisabledByAdminDialogTest { public void testGetAdminDetailsFromIntent() { final int userId = 123; final ComponentName component = new ComponentName("com.some.package", ".SomeClass"); - final EnforcedAdmin expectedAdmin = new EnforcedAdmin(component, userId); + final EnforcedAdmin expectedAdmin = new EnforcedAdmin(component, UserHandle.of(userId)); final Intent intent = new Intent(); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, component); @@ -54,7 +54,7 @@ public class ActionDisabledByAdminDialogTest { @Test public void testGetAdminDetailsFromNullIntent() { final int userId = UserHandle.myUserId(); - final EnforcedAdmin expectedAdmin = new EnforcedAdmin(null, userId); + final EnforcedAdmin expectedAdmin = new EnforcedAdmin(null, UserHandle.of(userId)); Assert.assertEquals(expectedAdmin, mDialog.getAdminDetailsFromIntent(null)); } From fa8ee797601de676883acb56bacfc6d497531879 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 9 Oct 2018 17:48:34 -0700 Subject: [PATCH 06/12] Get the ringtone name in background thread. - to prevent anr, retrieve the current ringtone in background thread. Change-Id: I701adfa618553c03aa24719b2550ea3ee97d9bfa Fixes: 117124470 Test: make RunSettingsRoboTests --- .../notification/RingtonePreferenceControllerBase.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/notification/RingtonePreferenceControllerBase.java b/src/com/android/settings/notification/RingtonePreferenceControllerBase.java index 7d5ebf13347..7b37855c6f7 100644 --- a/src/com/android/settings/notification/RingtonePreferenceControllerBase.java +++ b/src/com/android/settings/notification/RingtonePreferenceControllerBase.java @@ -25,6 +25,7 @@ import androidx.preference.Preference; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.ThreadUtils; public abstract class RingtonePreferenceControllerBase extends AbstractPreferenceController implements PreferenceControllerMixin { @@ -45,11 +46,17 @@ public abstract class RingtonePreferenceControllerBase extends AbstractPreferenc @Override public void updateState(Preference preference) { + ThreadUtils.postOnBackgroundThread(() -> updateSummary(preference)); + } + + private void updateSummary(Preference preference) { Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(mContext, getRingtoneType()); final CharSequence summary = Ringtone.getTitle( mContext, ringtoneUri, false /* followSettingsUri */, true /* allowRemote */); if (summary != null) { - preference.setSummary(summary); + ThreadUtils.postOnMainThread(() -> { + preference.setSummary(summary); + }); } } From 3ce67421a3cbfa3874b33d67d25293464a5deebd Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Wed, 10 Oct 2018 21:06:19 +0800 Subject: [PATCH 07/12] Fix test case error Test: make RunSettingsRoboTest Change-Id: Id8e13cdd13b4a5f21dad5f84be7110ca8cf5282f --- .../android/settings/homepage/CardContentLoaderTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/robotests/src/com/android/settings/homepage/CardContentLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/CardContentLoaderTest.java index 865989d3765..defe0d9f759 100644 --- a/tests/robotests/src/com/android/settings/homepage/CardContentLoaderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/CardContentLoaderTest.java @@ -23,6 +23,7 @@ import android.net.Uri; import com.android.settings.homepage.deviceinfo.DataUsageSlice; import com.android.settings.homepage.deviceinfo.DeviceInfoSlice; +import com.android.settings.homepage.deviceinfo.StorageSlice; import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -56,14 +57,15 @@ public class CardContentLoaderTest { public void createStaticCards_shouldReturnTwoCards() { final List defaultData = mCardContentLoader.createStaticCards(); - assertThat(defaultData).hasSize(2); + assertThat(defaultData).hasSize(3); } @Test public void createStaticCards_shouldContainDataUsageAndDeviceInfo() { final Uri dataUsage = DataUsageSlice.DATA_USAGE_CARD_URI; final Uri deviceInfo = DeviceInfoSlice.DEVICE_INFO_CARD_URI; - final List expectedUris = Arrays.asList(dataUsage, deviceInfo); + final Uri storageInfo = StorageSlice.STORAGE_CARD_URI; + final List expectedUris = Arrays.asList(dataUsage, deviceInfo, storageInfo); final List actualCardUris = mCardContentLoader.createStaticCards().stream().map( ContextualCard::getSliceUri).collect(Collectors.toList()); From 8985efe3b03e79cd54f8e3384d29e582af06c16b Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 9 Oct 2018 16:12:34 -0700 Subject: [PATCH 08/12] Add contextual card proto libraries. Test: rebuild Change-Id: Ifd105a91be4ce3b3ae35766e069d4b4663e54b0f --- Android.mk | 1 + protos/Android.bp | 8 ++++++++ protos/contextual_card_list.proto | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 protos/Android.bp create mode 100644 protos/contextual_card_list.proto diff --git a/Android.mk b/Android.mk index f10b3ec2d08..3610e7774fb 100644 --- a/Android.mk +++ b/Android.mk @@ -41,6 +41,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ androidx.lifecycle_lifecycle-extensions \ guava \ jsr305 \ + settings-contextual-card-protos-lite \ contextualcards \ settings-logtags \ diff --git a/protos/Android.bp b/protos/Android.bp new file mode 100644 index 00000000000..533dbca6564 --- /dev/null +++ b/protos/Android.bp @@ -0,0 +1,8 @@ +java_library_static { + name: "settings-contextual-card-protos-lite", + host_supported: true, + proto: { + type: "lite", + }, + srcs: ["contextual_card_list.proto"], +} \ No newline at end of file diff --git a/protos/contextual_card_list.proto b/protos/contextual_card_list.proto new file mode 100644 index 00000000000..89e6c138640 --- /dev/null +++ b/protos/contextual_card_list.proto @@ -0,0 +1,19 @@ +syntax = "proto2"; + +package com.android.settings.intelligence; +option java_outer_classname = "ContextualCardProto"; + +message ContextualCardList { + repeated ContextualCard card = 1; +} + +message ContextualCard { + // Slice uri of the contextual card + optional string sliceUri = 1; + + // {@link ContextualCardCategory}. + optional int32 category = 2; + + // Name of the card. It should be identical in every app + optional string cardName = 3; +} \ No newline at end of file From 8cd659af19bbc300f4cff23751d6b22cc7831a97 Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Tue, 9 Oct 2018 03:15:04 +0800 Subject: [PATCH 09/12] Use proto in contextualCard object Test: make RunSettingsRoboTests Change-Id: Ic7af69047e33e3b10a993dd9820b4c6ceb23666c --- libs/contextualcards.aar | Bin 5277 -> 2862 bytes .../SettingsContextualCardProvider.java | 23 +++++++++--------- .../SettingsContextualCardProviderTest.java | 13 +++++----- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/libs/contextualcards.aar b/libs/contextualcards.aar index a44a26c38b1f958295cb640c37dfefe21189f583..5e855fa0dec7120b31ca996bd877b25e3dd86ad6 100755 GIT binary patch delta 2312 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 XKNFMR3NQk56O$1O7Y3*k00000bSXgt diff --git a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java index 44705c59522..2dede95e758 100644 --- a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java +++ b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java @@ -21,14 +21,12 @@ import static android.provider.SettingsSlicesContract.KEY_WIFI; import android.annotation.Nullable; import com.android.settings.homepage.deviceinfo.DataUsageSlice; +import com.android.settings.intelligence.ContextualCardProto.ContextualCard; +import com.android.settings.intelligence.ContextualCardProto.ContextualCardList; import com.android.settings.wifi.WifiSlice; -import com.google.android.settings.intelligence.libs.contextualcards.ContextualCard; import com.google.android.settings.intelligence.libs.contextualcards.ContextualCardProvider; -import java.util.ArrayList; -import java.util.List; - /** Provides dynamic card for SettingsIntelligence. */ public class SettingsContextualCardProvider extends ContextualCardProvider { @@ -36,21 +34,22 @@ public class SettingsContextualCardProvider extends ContextualCardProvider { @Override @Nullable - public List getContextualCards() { - final List cards = new ArrayList<>(); + public ContextualCardList getContextualCards() { final ContextualCard wifiCard = - new ContextualCard.Builder() + ContextualCard.newBuilder() .setSliceUri(WifiSlice.WIFI_URI.toString()) - .setName(KEY_WIFI) + .setCardName(KEY_WIFI) .build(); final ContextualCard dataUsageCard = - new ContextualCard.Builder() + ContextualCard.newBuilder() .setSliceUri(DataUsageSlice.DATA_USAGE_CARD_URI.toString()) - .setName(DataUsageSlice.PATH_DATA_USAGE_CARD) + .setCardName(DataUsageSlice.PATH_DATA_USAGE_CARD) .build(); + final ContextualCardList cards = ContextualCardList.newBuilder() + .addCard(wifiCard) + .addCard(dataUsageCard) + .build(); - cards.add(wifiCard); - cards.add(dataUsageCard); return cards; } } diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java index 80d94977607..a80b963c594 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java @@ -24,9 +24,9 @@ import android.content.Context; import android.net.Uri; import android.os.Bundle; +import com.android.settings.intelligence.ContextualCardProto.ContextualCardList; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.google.android.settings.intelligence.libs.contextualcards.ContextualCard; import com.google.android.settings.intelligence.libs.contextualcards.ContextualCardProvider; import org.junit.Before; @@ -34,8 +34,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; -import java.util.ArrayList; - @RunWith(SettingsRobolectricTestRunner.class) public class SettingsContextualCardProviderTest { @@ -54,11 +52,12 @@ public class SettingsContextualCardProviderTest { } @Test - public void contentProviderCall_returnCorrectSize() { + public void contentProviderCall_returnCorrectSize() throws Exception { final Bundle returnValue = mResolver.call(mUri, ContextualCardProvider.METHOD_GET_CARD_LIST, "", null); - final ArrayList cards = - returnValue.getParcelableArrayList(ContextualCardProvider.BUNDLE_CARD_LIST); - assertThat(cards.size()).isEqualTo(2); + final ContextualCardList cards = + ContextualCardList.parseFrom( + returnValue.getByteArray(ContextualCardProvider.BUNDLE_CARD_LIST)); + assertThat(cards.getCardCount()).isEqualTo(2); } } \ No newline at end of file From 2f18df0c6914c26710b34bfdb8530507ee12229c Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 10 Oct 2018 11:16:02 -0700 Subject: [PATCH 10/12] Update strings Change-Id: I3a70d787e6db6743638460195f36386111647e4e Fixes: 117508849 Test: visual --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9843b800259..b52bfea6481 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10088,7 +10088,7 @@ All Settings - Your Settings + Suggestions CBRS Data From c4b40b06697b5fcf71311c28d188f1ac0e5e8b0c Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 9 Oct 2018 17:10:34 -0700 Subject: [PATCH 11/12] Use default network template in billing cycle settings. - if the network template is not set in the bundle arguments, use the default network template for getting the billing data. - change to use ConnectivityManager.from(context) in DataUsageUtils to be consistent with the usage in other methods. Change-Id: I25eb27f8f26d9ecafc66aa2c69806e94c6b63499 Fixes: 117452991 Test: make RunSettingsRoboTests --- .../datausage/BillingCycleSettings.java | 10 +++- .../settings/datausage/DataUsageUtils.java | 3 +- .../datausage/BillingCycleSettingsTest.java | 54 +++++++++++++++++-- ...aUsageSummaryPreferenceControllerTest.java | 2 +- 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java index 2d96fe92092..45997f8efc3 100644 --- a/src/com/android/settings/datausage/BillingCycleSettings.java +++ b/src/com/android/settings/datausage/BillingCycleSettings.java @@ -73,7 +73,8 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements static final String KEY_SET_DATA_LIMIT = "set_data_limit"; private static final String KEY_DATA_LIMIT = "data_limit"; - private NetworkTemplate mNetworkTemplate; + @VisibleForTesting + NetworkTemplate mNetworkTemplate; private Preference mBillingCycle; private Preference mDataWarning; private SwitchPreference mEnableDataWarning; @@ -100,10 +101,15 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements public void onCreate(Bundle icicle) { super.onCreate(icicle); - mDataUsageController = new DataUsageController(getContext()); + final Context context = getContext(); + mDataUsageController = new DataUsageController(context); Bundle args = getArguments(); mNetworkTemplate = args.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE); + if (mNetworkTemplate == null) { + mNetworkTemplate = DataUsageUtils.getDefaultTemplate(context, + DataUsageUtils.getDefaultSubscriptionId(context)); + } mBillingCycle = findPreference(KEY_BILLING_CYCLE); mEnableDataWarning = (SwitchPreference) findPreference(KEY_SET_DATA_WARNING); diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java index 3001d2e3f1e..53565ac803e 100644 --- a/src/com/android/settings/datausage/DataUsageUtils.java +++ b/src/com/android/settings/datausage/DataUsageUtils.java @@ -172,8 +172,7 @@ public final class DataUsageUtils { return SystemProperties.get(TEST_RADIOS_PROP).contains("wifi"); } - ConnectivityManager connectivityManager = - context.getSystemService(ConnectivityManager.class); + final ConnectivityManager connectivityManager = ConnectivityManager.from(context); return connectivityManager != null && connectivityManager.isNetworkSupported(TYPE_WIFI); } diff --git a/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java b/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java index eb5e4911664..1560af3261b 100644 --- a/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java +++ b/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java @@ -16,14 +16,17 @@ package com.android.settings.datausage; import static android.net.NetworkPolicy.CYCLE_NONE; +import static com.google.common.truth.Truth.assertThat; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - +import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyObject; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.nullable; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -32,14 +35,20 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; +import android.content.res.Resources; +import android.net.ConnectivityManager; +import android.net.NetworkPolicyManager; import android.os.Bundle; +import androidx.fragment.app.FragmentActivity; import androidx.preference.Preference; import androidx.preference.PreferenceManager; import androidx.preference.SwitchPreference; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.NetworkPolicyEditor; +import com.android.settingslib.widget.FooterPreference; +import com.android.settingslib.widget.FooterPreferenceMixinCompat; import org.junit.Before; import org.junit.Test; @@ -47,6 +56,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; +import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) public class BillingCycleSettingsTest { @@ -60,6 +70,10 @@ public class BillingCycleSettingsTest { PreferenceManager mMockPreferenceManager; @Mock private NetworkPolicyEditor mNetworkPolicyEditor; + @Mock + private ConnectivityManager mConnectivityManager; + @Mock + private NetworkPolicyManager mNetworkPolicyManager; private Context mContext; @Mock @@ -96,7 +110,8 @@ public class BillingCycleSettingsTest { public void testDataUsageLimit_shouldNotBeSetOnCancel() { mConfirmLimitFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE); - assertFalse(mSharedPreferences.getBoolean(BillingCycleSettings.KEY_SET_DATA_LIMIT, true)); + assertThat(mSharedPreferences.getBoolean(BillingCycleSettings.KEY_SET_DATA_LIMIT, true)) + .isFalse(); verify(mMockBillingCycleSettings, never()).setPolicyLimitBytes(anyLong()); } @@ -104,7 +119,8 @@ public class BillingCycleSettingsTest { public void testDataUsageLimit_shouldBeSetOnConfirmation() { mConfirmLimitFragment.onClick(null, DialogInterface.BUTTON_POSITIVE); - assertTrue(mSharedPreferences.getBoolean(BillingCycleSettings.KEY_SET_DATA_LIMIT, false)); + assertThat(mSharedPreferences.getBoolean(BillingCycleSettings.KEY_SET_DATA_LIMIT, false)) + .isTrue(); verify(mMockBillingCycleSettings).setPolicyLimitBytes(LIMIT_BYTES); } @@ -124,4 +140,32 @@ public class BillingCycleSettingsTest { verify(mBillingCycle).setSummary(null); } + + @Test + public void onCreate_emptyArguments_shouldSetDefaultNetworkTemplate() { + final BillingCycleSettings billingCycleSettings = spy(new BillingCycleSettings()); + when(billingCycleSettings.getContext()).thenReturn(mContext); + when(billingCycleSettings.getArguments()).thenReturn(Bundle.EMPTY); + final FragmentActivity activity = mock(FragmentActivity.class); + when(billingCycleSettings.getActivity()).thenReturn(activity); + final Resources.Theme theme = mContext.getTheme(); + when(activity.getTheme()).thenReturn(theme); + doNothing().when(billingCycleSettings) + .onCreatePreferences(any(Bundle.class), nullable(String.class)); + when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE)) + .thenReturn(mNetworkPolicyManager); + when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)) + .thenReturn(mConnectivityManager); + when(mConnectivityManager.isNetworkSupported(anyInt())).thenReturn(true); + final SwitchPreference preference = mock(SwitchPreference.class); + when(billingCycleSettings.findPreference(anyString())).thenReturn(preference); + final FooterPreferenceMixinCompat footer = mock(FooterPreferenceMixinCompat.class); + ReflectionHelpers.setField(billingCycleSettings, "mFooterPreferenceMixin", footer); + when(footer.createFooterPreference()).thenReturn(mock(FooterPreference.class)); + + billingCycleSettings.onCreate(Bundle.EMPTY); + + assertThat(billingCycleSettings.mNetworkTemplate).isNotNull(); + } + } \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java index 254e4f6f654..517154867c5 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java @@ -121,7 +121,7 @@ public class DataUsageSummaryPreferenceControllerTest { mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get()); when(mActivity.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); - when(mActivity.getSystemService(ConnectivityManager.class)) + when(mActivity.getSystemService(Context.CONNECTIVITY_SERVICE)) .thenReturn(mConnectivityManager); when(mTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_READY); when(mConnectivityManager.isNetworkSupported(TYPE_WIFI)).thenReturn(false); From 3f365a91e9baf3a49ab081dc6a994a0a1cc7e67d Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Wed, 10 Oct 2018 13:43:01 -0700 Subject: [PATCH 12/12] Remove ShadowKeyValueListParser It is not used anymore. Change-Id: I52991f42bc0872fd98809d6d6596f4b85d041d60 Fixes: 38346649 Test: RunSettingsRoboTests --- .../shadow/ShadowKeyValueListParser.java | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParser.java diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParser.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParser.java deleted file mode 100644 index 5dce99096c3..00000000000 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParser.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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.testutils.shadow; - -import android.util.KeyValueListParser; - -import org.robolectric.annotation.Implementation; -import org.robolectric.annotation.Implements; - -/** - * Shadow for {@link KeyValueListParser} so we could implement - * {@link #getBoolean(String, boolean)} that doesn't support in the current - * robolectric - */ -@Implements(KeyValueListParser.class) -public class ShadowKeyValueListParser { - - @Implementation - public boolean getBoolean(String key, boolean defaultValue) { - return defaultValue; - } -}