Hint user that fingerprint cannot unlock FBE keys

Show a hint text to user noting that pattern/PIN/password is
required when decrypting the credential based storage when file
based encryption is turned on.

The hint text is the same as that of the device unlock screen after
device reboot.

Bug: 27964055
Change-Id: I0d5a493bab69eae5ce4742bd07d4851387863cac
This commit is contained in:
Daniel U
2016-04-07 19:18:26 +01:00
parent 77359ad761
commit 6655e1b6f5
7 changed files with 61 additions and 5 deletions

View File

@@ -59,9 +59,15 @@
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_marginTop="16dp"/> android:layout_marginTop="16dp"/>
<View android:layout_width="match_parent" <TextView
android:id="@+id/strongAuthRequiredText"
style="@style/TextAppearance.ConfirmDeviceCredentialsStrongAuthRequiredText"
android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"/> android:layout_weight="1"
android:singleLine="true"
android:ellipsize="marquee"
android:gravity="center"/>
<EditText <EditText
android:id="@+id/password_entry" android:id="@+id/password_entry"

View File

@@ -59,9 +59,15 @@
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_marginTop="16dp"/> android:layout_marginTop="16dp"/>
<View android:layout_width="match_parent" <TextView
android:id="@+id/strongAuthRequiredText"
style="@style/TextAppearance.ConfirmDeviceCredentialsStrongAuthRequiredText"
android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="0.5"/> android:layout_weight="0.5"
android:singleLine="true"
android:ellipsize="marquee"
android:gravity="center"/>
<com.android.internal.widget.LockPatternView <com.android.internal.widget.LockPatternView
android:id="@+id/lockPattern" android:id="@+id/lockPattern"

View File

@@ -3089,6 +3089,13 @@
<!-- Message to be used to explain the user that he needs to enter his work password to continue a <!-- Message to be used to explain the user that he needs to enter his work password to continue a
particular operation. [CHAR LIMIT=70]--> particular operation. [CHAR LIMIT=70]-->
<string name="lockpassword_confirm_your_password_generic_profile">Enter your work password to continue</string> <string name="lockpassword_confirm_your_password_generic_profile">Enter your work password to continue</string>
<!-- An explanation text that the pattern needs to be solved since the device has just been restarted. [CHAR LIMIT=80] -->
<string name="lockpassword_strong_auth_required_reason_restart_pattern">Pattern required after device restarts</string>
<!-- An explanation text that the pin needs to be entered since the device has just been restarted. [CHAR LIMIT=80] -->
<string name="lockpassword_strong_auth_required_reason_restart_pin">PIN required after device restarts</string>
<!-- An explanation text that the password needs to be entered since the device has just been restarted. [CHAR LIMIT=80] -->
<string name="lockpassword_strong_auth_required_reason_restart_password">Password required after device restarts</string>
<!-- Security & location settings screen, change security method screen instruction if user <!-- Security & location settings screen, change security method screen instruction if user
enters incorrect PIN [CHAR LIMIT=30] --> enters incorrect PIN [CHAR LIMIT=30] -->

View File

@@ -357,6 +357,11 @@
<item name="android:textColor">@color/warning</item> <item name="android:textColor">@color/warning</item>
</style> </style>
<style name="TextAppearance.ConfirmDeviceCredentialsStrongAuthRequiredText"
parent="android:TextAppearance.Material.Body1">
<item name="android:textColor">?android:attr/textColorSecondary</item>
</style>
<style name="TextAppearance.Small.SwitchBar"> <style name="TextAppearance.Small.SwitchBar">
<item name="android:textColor">?android:attr/textColorPrimary</item> <item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textStyle">normal</item> <item name="android:textStyle">normal</item>

View File

@@ -66,6 +66,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends OptionsMenuFra
PACKAGE + ".ConfirmCredentials.showWhenLocked"; PACKAGE + ".ConfirmCredentials.showWhenLocked";
private FingerprintUiHelper mFingerprintHelper; private FingerprintUiHelper mFingerprintHelper;
private boolean mIsStrongAuthRequired;
private boolean mAllowFpAuthentication; private boolean mAllowFpAuthentication;
protected Button mCancelButton; protected Button mCancelButton;
protected ImageView mFingerprintIcon; protected ImageView mFingerprintIcon;
@@ -73,6 +74,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends OptionsMenuFra
protected int mUserId; protected int mUserId;
protected LockPatternUtils mLockPatternUtils; protected LockPatternUtils mLockPatternUtils;
protected TextView mErrorTextView; protected TextView mErrorTextView;
protected TextView mStrongAuthRequiredTextView;
protected final Handler mHandler = new Handler(); protected final Handler mHandler = new Handler();
@Override @Override
@@ -85,7 +87,9 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends OptionsMenuFra
mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras()); mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
final UserManager userManager = UserManager.get(getActivity()); final UserManager userManager = UserManager.get(getActivity());
mEffectiveUserId = userManager.getCredentialOwnerProfile(mUserId); mEffectiveUserId = userManager.getCredentialOwnerProfile(mUserId);
mAllowFpAuthentication = mAllowFpAuthentication && !isFingerprintDisabledByAdmin(); mIsStrongAuthRequired = isStrongAuthRequired();
mAllowFpAuthentication = mAllowFpAuthentication && !isFingerprintDisabledByAdmin()
&& !mIsStrongAuthRequired;
mLockPatternUtils = new LockPatternUtils(getActivity()); mLockPatternUtils = new LockPatternUtils(getActivity());
} }
@@ -93,6 +97,11 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends OptionsMenuFra
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
mCancelButton = (Button) view.findViewById(R.id.cancelButton); mCancelButton = (Button) view.findViewById(R.id.cancelButton);
if (mStrongAuthRequiredTextView != null) {
// INIVISIBLE instead of GONE because it also acts as a weighted spacer
mStrongAuthRequiredTextView.setVisibility(
mIsStrongAuthRequired ? View.VISIBLE : View.INVISIBLE);
}
mFingerprintIcon = (ImageView) view.findViewById(R.id.fingerprintIcon); mFingerprintIcon = (ImageView) view.findViewById(R.id.fingerprintIcon);
mFingerprintHelper = new FingerprintUiHelper( mFingerprintHelper = new FingerprintUiHelper(
mFingerprintIcon, mFingerprintIcon,
@@ -123,6 +132,10 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends OptionsMenuFra
return (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0; return (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0;
} }
private boolean isStrongAuthRequired() {
return !(UserManager.get(getContext()).isUserUnlocked(mEffectiveUserId));
}
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();

View File

@@ -124,6 +124,18 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
|| DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality
|| DevicePolicyManager.PASSWORD_QUALITY_MANAGED == storedQuality; || DevicePolicyManager.PASSWORD_QUALITY_MANAGED == storedQuality;
// Strong auth is required when the user is locked.
// Currently a user does not get locked again until the device restarts. Show the
// hint text as "device has just been restarted".
mStrongAuthRequiredTextView = (TextView) view.findViewById(R.id.strongAuthRequiredText);
if (mIsAlpha) {
mStrongAuthRequiredTextView.setText(
R.string.lockpassword_strong_auth_required_reason_restart_password);
} else {
mStrongAuthRequiredTextView.setText(
R.string.lockpassword_strong_auth_required_reason_restart_pin);
}
mImm = (InputMethodManager) getActivity().getSystemService( mImm = (InputMethodManager) getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE); Context.INPUT_METHOD_SERVICE);

View File

@@ -118,6 +118,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
mHeaderTextView = (TextView) view.findViewById(R.id.headerText); mHeaderTextView = (TextView) view.findViewById(R.id.headerText);
mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern); mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
mDetailsTextView = (TextView) view.findViewById(R.id.detailsText); mDetailsTextView = (TextView) view.findViewById(R.id.detailsText);
mStrongAuthRequiredTextView = (TextView) view.findViewById(R.id.strongAuthRequiredText);
mErrorTextView = (TextView) view.findViewById(R.id.errorText); mErrorTextView = (TextView) view.findViewById(R.id.errorText);
mLeftSpacerLandscape = view.findViewById(R.id.leftSpacer); mLeftSpacerLandscape = view.findViewById(R.id.leftSpacer);
mRightSpacerLandscape = view.findViewById(R.id.rightSpacer); mRightSpacerLandscape = view.findViewById(R.id.rightSpacer);
@@ -176,6 +177,12 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
FRAGMENT_TAG_CHECK_LOCK_RESULT).commit(); FRAGMENT_TAG_CHECK_LOCK_RESULT).commit();
} }
// Strong auth is required when the user is locked.
// Currently a user does not get locked again until the device restarts. Show the
// hint text as "device has just been restarted".
mStrongAuthRequiredTextView.setText(
R.string.lockpassword_strong_auth_required_reason_restart_pattern);
return view; return view;
} }