diff options
author | Paul Lawrence <paullawrence@google.com> | 2014-02-04 10:22:19 -0800 |
---|---|---|
committer | Paul Lawrence <paullawrence@google.com> | 2014-02-11 10:27:58 -0800 |
commit | b05f39d186d8ce1b53bb4da3cb4c2cd22986f513 (patch) | |
tree | 9b45bf9635249f1d33f31562cf81afe02ae3c355 | |
parent | c94122a199461972401bc0cadb70602ff1b573c3 (diff) | |
download | packages_apps_Settings-b05f39d186d8ce1b53bb4da3cb4c2cd22986f513.zip packages_apps_Settings-b05f39d186d8ce1b53bb4da3cb4c2cd22986f513.tar.gz packages_apps_Settings-b05f39d186d8ce1b53bb4da3cb4c2cd22986f513.tar.bz2 |
Support default, pattern, pin and password encryption types
Use plumbing provided by dependant change to bring up correct dialog
at boot time.
Needs matching framework changes from
https://googleplex-android-review.googlesource.com/#/c/412885/
Bug: 8769627
Change-Id: Ib04a2875e051a7cccca035fadb25978dfec22491
-rw-r--r-- | res/layout/crypt_keeper_pattern_entry.xml | 49 | ||||
-rw-r--r-- | res/layout/crypt_keeper_pattern_field.xml | 38 | ||||
-rw-r--r-- | res/layout/crypt_keeper_pin_entry.xml | 49 | ||||
-rw-r--r-- | res/layout/crypt_keeper_pin_field.xml | 44 | ||||
-rw-r--r-- | src/com/android/settings/ChooseLockGeneric.java | 36 | ||||
-rw-r--r-- | src/com/android/settings/CryptKeeper.java | 69 |
6 files changed, 241 insertions, 44 deletions
diff --git a/res/layout/crypt_keeper_pattern_entry.xml b/res/layout/crypt_keeper_pattern_entry.xml new file mode 100644 index 0000000..a59d36f --- /dev/null +++ b/res/layout/crypt_keeper_pattern_entry.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2014, 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. +*/ +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" +> + <include layout="@layout/crypt_keeper_status" /> + + <LinearLayout + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:layout_marginStart="8dip" + android:layout_marginEnd="8dip" + android:orientation="horizontal" + > + <include layout="@layout/crypt_keeper_pattern_field" /> + </LinearLayout> + + <!-- Emergency call button. + Text and icon are set by CryptKeeper.updateEmergencyCallButtonState() --> + <Button android:id="@+id/emergencyCallButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginTop="16dip" + style="@*android:style/Widget.Button.Transparent" + android:textSize="14sp" + android:drawablePadding="6dip" + /> + +</LinearLayout> diff --git a/res/layout/crypt_keeper_pattern_field.xml b/res/layout/crypt_keeper_pattern_field.xml new file mode 100644 index 0000000..c4ec1f4 --- /dev/null +++ b/res/layout/crypt_keeper_pattern_field.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2014, 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. +*/ +--> + +<!-- Contents of the password entry field for CryptKeeper. Comes with an IME + switcher, if necessary. Assumed to be in a horizontal LinearLayout. --> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + <ImageView android:id="@+id/switch_ime_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_lockscreen_ime" + android:clickable="true" + android:contentDescription="@string/crypt_keeper_switch_input_method" + android:padding="8dip" + android:layout_gravity="center" + android:background="?android:attr/selectableItemBackground" + android:visibility="gone" + /> +</merge> diff --git a/res/layout/crypt_keeper_pin_entry.xml b/res/layout/crypt_keeper_pin_entry.xml new file mode 100644 index 0000000..dfc5fb5 --- /dev/null +++ b/res/layout/crypt_keeper_pin_entry.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2014, 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. +*/ +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" +> + <include layout="@layout/crypt_keeper_status" /> + + <LinearLayout + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:layout_marginStart="8dip" + android:layout_marginEnd="8dip" + android:orientation="horizontal" + > + <include layout="@layout/crypt_keeper_pin_field" /> + </LinearLayout> + + <!-- Emergency call button. + Text and icon are set by CryptKeeper.updateEmergencyCallButtonState() --> + <Button android:id="@+id/emergencyCallButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginTop="16dip" + style="@*android:style/Widget.Button.Transparent" + android:textSize="14sp" + android:drawablePadding="6dip" + /> + +</LinearLayout> diff --git a/res/layout/crypt_keeper_pin_field.xml b/res/layout/crypt_keeper_pin_field.xml new file mode 100644 index 0000000..270b26b --- /dev/null +++ b/res/layout/crypt_keeper_pin_field.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2014, 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. +*/ +--> + +<!-- Contents of the password entry field for CryptKeeper. Comes with an IME + switcher, if necessary. Assumed to be in a horizontal LinearLayout. --> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + <EditText android:id="@+id/passwordEntry" + android:layout_height="wrap_content" + android:layout_width="0dip" + android:layout_weight="1" + android:singleLine="true" + android:inputType="numberPassword" + android:imeOptions="flagForceAscii|actionDone" + android:textAppearance="?android:attr/textAppearanceMedium" + /> + + <ImageView android:id="@+id/switch_ime_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_lockscreen_ime" + android:clickable="true" + android:contentDescription="@string/crypt_keeper_switch_input_method" + android:padding="8dip" + android:layout_gravity="center" + android:background="?android:attr/selectableItemBackground" + android:visibility="gone" + /> +</merge> diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java index a92f514..9c9fab1 100644 --- a/src/com/android/settings/ChooseLockGeneric.java +++ b/src/com/android/settings/ChooseLockGeneric.java @@ -226,20 +226,7 @@ public class ChooseLockGeneric extends SettingsActivity { private int upgradeQuality(int quality, MutableBoolean allowBiometric) { quality = upgradeQualityForDPM(quality); quality = upgradeQualityForKeyStore(quality); - int encryptionQuality = upgradeQualityForEncryption(quality); - if (encryptionQuality > quality) { - //The first case checks whether biometric is allowed, prior to the user making - //their selection from the list - if (allowBiometric != null) { - allowBiometric.value = quality <= - DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK; - } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { - //When the user has selected biometric we shouldn't change that due to - //encryption - return quality; - } - } - return encryptionQuality; + return quality; } private int upgradeQualityForDPM(int quality) { @@ -251,27 +238,6 @@ public class ChooseLockGeneric extends SettingsActivity { return quality; } - /** - * Mix in "encryption minimums" to any given quality value. This prevents users - * from downgrading the pattern/pin/password to a level below the minimums. - * - * ASSUMPTION: Setting quality is sufficient (e.g. minimum lengths will be set - * appropriately.) - */ - private int upgradeQualityForEncryption(int quality) { - // Don't upgrade quality for secondary users. Encryption requirements don't apply. - if (!Process.myUserHandle().equals(UserHandle.OWNER)) return quality; - int encryptionStatus = mDPM.getStorageEncryptionStatus(); - boolean encrypted = (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE) - || (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING); - if (encrypted) { - if (quality < CryptKeeperSettings.MIN_PASSWORD_QUALITY) { - quality = CryptKeeperSettings.MIN_PASSWORD_QUALITY; - } - } - return quality; - } - private int upgradeQualityForKeyStore(int quality) { if (!mKeyStore.isEmpty()) { if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) { diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java index 23ec70e..d974d00 100644 --- a/src/com/android/settings/CryptKeeper.java +++ b/src/com/android/settings/CryptKeeper.java @@ -34,6 +34,7 @@ import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.os.storage.IMountService; +import android.os.storage.StorageManager; import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.Editable; @@ -60,6 +61,9 @@ import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; +import com.android.internal.widget.LockPatternUtils; +import com.android.internal.widget.LockPatternView; +import com.android.internal.widget.LockPatternView.Cell; import java.util.List; @@ -113,6 +117,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList private int mCooldown; PowerManager.WakeLock mWakeLock; private EditText mPasswordEntry; + private LockPatternView mLockPatternView; /** Number of calls to {@link #notifyUser()} to ignore before notifying. */ private int mNotificationCountdown = 0; @@ -175,7 +180,9 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList final TextView status = (TextView) findViewById(R.id.status); status.setText(R.string.try_again); // Reenable the password entry - mPasswordEntry.setEnabled(true); + if (mPasswordEntry != null) { + mPasswordEntry.setEnabled(true); + } } } } @@ -354,7 +361,21 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList setContentView(R.layout.crypt_keeper_progress); encryptionProgressInit(); } else if (mValidationComplete || isDebugView(FORCE_VIEW_PASSWORD)) { - setContentView(R.layout.crypt_keeper_password_entry); + final IMountService service = getMountService(); + int type = StorageManager.CRYPT_TYPE_PASSWORD; + try { + type = service.getPasswordType(); + } catch (Exception e) { + Log.e(TAG, "Error while getting type - showing default dialog" + e); + } + + if(type == StorageManager.CRYPT_TYPE_PIN) { + setContentView(R.layout.crypt_keeper_pin_entry); + } else if (type == StorageManager.CRYPT_TYPE_PATTERN) { + setContentView(R.layout.crypt_keeper_pattern_entry); + } else { + setContentView(R.layout.crypt_keeper_password_entry); + } passwordEntryInit(); } else if (!mValidationRequested) { // We're supposed to be encrypted, but no validation has been done. @@ -503,14 +524,44 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList } } - private void passwordEntryInit() { + protected LockPatternView.OnPatternListener mChooseNewLockPatternListener = + new LockPatternView.OnPatternListener() { + + @Override + public void onPatternStart() { + } + + @Override + public void onPatternCleared() { + } + + @Override + public void onPatternDetected(List<LockPatternView.Cell> pattern) { + new DecryptTask().execute(LockPatternUtils.patternToString(pattern)); + } + + @Override + public void onPatternCellAdded(List<Cell> pattern) { + } + }; + + private void passwordEntryInit() { + // Password/pin case mPasswordEntry = (EditText) findViewById(R.id.passwordEntry); - mPasswordEntry.setOnEditorActionListener(this); - mPasswordEntry.requestFocus(); - // Become quiet when the user interacts with the Edit text screen. - mPasswordEntry.setOnKeyListener(this); - mPasswordEntry.setOnTouchListener(this); - mPasswordEntry.addTextChangedListener(this); + if (mPasswordEntry != null){ + mPasswordEntry.setOnEditorActionListener(this); + mPasswordEntry.requestFocus(); + // Become quiet when the user interacts with the Edit text screen. + mPasswordEntry.setOnKeyListener(this); + mPasswordEntry.setOnTouchListener(this); + mPasswordEntry.addTextChangedListener(this); + } + + // Pattern case + mLockPatternView = (LockPatternView) findViewById(R.id.lockPattern); + if (mLockPatternView != null) { + mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener); + } // Disable the Emergency call button if the device has no voice telephone capability final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); |