1package com.peachpasswords.autofill23import android.app.PendingIntent4import android.content.Context5import android.content.Intent6import android.content.IntentSender7import android.os.Build8910111213141516object AutofillIntents {17 const val EXTRA_IDENTITY_ID = "peach.autofill.identityId"18 const val EXTRA_PASSWORD_ID = "peach.autofill.passwordId"19 const val EXTRA_OTP_ID = "peach.autofill.otpId"20 const val EXTRA_OTP_DIGIT_BOX_IDS = "peach.autofill.otpDigitBoxIds"21 const val EXTRA_ORIGIN = "peach.autofill.origin"22 const val EXTRA_IS_WEB_ORIGIN = "peach.autofill.isWebOrigin"23 24 const val EXTRA_CALLER_PACKAGE = "peach.autofill.callerPackage"2526 const val EXTRA_CARD_NUMBER_ID = "peach.autofill.cardNumberId"27 const val EXTRA_CARD_EXP_MONTH_ID = "peach.autofill.cardExpMonthId"28 const val EXTRA_CARD_EXP_YEAR_ID = "peach.autofill.cardExpYearId"29 const val EXTRA_CARD_EXP_DATE_ID = "peach.autofill.cardExpDateId"30 const val EXTRA_CARD_CVC_ID = "peach.autofill.cardCvcId"31 const val EXTRA_CARD_NAME_ID = "peach.autofill.cardNameId"3233 34 const val EXTRA_TYPED_USERNAME = "peach.autofill.typedUsername"35 36 const val EXTRA_TYPED_EMAIL = "peach.autofill.typedEmail"3738 39404142434445 const val EXTRA_OPEN_NEW_ENTRY = "peach.autofill.openNewEntry"46 const val EXTRA_NEW_ENTRY_URL = "peach.autofill.newEntryUrl"47 const val EXTRA_NEW_ENTRY_USERNAME = "peach.autofill.newEntryUsername"48 const val EXTRA_NEW_ENTRY_EMAIL = "peach.autofill.newEntryEmail"49 505152535455 const val EXTRA_NEW_ENTRY_TOKEN = "peach.autofill.newEntryToken"5657 private const val REQ_CHIP = 0xC0DE58 private const val REQ_PICKER_TAG = 0xBEEF59 private const val REQ_PICKER_CHIP_TAG = 0xBEE06061 private fun requestCode(requestId: Int, tag: Int): Int = requestId xor tag6263 @Volatile private var pendingNewEntryToken: String? = null6465 66 fun issueNewEntryToken(): String {67 val token = java.util.UUID.randomUUID().toString()68 pendingNewEntryToken = token69 return token70 }7172 73747576 fun consumeNewEntryToken(token: String?): Boolean {77 val expected = pendingNewEntryToken ?: return false78 if (token != expected) return false79 pendingNewEntryToken = null80 return true81 }82 fun noopChipIntent(context: Context, requestId: Int): PendingIntent {83 val intent = Intent(context, AutofillEntryPickerActivity::class.java)84 return PendingIntent.getActivity(context, requestCode(requestId, REQ_CHIP), intent, immutableFlags(false))85 }8687 888990919293 fun pickerChipPendingIntent(context: Context, parsed: ParsedStructure, requestId: Int): PendingIntent {94 val intent = Intent(context, AutofillEntryPickerActivity::class.java).apply {95 putExtra(EXTRA_IDENTITY_ID, parsed.identityId)96 putExtra(EXTRA_PASSWORD_ID, parsed.passwordId)97 putExtra(EXTRA_OTP_ID, parsed.otpId)98 putParcelableArrayListExtra(EXTRA_OTP_DIGIT_BOX_IDS, ArrayList(parsed.otpDigitBoxIds))99 putExtra(EXTRA_ORIGIN, parsed.origin)100 putExtra(EXTRA_IS_WEB_ORIGIN, parsed.webDomain != null)101 putExtra(EXTRA_CALLER_PACKAGE, parsed.packageName)102 putExtra(EXTRA_CARD_NUMBER_ID, parsed.cardNumberId)103 putExtra(EXTRA_CARD_EXP_MONTH_ID, parsed.cardExpMonthId)104 putExtra(EXTRA_CARD_EXP_YEAR_ID, parsed.cardExpYearId)105 putExtra(EXTRA_CARD_EXP_DATE_ID, parsed.cardExpDateId)106 putExtra(EXTRA_CARD_CVC_ID, parsed.cardCvcId)107 putExtra(EXTRA_CARD_NAME_ID, parsed.cardNameId)108 parsed.usernameValue?.trim()?.takeIf { it.isNotBlank() }?.let {109 putExtra(EXTRA_TYPED_USERNAME, it)110 }111 parsed.emailValue?.trim()?.takeIf { it.isNotBlank() }?.let {112 putExtra(EXTRA_TYPED_EMAIL, it)113 }114 }115 return PendingIntent.getActivity(context, requestCode(requestId, REQ_PICKER_CHIP_TAG), intent, immutableFlags(false))116 }117118 119 fun pickerIntentSender(context: Context, parsed: ParsedStructure, requestId: Int): IntentSender {120 val intent = Intent(context, AutofillEntryPickerActivity::class.java).apply {121 putExtra(EXTRA_IDENTITY_ID, parsed.identityId)122 putExtra(EXTRA_PASSWORD_ID, parsed.passwordId)123 putExtra(EXTRA_OTP_ID, parsed.otpId)124 putParcelableArrayListExtra(EXTRA_OTP_DIGIT_BOX_IDS, ArrayList(parsed.otpDigitBoxIds))125 putExtra(EXTRA_ORIGIN, parsed.origin)126 putExtra(EXTRA_IS_WEB_ORIGIN, parsed.webDomain != null)127 128 129 putExtra(EXTRA_CALLER_PACKAGE, parsed.packageName)130 putExtra(EXTRA_CARD_NUMBER_ID, parsed.cardNumberId)131 putExtra(EXTRA_CARD_EXP_MONTH_ID, parsed.cardExpMonthId)132 putExtra(EXTRA_CARD_EXP_YEAR_ID, parsed.cardExpYearId)133 putExtra(EXTRA_CARD_EXP_DATE_ID, parsed.cardExpDateId)134 putExtra(EXTRA_CARD_CVC_ID, parsed.cardCvcId)135 putExtra(EXTRA_CARD_NAME_ID, parsed.cardNameId)136 137 138 139 140 parsed.usernameValue?.trim()?.takeIf { it.isNotBlank() }?.let {141 putExtra(EXTRA_TYPED_USERNAME, it)142 }143 parsed.emailValue?.trim()?.takeIf { it.isNotBlank() }?.let {144 putExtra(EXTRA_TYPED_EMAIL, it)145 }146 }147 148 149 150 return PendingIntent.getActivity(context, requestCode(requestId, REQ_PICKER_TAG), intent, immutableFlags(false)).intentSender151 }152153 private fun immutableFlags(updateCurrent: Boolean = true): Int =154 (if (updateCurrent) PendingIntent.FLAG_UPDATE_CURRENT else 0) or155 if (Build.VERSION.SDK_INT >= 23) PendingIntent.FLAG_IMMUTABLE else 0156157}