From ee2f899a8bd6ba324be5da04259fe8d16d97bda2 Mon Sep 17 00:00:00 2001 From: Alexey Kuzmin Date: Mon, 16 Jul 2018 22:37:46 +0100 Subject: [PATCH 1/5] Add a reason field to vibrator service Test: Run vibration test, see reason written to log and trace Bug: 109654229 Change-Id: I5dbe9a5ff666535f02b5606f18438255ec8a50e8 --- .../fingerprint/FingerprintEnrollEnrollingTest.java | 1 + .../android/settings/testutils/shadow/ShadowVibrator.java | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java index bee208fb71b..da91a1dae51 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java @@ -106,6 +106,7 @@ public class FingerprintEnrollEnrollingTest { anyInt(), nullable(String.class), any(VibrationEffect.class), + nullable(String.class), nullable(AudioAttributes.class)); } diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowVibrator.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowVibrator.java index 9046720930e..69e08d5cf08 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowVibrator.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowVibrator.java @@ -50,7 +50,8 @@ public class ShadowVibrator { public final Vibrator delegate = mock(Vibrator.class); @Implementation - public void vibrate(int uid, String opPkg, VibrationEffect vibe, AudioAttributes attributes) { - delegate.vibrate(uid, opPkg, vibe, attributes); + public void vibrate(int uid, String opPkg, VibrationEffect vibe, String reason, + AudioAttributes attributes) { + delegate.vibrate(uid, opPkg, vibe, reason, attributes); } } From c4d473c613fbd850a2cda444f9e00aa2e0abbff8 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 3 Aug 2018 16:05:32 -0400 Subject: [PATCH 2/5] Use CustomDialogPreferenceCompat for ZenDuration Test: ZenModeDurationPreferenceControllerTest Bug: 112041657 Change-Id: I0158a703d26f73512c560889d6549d68230bf98e --- res/xml/zen_mode_settings.xml | 5 +- .../ZenDurationDialogPreference.java | 52 +++++++++++++++++++ .../ZenModeDurationPreferenceController.java | 34 +++--------- .../notification/ZenModeSettings.java | 3 +- ...nModeDurationPreferenceControllerTest.java | 35 ++++--------- 5 files changed, 71 insertions(+), 58 deletions(-) create mode 100644 src/com/android/settings/notification/ZenDurationDialogPreference.java diff --git a/res/xml/zen_mode_settings.xml b/res/xml/zen_mode_settings.xml index 240c4c5fa44..b8af6505b62 100644 --- a/res/xml/zen_mode_settings.xml +++ b/res/xml/zen_mode_settings.xml @@ -56,9 +56,10 @@ android:key="zen_mode_settings_category_schedule" android:title="@string/zen_category_schedule"> - + android:title="@string/zen_mode_duration_settings_title" + android:widgetLayout="@null"/> Date: Fri, 3 Aug 2018 16:53:26 +0800 Subject: [PATCH 3/5] remove unnecessary mock in BluetoothDeviceUpdaterTest Bug: 111848213 Test: make -j50 RunSettingsRoboTests Change-Id: If1c46614ec6e40c66eb121cc48caa1fbc9c39871 --- .../bluetooth/BluetoothDeviceUpdaterTest.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java index a5422e71ceb..9f81711c88c 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java @@ -30,11 +30,8 @@ import com.android.settings.SettingsActivity; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.CachedBluetoothDevice; -import com.android.settingslib.bluetooth.HeadsetProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; -import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import org.junit.Before; import org.junit.Test; @@ -61,12 +58,6 @@ public class BluetoothDeviceUpdaterTest { private SettingsActivity mSettingsActivity; @Mock private LocalBluetoothManager mLocalManager; - @Mock - private LocalBluetoothProfileManager mLocalBluetoothProfileManager; - @Mock - private HeadsetProfile mHeadsetProfile; - @Mock - private A2dpProfile mA2dpProfile; private Context mContext; private BluetoothDeviceUpdater mBluetoothDeviceUpdater; @@ -79,9 +70,6 @@ public class BluetoothDeviceUpdaterTest { mContext = RuntimeEnvironment.application; doReturn(mContext).when(mDashboardFragment).getContext(); when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice); - when(mLocalManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); - when(mLocalBluetoothProfileManager.getHeadsetProfile()).thenReturn(mHeadsetProfile); - when(mLocalBluetoothProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile); mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false); mBluetoothDeviceUpdater = From 58543721f8957460c95147d8602a959e63f5bd05 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 6 Aug 2018 15:23:45 -0700 Subject: [PATCH 4/5] Treat icon color metadata as raw value instead of reference Bug: 79841665 Test: robotests Change-Id: I1216718e45e80a428e8a0edb7b9accf5325be769 --- .../settings/dashboard/DashboardAdapter.java | 26 +++++++++++++------ .../dashboard/DashboardAdapterTest.java | 24 +++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index fc1a129c1bd..72735677db7 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -64,7 +64,7 @@ public class DashboardAdapter extends RecyclerView.Adapter Date: Mon, 6 Aug 2018 16:22:43 -0700 Subject: [PATCH 5/5] Fix profile photo chooser The underlying Dialog API changed when it returns true for isShowing() in a way that broke our profile photo chooser, but it turns out it was an intended change and we were depending on it in a way we shouldn't have been. Instead we'll just keep track of whether we were showing the dialog by using an already existing boolean flag that gets set before we start the photo collection activity. Fixes: 110101157 Test: make -j RunSettingsRoboTests Change-Id: I166230e85142c348b6760e436324261f2a41f1e0 --- .../users/EditUserInfoController.java | 18 ++- .../users/EditUserInfoControllerTest.java | 126 ++++++++++++++++++ 2 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java diff --git a/src/com/android/settings/users/EditUserInfoController.java b/src/com/android/settings/users/EditUserInfoController.java index 604551607a5..2035f669063 100644 --- a/src/com/android/settings/users/EditUserInfoController.java +++ b/src/com/android/settings/users/EditUserInfoController.java @@ -41,6 +41,7 @@ import com.android.settingslib.drawable.CircleFramedDrawable; import java.io.File; import androidx.appcompat.app.AlertDialog; +import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; /** @@ -103,9 +104,8 @@ public class EditUserInfoController { public void onActivityResult(int requestCode, int resultCode, Intent data) { mWaitingForActivityResult = false; - if (mEditUserInfoDialog != null && mEditUserInfoDialog.isShowing() - && mEditUserPhotoController.onActivityResult(requestCode, resultCode, data)) { - return; + if (mEditUserInfoDialog != null) { + mEditUserPhotoController.onActivityResult(requestCode, resultCode, data); } } @@ -115,7 +115,7 @@ public class EditUserInfoController { Activity activity = fragment.getActivity(); mUser = user; if (mUserManager == null) { - mUserManager = UserManager.get(activity); + mUserManager = activity.getSystemService(UserManager.class); } LayoutInflater inflater = activity.getLayoutInflater(); View content = inflater.inflate(R.layout.edit_user_info_dialog_content, null); @@ -136,8 +136,7 @@ public class EditUserInfoController { } } userPhotoView.setImageDrawable(drawable); - mEditUserPhotoController = new EditUserPhotoController(fragment, userPhotoView, - mSavedPhoto, drawable, mWaitingForActivityResult); + mEditUserPhotoController = createEditUserPhotoController(fragment, userPhotoView, drawable); mEditUserInfoDialog = new AlertDialog.Builder(activity) .setTitle(R.string.profile_info_settings_title) .setView(content) @@ -195,4 +194,11 @@ public class EditUserInfoController { return mEditUserInfoDialog; } + + @VisibleForTesting + EditUserPhotoController createEditUserPhotoController(Fragment fragment, + ImageView userPhotoView, Drawable drawable) { + return new EditUserPhotoController(fragment, userPhotoView, + mSavedPhoto, drawable, mWaitingForActivityResult); + } } diff --git a/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java new file mode 100644 index 00000000000..2e205f86a96 --- /dev/null +++ b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java @@ -0,0 +1,126 @@ +/* + * 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.users; + +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.ArgumentMatchers.same; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.UserInfo; +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; + +import com.android.settings.R; +import com.android.settings.testutils.Robolectric; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.ShadowUserManager; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowUserManager.class}) +public class EditUserInfoControllerTest { + @Mock + private Fragment mFragment; + @Mock + private LayoutInflater mInflater; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private UserInfo mUserInfo; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private View mDialogContent; + @Mock + private EditText mUserName; + @Mock + private ImageView mPhotoView; + @Mock + private Drawable mCurrentIcon; + + private ShadowUserManager mUserManager; + private FragmentActivity mActivity; + private TestEditUserInfoController mController; + + public class TestEditUserInfoController extends EditUserInfoController { + private EditUserPhotoController mPhotoController; + + public EditUserPhotoController getPhotoController() { + return mPhotoController; + } + + @Override + protected EditUserPhotoController createEditUserPhotoController(Fragment fragment, + ImageView userPhotoView, Drawable drawable) { + mPhotoController = mock(EditUserPhotoController.class, Answers.RETURNS_DEEP_STUBS); + return mPhotoController; + } + } + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mUserManager = ShadowUserManager.getShadow(); + mUserManager.setUserInfo(0, mUserInfo); + mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get()); + when(mFragment.getActivity()).thenReturn(mActivity); + when(mActivity.getLayoutInflater()).thenReturn(mInflater); + when(mInflater.inflate(eq(R.layout.edit_user_info_dialog_content), any())).thenReturn( + mDialogContent); + when(mDialogContent.findViewById(eq(R.id.user_name))).thenReturn(mUserName); + when(mDialogContent.findViewById(eq(R.id.user_photo))).thenReturn(mPhotoView); + when(mPhotoView.getContext()).thenReturn((Context) mActivity); + mController = new TestEditUserInfoController(); + } + + @After + public void tearDown() { + mUserManager.reset(); + } + + @Test + public void photoControllerOnActivityResult_whenWaiting_isCalled() { + mController.createDialog(mFragment, mCurrentIcon, "test user", + R.string.profile_info_settings_title, null, android.os.Process.myUserHandle()); + mController.startingActivityForResult(); + Intent resultData = new Intent(); + mController.onActivityResult(0, 0, resultData); + EditUserPhotoController photoController = mController.getPhotoController(); + assertThat(photoController).isNotNull(); + verify(photoController).onActivityResult(eq(0), eq(0), same(resultData)); + } +}