diff --git a/res/layout/bluetooth_pin_confirm.xml b/res/layout/bluetooth_pin_confirm.xml
index 28ad1f62920..0024ad42413 100644
--- a/res/layout/bluetooth_pin_confirm.xml
+++ b/res/layout/bluetooth_pin_confirm.xml
@@ -81,6 +81,7 @@
android:id="@+id/phonebook_sharing_message_confirm_pin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:minHeight="@dimen/min_tap_target_size"
android:layout_marginStart="@dimen/bluetooth_dialog_padding"
android:layout_marginEnd="@dimen/bluetooth_dialog_padding"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
diff --git a/res/layout/running_service_details.xml b/res/layout/running_service_details.xml
index 68ddb1c8baa..d544704ac64 100644
--- a/res/layout/running_service_details.xml
+++ b/res/layout/running_service_details.xml
@@ -16,7 +16,7 @@
** limitations under the License.
*/
-->
-
-
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 52b163cadcc..95d995a20b0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5573,6 +5573,10 @@
Vibration & haptics
Control the vibration strength for different usages
+
+ On
+
+ Off
Setting disabled because device is set to silent
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index da21729d72e..012996b878d 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -416,8 +416,11 @@ public class TetherSettings extends RestrictedSettingsFragment
if (usbTethered) {
mUsbTether.setEnabled(!mDataSaverEnabled);
mUsbTether.setChecked(true);
- mUsbTether.setDisabledByAdmin(
- checkIfUsbDataSignalingIsDisabled(mContext, UserHandle.myUserId()));
+ final RestrictedLockUtils.EnforcedAdmin enforcedAdmin =
+ checkIfUsbDataSignalingIsDisabled(mContext, UserHandle.myUserId());
+ if (enforcedAdmin != null) {
+ mUsbTether.setDisabledByAdmin(enforcedAdmin);
+ }
} else {
mUsbTether.setChecked(false);
updateUsbPreference();
diff --git a/src/com/android/settings/accessibility/VibrationPreferenceController.java b/src/com/android/settings/accessibility/VibrationPreferenceController.java
index d1faedd78bb..61606b8f397 100644
--- a/src/com/android/settings/accessibility/VibrationPreferenceController.java
+++ b/src/com/android/settings/accessibility/VibrationPreferenceController.java
@@ -44,6 +44,9 @@ public class VibrationPreferenceController extends BasePreferenceController {
public CharSequence getSummary() {
final boolean isVibrateOn = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.VIBRATE_ON, ON) == ON;
- return mContext.getText(isVibrateOn ? R.string.switch_on_text : R.string.switch_off_text);
+ return mContext.getText(
+ isVibrateOn
+ ? R.string.accessibility_vibration_settings_state_on
+ : R.string.accessibility_vibration_settings_state_off);
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index 6ed95a03759..98210b3babb 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -113,12 +113,6 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
private static final VibrationAttributes FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES =
VibrationAttributes.createForUsage(VibrationAttributes.USAGE_ACCESSIBILITY);
- private static final VibrationAttributes HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES =
- VibrationAttributes.createForUsage(VibrationAttributes.USAGE_HARDWARE_FEEDBACK);
-
- private static final VibrationEffect SUCCESS_VIBRATION_EFFECT =
- VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
-
private FingerprintManager mFingerprintManager;
private boolean mCanAssumeUdfps;
@Nullable private ProgressBar mProgressBar;
@@ -520,13 +514,6 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
mErrorText.removeCallbacks(mTouchAgainRunnable);
mErrorText.postDelayed(mTouchAgainRunnable, HINT_TIMEOUT_DURATION);
} else {
- if (mVibrator != null) {
- mVibrator.vibrate(Process.myUid(),
- getApplicationContext().getOpPackageName(),
- SUCCESS_VIBRATION_EFFECT,
- getClass().getSimpleName() + "::OnEnrollmentProgressChanged",
- HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES);
- }
if (mIsAccessibilityEnabled) {
final int percent = (int) (((float)(steps - remaining) / (float) steps) * 100);
@@ -599,7 +586,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
mErrorText.setTranslationY(0f);
}
}
- if (isResumed() && (mIsAccessibilityEnabled || !mCanAssumeUdfps)) {
+ if (isResumed() && mIsAccessibilityEnabled && !mCanAssumeUdfps) {
mVibrator.vibrate(Process.myUid(), getApplicationContext().getOpPackageName(),
VIBRATE_EFFECT_ERROR, getClass().getSimpleName() + "::showError",
FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES);
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index b7f89095755..9069feabb82 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -479,7 +479,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
@Override
protected void refresh() {
for (LocalBluetoothProfile profile : getProfiles()) {
- if (profile != null && !profile.isProfileReady()) {
+ if (profile == null || !profile.isProfileReady()) {
continue;
}
SwitchPreference pref = mProfilesContainer.findPreference(
diff --git a/src/com/android/settings/gestures/OneHandedEnablePreferenceController.java b/src/com/android/settings/gestures/OneHandedEnablePreferenceController.java
index 29004c8f1fd..6aac7723435 100644
--- a/src/com/android/settings/gestures/OneHandedEnablePreferenceController.java
+++ b/src/com/android/settings/gestures/OneHandedEnablePreferenceController.java
@@ -17,17 +17,29 @@
package com.android.settings.gestures;
import android.content.Context;
+import android.net.Uri;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
/**
* Preference controller for One-handed mode shortcut settings
*/
-public class OneHandedEnablePreferenceController extends BasePreferenceController {
+public class OneHandedEnablePreferenceController extends BasePreferenceController
+ implements OneHandedSettingsUtils.TogglesCallback, LifecycleObserver, OnStart, OnStop {
+
+ private final OneHandedSettingsUtils mUtils;
+ private Preference mPreference;
public OneHandedEnablePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
+ mUtils = new OneHandedSettingsUtils(context);
}
@Override
@@ -41,4 +53,30 @@ public class OneHandedEnablePreferenceController extends BasePreferenceControlle
OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)
? R.string.gesture_setting_on : R.string.gesture_setting_off);
}
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
+ public void onStart() {
+ mUtils.registerToggleAwareObserver(this);
+ }
+
+ @Override
+ public void onStop() {
+ mUtils.unregisterToggleAwareObserver();
+ }
+
+ @Override
+ public void onChange(Uri uri) {
+ if (mPreference == null) {
+ return;
+ }
+ if (uri.equals(OneHandedSettingsUtils.ONE_HANDED_MODE_ENABLED_URI)) {
+ refreshSummary(mPreference);
+ }
+ }
}
diff --git a/src/com/android/settings/network/helper/LifecycleCallbackIntentReceiver.java b/src/com/android/settings/network/helper/LifecycleCallbackIntentReceiver.java
deleted file mode 100644
index 8aaa53e0af8..00000000000
--- a/src/com/android/settings/network/helper/LifecycleCallbackIntentReceiver.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2022 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.network.helper;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Handler;
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.lifecycle.Lifecycle;
-import java.util.function.Consumer;
-
-/**
- * A {@link BroadcastReceiver} for {@link Intent}.
- *
- * This is {@link BroadcastReceiver} supported by {@link LifecycleCallbackConverter},
- * and only register when state is either START or RESUME.
- */
-@VisibleForTesting
-public class LifecycleCallbackIntentReceiver extends LifecycleCallbackConverter {
- private static final String TAG = "LifecycleCallbackIntentReceiver";
-
- @VisibleForTesting
- protected final BroadcastReceiver mReceiver;
-
- private final Runnable mRegisterCallback;
- private final Runnable mUnRegisterCallback;
-
- /**
- * Constructor
- * @param lifecycle {@link Lifecycle} to monitor
- * @param context for this BroadcastReceiver
- * @param filter the IntentFilter for BroadcastReceiver
- * @param broadcastPermission for permission when listening
- * @param scheduler for running in background thread
- * @param resultCallback for the Intent from BroadcastReceiver
- */
- @VisibleForTesting
- public LifecycleCallbackIntentReceiver(@NonNull Lifecycle lifecycle,
- @NonNull Context context, @NonNull IntentFilter filter,
- String broadcastPermission, Handler scheduler,
- @NonNull Consumer resultCallback) {
- super(lifecycle, resultCallback);
-
- // BroadcastReceiver
- mReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- if (isInitialStickyBroadcast()) {
- return;
- }
- final String action = intent.getAction();
- if ((action == null) || (action.length() <= 0)) {
- return;
- }
- postResult(intent);
- }
- };
-
- // Register operation
- mRegisterCallback = () -> {
- Intent initIntent = context.registerReceiver(mReceiver,
- filter, broadcastPermission, scheduler);
- if (initIntent != null) {
- postResult(initIntent);
- }
- };
-
- // Un-Register operation
- mUnRegisterCallback = () -> {
- context.unregisterReceiver(mReceiver);
- };
- }
-
- @Override
- public void setCallbackActive(boolean isActive) {
- super.setCallbackActive(isActive);
- Runnable op = (isActive) ? mRegisterCallback : mUnRegisterCallback;
- op.run();
- }
-
- @Override
- public void close() {
- super.close();
- if (isCallbackActive()) {
- setCallbackActive(false);
- }
- }
-}
diff --git a/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapter.java b/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapter.java
deleted file mode 100644
index 0fae4f27aaf..00000000000
--- a/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2022 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.network.helper;
-
-import android.telephony.TelephonyCallback;
-import android.telephony.TelephonyManager;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.lifecycle.Lifecycle;
-
-import java.util.concurrent.Executor;
-import java.util.function.Consumer;
-
-/**
- * A {@link LifecycleCallbackConverter} for supporting the register/unregister work for
- * {@link TelephonyCallback}.
- */
-@VisibleForTesting
-public class LifecycleCallbackTelephonyAdapter extends LifecycleCallbackConverter {
- private static final String TAG = "LifecycleCallbackTelephony";
-
- private final Runnable mRegisterCallback;
- private final Runnable mUnRegisterCallback;
-
- /**
- * Constructor
- * @param lifecycle {@link Lifecycle} to monitor
- * @param telephonyManager {@link TelephonyManager} to interact with
- * @param telephonyCallback {@link TelephonyCallback}
- * @param executor {@link Executor} for receiving the notify from telephony framework.
- * @param resultCallback for the result from {@link TelephonyCallback}
- */
- @VisibleForTesting
- public LifecycleCallbackTelephonyAdapter(@NonNull Lifecycle lifecycle,
- @NonNull TelephonyManager telephonyManager,
- @NonNull TelephonyCallback telephonyCallback,
- Executor executor, @NonNull Consumer resultCallback) {
- super(lifecycle, resultCallback);
-
- // Register operation
- mRegisterCallback = () -> {
- telephonyManager.registerTelephonyCallback(executor, telephonyCallback);
- };
-
- // Un-Register operation
- mUnRegisterCallback = () -> {
- telephonyManager.unregisterTelephonyCallback(telephonyCallback);
- };
- }
-
- @Override
- public void setCallbackActive(boolean isActive) {
- super.setCallbackActive(isActive);
- Runnable op = (isActive) ? mRegisterCallback : mUnRegisterCallback;
- op.run();
- }
-}
diff --git a/src/com/android/settings/widget/SettingsMainSwitchPreference.java b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
index f1eb603a719..0e17d3f8e90 100644
--- a/src/com/android/settings/widget/SettingsMainSwitchPreference.java
+++ b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
@@ -254,7 +254,5 @@ public class SettingsMainSwitchPreference extends TwoStatePreference implements
for (OnMainSwitchChangeListener listener : mSwitchChangeListeners) {
mMainSwitchBar.addOnSwitchChangeListener(listener);
}
- mBeforeCheckedChangeListeners.clear();
- mSwitchChangeListeners.clear();
}
}
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
index 821c6e49586..3fd6c45d2b2 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
@@ -37,6 +37,7 @@ import android.os.Process;
import android.os.SimpleClock;
import android.os.SystemClock;
import android.text.TextUtils;
+import android.util.EventLog;
import android.util.Log;
import android.util.Size;
import android.view.LayoutInflater;
@@ -58,6 +59,7 @@ import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.qrcode.QrCamera;
import com.android.settingslib.qrcode.QrDecorateView;
+import com.android.settingslib.wifi.WifiPermissionChecker;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -117,9 +119,9 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
private int mLatestStatusCode = WifiDppUtils.EASY_CONNECT_EVENT_FAILURE_NONE;
- @VisibleForTesting
- WifiPickerTracker mWifiPickerTracker;
+ private WifiPickerTracker mWifiPickerTracker;
private HandlerThread mWorkerThread;
+ private WifiPermissionChecker mWifiPermissionChecker;
private final Handler mHandler = new Handler() {
@Override
@@ -363,6 +365,15 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
mIsConfiguratorMode = true;
}
+ public WifiDppQrCodeScannerFragment(WifiPickerTracker wifiPickerTracker,
+ WifiPermissionChecker wifiPermissionChecker) {
+ super();
+
+ mIsConfiguratorMode = true;
+ mWifiPickerTracker = wifiPickerTracker;
+ mWifiPermissionChecker = wifiPermissionChecker;
+ }
+
/**
* Enrollee container activity of the fragment should create instance with this constructor and
* specify the SSID string of the WI-Fi network to be provisioned.
@@ -719,6 +730,28 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
resultIntent.putExtra(KEY_WIFI_CONFIGURATION, mEnrolleeWifiConfiguration);
final Activity hostActivity = getActivity();
+ if (hostActivity == null) return;
+ if (mWifiPermissionChecker == null) {
+ mWifiPermissionChecker = new WifiPermissionChecker(hostActivity);
+ }
+
+ if (!mWifiPermissionChecker.canAccessWifiState()) {
+ Log.w(TAG, "Calling package does not have ACCESS_WIFI_STATE permission for result.");
+ EventLog.writeEvent(0x534e4554, "187176859",
+ mWifiPermissionChecker.getLaunchedPackage(), "no ACCESS_WIFI_STATE permission");
+ hostActivity.finish();
+ return;
+ }
+
+ if (!mWifiPermissionChecker.canAccessFineLocation()) {
+ Log.w(TAG, "Calling package does not have ACCESS_FINE_LOCATION permission for result.");
+ EventLog.writeEvent(0x534e4554, "187176859",
+ mWifiPermissionChecker.getLaunchedPackage(),
+ "no ACCESS_FINE_LOCATION permission");
+ hostActivity.finish();
+ return;
+ }
+
hostActivity.setResult(Activity.RESULT_OK, resultIntent);
hostActivity.finish();
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java
index 40e31fd2d63..a045deaa81a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java
@@ -92,7 +92,7 @@ public class VibrationPreferenceControllerTest {
controller.updateState(mPreference);
assertThat(mPreference.getSummary().toString()).isEqualTo(
- mContext.getString(R.string.switch_on_text));
+ mContext.getString(R.string.accessibility_vibration_settings_state_on));
}
@Test
@@ -103,7 +103,7 @@ public class VibrationPreferenceControllerTest {
controller.updateState(mPreference);
assertThat(mPreference.getSummary().toString()).isEqualTo(
- mContext.getString(R.string.switch_on_text));
+ mContext.getString(R.string.accessibility_vibration_settings_state_on));
}
@Test
@@ -114,7 +114,7 @@ public class VibrationPreferenceControllerTest {
controller.updateState(mPreference);
assertThat(mPreference.getSummary().toString()).isEqualTo(
- mContext.getString(R.string.switch_off_text));
+ mContext.getString(R.string.accessibility_vibration_settings_state_off));
}
private VibrationPreferenceController createPreferenceController() {
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 a67cb3a844e..757a3043f40 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
@@ -83,12 +83,12 @@ public class FingerprintEnrollEnrollingTest {
}
@Test
- public void fingerprintUdfpsEnrollSuccessProgress_shouldVibrate() {
+ public void fingerprintUdfpsEnrollSuccessProgress_shouldNotVibrate() {
initializeActivityFor(FingerprintSensorProperties.TYPE_UDFPS_OPTICAL);
mActivity.onEnrollmentProgressChange(1, 1);
- verify(mVibrator).vibrate(anyInt(), anyString(), any(), anyString(), any());
+ verify(mVibrator, never()).vibrate(anyInt(), anyString(), any(), anyString(), any());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeScheduleRuleSettingsTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeScheduleRuleSettingsTest.java
index 601ec092fa7..a8a551f64c5 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeScheduleRuleSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeScheduleRuleSettingsTest.java
@@ -18,31 +18,27 @@ package com.android.settings.notification.zen;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
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.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Looper;
import androidx.fragment.app.FragmentActivity;
+import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.shadows.ShadowApplication;
import org.robolectric.shadows.ShadowToast;
@RunWith(RobolectricTestRunner.class)
@@ -54,42 +50,32 @@ public class ZenModeScheduleRuleSettingsTest {
@Mock
private Intent mIntent;
- @Mock
- private NotificationManager mNotificationManager;
-
- private TestFragment mFragment;
+ private ZenModeScheduleRuleSettings mFragment;
private Context mContext;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- ShadowApplication shadowApplication = ShadowApplication.getInstance();
- shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNotificationManager);
- mContext = application;
+ mContext = ApplicationProvider.getApplicationContext();
- mFragment = spy(new TestFragment());
- mFragment.onAttach(application);
-
- doReturn(mActivity).when(mFragment).getActivity();
-
- Resources res = application.getResources();
-
- doReturn(res).when(mFragment).getResources();
+ Resources res = mContext.getResources();
when(mActivity.getTheme()).thenReturn(res.newTheme());
when(mActivity.getIntent()).thenReturn(mIntent);
when(mActivity.getResources()).thenReturn(res);
when(mActivity.getMainLooper()).thenReturn(mock(Looper.class));
+
+ mFragment = spy(new ZenModeScheduleRuleSettings());
+ when(mFragment.getActivity()).thenReturn(mActivity);
when(mFragment.getContext()).thenReturn(mContext);
+ when(mFragment.getResources()).thenReturn(res);
+ mFragment.onAttach(mContext);
}
@Test
- @Ignore
- public void onCreate_noRuleId_shouldToastAndFinishAndNoCrash() {
+ public void onAttach_noRuleId_shouldToastAndFinishAndNoCrash() {
final String expected = mContext.getString(R.string.zen_mode_rule_not_found_text);
- mFragment.onCreate(null);
-
// verify the toast
assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(expected);
@@ -98,12 +84,4 @@ public class ZenModeScheduleRuleSettingsTest {
//should not crash
}
-
- public static class TestFragment extends ZenModeScheduleRuleSettings {
-
- @Override
- protected Object getSystemService(final String name) {
- return null;
- }
- }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java
index 1046418055d..bf978c7d917 100644
--- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java
@@ -19,11 +19,19 @@ package com.android.settings.wifi.dpp;
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.any;
import static org.mockito.Mockito.doNothing;
+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.app.Activity;
+
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.settingslib.wifi.WifiPermissionChecker;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -49,6 +57,10 @@ public class WifiDppQrCodeScannerFragmentTest {
WifiPickerTracker mWifiPickerTracker;
@Mock
WifiEntry mWifiEntry;
+ @Mock
+ WifiPermissionChecker mWifiPermissionChecker;
+ @Mock
+ FragmentActivity mActivity;
WifiDppQrCodeScannerFragment mFragment;
@@ -57,8 +69,8 @@ public class WifiDppQrCodeScannerFragmentTest {
when(mWifiEntry.getSsid()).thenReturn(WIFI_SSID);
when(mWifiPickerTracker.getWifiEntries()).thenReturn(Arrays.asList(mWifiEntry));
- mFragment = spy(new WifiDppQrCodeScannerFragment());
- mFragment.mWifiPickerTracker = mWifiPickerTracker;
+ mFragment = spy(
+ new WifiDppQrCodeScannerFragment(mWifiPickerTracker, mWifiPermissionChecker));
}
@Test
@@ -84,4 +96,52 @@ public class WifiDppQrCodeScannerFragmentTest {
assertThat(mFragment.canConnectWifi(WIFI_SSID)).isFalse();
verify(mFragment).showErrorMessageAndRestartCamera(anyInt());
}
+
+ @Test
+ public void onSuccess_noWifiPermission_finishActivityWithoutSetResult() {
+ when(mFragment.getActivity()).thenReturn(mActivity);
+ when(mWifiPermissionChecker.canAccessWifiState()).thenReturn(false);
+ when(mWifiPermissionChecker.canAccessFineLocation()).thenReturn(false);
+
+ mFragment.onSuccess();
+
+ verify(mActivity).finish();
+ verify(mActivity, never()).setResult(eq(Activity.RESULT_OK), any());
+ }
+
+ @Test
+ public void onSuccess_hasAccessWifiStatePermissionOnly_finishActivityWithoutSetResult() {
+ when(mFragment.getActivity()).thenReturn(mActivity);
+ when(mWifiPermissionChecker.canAccessWifiState()).thenReturn(true);
+ when(mWifiPermissionChecker.canAccessFineLocation()).thenReturn(false);
+
+ mFragment.onSuccess();
+
+ verify(mActivity).finish();
+ verify(mActivity, never()).setResult(eq(Activity.RESULT_OK), any());
+ }
+
+ @Test
+ public void onSuccess_hasAccessFineLocationPermissionOnly_finishActivityWithoutSetResult() {
+ when(mFragment.getActivity()).thenReturn(mActivity);
+ when(mWifiPermissionChecker.canAccessWifiState()).thenReturn(false);
+ when(mWifiPermissionChecker.canAccessFineLocation()).thenReturn(true);
+
+ mFragment.onSuccess();
+
+ verify(mActivity).finish();
+ verify(mActivity, never()).setResult(eq(Activity.RESULT_OK), any());
+ }
+
+ @Test
+ public void onSuccess_hasRequiredPermissions_finishActivityWithSetResult() {
+ when(mFragment.getActivity()).thenReturn(mActivity);
+ when(mWifiPermissionChecker.canAccessWifiState()).thenReturn(true);
+ when(mWifiPermissionChecker.canAccessFineLocation()).thenReturn(true);
+
+ mFragment.onSuccess();
+
+ verify(mActivity).setResult(eq(Activity.RESULT_OK), any());
+ verify(mActivity).finish();
+ }
}
diff --git a/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackConverterTest.java b/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackConverterTest.java
index 149fd8293db..22377469c22 100644
--- a/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackConverterTest.java
+++ b/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackConverterTest.java
@@ -43,6 +43,9 @@ public class LifecycleCallbackConverterTest implements LifecycleOwner {
public void setUp() {
mTestData = new Object();
mConsumer = new TestConsumer();
+ }
+
+ private void initEnvPerTestCase() {
mConverter = new LifecycleCallbackConverter