Add page Settings->Security & lock screen->Lock screen preferences.

- add the new preference screen that contains configuration for lock
screen notification, add user when locked, and owner info.
- refactor SecuritySettings to use the new owner info controller.

Fix: 36163515
Test: make RunSettingsRoboTests

Change-Id: I3bada8f652f89ed0af7aebc03f0bf2f637296b4d
This commit is contained in:
Doris Ling
2017-03-16 13:20:15 -07:00
parent 866497392d
commit 93582995da
13 changed files with 520 additions and 38 deletions

View File

@@ -744,6 +744,10 @@
<string name="security_settings_title">Security &amp; screen lock</string>
<!-- Security Settings screen setting option title for the item to take you to the encryption and credential screen -->
<string name="encryption_and_credential_settings_title">Encryption &amp; credentials</string>
<!-- Security Settings screen setting option title for the item to take you to the lock screen preference screen [CHAR LIMIT=60] -->
<string name="lockscreen_settings_title">Lock screen preferences</string>
<!-- Security Settings screen setting option summary for the item to take you to the lock screen preference screen -->
<string name="lockscreen_settings_summary">Access settings in lock screen</string>
<!-- Main Settings screen setting option summary text for the item tot ake you to the security and location screen -->
<string name="security_settings_summary">Set My Location, screen unlock, SIM card lock, credential storage lock</string>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/lockscreen_settings_title">
<com.android.settings.notification.RestrictedDropDownPreference
android:key="lock_screen_notifications"
android:title="@string/lock_screen_notifications_title"
android:summary="%s"/>
<com.android.settingslib.RestrictedSwitchPreference
android:key="add_users_when_locked"
android:title="@string/user_add_on_lockscreen_menu"/>
<com.android.settingslib.RestrictedPreference
android:key="owner_info_settings"
android:title="@string/owner_info_settings_title"
android:summary="@string/owner_info_settings_summary"/>
</PreferenceScreen>

View File

@@ -29,6 +29,11 @@
settings:keywords="@string/keywords_lockscreen"
android:persistent="false"/>
<Preference android:key="lockscreen_preferences"
android:title="@string/lockscreen_settings_title"
android:summary="@string/lockscreen_settings_summary"
android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -28,6 +28,11 @@
android:summary="@string/unlock_set_unlock_mode_password"
settings:keywords="@string/keywords_lockscreen" />
<Preference android:key="lockscreen_preferences"
android:title="@string/lockscreen_settings_title"
android:summary="@string/lockscreen_settings_summary"
android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -28,6 +28,11 @@
android:summary="@string/unlock_set_unlock_mode_pattern"
settings:keywords="@string/keywords_lockscreen" />
<Preference android:key="lockscreen_preferences"
android:title="@string/lockscreen_settings_title"
android:summary="@string/lockscreen_settings_summary"
android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -28,6 +28,11 @@
android:summary="@string/unlock_set_unlock_mode_pin"
settings:keywords="@string/keywords_lockscreen" />
<Preference android:key="lockscreen_preferences"
android:title="@string/lockscreen_settings_title"
android:summary="@string/lockscreen_settings_summary"
android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -31,6 +31,7 @@ import android.widget.EditText;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.security.OwnerInfoPreferenceController.OwnerInfoCallback;
public class OwnerInfoSettings extends InstrumentedDialogFragment implements OnClickListener {
@@ -76,8 +77,8 @@ public class OwnerInfoSettings extends InstrumentedDialogFragment implements OnC
mLockPatternUtils.setOwnerInfoEnabled(!TextUtils.isEmpty(info), mUserId);
mLockPatternUtils.setOwnerInfo(info, mUserId);
if (getTargetFragment() instanceof SecuritySettings.SecuritySubSettings) {
((SecuritySettings.SecuritySubSettings) getTargetFragment()).updateOwnerInfo();
if (getTargetFragment() instanceof OwnerInfoCallback) {
((OwnerInfoCallback) getTargetFragment()).onOwnerInfoUpdated();
}
}
}

View File

@@ -16,7 +16,6 @@
package com.android.settings;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -67,6 +66,7 @@ import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.search2.SearchFeatureProvider;
import com.android.settings.security.OwnerInfoPreferenceController;
import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.trustagent.TrustAgentManager;
import com.android.settings.widget.GearPreference;
@@ -917,11 +917,10 @@ public class SecuritySettings extends SettingsPreferenceFragment
}
public static class SecuritySubSettings extends SettingsPreferenceFragment
implements OnPreferenceChangeListener {
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_OWNER_INFO_SETTINGS = "owner_info_settings";
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.
@@ -931,11 +930,11 @@ public class SecuritySettings extends SettingsPreferenceFragment
private TimeoutListPreference mLockAfter;
private SwitchPreference mVisiblePattern;
private SwitchPreference mPowerButtonInstantlyLocks;
private RestrictedPreference mOwnerInfoPref;
private TrustAgentManager mTrustAgentManager;
private LockPatternUtils mLockPatternUtils;
private DevicePolicyManager mDPM;
private OwnerInfoPreferenceController mOwnerInfoPreferenceController;
@Override
public int getMetricsCategory() {
@@ -950,6 +949,8 @@ public class SecuritySettings extends SettingsPreferenceFragment
mTrustAgentManager = securityFeatureProvider.getTrustAgentManager();
mLockPatternUtils = new LockPatternUtils(getContext());
mDPM = getContext().getSystemService(DevicePolicyManager.class);
mOwnerInfoPreferenceController =
new OwnerInfoPreferenceController(getContext(), this, null /* lifecycle */);
createPreferenceHierarchy();
}
@@ -968,7 +969,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
mLockPatternUtils.getPowerButtonInstantlyLocks(MY_USER_ID));
}
updateOwnerInfo();
mOwnerInfoPreferenceController.updateSummary();
}
@Override
@@ -1010,26 +1011,8 @@ public class SecuritySettings extends SettingsPreferenceFragment
trustAgentLabel));
}
mOwnerInfoPref = (RestrictedPreference) findPreference(KEY_OWNER_INFO_SETTINGS);
if (mOwnerInfoPref != null) {
if (mLockPatternUtils.isDeviceOwnerInfoEnabled()) {
EnforcedAdmin admin = RestrictedLockUtils.getDeviceOwner(getActivity());
mOwnerInfoPref.setDisabledByAdmin(admin);
} else {
mOwnerInfoPref.setDisabledByAdmin(null);
mOwnerInfoPref.setEnabled(!mLockPatternUtils.isLockScreenDisabled(MY_USER_ID));
if (mOwnerInfoPref.isEnabled()) {
mOwnerInfoPref.setOnPreferenceClickListener(
new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
OwnerInfoSettings.show(SecuritySubSettings.this);
return true;
}
});
}
}
}
mOwnerInfoPreferenceController.displayPreference(getPreferenceScreen());
mOwnerInfoPreferenceController.updateEnableState();
for (int i = 0; i < SWITCH_PREFERENCE_KEYS.length; i++) {
final Preference pref = findPreference(SWITCH_PREFERENCE_KEYS[i]);
@@ -1093,17 +1076,9 @@ public class SecuritySettings extends SettingsPreferenceFragment
mLockAfter.setSummary(summary);
}
public void updateOwnerInfo() {
if (mOwnerInfoPref != null) {
if (mLockPatternUtils.isDeviceOwnerInfoEnabled()) {
mOwnerInfoPref.setSummary(
mLockPatternUtils.getDeviceOwnerInfo());
} else {
mOwnerInfoPref.setSummary(mLockPatternUtils.isOwnerInfoEnabled(MY_USER_ID)
? mLockPatternUtils.getOwnerInfo(MY_USER_ID)
: getString(R.string.owner_info_settings_summary));
}
}
@Override
public void onOwnerInfoUpdated() {
mOwnerInfoPreferenceController.updateSummary();
}
private static int getResIdForLockUnlockSubScreen(Context context,

View File

@@ -111,6 +111,7 @@ import com.android.settings.notification.ZenModeSettings;
import com.android.settings.notification.ZenModeVisualInterruptionSettings;
import com.android.settings.print.PrintJobSettingsFragment;
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.security.LockscreenDashboardFragment;
import com.android.settings.sim.SimSettings;
import com.android.settings.system.SystemDashboardFragment;
import com.android.settings.tts.TextToSpeechSettings;
@@ -242,6 +243,7 @@ public class SettingsGateway {
UserAndAccountDashboardFragment.class.getName(),
EnterprisePrivacySettings.class.getName(),
WebViewAppPicker.class.getName(),
LockscreenDashboardFragment.class.getName(),
};
public static final String[] SETTINGS_FOR_RESTRICTED = {

View File

@@ -70,6 +70,7 @@ import com.android.settings.notification.ZenModePrioritySettings;
import com.android.settings.notification.ZenModeSettings;
import com.android.settings.notification.ZenModeVisualInterruptionSettings;
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.security.LockscreenDashboardFragment;
import com.android.settings.sim.SimSettings;
import com.android.settings.system.SystemDashboardFragment;
import com.android.settings.tts.TtsEnginePreferenceFragment;
@@ -170,6 +171,8 @@ public final class SearchIndexableResources {
addIndex(PaymentSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_nfc_payment);
addIndex(
TtsEnginePreferenceFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
addIndex(LockscreenDashboardFragment.class, R.xml.security_lockscreen_settings,
R.drawable.ic_settings_security);
}
private SearchIndexableResources() {

View File

@@ -0,0 +1,103 @@
/*
* 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 android.content.Context;
import android.provider.SearchIndexableResource;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.accounts.AddUserWhenLockedPreferenceController;
import com.android.settings.core.PreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.notification.LockScreenNotificationPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Settings screen for lock screen preference
*/
public class LockscreenDashboardFragment extends DashboardFragment
implements OwnerInfoPreferenceController.OwnerInfoCallback {
private static final String TAG = "LockscreenDashboardFragment";
private OwnerInfoPreferenceController mOwnerInfoPreferenceController;
@Override
public int getMetricsCategory() {
return MetricsEvent.SETTINGS_LOCK_SCREEN_PREFERENCES;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.security_lockscreen_settings;
}
@Override
protected List<PreferenceController> getPreferenceControllers(Context context) {
final List<PreferenceController> controllers = new ArrayList<>();
final Lifecycle lifecycle = getLifecycle();
final LockScreenNotificationPreferenceController notificationController =
new LockScreenNotificationPreferenceController(context);
lifecycle.addObserver(notificationController);
controllers.add(notificationController);
final AddUserWhenLockedPreferenceController addUserWhenLockedController =
new AddUserWhenLockedPreferenceController(context);
lifecycle.addObserver(addUserWhenLockedController);
controllers.add(addUserWhenLockedController);
mOwnerInfoPreferenceController =
new OwnerInfoPreferenceController(context, this, lifecycle);
controllers.add(mOwnerInfoPreferenceController);
return controllers;
}
@Override
public void onOwnerInfoUpdated() {
if (mOwnerInfoPreferenceController != null) {
mOwnerInfoPreferenceController.updateSummary();
}
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(
Context context, boolean enabled) {
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.security_lockscreen_settings;
return Arrays.asList(sir);
}
@Override
public List<PreferenceController> getPreferenceControllers(Context context) {
final List<PreferenceController> controllers = new ArrayList<>();
controllers.add(new LockScreenNotificationPreferenceController(context));
controllers.add(new AddUserWhenLockedPreferenceController(context));
controllers.add(new OwnerInfoPreferenceController(
context, null /* fragment */, null /* lifecycle */));
return controllers;
}
};
}

View File

@@ -0,0 +1,142 @@
/*
* 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 android.app.Fragment;
import android.content.Context;
import android.os.UserHandle;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.support.v7.preference.PreferenceScreen;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.OwnerInfoSettings;
import com.android.settings.core.PreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.core.lifecycle.events.OnResume;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedPreference;
public class OwnerInfoPreferenceController extends PreferenceController
implements LifecycleObserver, OnResume {
private static final String KEY_OWNER_INFO = "owner_info_settings";
private static final int MY_USER_ID = UserHandle.myUserId();
private final LockPatternUtils mLockPatternUtils;
private final Fragment mParent;
private RestrictedPreference mOwnerInfoPref;
// Container fragment should implement this in order to show the correct summary
public interface OwnerInfoCallback {
public void onOwnerInfoUpdated();
}
public OwnerInfoPreferenceController(Context context, Fragment parent, Lifecycle lifecycle ) {
super(context);
mParent = parent;
mLockPatternUtils = new LockPatternUtils(context);
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override
public void displayPreference(PreferenceScreen screen) {
mOwnerInfoPref = (RestrictedPreference) screen.findPreference(KEY_OWNER_INFO);
}
@Override
public void onResume() {
updateEnableState();
updateSummary();
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public String getPreferenceKey() {
return KEY_OWNER_INFO;
}
public void updateEnableState() {
if (mOwnerInfoPref == null) {
return;
}
if (isDeviceOwnerInfoEnabled()) {
EnforcedAdmin admin = getDeviceOwner();
mOwnerInfoPref.setDisabledByAdmin(admin);
} else {
mOwnerInfoPref.setDisabledByAdmin(null);
mOwnerInfoPref.setEnabled(!mLockPatternUtils.isLockScreenDisabled(MY_USER_ID));
if (mOwnerInfoPref.isEnabled()) {
mOwnerInfoPref.setOnPreferenceClickListener(
new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
OwnerInfoSettings.show(mParent);
return true;
}
});
}
}
}
public void updateSummary() {
if (mOwnerInfoPref != null) {
if (isDeviceOwnerInfoEnabled()) {
mOwnerInfoPref.setSummary(
getDeviceOwnerInfo());
} else {
mOwnerInfoPref.setSummary(isOwnerInfoEnabled()
? getOwnerInfo()
: mContext.getString(
com.android.settings.R.string.owner_info_settings_summary));
}
}
}
// Wrapper methods to allow testing
@VisibleForTesting
boolean isDeviceOwnerInfoEnabled() {
return mLockPatternUtils.isDeviceOwnerInfoEnabled();
}
@VisibleForTesting
String getDeviceOwnerInfo() {
return mLockPatternUtils.getDeviceOwnerInfo();
}
@VisibleForTesting
boolean isOwnerInfoEnabled() {
return mLockPatternUtils.isOwnerInfoEnabled(MY_USER_ID);
}
@VisibleForTesting
String getOwnerInfo() {
return mLockPatternUtils.getOwnerInfo(MY_USER_ID);
}
@VisibleForTesting
EnforcedAdmin getDeviceOwner() {
return RestrictedLockUtils.getDeviceOwner(mContext);
}
}

View File

@@ -0,0 +1,197 @@
/*
* 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 android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.support.v7.preference.PreferenceScreen;
import android.support.v14.preference.PreferenceFragment;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.OwnerInfoSettings;
import com.android.settings.R;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedPreference;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import org.robolectric.util.ReflectionHelpers;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class OwnerInfoPreferenceControllerTest {
@Mock(answer = RETURNS_DEEP_STUBS)
private PreferenceFragment mFragment;
@Mock
private PreferenceScreen mScreen;
@Mock
private FragmentManager mFragmentManager;
@Mock
private FragmentTransaction mFragmentTransaction;
@Mock
private RestrictedPreference mPreference;
@Mock
private LockPatternUtils mLockPatternUtils;
private Context mContext;
private OwnerInfoPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowApplication shadowContext = ShadowApplication.getInstance();
mContext = spy(shadowContext.getApplicationContext());
when(mFragment.isAdded()).thenReturn(true);
when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
when(mFragment.getFragmentManager()).thenReturn(mFragmentManager);
when(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction);
mController = spy(new OwnerInfoPreferenceController(mContext, mFragment, null));
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
ReflectionHelpers.setField(mController, "mLockPatternUtils", mLockPatternUtils);
}
@Test
public void isAvailable_shouldReturnTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void onResume_shouldUpdateEnableState() {
mController.onResume();
verify(mController).updateEnableState();
}
@Test
public void onResume_shouldUpdateSummary() {
mController.onResume();
verify(mController).updateSummary();
}
@Test
public void updateSummary_deviceOwnerInfoEnabled_shouldSetDeviceOwnerInfoSummary() {
final String deviceOwnerInfo = "Test Device Owner Info";
doReturn(true).when(mController).isDeviceOwnerInfoEnabled();
doReturn(deviceOwnerInfo).when(mController).getDeviceOwnerInfo();
mController.displayPreference(mScreen);
mController.updateSummary();
verify(mPreference).setSummary(deviceOwnerInfo);
}
@Test
public void updateSummary_ownerInfoEnabled_shouldSetOwnerInfoSummary() {
final String ownerInfo = "Test Owner Info";
doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
doReturn(true).when(mController).isOwnerInfoEnabled();
doReturn(ownerInfo).when(mController).getOwnerInfo();
mController.displayPreference(mScreen);
mController.updateSummary();
verify(mPreference).setSummary(ownerInfo);
}
@Test
public void updateSummary_ownerInfoDisabled_shouldSetDefaultSummary() {
doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
doReturn(false).when(mController).isOwnerInfoEnabled();
mController.displayPreference(mScreen);
mController.updateSummary();
verify(mPreference).setSummary(mContext.getString(
com.android.settings.R.string.owner_info_settings_summary));
}
@Test
public void updateEnableState_deviceOwnerInfoEnabled_shouldSetDisabledByAdmin() {
doReturn(true).when(mController).isDeviceOwnerInfoEnabled();
doReturn(mock(EnforcedAdmin.class)).when(mController).getDeviceOwner();
mController.displayPreference(mScreen);
mController.updateEnableState();
verify(mPreference).setDisabledByAdmin(any(EnforcedAdmin.class));
}
@Test
public void updateEnableState_lockScreenDisabled_shouldDisablePreference() {
doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
doReturn(true).when(mLockPatternUtils).isLockScreenDisabled(anyInt());
mController.displayPreference(mScreen);
mController.updateEnableState();
verify(mPreference).setEnabled(false);
}
@Test
public void updateEnableState_lockScreenEnabled_shouldEnablePreference() {
doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
doReturn(false).when(mLockPatternUtils).isLockScreenDisabled(anyInt());
mController.displayPreference(mScreen);
mController.updateEnableState();
verify(mPreference).setEnabled(true);
}
@Test
public void performClick_shouldLaunchOwnerInfoSettings() {
final ShadowApplication application = ShadowApplication.getInstance();
final RestrictedPreference preference =
new RestrictedPreference(application.getApplicationContext());
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(preference);
doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
doReturn(false).when(mLockPatternUtils).isLockScreenDisabled(anyInt());
mController.displayPreference(mScreen);
mController.updateEnableState();
preference.performClick();
verify(mFragment).getFragmentManager();
verify(mFragment.getFragmentManager().beginTransaction())
.add(any(OwnerInfoSettings.class), anyString());
}
}