diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 16baf544f81..062ebdce45f 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1247,7 +1247,7 @@ + android:value="com.android.settings.security.SecuritySettings" /> @@ -1289,7 +1289,7 @@ android:exported="true" android:targetActivity="Settings$SecuritySettingsActivity"> + android:value="com.android.settings.security.SecuritySettings" /> getActiveTrustAgents(Context context, + static ArrayList getActiveTrustAgents(Context context, TrustAgentManager trustAgentManager, LockPatternUtils utils, DevicePolicyManager dpm) { PackageManager pm = context.getPackageManager(); @@ -568,13 +565,7 @@ public class SecuritySettings extends SettingsPreferenceFragment return result; } - private static CharSequence getActiveTrustAgentLabel(Context context, - TrustAgentManager trustAgentManager, LockPatternUtils utils, - DevicePolicyManager dpm) { - ArrayList agents = getActiveTrustAgents(context, - trustAgentManager, utils, dpm); - return agents.isEmpty() ? null : agents.get(0).title; - } + @Override public void onGearClick(GearPreference p) { @@ -837,7 +828,7 @@ public class SecuritySettings extends SettingsPreferenceFragment || lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId) || !isPasswordManaged(profileUserId, context, dpm))) { // Add options for lock/unlock screen - final int resId = getResIdForLockUnlockScreen(context, lockPatternUtils, + final int resId = getResIdForLockUnlockScreen(lockPatternUtils, managedPasswordProvider, MY_USER_ID); index.add(getSearchResource(context, resId)); } @@ -845,12 +836,12 @@ public class SecuritySettings extends SettingsPreferenceFragment if (profileUserId != UserHandle.USER_NULL && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId) && !isPasswordManaged(profileUserId, context, dpm)) { - index.add(getSearchResource(context, getResIdForLockUnlockScreen(context, + index.add(getSearchResource(context, getResIdForLockUnlockScreen( lockPatternUtils, managedPasswordProvider, profileUserId))); } final SearchIndexableResource sir = getSearchResource(context, - SecuritySubSettings.getResIdForLockUnlockSubScreen(context, lockPatternUtils, + SecuritySubSettings.getResIdForLockUnlockSubScreen(lockPatternUtils, managedPasswordProvider)); sir.className = SecuritySubSettings.class.getName(); index.add(sir); @@ -973,216 +964,6 @@ public class SecuritySettings extends SettingsPreferenceFragment } } - public static class SecuritySubSettings extends SettingsPreferenceFragment - implements OnPreferenceChangeListener, OwnerInfoPreferenceController.OwnerInfoCallback { - - private static final String KEY_VISIBLE_PATTERN = "visiblepattern"; - private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout"; - private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks"; - - // These switch preferences need special handling since they're not all stored in Settings. - private static final String SWITCH_PREFERENCE_KEYS[] = { KEY_LOCK_AFTER_TIMEOUT, - KEY_VISIBLE_PATTERN, KEY_POWER_INSTANTLY_LOCKS }; - - private TimeoutListPreference mLockAfter; - private SwitchPreference mVisiblePattern; - private SwitchPreference mPowerButtonInstantlyLocks; - - private TrustAgentManager mTrustAgentManager; - private LockPatternUtils mLockPatternUtils; - private DevicePolicyManager mDPM; - private OwnerInfoPreferenceController mOwnerInfoPreferenceController; - - @Override - public int getMetricsCategory() { - return MetricsEvent.SECURITY; - } - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - SecurityFeatureProvider securityFeatureProvider = - FeatureFactory.getFactory(getActivity()).getSecurityFeatureProvider(); - mTrustAgentManager = securityFeatureProvider.getTrustAgentManager(); - mLockPatternUtils = new LockPatternUtils(getContext()); - mDPM = getContext().getSystemService(DevicePolicyManager.class); - mOwnerInfoPreferenceController = - new OwnerInfoPreferenceController(getContext(), this, null /* lifecycle */); - createPreferenceHierarchy(); - } - - @Override - public void onResume() { - super.onResume(); - - createPreferenceHierarchy(); - - if (mVisiblePattern != null) { - mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled( - MY_USER_ID)); - } - if (mPowerButtonInstantlyLocks != null) { - mPowerButtonInstantlyLocks.setChecked( - mLockPatternUtils.getPowerButtonInstantlyLocks(MY_USER_ID)); - } - - mOwnerInfoPreferenceController.updateSummary(); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - createPreferenceHierarchy(); - } - - private void createPreferenceHierarchy() { - PreferenceScreen root = getPreferenceScreen(); - if (root != null) { - root.removeAll(); - } - - final int resid = getResIdForLockUnlockSubScreen(getActivity(), - new LockPatternUtils(getContext()), - ManagedLockPasswordProvider.get(getContext(), MY_USER_ID)); - addPreferencesFromResource(resid); - - // lock after preference - mLockAfter = (TimeoutListPreference) findPreference(KEY_LOCK_AFTER_TIMEOUT); - if (mLockAfter != null) { - setupLockAfterPreference(); - updateLockAfterPreferenceSummary(); - } - - // visible pattern - mVisiblePattern = (SwitchPreference) findPreference(KEY_VISIBLE_PATTERN); - - // lock instantly on power key press - mPowerButtonInstantlyLocks = (SwitchPreference) findPreference( - KEY_POWER_INSTANTLY_LOCKS); - CharSequence trustAgentLabel = getActiveTrustAgentLabel(getContext(), - mTrustAgentManager, mLockPatternUtils, mDPM); - if (mPowerButtonInstantlyLocks != null && !TextUtils.isEmpty(trustAgentLabel)) { - mPowerButtonInstantlyLocks.setSummary(getString( - R.string.lockpattern_settings_power_button_instantly_locks_summary, - trustAgentLabel)); - } - - mOwnerInfoPreferenceController.displayPreference(getPreferenceScreen()); - mOwnerInfoPreferenceController.updateEnableState(); - - for (int i = 0; i < SWITCH_PREFERENCE_KEYS.length; i++) { - final Preference pref = findPreference(SWITCH_PREFERENCE_KEYS[i]); - if (pref != null) pref.setOnPreferenceChangeListener(this); - } - } - - private void setupLockAfterPreference() { - // Compatible with pre-Froyo - long currentTimeout = Settings.Secure.getLong(getContentResolver(), - Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); - mLockAfter.setValue(String.valueOf(currentTimeout)); - mLockAfter.setOnPreferenceChangeListener(this); - if (mDPM != null) { - final EnforcedAdmin admin = RestrictedLockUtils.checkIfMaximumTimeToLockIsSet( - getActivity()); - final long adminTimeout = mDPM - .getMaximumTimeToLockForUserAndProfiles(UserHandle.myUserId()); - final long displayTimeout = Math.max(0, - Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0)); - // This setting is a slave to display timeout when a device policy is enforced. - // As such, maxLockTimeout = adminTimeout - displayTimeout. - // If there isn't enough time, shows "immediately" setting. - final long maxTimeout = Math.max(0, adminTimeout - displayTimeout); - mLockAfter.removeUnusableTimeouts(maxTimeout, admin); - } - } - - private void updateLockAfterPreferenceSummary() { - final String summary; - if (mLockAfter.isDisabledByAdmin()) { - summary = getString(R.string.disabled_by_policy_title); - } else { - // Update summary message with current value - long currentTimeout = Settings.Secure.getLong(getContentResolver(), - Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); - final CharSequence[] entries = mLockAfter.getEntries(); - final CharSequence[] values = mLockAfter.getEntryValues(); - int best = 0; - for (int i = 0; i < values.length; i++) { - long timeout = Long.valueOf(values[i].toString()); - if (currentTimeout >= timeout) { - best = i; - } - } - - CharSequence trustAgentLabel = getActiveTrustAgentLabel(getContext(), - mTrustAgentManager, mLockPatternUtils, mDPM); - if (!TextUtils.isEmpty(trustAgentLabel)) { - if (Long.valueOf(values[best].toString()) == 0) { - summary = getString(R.string.lock_immediately_summary_with_exception, - trustAgentLabel); - } else { - summary = getString(R.string.lock_after_timeout_summary_with_exception, - entries[best], trustAgentLabel); - } - } else { - summary = getString(R.string.lock_after_timeout_summary, entries[best]); - } - } - mLockAfter.setSummary(summary); - } - - @Override - public void onOwnerInfoUpdated() { - mOwnerInfoPreferenceController.updateSummary(); - } - - private static int getResIdForLockUnlockSubScreen(Context context, - LockPatternUtils lockPatternUtils, - ManagedLockPasswordProvider managedPasswordProvider) { - if (lockPatternUtils.isSecure(MY_USER_ID)) { - switch (lockPatternUtils.getKeyguardStoredPasswordQuality(MY_USER_ID)) { - case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: - return R.xml.security_settings_pattern_sub; - case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: - case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: - return R.xml.security_settings_pin_sub; - case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: - case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: - case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: - return R.xml.security_settings_password_sub; - case DevicePolicyManager.PASSWORD_QUALITY_MANAGED: - return managedPasswordProvider.getResIdForLockUnlockSubScreen(); - } - } else if (!lockPatternUtils.isLockScreenDisabled(MY_USER_ID)) { - return R.xml.security_settings_slide_sub; - } - return 0; - } - - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - String key = preference.getKey(); - if (KEY_POWER_INSTANTLY_LOCKS.equals(key)) { - mLockPatternUtils.setPowerButtonInstantlyLocks((Boolean) value, MY_USER_ID); - } else if (KEY_LOCK_AFTER_TIMEOUT.equals(key)) { - int timeout = Integer.parseInt((String) value); - try { - Settings.Secure.putInt(getContentResolver(), - Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout); - } catch (NumberFormatException e) { - Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e); - } - setupLockAfterPreference(); - updateLockAfterPreferenceSummary(); - } else if (KEY_VISIBLE_PATTERN.equals(key)) { - mLockPatternUtils.setVisiblePatternEnabled((Boolean) value, MY_USER_ID); - } - return true; - } - } - public static class UnificationConfirmationDialog extends InstrumentedDialogFragment { private static final String EXTRA_COMPLIANT = "compliant"; diff --git a/src/com/android/settings/security/SecuritySubSettings.java b/src/com/android/settings/security/SecuritySubSettings.java new file mode 100644 index 00000000000..d9f2f2c2e4e --- /dev/null +++ b/src/com/android/settings/security/SecuritySubSettings.java @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2017 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.security; + +import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; + +import android.app.admin.DevicePolicyManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.UserHandle; +import android.provider.Settings; +import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.text.TextUtils; +import android.util.Log; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.widget.LockPatternUtils; +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.TimeoutListPreference; +import com.android.settings.overlay.FeatureFactory; +import com.android.settings.password.ManagedLockPasswordProvider; +import com.android.settings.security.trustagent.TrustAgentManager; +import com.android.settingslib.RestrictedLockUtils; + +import java.util.ArrayList; + +public class SecuritySubSettings extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener, + OwnerInfoPreferenceController.OwnerInfoCallback { + + private static final String TAG = "SecuritySubSettings"; + + private static final String KEY_VISIBLE_PATTERN = "visiblepattern"; + private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout"; + private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks"; + + // These switch preferences need special handling since they're not all stored in Settings. + private static final String SWITCH_PREFERENCE_KEYS[] = { + KEY_LOCK_AFTER_TIMEOUT, KEY_VISIBLE_PATTERN, KEY_POWER_INSTANTLY_LOCKS}; + private static final int MY_USER_ID = UserHandle.myUserId(); + + private TimeoutListPreference mLockAfter; + private SwitchPreference mVisiblePattern; + private SwitchPreference mPowerButtonInstantlyLocks; + + private TrustAgentManager mTrustAgentManager; + private LockPatternUtils mLockPatternUtils; + private DevicePolicyManager mDPM; + private OwnerInfoPreferenceController mOwnerInfoPreferenceController; + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.SECURITY; + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + SecurityFeatureProvider securityFeatureProvider = + FeatureFactory.getFactory(getActivity()).getSecurityFeatureProvider(); + mTrustAgentManager = securityFeatureProvider.getTrustAgentManager(); + mLockPatternUtils = new LockPatternUtils(getContext()); + mDPM = getContext().getSystemService(DevicePolicyManager.class); + mOwnerInfoPreferenceController = + new OwnerInfoPreferenceController(getContext(), this, null /* lifecycle */); + createPreferenceHierarchy(); + } + + @Override + public void onResume() { + super.onResume(); + + createPreferenceHierarchy(); + + if (mVisiblePattern != null) { + mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled(MY_USER_ID)); + } + if (mPowerButtonInstantlyLocks != null) { + mPowerButtonInstantlyLocks.setChecked( + mLockPatternUtils.getPowerButtonInstantlyLocks(MY_USER_ID)); + } + + mOwnerInfoPreferenceController.updateSummary(); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + createPreferenceHierarchy(); + } + + private void createPreferenceHierarchy() { + PreferenceScreen root = getPreferenceScreen(); + if (root != null) { + root.removeAll(); + } + + final int resid = getResIdForLockUnlockSubScreen(new LockPatternUtils(getContext()), + ManagedLockPasswordProvider.get(getContext(), MY_USER_ID)); + addPreferencesFromResource(resid); + + // lock after preference + mLockAfter = (TimeoutListPreference) findPreference(KEY_LOCK_AFTER_TIMEOUT); + if (mLockAfter != null) { + setupLockAfterPreference(); + updateLockAfterPreferenceSummary(); + } + + // visible pattern + mVisiblePattern = (SwitchPreference) findPreference(KEY_VISIBLE_PATTERN); + + // lock instantly on power key press + mPowerButtonInstantlyLocks = (SwitchPreference) findPreference( + KEY_POWER_INSTANTLY_LOCKS); + CharSequence trustAgentLabel = getActiveTrustAgentLabel(getContext(), + mTrustAgentManager, mLockPatternUtils, mDPM); + if (mPowerButtonInstantlyLocks != null && !TextUtils.isEmpty(trustAgentLabel)) { + mPowerButtonInstantlyLocks.setSummary(getString( + R.string.lockpattern_settings_power_button_instantly_locks_summary, + trustAgentLabel)); + } + + mOwnerInfoPreferenceController.displayPreference(getPreferenceScreen()); + mOwnerInfoPreferenceController.updateEnableState(); + + for (int i = 0; i < SWITCH_PREFERENCE_KEYS.length; i++) { + final Preference pref = findPreference(SWITCH_PREFERENCE_KEYS[i]); + if (pref != null) pref.setOnPreferenceChangeListener(this); + } + } + + private void setupLockAfterPreference() { + // Compatible with pre-Froyo + long currentTimeout = Settings.Secure.getLong(getContentResolver(), + Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); + mLockAfter.setValue(String.valueOf(currentTimeout)); + mLockAfter.setOnPreferenceChangeListener(this); + if (mDPM != null) { + final RestrictedLockUtils.EnforcedAdmin admin = + RestrictedLockUtils.checkIfMaximumTimeToLockIsSet( + getActivity()); + final long adminTimeout = mDPM + .getMaximumTimeToLockForUserAndProfiles(UserHandle.myUserId()); + final long displayTimeout = Math.max(0, + Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0)); + // This setting is a slave to display timeout when a device policy is enforced. + // As such, maxLockTimeout = adminTimeout - displayTimeout. + // If there isn't enough time, shows "immediately" setting. + final long maxTimeout = Math.max(0, adminTimeout - displayTimeout); + mLockAfter.removeUnusableTimeouts(maxTimeout, admin); + } + } + + private void updateLockAfterPreferenceSummary() { + final String summary; + if (mLockAfter.isDisabledByAdmin()) { + summary = getString(R.string.disabled_by_policy_title); + } else { + // Update summary message with current value + long currentTimeout = Settings.Secure.getLong(getContentResolver(), + Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000); + final CharSequence[] entries = mLockAfter.getEntries(); + final CharSequence[] values = mLockAfter.getEntryValues(); + int best = 0; + for (int i = 0; i < values.length; i++) { + long timeout = Long.valueOf(values[i].toString()); + if (currentTimeout >= timeout) { + best = i; + } + } + + CharSequence trustAgentLabel = getActiveTrustAgentLabel(getContext(), + mTrustAgentManager, mLockPatternUtils, mDPM); + if (!TextUtils.isEmpty(trustAgentLabel)) { + if (Long.valueOf(values[best].toString()) == 0) { + summary = getString(R.string.lock_immediately_summary_with_exception, + trustAgentLabel); + } else { + summary = getString(R.string.lock_after_timeout_summary_with_exception, + entries[best], trustAgentLabel); + } + } else { + summary = getString(R.string.lock_after_timeout_summary, entries[best]); + } + } + mLockAfter.setSummary(summary); + } + + @Override + public void onOwnerInfoUpdated() { + mOwnerInfoPreferenceController.updateSummary(); + } + + static int getResIdForLockUnlockSubScreen(LockPatternUtils lockPatternUtils, + ManagedLockPasswordProvider managedPasswordProvider) { + if (lockPatternUtils.isSecure(MY_USER_ID)) { + switch (lockPatternUtils.getKeyguardStoredPasswordQuality(MY_USER_ID)) { + case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: + return R.xml.security_settings_pattern_sub; + case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: + case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: + return R.xml.security_settings_pin_sub; + case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: + case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: + case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: + return R.xml.security_settings_password_sub; + case DevicePolicyManager.PASSWORD_QUALITY_MANAGED: + return managedPasswordProvider.getResIdForLockUnlockSubScreen(); + } + } else if (!lockPatternUtils.isLockScreenDisabled(MY_USER_ID)) { + return R.xml.security_settings_slide_sub; + } + return 0; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object value) { + String key = preference.getKey(); + if (KEY_POWER_INSTANTLY_LOCKS.equals(key)) { + mLockPatternUtils.setPowerButtonInstantlyLocks((Boolean) value, MY_USER_ID); + } else if (KEY_LOCK_AFTER_TIMEOUT.equals(key)) { + int timeout = Integer.parseInt((String) value); + try { + Settings.Secure.putInt(getContentResolver(), + Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout); + } catch (NumberFormatException e) { + Log.e(TAG, "could not persist lockAfter timeout setting", e); + } + setupLockAfterPreference(); + updateLockAfterPreferenceSummary(); + } else if (KEY_VISIBLE_PATTERN.equals(key)) { + mLockPatternUtils.setVisiblePatternEnabled((Boolean) value, MY_USER_ID); + } + return true; + } + + private static CharSequence getActiveTrustAgentLabel(Context context, + TrustAgentManager trustAgentManager, LockPatternUtils utils, + DevicePolicyManager dpm) { + ArrayList agents = + SecuritySettings.getActiveTrustAgents(context, trustAgentManager, utils, dpm); + return agents.isEmpty() ? null : agents.get(0).title; + } +} diff --git a/src/com/android/settings/security/trustagent/TrustAgentSettings.java b/src/com/android/settings/security/trustagent/TrustAgentSettings.java index d3ec2d91dd2..c7001a03752 100644 --- a/src/com/android/settings/security/trustagent/TrustAgentSettings.java +++ b/src/com/android/settings/security/trustagent/TrustAgentSettings.java @@ -98,7 +98,7 @@ public class TrustAgentSettings extends SettingsPreferenceFragment implements super.onResume(); removePreference("dummy_preference"); updateAgents(); - }; + } private void updateAgents() { final Context context = getActivity(); diff --git a/tests/robotests/assets/grandfather_not_implementing_indexable b/tests/robotests/assets/grandfather_not_implementing_indexable index 608e44c459c..31b8f43d81f 100644 --- a/tests/robotests/assets/grandfather_not_implementing_indexable +++ b/tests/robotests/assets/grandfather_not_implementing_indexable @@ -71,7 +71,7 @@ com.android.settings.applications.ExternalSourcesDetails com.android.settings.applications.PictureInPictureSettings com.android.settings.applications.PictureInPictureDetails com.android.settings.ApnSettings -com.android.settings.SecuritySettings$SecuritySubSettings +com.android.settings.security.SecuritySubSettings com.android.settings.PrivacySettings com.android.settings.WifiCallingSettings com.android.settings.WifiCallingSettingsForSub diff --git a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java b/tests/robotests/src/com/android/settings/security/SecuritySettingsTest.java similarity index 92% rename from tests/robotests/src/com/android/settings/SecuritySettingsTest.java rename to tests/robotests/src/com/android/settings/security/SecuritySettingsTest.java index fc3478d25cc..827dd647761 100644 --- a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java +++ b/tests/robotests/src/com/android/settings/security/SecuritySettingsTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings; +package com.android.settings.security; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyInt; @@ -35,6 +35,8 @@ import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; import com.android.internal.widget.LockPatternUtils; +import com.android.settings.R; +import com.android.settings.TestConfig; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.notification.LockScreenNotificationPreferenceController; import com.android.settings.testutils.FakeFeatureFactory; @@ -56,11 +58,10 @@ import org.robolectric.util.ReflectionHelpers; import java.util.List; @RunWith(SettingsRobolectricTestRunner.class) -@Config( - manifest = TestConfig.MANIFEST_PATH, - sdk = TestConfig.SDK_VERSION, - shadows = {ShadowLockPatternUtils.class} -) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O, + shadows = { + ShadowLockPatternUtils.class + }) public class SecuritySettingsTest { @@ -104,7 +105,7 @@ public class SecuritySettingsTest { public void testSummaryProvider_noFpFeature_shouldSetSummaryWithNoFingerprint() { final FingerprintManager fpm = mock(FingerprintManager.class); when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) - .thenReturn(false); + .thenReturn(false); mSummaryProvider.setListening(true); @@ -115,7 +116,7 @@ public class SecuritySettingsTest { public void testSummaryProvider_noFpHardware_shouldSetSummaryWithNoFingerprint() { final FingerprintManager fpm = mock(FingerprintManager.class); when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) - .thenReturn(true); + .thenReturn(true); // Cast to Object to workaround a robolectric casting bug when((Object) mContext.getSystemService(FingerprintManager.class)).thenReturn(fpm); @@ -147,7 +148,7 @@ public class SecuritySettingsTest { securitySettings.initTrustAgentPreference(screen, 2); verify(preference).setSummary(context.getResources().getQuantityString( - R.plurals.manage_trust_agents_summary_on, 2, 2)); + R.plurals.manage_trust_agents_summary_on, 2, 2)); } @Test @@ -155,13 +156,13 @@ public class SecuritySettingsTest { final Preference preference = mock(Preference.class); final PreferenceGroup group = mock(PreferenceGroup.class); when(group.findPreference(SecuritySettings.KEY_LOCKSCREEN_PREFERENCES)) - .thenReturn(preference); + .thenReturn(preference); final LockScreenNotificationPreferenceController controller = - mock(LockScreenNotificationPreferenceController.class); + mock(LockScreenNotificationPreferenceController.class); final SecuritySettings securitySettings = new SecuritySettings(); ReflectionHelpers.setField(securitySettings, - "mLockScreenNotificationPreferenceController", controller); + "mLockScreenNotificationPreferenceController", controller); when(controller.getSummaryResource()).thenReturn(1234); securitySettings.setLockscreenPreferencesSummary(group);