@@ -271,6 +271,9 @@ public static class ChooseLockPasswordFragment extends InstrumentedFragment
271
271
protected boolean mForFace ;
272
272
protected boolean mForBiometrics ;
273
273
274
+ // PIN/passphrase generation will delegate to this Fragment for the last confirmation step
275
+ private boolean mFromPasswordGeneration ;
276
+
274
277
private LockscreenCredential mFirstPassword ;
275
278
private RecyclerView mPasswordRestrictionView ;
276
279
protected boolean mIsAlphaMode ;
@@ -515,6 +518,9 @@ public void onCreate(Bundle savedInstanceState) {
515
518
if (mMinMetrics == null ) mMinMetrics = new PasswordMetrics (CREDENTIAL_TYPE_NONE );
516
519
517
520
mTextChangedHandler = new TextChangedHandler ();
521
+
522
+ mFromPasswordGeneration = intent .getBooleanExtra (
523
+ ChooseLockSettingsHelper .EXTRA_KEY_FROM_PASSWORD_GENERATION , false );
518
524
}
519
525
520
526
@ Override
@@ -625,6 +631,21 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
625
631
.setUserId (mUserId )
626
632
.show ();
627
633
}
634
+
635
+ if (mFromPasswordGeneration ) {
636
+ final LockscreenCredential generatedPassword = intent .getParcelableExtra (
637
+ ChooseLockSettingsHelper .EXTRA_KEY_FROM_PASSWORD_GENERATION_GENERATED_PASSWORD , LockscreenCredential .class );
638
+ if (generatedPassword != null ) {
639
+ final var isAutoPinConfirm = intent .getBooleanExtra (
640
+ ChooseLockSettingsHelper .EXTRA_KEY_FROM_PASSWORD_GENERATION_AUTO_PIN_CONFIRM , false );
641
+ mIsAutoPinConfirmOptionSetManually = true ;
642
+ mAutoPinConfirmOption .setChecked (isAutoPinConfirm );
643
+ // simulate the user inputting this generated password so that it's
644
+ // validated against existing AOSP validation code
645
+ handleNext (generatedPassword );
646
+ // do not zeroize generatedPassword; it might be stored in mChosenPassword
647
+ }
648
+ }
628
649
} else {
629
650
630
651
// restore from previous state
@@ -815,14 +836,23 @@ private byte[] getPasswordHistoryHashFactor() {
815
836
}
816
837
817
838
public void handleNext () {
839
+ handleNext (null );
840
+ }
841
+
842
+ public void handleNext (@ Nullable LockscreenCredential chosenPasswordOverride ) {
818
843
if (mSaveAndFinishWorker != null ) return ;
819
844
// TODO(b/120484642): This is a point of entry for passwords from the UI
820
- final Editable passwordText = mPasswordEntry .getText ();
821
- if (TextUtils .isEmpty (passwordText )) {
822
- return ;
845
+ if (chosenPasswordOverride != null && mUiStage == Stage .Introduction ) {
846
+ // simulate generated password being used as user input
847
+ mChosenPassword = chosenPasswordOverride ;
848
+ } else {
849
+ final Editable passwordText = mPasswordEntry .getText ();
850
+ if (TextUtils .isEmpty (passwordText )) {
851
+ return ;
852
+ }
853
+ mChosenPassword = mIsAlphaMode ? LockscreenCredential .createPassword (passwordText )
854
+ : LockscreenCredential .createPin (passwordText );
823
855
}
824
- mChosenPassword = mIsAlphaMode ? LockscreenCredential .createPassword (passwordText )
825
- : LockscreenCredential .createPin (passwordText );
826
856
if (mUiStage == Stage .Introduction ) {
827
857
if (validatePassword (mChosenPassword )) {
828
858
mFirstPassword = mChosenPassword ;
@@ -1031,7 +1061,14 @@ protected void updateUi() {
1031
1061
mAutoConfirmSecurityMessage .setVisibility (View .GONE );
1032
1062
}
1033
1063
final int stage = getStageType ();
1034
- if (getStageType () != Stage .TYPE_NONE ) {
1064
+ if (mFromPasswordGeneration ) {
1065
+ // this is the third confirmation; let the user know that they're done after this
1066
+ mMessage .setVisibility (View .VISIBLE );
1067
+ final var msg = mIsAlphaMode
1068
+ ? R .string .lock_screen_generate_confirm_last_desc_passphrase
1069
+ : R .string .lock_screen_generate_confirm_last_desc_pin ;
1070
+ mMessage .setText (getString (msg ));
1071
+ } else if (getStageType () != Stage .TYPE_NONE ) {
1035
1072
int message = mUiStage .getMessage (mIsAlphaMode , stage );
1036
1073
if (message != 0 ) {
1037
1074
mMessage .setVisibility (View .VISIBLE );
0 commit comments