diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d9270736f93..c996b6b92db 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2343,7 +2343,7 @@ diff --git a/res/layout/accessibility_text_reading_reset_button.xml b/res/layout/accessibility_text_reading_reset_button.xml index dd9128b4eda..f3691e1f816 100644 --- a/res/layout/accessibility_text_reading_reset_button.xml +++ b/res/layout/accessibility_text_reading_reset_button.xml @@ -27,9 +27,14 @@ android:id="@+id/reset_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" - android:paddingHorizontal="24dp" + android:layout_gravity="center|end" android:paddingVertical="14dp" - android:text="@string/accessibility_text_reading_reset_button_title" - style="@style/ActionPrimaryButton"/> + android:background="@null" + android:drawableStart="@drawable/ic_history" + android:drawablePadding="9dp" + android:drawableTint="?android:attr/colorAccent" + android:textColor="?android:attr/colorAccent" + android:textSize="16sp" + android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium" + android:text="@string/accessibility_text_reading_reset_button_title"/> diff --git a/res/values/strings.xml b/res/values/strings.xml index 905f036321a..26b79d82490 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4680,8 +4680,8 @@ Clear storage Uninstall updates - - Unlock restricted settings + + Allow restricted settings Some activities you\u2019ve selected open in this app by default. @@ -12166,7 +12166,9 @@ Learn more - Restricted Settings + Restricted setting + + Restricted settings allowed for %s For your security, this setting is currently unavailable. diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml index 95fefb63a12..0726c208e09 100644 --- a/res/xml/app_info_settings.xml +++ b/res/xml/app_info_settings.xml @@ -141,7 +141,7 @@ diff --git a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java index 3d0c1dbe853..a0cc77eafa5 100644 --- a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java +++ b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java @@ -118,6 +118,11 @@ public class AccessibilityDialogUtils { * launch tutorial. */ int LAUNCH_ACCESSIBILITY_TUTORIAL = 1008; + + /** + * OPEN: Settings > Accessibility > Display size and text > Click 'Reset settings' button. + */ + int DIALOG_RESET_SETTINGS = 1009; } /** diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java index a25c4a61207..34e1fb0557d 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java @@ -333,6 +333,10 @@ public abstract class AccessibilityShortcutPreferenceFragment extends DashboardF mShortcutPreference.setChecked(shortcutAssigned); mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); + if (mHardwareTypeCheckBox.isChecked()) { + AccessibilityUtil.skipVolumeShortcutDialogTimeoutRestriction(getPrefContext()); + } + // Show the quick setting tooltip if the shortcut assigned in the first time if (shortcutAssigned) { showQuickSettingsTooltipIfNeeded(); diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java index 3e97edc22a4..e2e29333c98 100644 --- a/src/com/android/settings/accessibility/AccessibilityUtil.java +++ b/src/com/android/settings/accessibility/AccessibilityUtil.java @@ -434,4 +434,15 @@ public final class AccessibilityUtil { public static boolean isSystemApp(@NonNull AccessibilityServiceInfo info) { return info.getResolveInfo().serviceInfo.applicationInfo.isSystemApp(); } + + /** + * Bypasses the timeout restriction if volume key shortcut assigned. + * + * @param context the current context. + */ + public static void skipVolumeShortcutDialogTimeoutRestriction(Context context) { + Settings.Secure.putInt(context.getContentResolver(), + Settings.Secure.SKIP_ACCESSIBILITY_SHORTCUT_DIALOG_TIMEOUT_RESTRICTION, /* + true */ 1); + } } diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java index 7dd70aff596..da0287677f6 100644 --- a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java +++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java @@ -18,10 +18,15 @@ package com.android.settings.accessibility; import static com.android.settings.accessibility.TextReadingResetController.ResetStateListener; +import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.Context; +import android.content.DialogInterface; + +import androidx.appcompat.app.AlertDialog; import com.android.settings.R; +import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; @@ -88,16 +93,54 @@ public class TextReadingPreferenceFragment extends DashboardFragment { new HighTextContrastPreferenceController(context, HIGHT_TEXT_CONTRAST_KEY); controllers.add(highTextContrastController); - final List resetStateListeners = - controllers.stream().filter(c -> c instanceof ResetStateListener).map( - c -> (ResetStateListener) c).collect(Collectors.toList()); final TextReadingResetController resetController = - new TextReadingResetController(context, RESET_KEY, resetStateListeners); + new TextReadingResetController(context, RESET_KEY, + v -> showDialog(DialogEnums.DIALOG_RESET_SETTINGS)); controllers.add(resetController); return controllers; } + @Override + public Dialog onCreateDialog(int dialogId) { + if (dialogId == DialogEnums.DIALOG_RESET_SETTINGS) { + return new AlertDialog.Builder(getPrefContext()) + .setTitle(R.string.accessibility_text_reading_confirm_dialog_title) + .setMessage(R.string.accessibility_text_reading_confirm_dialog_message) + .setPositiveButton( + R.string.accessibility_text_reading_confirm_dialog_reset_button, + this::onPositiveButtonClicked) + .setNegativeButton(R.string.cancel, /* listener= */ null) + .create(); + } + + throw new IllegalArgumentException("Unsupported dialogId " + dialogId); + } + + @Override + public int getDialogMetricsCategory(int dialogId) { + if (dialogId == DialogEnums.DIALOG_RESET_SETTINGS) { + return SettingsEnums.DIALOG_RESET_SETTINGS; + } + + return super.getDialogMetricsCategory(dialogId); + } + + private void onPositiveButtonClicked(DialogInterface dialog, int which) { + // To avoid showing the dialog again, probably the onDetach() of SettingsDialogFragment + // was interrupted by unexpectedly recreating the activity. + removeDialog(DialogEnums.DIALOG_RESET_SETTINGS); + + getResetStateListeners().forEach(ResetStateListener::resetState); + } + + private List getResetStateListeners() { + final List controllers = new ArrayList<>(); + getPreferenceControllers().forEach(controllers::addAll); + return controllers.stream().filter(c -> c instanceof ResetStateListener).map( + c -> (ResetStateListener) c).collect(Collectors.toList()); + } + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.accessibility_text_reading_options); } diff --git a/src/com/android/settings/accessibility/TextReadingResetController.java b/src/com/android/settings/accessibility/TextReadingResetController.java index f4752cb75fd..152ad5fe4f1 100644 --- a/src/com/android/settings/accessibility/TextReadingResetController.java +++ b/src/com/android/settings/accessibility/TextReadingResetController.java @@ -19,25 +19,23 @@ package com.android.settings.accessibility; import android.content.Context; import android.view.View; -import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.widget.LayoutPreference; -import java.util.List; - /** * The controller of the reset button in the text and reading options page. */ class TextReadingResetController extends BasePreferenceController { - private final List mListeners; + private final View.OnClickListener mOnResetClickListener; TextReadingResetController(Context context, String preferenceKey, - @NonNull List listeners) { + @Nullable View.OnClickListener listener) { super(context, preferenceKey); - mListeners = listeners; + mOnResetClickListener = listener; } @Override @@ -51,7 +49,11 @@ class TextReadingResetController extends BasePreferenceController { final LayoutPreference layoutPreference = screen.findPreference(getPreferenceKey()); final View view = layoutPreference.findViewById(R.id.reset_button); - view.setOnClickListener(v -> mListeners.forEach(ResetStateListener::resetState)); + view.setOnClickListener(v -> { + if (mOnResetClickListener != null) { + mOnResetClickListener.onClick(v); + } + }); } /** diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index e123a5387f7..bd8ee667571 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -725,6 +725,10 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference mShortcutPreference.setChecked(shortcutAssigned); mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); + if (mHardwareTypeCheckBox.isChecked()) { + AccessibilityUtil.skipVolumeShortcutDialogTimeoutRestriction(getPrefContext()); + } + // Show the quick setting tooltip if the shortcut assigned in the first time if (shortcutAssigned) { showQuickSettingsTooltipIfNeeded(); diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index d2d6a3374ca..bf47658f96b 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -367,6 +367,10 @@ public class ToggleScreenMagnificationPreferenceFragment extends mShortcutPreference.setChecked(value != UserShortcutType.EMPTY); mShortcutPreference.setSummary( getShortcutTypeSummary(getPrefContext())); + + if (mHardwareTypeCheckBox.isChecked()) { + AccessibilityUtil.skipVolumeShortcutDialogTimeoutRestriction(getPrefContext()); + } } @Override diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java index 5bc4118bfef..ac5330c4f99 100755 --- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java @@ -48,6 +48,7 @@ import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.widget.Toast; import androidx.annotation.VisibleForTesting; @@ -443,14 +444,14 @@ public class AppInfoDashboardFragment extends DashboardFragment }; final BiometricPrompt.Builder builder = new BiometricPrompt.Builder(context) - .setTitle(context.getText(R.string.app_restricted_settings_lockscreen_title)); + .setUseDefaultTitle(); // use default title if title is null/empty - if (context.getSystemService(BiometricManager.class).canAuthenticate( - BiometricManager.Authenticators.DEVICE_CREDENTIAL - | BiometricManager.Authenticators.BIOMETRIC_WEAK) - == BiometricManager.BIOMETRIC_SUCCESS) { - builder.setAllowedAuthenticators(BiometricManager.Authenticators.DEVICE_CREDENTIAL - | BiometricManager.Authenticators.BIOMETRIC_WEAK); + final BiometricManager bm = context.getSystemService(BiometricManager.class); + final int authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL + | BiometricManager.Authenticators.BIOMETRIC_WEAK; + if (bm.canAuthenticate(authenticators) == BiometricManager.BIOMETRIC_SUCCESS) { + builder.setAllowedAuthenticators(authenticators); + builder.setSubtitle(bm.getStrings(authenticators).getPromptMessage()); } final BiometricPrompt bp = builder.build(); @@ -481,6 +482,10 @@ public class AppInfoDashboardFragment extends DashboardFragment getPackageName(), AppOpsManager.MODE_ALLOWED); getActivity().invalidateOptionsMenu(); + final String toastString = getContext().getString( + R.string.toast_allows_restricted_settings_successfully, + mAppEntry.label); + Toast.makeText(getContext(), toastString, Toast.LENGTH_LONG).show(); }); return true; } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index 70140c42c8c..f41316a75c7 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -32,8 +32,9 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; -import android.media.AudioAttributes; import android.os.Bundle; +import android.os.Process; +import android.os.VibrationAttributes; import android.os.VibrationEffect; import android.os.Vibrator; import android.text.TextUtils; @@ -108,11 +109,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private static final VibrationEffect VIBRATE_EFFECT_ERROR = VibrationEffect.createWaveform(new long[] {0, 5, 55, 60}, -1); - private static final AudioAttributes FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES = - new AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) - .build(); + private static final VibrationAttributes FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES = + VibrationAttributes.createForUsage(VibrationAttributes.USAGE_ACCESSIBILITY); private FingerprintManager mFingerprintManager; private boolean mCanAssumeUdfps; @@ -582,8 +580,10 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { mErrorText.setTranslationY(0f); } } - if (isResumed()) { - mVibrator.vibrate(VIBRATE_EFFECT_ERROR, FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES); + if (isResumed() && (mIsAccessibilityEnabled || !mCanAssumeUdfps)) { + mVibrator.vibrate(Process.myUid(), getApplicationContext().getOpPackageName(), + VIBRATE_EFFECT_ERROR, "FingerprintEnrollEnrolling:showError", + FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES); } } diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java index 8542fcd2461..7d27a37924f 100644 --- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java +++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java @@ -126,7 +126,7 @@ public final class BluetoothPermissionRequest extends BroadcastReceiver { // "Clear All Notifications" button Intent deleteIntent = new Intent(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY); - deleteIntent.setPackage("com.android.bluetooth"); + deleteIntent.setPackage("com.android.bluetooth.services"); deleteIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice); deleteIntent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT, BluetoothDevice.CONNECTION_ACCESS_NO); diff --git a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java index bd8169a80fe..af9a29587a2 100644 --- a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java +++ b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java @@ -47,10 +47,10 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceController extends try { Resources res = context.getPackageManager().getResourcesForApplication( - "com.android.bluetooth"); + "com.android.bluetooth.services"); mDefaultMaxConnectedAudioDevices = res.getInteger(res.getIdentifier( "config_bluetooth_max_connected_audio_devices", - "integer", "com.android.bluetooth")); + "integer", "com.android.bluetooth.services")); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } diff --git a/src/com/android/settings/notification/RemoteVolumeGroupController.java b/src/com/android/settings/notification/RemoteVolumeGroupController.java index 3d8d261aa08..47a12d0aab8 100644 --- a/src/com/android/settings/notification/RemoteVolumeGroupController.java +++ b/src/com/android/settings/notification/RemoteVolumeGroupController.java @@ -119,6 +119,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem if (seekBarPreference.getProgress() != info.getVolume()) { seekBarPreference.setProgress(info.getVolume()); } + seekBarPreference.setEnabled(mLocalMediaManager.shouldEnableVolumeSeekBar(info)); } else { // Add slider seekBarPreference = new RemoteVolumeSeekBarPreference(mContext); diff --git a/src/com/android/settings/security/EncryptionAndCredential.java b/src/com/android/settings/security/EncryptionAndCredential.java index 5362ad0c92a..e3dd9d5ccf8 100644 --- a/src/com/android/settings/security/EncryptionAndCredential.java +++ b/src/com/android/settings/security/EncryptionAndCredential.java @@ -20,7 +20,6 @@ import static com.android.settings.security.EncryptionStatusPreferenceController import android.app.settings.SettingsEnums; import android.content.Context; -import android.os.UserManager; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -96,9 +95,7 @@ public class EncryptionAndCredential extends DashboardFragment { @Override protected boolean isPageSearchEnabled(Context context) { - final UserManager um = (UserManager) context.getSystemService( - Context.USER_SERVICE); - return um.isAdminUser(); + return true; } }; } diff --git a/src/com/android/settings/security/EncryptionStatusPreferenceController.java b/src/com/android/settings/security/EncryptionStatusPreferenceController.java index d83579822d4..68d1181a0aa 100644 --- a/src/com/android/settings/security/EncryptionStatusPreferenceController.java +++ b/src/com/android/settings/security/EncryptionStatusPreferenceController.java @@ -44,11 +44,11 @@ public class EncryptionStatusPreferenceController extends BasePreferenceControll public int getAvailabilityStatus() { if (TextUtils.equals(getPreferenceKey(), PREF_KEY_ENCRYPTION_DETAIL_PAGE) && !mContext.getResources().getBoolean( - R.bool.config_show_encryption_and_credentials_encryption_status)) { + R.bool.config_show_encryption_and_credentials_encryption_status)) { return UNSUPPORTED_ON_DEVICE; } - return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER; + return AVAILABLE; } @Override diff --git a/src/com/android/settings/wifi/WifiEntryPreference.java b/src/com/android/settings/wifi/WifiEntryPreference.java index a9b307c8e51..e74f269ae8d 100644 --- a/src/com/android/settings/wifi/WifiEntryPreference.java +++ b/src/com/android/settings/wifi/WifiEntryPreference.java @@ -25,6 +25,7 @@ import android.text.TextUtils; import android.view.View; import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; @@ -35,6 +36,7 @@ import androidx.preference.PreferenceViewHolder; import com.android.settingslib.R; import com.android.settingslib.Utils; import com.android.settingslib.wifi.WifiUtils; +import com.android.wifitrackerlib.BaseWifiTracker; import com.android.wifitrackerlib.WifiEntry; /** @@ -94,6 +96,12 @@ public class WifiEntryPreference extends Preference implements WifiEntry.WifiEnt @Override public void onBindViewHolder(final PreferenceViewHolder view) { super.onBindViewHolder(view); + if (BaseWifiTracker.isVerboseLoggingEnabled()) { + TextView summary = (TextView) view.findViewById(android.R.id.summary); + if (summary != null) { + summary.setMaxLines(100); + } + } final Drawable drawable = getIcon(); if (drawable != null) { drawable.setLevel(mLevel); diff --git a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java index cad56e3b3ee..6f86ddd1832 100644 --- a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java +++ b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java @@ -26,7 +26,6 @@ import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.Looper; -import android.view.View; import android.widget.Switch; import androidx.annotation.VisibleForTesting; @@ -36,12 +35,13 @@ import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; +import com.android.settingslib.widget.OnMainSwitchChangeListener; /** * Controller for logic pertaining to switch Wi-Fi tethering. */ public class WifiTetherSwitchBarController implements - LifecycleObserver, OnStart, OnStop, DataSaverBackend.Listener, View.OnClickListener { + LifecycleObserver, OnStart, OnStop, DataSaverBackend.Listener, OnMainSwitchChangeListener { private static final IntentFilter WIFI_INTENT_FILTER; private final Context mContext; @@ -82,7 +82,7 @@ public class WifiTetherSwitchBarController implements @Override public void onStart() { mDataSaverBackend.addListener(this); - mSwitch.setOnClickListener(this); + mSwitchBar.addOnSwitchChangeListener(this); mContext.registerReceiver(mReceiver, WIFI_INTENT_FILTER, Context.RECEIVER_EXPORTED_UNAUDITED); } @@ -94,8 +94,8 @@ public class WifiTetherSwitchBarController implements } @Override - public void onClick(View v) { - if (((Switch) v).isChecked()) { + public void onSwitchChanged(Switch switchView, boolean isChecked) { + if (isChecked) { startTether(); } else { stopTether(); diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java index 2ae8e242a1e..2e4566ceac0 100644 --- a/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java @@ -16,10 +16,10 @@ package com.android.settings.accessibility; -import static com.android.settings.accessibility.TextReadingResetController.ResetStateListener; - import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; @@ -29,7 +29,6 @@ import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; -import com.android.settings.core.BasePreferenceController; import com.android.settingslib.widget.LayoutPreference; import org.junit.Before; @@ -39,21 +38,18 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import java.util.ArrayList; -import java.util.List; - /** * Tests for {@link TextReadingResetController}. */ @RunWith(RobolectricTestRunner.class) public class TextReadingResetControllerTest { - private static final String TEST_KEY = "test"; private static final String RESET_KEY = "reset"; private final Context mContext = ApplicationProvider.getApplicationContext(); private final View mResetView = new View(mContext); - private final List mListeners = new ArrayList<>(); private TextReadingResetController mResetController; - private TestPreferenceController mPreferenceController; + + @Mock + private View.OnClickListener mOnResetButtonClickListener; @Mock private PreferenceScreen mPreferenceScreen; @@ -64,10 +60,8 @@ public class TextReadingResetControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - - mPreferenceController = new TestPreferenceController(mContext, TEST_KEY); - mListeners.add(mPreferenceController); - mResetController = new TextReadingResetController(mContext, RESET_KEY, mListeners); + mResetController = new TextReadingResetController(mContext, RESET_KEY, + mOnResetButtonClickListener); } @Test @@ -80,40 +74,17 @@ public class TextReadingResetControllerTest { } @Test - public void triggerResetState_success() { + public void clickResetButtonAfterDisplayPreference_verifyClickListener() { setupResetButton(); mResetController.displayPreference(mPreferenceScreen); mResetView.callOnClick(); - assertThat(mPreferenceController.isReset()).isTrue(); + verify(mOnResetButtonClickListener).onClick(any(View.class)); } private void setupResetButton() { when(mPreferenceScreen.findPreference(RESET_KEY)).thenReturn(mLayoutPreference); when(mLayoutPreference.findViewById(R.id.reset_button)).thenReturn(mResetView); } - - private static class TestPreferenceController extends BasePreferenceController implements - ResetStateListener { - private boolean mIsReset = false; - - TestPreferenceController(Context context, String preferenceKey) { - super(context, preferenceKey); - } - - @Override - public void resetState() { - mIsReset = true; - } - - @Override - public int getAvailabilityStatus() { - return AVAILABLE; - } - - boolean isReset() { - return mIsReset; - } - } } diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java index 114f96985cf..fea28d14b9a 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java @@ -38,6 +38,7 @@ import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; import android.widget.PopupWindow; import androidx.annotation.XmlRes; @@ -183,6 +184,28 @@ public class ToggleFeaturePreferenceFragmentTest { assertThat(expectedType).isEqualTo(UserShortcutType.HARDWARE); } + @Test + public void dialogCheckboxClicked_hardwareType_skipTimeoutRestriction() { + mContext.setTheme(R.style.Theme_AppCompat); + final ShortcutPreference shortcutPreference = new ShortcutPreference(mContext, /* attrs= */ + null); + mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME; + mFragment.mShortcutPreference = shortcutPreference; + final AlertDialog dialog = AccessibilityDialogUtils.showEditShortcutDialog( + mContext, DialogType.EDIT_SHORTCUT_GENERIC, PLACEHOLDER_DIALOG_TITLE, + mFragment::callOnAlertDialogCheckboxClicked); + mFragment.setupEditShortcutDialog(dialog); + + final View dialogHardwareView = dialog.findViewById(R.id.hardware_shortcut); + final CheckBox hardwareTypeCheckBox = dialogHardwareView.findViewById(R.id.checkbox); + hardwareTypeCheckBox.setChecked(true); + dialog.getButton(DialogInterface.BUTTON_POSITIVE).callOnClick(); + final boolean skipTimeoutRestriction = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.SKIP_ACCESSIBILITY_SHORTCUT_DIALOG_TIMEOUT_RESTRICTION, 0) != 0; + + assertThat(skipTimeoutRestriction).isTrue(); + } + @Test public void setupEditShortcutDialog_shortcutPreferenceOff_checkboxIsEmptyValue() { mContext.setTheme(R.style.Theme_AppCompat); diff --git a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java index 72477b94585..53494ab5d23 100644 --- a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java @@ -70,8 +70,8 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest { mPreference.setEntryValues(R.array.bluetooth_max_connected_audio_devices_values); // Retrieve default max connected audio devices to a test controlled value try { - Resources res = mSpyContext.getPackageManager().getResourcesForApplication("com.android.bluetooth"); - TEST_MAX_CONNECTED_AUDIO_DEVICES = res.getInteger(res.getIdentifier("config_bluetooth_max_connected_audio_devices", "integer", "com.android.bluetooth")); + Resources res = mSpyContext.getPackageManager().getResourcesForApplication("com.android.bluetooth.services"); + TEST_MAX_CONNECTED_AUDIO_DEVICES = res.getInteger(res.getIdentifier("config_bluetooth_max_connected_audio_devices", "integer", "com.android.bluetooth.services")); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } diff --git a/tests/robotests/src/com/android/settings/security/EncryptionAndCredentialTest.java b/tests/robotests/src/com/android/settings/security/EncryptionAndCredentialTest.java index 6f326ce6627..1d7a4a74547 100644 --- a/tests/robotests/src/com/android/settings/security/EncryptionAndCredentialTest.java +++ b/tests/robotests/src/com/android/settings/security/EncryptionAndCredentialTest.java @@ -16,19 +16,13 @@ package com.android.settings.security; -import static com.android.settings.security.EncryptionAndCredential.SEARCH_INDEX_DATA_PROVIDER; - import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.when; - import android.app.admin.DevicePolicyManager; import android.content.Context; import android.os.UserManager; -import android.provider.SearchIndexableResource; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.search.BaseSearchIndexProvider; import org.junit.Before; import org.junit.Test; @@ -39,9 +33,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowApplication; -import java.util.ArrayList; -import java.util.List; - @RunWith(RobolectricTestRunner.class) public class EncryptionAndCredentialTest { @@ -67,19 +58,4 @@ public class EncryptionAndCredentialTest { assertThat(fragment.getMetricsCategory()).isEqualTo(MetricsEvent.ENCRYPTION_AND_CREDENTIAL); } - @Test - public void getNonIndexableKeys_pageIsDisabled_shouldReturnAllKeysAsNonIndexable() { - when(mUserManager.isAdminUser()).thenReturn(false); - - final List index = - SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext, true /* enabled */); - final List expectedKeys = new ArrayList<>(); - for (SearchIndexableResource res : index) { - expectedKeys.addAll(((BaseSearchIndexProvider) SEARCH_INDEX_DATA_PROVIDER) - .getNonIndexableKeysFromXml(mContext, res.xmlResId, true /* suppressAll */)); - } - final List keys = SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext); - - assertThat(keys).containsExactlyElementsIn(expectedKeys); - } } diff --git a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java index 970564aa04f..410198bf796 100644 --- a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java @@ -56,20 +56,6 @@ public class EncryptionStatusPreferenceControllerTest { mPreference = new Preference(mContext); } - @Test - public void isAvailable_admin_true() { - mShadowUserManager.setIsAdminUser(true); - - assertThat(mController.isAvailable()).isTrue(); - } - - @Test - public void isAvailable_notAdmin_false() { - mShadowUserManager.setIsAdminUser(false); - - assertThat(mController.isAvailable()).isFalse(); - } - @Test @Config(qualifiers = "mcc999") public void isAvailable_notVisible_false() { @@ -82,7 +68,6 @@ public class EncryptionStatusPreferenceControllerTest { mController = new EncryptionStatusPreferenceController(mContext, PREF_KEY_ENCRYPTION_SECURITY_PAGE); - mShadowUserManager.setIsAdminUser(true); assertThat(mController.isAvailable()).isTrue(); } diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java index b0bd8bc86ab..a27743e2bd7 100644 --- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java @@ -16,15 +16,14 @@ package com.android.settings.wifi.tether; +import static android.net.ConnectivityManager.TETHERING_WIFI; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -52,6 +51,8 @@ public class WifiTetherSwitchBarControllerTest { private ConnectivityManager mConnectivityManager; @Mock private NetworkPolicyManager mNetworkPolicyManager; + @Mock + private Switch mSwitch; private Context mContext; private SettingsMainSwitchBar mSwitchBar; @@ -99,23 +100,20 @@ public class WifiTetherSwitchBarControllerTest { } @Test - public void onSwitchToggled_switchOff_noStartTethering() { - final Switch mockSwitch = mock(Switch.class); - when(mockSwitch.isChecked()).thenReturn(false); + public void onSwitchChanged_isChecked_startTethering() { + when(mSwitch.isChecked()).thenReturn(true); - mController.onClick(mockSwitch); + mController.onSwitchChanged(mSwitch, mSwitch.isChecked()); - verify(mConnectivityManager, never()).startTethering(anyInt(), anyBoolean(), any(), any()); + verify(mConnectivityManager).startTethering(eq(TETHERING_WIFI), anyBoolean(), any(), any()); } @Test - public void onSwitchToggled_switchOn_startTethering() { - final Switch mockSwitch = mock(Switch.class); - when(mockSwitch.isChecked()).thenReturn(true); + public void onSwitchChanged_isNotChecked_stopTethering() { + when(mSwitch.isChecked()).thenReturn(false); - mController.onClick(mockSwitch); + mController.onSwitchChanged(mSwitch, mSwitch.isChecked()); - verify(mConnectivityManager, times(1)) - .startTethering(anyInt(), anyBoolean(), any(), any()); + verify(mConnectivityManager).stopTethering(TETHERING_WIFI); } }