Loading core/java/com/android/internal/widget/LockPatternUtils.java +17 −1 Original line number Diff line number Diff line Loading @@ -538,6 +538,14 @@ public class LockPatternUtils { return getBoolean(PATTERN_EVER_CHOSEN_KEY, false, userId); } /** * Records that the user has chosen a pattern at some time, even if the pattern is * currently cleared. */ public void reportPatternWasChosen(int userId) { setBoolean(PATTERN_EVER_CHOSEN_KEY, true, userId); } /** * Used by device policy manager to validate the current password * information it has. Loading Loading @@ -656,7 +664,7 @@ public class LockPatternUtils { } } setBoolean(PATTERN_EVER_CHOSEN_KEY, true, userId); reportPatternWasChosen(userId); onAfterChangingPassword(userId); } catch (RemoteException re) { Log.e(TAG, "Couldn't save lock pattern " + re); Loading Loading @@ -1125,6 +1133,10 @@ public class LockPatternUtils { } } public boolean isVisiblePatternEverChosen(int userId) { return getString(Settings.Secure.LOCK_PATTERN_VISIBLE, userId) != null; } /** * Set whether the visible password is enabled for cryptkeeper screen. */ Loading Loading @@ -1252,6 +1264,10 @@ public class LockPatternUtils { return getBoolean(LOCKSCREEN_POWER_BUTTON_INSTANTLY_LOCKS, true, userId); } public boolean isPowerButtonInstantlyLocksEverChosen(int userId) { return getString(LOCKSCREEN_POWER_BUTTON_INSTANTLY_LOCKS, userId) != null; } public void setEnabledTrustAgents(Collection<ComponentName> activeTrustAgents, int userId) { StringBuilder sb = new StringBuilder(); for (ComponentName cn : activeTrustAgents) { Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +38 −15 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.providers.settings; import android.annotation.UserIdInt; import android.app.backup.BackupAgentHelper; import android.app.backup.BackupDataInput; import android.app.backup.BackupDataOutput; Loading Loading @@ -133,6 +134,10 @@ public class SettingsBackupAgent extends BackupAgentHelper { // Keys within the lock settings section private static final String KEY_LOCK_SETTINGS_OWNER_INFO_ENABLED = "owner_info_enabled"; private static final String KEY_LOCK_SETTINGS_OWNER_INFO = "owner_info"; private static final String KEY_LOCK_SETTINGS_VISIBLE_PATTERN_ENABLED = "visible_pattern_enabled"; private static final String KEY_LOCK_SETTINGS_POWER_BUTTON_INSTANTLY_LOCKS = "power_button_instantly_locks"; // Name of the temporary file we use during full backup/restore. This is // stored in the full-backup tarfile as well, so should not be changed. Loading @@ -158,7 +163,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); byte[] lockSettingsData = getLockSettings(); byte[] lockSettingsData = getLockSettings(UserHandle.myUserId()); byte[] locale = mSettingsHelper.getLocaleData(); byte[] softApConfigData = getSoftAPConfiguration(); byte[] netPoliciesData = getNetworkPolicies(); Loading Loading @@ -236,7 +241,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { break; case KEY_LOCK_SETTINGS : restoreLockSettings(data); restoreLockSettings(UserHandle.myUserId(), data); break; case KEY_SOFTAP_CONFIG : Loading Loading @@ -275,7 +280,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); byte[] lockSettingsData = getLockSettings(); byte[] lockSettingsData = getLockSettings(UserHandle.myUserId()); byte[] locale = mSettingsHelper.getLocaleData(); byte[] softApConfigData = getSoftAPConfiguration(); byte[] netPoliciesData = getNetworkPolicies(); Loading Loading @@ -405,7 +410,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { if (nBytes > buffer.length) buffer = new byte[nBytes]; if (nBytes > 0) { in.readFully(buffer, 0, nBytes); restoreLockSettings(buffer, nBytes); restoreLockSettings(UserHandle.myUserId(), buffer, nBytes); } } // softap config Loading Loading @@ -531,12 +536,16 @@ public class SettingsBackupAgent extends BackupAgentHelper { } /** * Serialize the owner info settings * Serialize the owner info and other lock settings */ private byte[] getLockSettings() { private byte[] getLockSettings(@UserIdInt int userId) { final LockPatternUtils lockPatternUtils = new LockPatternUtils(this); final boolean ownerInfoEnabled = lockPatternUtils.isOwnerInfoEnabled(UserHandle.myUserId()); final String ownerInfo = lockPatternUtils.getOwnerInfo(UserHandle.myUserId()); final boolean ownerInfoEnabled = lockPatternUtils.isOwnerInfoEnabled(userId); final String ownerInfo = lockPatternUtils.getOwnerInfo(userId); final boolean lockPatternEnabled = lockPatternUtils.isLockPatternEnabled(userId); final boolean visiblePatternEnabled = lockPatternUtils.isVisiblePatternEnabled(userId); final boolean powerButtonInstantlyLocks = lockPatternUtils.getPowerButtonInstantlyLocks(userId); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(baos); Loading @@ -547,6 +556,14 @@ public class SettingsBackupAgent extends BackupAgentHelper { out.writeUTF(KEY_LOCK_SETTINGS_OWNER_INFO); out.writeUTF(ownerInfo != null ? ownerInfo : ""); } if (lockPatternUtils.isVisiblePatternEverChosen(userId)) { out.writeUTF(KEY_LOCK_SETTINGS_VISIBLE_PATTERN_ENABLED); out.writeUTF(visiblePatternEnabled ? "1" : "0"); } if (lockPatternUtils.isPowerButtonInstantlyLocksEverChosen(userId)) { out.writeUTF(KEY_LOCK_SETTINGS_POWER_BUTTON_INSTANTLY_LOCKS); out.writeUTF(powerButtonInstantlyLocks ? "1" : "0"); } // End marker out.writeUTF(""); out.flush(); Loading Loading @@ -632,12 +649,12 @@ public class SettingsBackupAgent extends BackupAgentHelper { } /** * Restores the owner info enabled and owner info settings in LockSettings. * Restores the owner info enabled and other settings in LockSettings. * * @param buffer * @param nBytes */ private void restoreLockSettings(byte[] buffer, int nBytes) { private void restoreLockSettings(@UserIdInt int userId, byte[] buffer, int nBytes) { final LockPatternUtils lockPatternUtils = new LockPatternUtils(this); ByteArrayInputStream bais = new ByteArrayInputStream(buffer, 0, nBytes); Loading @@ -652,11 +669,17 @@ public class SettingsBackupAgent extends BackupAgentHelper { } switch (key) { case KEY_LOCK_SETTINGS_OWNER_INFO_ENABLED: lockPatternUtils.setOwnerInfoEnabled("1".equals(value), UserHandle.myUserId()); lockPatternUtils.setOwnerInfoEnabled("1".equals(value), userId); break; case KEY_LOCK_SETTINGS_OWNER_INFO: lockPatternUtils.setOwnerInfo(value, UserHandle.myUserId()); lockPatternUtils.setOwnerInfo(value, userId); break; case KEY_LOCK_SETTINGS_VISIBLE_PATTERN_ENABLED: lockPatternUtils.reportPatternWasChosen(userId); lockPatternUtils.setVisiblePatternEnabled("1".equals(value), userId); break; case KEY_LOCK_SETTINGS_POWER_BUTTON_INSTANTLY_LOCKS: lockPatternUtils.setPowerButtonInstantlyLocks("1".equals(value), userId); break; } } Loading @@ -665,7 +688,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { } } private void restoreLockSettings(BackupDataInput data) { private void restoreLockSettings(@UserIdInt int userId, BackupDataInput data) { final byte[] settings = new byte[data.getDataSize()]; try { data.readEntityData(settings, 0, settings.length); Loading @@ -673,7 +696,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { Log.e(TAG, "Couldn't read entity data"); return; } restoreLockSettings(settings, settings.length); restoreLockSettings(userId, settings, settings.length); } /** Loading services/core/java/com/android/server/locksettings/LockSettingsService.java +3 −1 Original line number Diff line number Diff line Loading @@ -1789,7 +1789,9 @@ public class LockSettingsService extends ILockSettings.Stub { private static final String[] SETTINGS_TO_BACKUP = new String[] { Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, Secure.LOCK_SCREEN_OWNER_INFO Secure.LOCK_SCREEN_OWNER_INFO, Secure.LOCK_PATTERN_VISIBLE, LockPatternUtils.LOCKSCREEN_POWER_BUTTON_INSTANTLY_LOCKS }; private class GateKeeperDiedRecipient implements IBinder.DeathRecipient { Loading Loading
core/java/com/android/internal/widget/LockPatternUtils.java +17 −1 Original line number Diff line number Diff line Loading @@ -538,6 +538,14 @@ public class LockPatternUtils { return getBoolean(PATTERN_EVER_CHOSEN_KEY, false, userId); } /** * Records that the user has chosen a pattern at some time, even if the pattern is * currently cleared. */ public void reportPatternWasChosen(int userId) { setBoolean(PATTERN_EVER_CHOSEN_KEY, true, userId); } /** * Used by device policy manager to validate the current password * information it has. Loading Loading @@ -656,7 +664,7 @@ public class LockPatternUtils { } } setBoolean(PATTERN_EVER_CHOSEN_KEY, true, userId); reportPatternWasChosen(userId); onAfterChangingPassword(userId); } catch (RemoteException re) { Log.e(TAG, "Couldn't save lock pattern " + re); Loading Loading @@ -1125,6 +1133,10 @@ public class LockPatternUtils { } } public boolean isVisiblePatternEverChosen(int userId) { return getString(Settings.Secure.LOCK_PATTERN_VISIBLE, userId) != null; } /** * Set whether the visible password is enabled for cryptkeeper screen. */ Loading Loading @@ -1252,6 +1264,10 @@ public class LockPatternUtils { return getBoolean(LOCKSCREEN_POWER_BUTTON_INSTANTLY_LOCKS, true, userId); } public boolean isPowerButtonInstantlyLocksEverChosen(int userId) { return getString(LOCKSCREEN_POWER_BUTTON_INSTANTLY_LOCKS, userId) != null; } public void setEnabledTrustAgents(Collection<ComponentName> activeTrustAgents, int userId) { StringBuilder sb = new StringBuilder(); for (ComponentName cn : activeTrustAgents) { Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +38 −15 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.providers.settings; import android.annotation.UserIdInt; import android.app.backup.BackupAgentHelper; import android.app.backup.BackupDataInput; import android.app.backup.BackupDataOutput; Loading Loading @@ -133,6 +134,10 @@ public class SettingsBackupAgent extends BackupAgentHelper { // Keys within the lock settings section private static final String KEY_LOCK_SETTINGS_OWNER_INFO_ENABLED = "owner_info_enabled"; private static final String KEY_LOCK_SETTINGS_OWNER_INFO = "owner_info"; private static final String KEY_LOCK_SETTINGS_VISIBLE_PATTERN_ENABLED = "visible_pattern_enabled"; private static final String KEY_LOCK_SETTINGS_POWER_BUTTON_INSTANTLY_LOCKS = "power_button_instantly_locks"; // Name of the temporary file we use during full backup/restore. This is // stored in the full-backup tarfile as well, so should not be changed. Loading @@ -158,7 +163,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); byte[] lockSettingsData = getLockSettings(); byte[] lockSettingsData = getLockSettings(UserHandle.myUserId()); byte[] locale = mSettingsHelper.getLocaleData(); byte[] softApConfigData = getSoftAPConfiguration(); byte[] netPoliciesData = getNetworkPolicies(); Loading Loading @@ -236,7 +241,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { break; case KEY_LOCK_SETTINGS : restoreLockSettings(data); restoreLockSettings(UserHandle.myUserId(), data); break; case KEY_SOFTAP_CONFIG : Loading Loading @@ -275,7 +280,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); byte[] lockSettingsData = getLockSettings(); byte[] lockSettingsData = getLockSettings(UserHandle.myUserId()); byte[] locale = mSettingsHelper.getLocaleData(); byte[] softApConfigData = getSoftAPConfiguration(); byte[] netPoliciesData = getNetworkPolicies(); Loading Loading @@ -405,7 +410,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { if (nBytes > buffer.length) buffer = new byte[nBytes]; if (nBytes > 0) { in.readFully(buffer, 0, nBytes); restoreLockSettings(buffer, nBytes); restoreLockSettings(UserHandle.myUserId(), buffer, nBytes); } } // softap config Loading Loading @@ -531,12 +536,16 @@ public class SettingsBackupAgent extends BackupAgentHelper { } /** * Serialize the owner info settings * Serialize the owner info and other lock settings */ private byte[] getLockSettings() { private byte[] getLockSettings(@UserIdInt int userId) { final LockPatternUtils lockPatternUtils = new LockPatternUtils(this); final boolean ownerInfoEnabled = lockPatternUtils.isOwnerInfoEnabled(UserHandle.myUserId()); final String ownerInfo = lockPatternUtils.getOwnerInfo(UserHandle.myUserId()); final boolean ownerInfoEnabled = lockPatternUtils.isOwnerInfoEnabled(userId); final String ownerInfo = lockPatternUtils.getOwnerInfo(userId); final boolean lockPatternEnabled = lockPatternUtils.isLockPatternEnabled(userId); final boolean visiblePatternEnabled = lockPatternUtils.isVisiblePatternEnabled(userId); final boolean powerButtonInstantlyLocks = lockPatternUtils.getPowerButtonInstantlyLocks(userId); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(baos); Loading @@ -547,6 +556,14 @@ public class SettingsBackupAgent extends BackupAgentHelper { out.writeUTF(KEY_LOCK_SETTINGS_OWNER_INFO); out.writeUTF(ownerInfo != null ? ownerInfo : ""); } if (lockPatternUtils.isVisiblePatternEverChosen(userId)) { out.writeUTF(KEY_LOCK_SETTINGS_VISIBLE_PATTERN_ENABLED); out.writeUTF(visiblePatternEnabled ? "1" : "0"); } if (lockPatternUtils.isPowerButtonInstantlyLocksEverChosen(userId)) { out.writeUTF(KEY_LOCK_SETTINGS_POWER_BUTTON_INSTANTLY_LOCKS); out.writeUTF(powerButtonInstantlyLocks ? "1" : "0"); } // End marker out.writeUTF(""); out.flush(); Loading Loading @@ -632,12 +649,12 @@ public class SettingsBackupAgent extends BackupAgentHelper { } /** * Restores the owner info enabled and owner info settings in LockSettings. * Restores the owner info enabled and other settings in LockSettings. * * @param buffer * @param nBytes */ private void restoreLockSettings(byte[] buffer, int nBytes) { private void restoreLockSettings(@UserIdInt int userId, byte[] buffer, int nBytes) { final LockPatternUtils lockPatternUtils = new LockPatternUtils(this); ByteArrayInputStream bais = new ByteArrayInputStream(buffer, 0, nBytes); Loading @@ -652,11 +669,17 @@ public class SettingsBackupAgent extends BackupAgentHelper { } switch (key) { case KEY_LOCK_SETTINGS_OWNER_INFO_ENABLED: lockPatternUtils.setOwnerInfoEnabled("1".equals(value), UserHandle.myUserId()); lockPatternUtils.setOwnerInfoEnabled("1".equals(value), userId); break; case KEY_LOCK_SETTINGS_OWNER_INFO: lockPatternUtils.setOwnerInfo(value, UserHandle.myUserId()); lockPatternUtils.setOwnerInfo(value, userId); break; case KEY_LOCK_SETTINGS_VISIBLE_PATTERN_ENABLED: lockPatternUtils.reportPatternWasChosen(userId); lockPatternUtils.setVisiblePatternEnabled("1".equals(value), userId); break; case KEY_LOCK_SETTINGS_POWER_BUTTON_INSTANTLY_LOCKS: lockPatternUtils.setPowerButtonInstantlyLocks("1".equals(value), userId); break; } } Loading @@ -665,7 +688,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { } } private void restoreLockSettings(BackupDataInput data) { private void restoreLockSettings(@UserIdInt int userId, BackupDataInput data) { final byte[] settings = new byte[data.getDataSize()]; try { data.readEntityData(settings, 0, settings.length); Loading @@ -673,7 +696,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { Log.e(TAG, "Couldn't read entity data"); return; } restoreLockSettings(settings, settings.length); restoreLockSettings(userId, settings, settings.length); } /** Loading
services/core/java/com/android/server/locksettings/LockSettingsService.java +3 −1 Original line number Diff line number Diff line Loading @@ -1789,7 +1789,9 @@ public class LockSettingsService extends ILockSettings.Stub { private static final String[] SETTINGS_TO_BACKUP = new String[] { Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, Secure.LOCK_SCREEN_OWNER_INFO Secure.LOCK_SCREEN_OWNER_INFO, Secure.LOCK_PATTERN_VISIBLE, LockPatternUtils.LOCKSCREEN_POWER_BUTTON_INSTANTLY_LOCKS }; private class GateKeeperDiedRecipient implements IBinder.DeathRecipient { Loading