From 26ec4cfa7965ca7a208a88550b75c51c46d12dd6 Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Thu, 22 Jul 2021 17:09:03 +0200 Subject: [PATCH 1/2] feat: autofillType property for edit text base --- packages/core/core-types/index.ts | 6 +++ .../editable-text-base-common.ts | 6 +++ .../ui/editable-text-base/index.android.ts | 44 ++++++++++++++++++- .../core/ui/editable-text-base/index.d.ts | 5 +++ .../core/ui/editable-text-base/index.ios.ts | 36 ++++++++++++++- 5 files changed, 95 insertions(+), 2 deletions(-) diff --git a/packages/core/core-types/index.ts b/packages/core/core-types/index.ts index 66bcae408a..760859bd7a 100644 --- a/packages/core/core-types/index.ts +++ b/packages/core/core-types/index.ts @@ -41,6 +41,12 @@ export namespace CoreTypes { export const email = 'email'; export const integer = 'integer'; } + export type AutofillType = 'username' | 'password' | 'none' | string; + export module AutofillType { + export const username = 'username'; + export const password = 'password'; + export const none = 'none'; + } export type ReturnKeyButtonType = 'done' | 'next' | 'go' | 'search' | 'send'; export module ReturnKeyType { diff --git a/packages/core/ui/editable-text-base/editable-text-base-common.ts b/packages/core/ui/editable-text-base/editable-text-base-common.ts index 1f4003d422..d34cf174a0 100644 --- a/packages/core/ui/editable-text-base/editable-text-base-common.ts +++ b/packages/core/ui/editable-text-base/editable-text-base-common.ts @@ -16,6 +16,7 @@ export abstract class EditableTextBase extends TextBase implements EditableTextB public returnKeyType: CoreTypes.ReturnKeyButtonType; public updateTextTrigger: CoreTypes.UpdateTextTriggerType; public autocapitalizationType: CoreTypes.AutocapitalizationInputType; + public autofillType: CoreTypes.AutofillType; public editable: boolean; public autocorrect: boolean; public hint: string; @@ -50,6 +51,11 @@ placeholderColorProperty.register(Style); const keyboardTypeConverter = makeParser(makeValidator(CoreTypes.KeyboardType.datetime, CoreTypes.KeyboardType.phone, CoreTypes.KeyboardType.number, CoreTypes.KeyboardType.url, CoreTypes.KeyboardType.email, CoreTypes.KeyboardType.integer), true); +const autofillTypeConverter = makeParser(makeValidator(CoreTypes.AutofillType.username, CoreTypes.AutofillType.password, CoreTypes.AutofillType.none), true); + +export const autofillTypeProperty = new Property({ name: 'autofillType', valueConverter: autofillTypeConverter }); +autofillTypeProperty.register(EditableTextBase); + export const keyboardTypeProperty = new Property({ name: 'keyboardType', valueConverter: keyboardTypeConverter }); keyboardTypeProperty.register(EditableTextBase); diff --git a/packages/core/ui/editable-text-base/index.android.ts b/packages/core/ui/editable-text-base/index.android.ts index 5dc8d24885..4b7e28a7e7 100644 --- a/packages/core/ui/editable-text-base/index.android.ts +++ b/packages/core/ui/editable-text-base/index.android.ts @@ -1,7 +1,8 @@ -import { EditableTextBase as EditableTextBaseCommon, keyboardTypeProperty, returnKeyTypeProperty, editableProperty, autocapitalizationTypeProperty, autocorrectProperty, hintProperty, placeholderColorProperty, maxLengthProperty } from './editable-text-base-common'; +import { EditableTextBase as EditableTextBaseCommon, autofillTypeProperty, keyboardTypeProperty, returnKeyTypeProperty, editableProperty, autocapitalizationTypeProperty, autocorrectProperty, hintProperty, placeholderColorProperty, maxLengthProperty } from './editable-text-base-common'; import { textTransformProperty, textProperty, resetSymbol } from '../text-base'; import { Color } from '../../color'; import { ad } from '../../utils'; +import { CoreTypes } from '../../core-types'; export * from './editable-text-base-common'; @@ -293,6 +294,47 @@ export abstract class EditableTextBase extends EditableTextBaseCommon { this._setInputType(newInputType); } + [autofillTypeProperty.setNative](value: CoreTypes.AutofillType) { + let newOptions; + switch (value) { + case 'phone': + newOptions = android.view.View.AUTOFILL_HINT_PHONE; + break; + case 'postalCode': + newOptions = android.view.View.AUTOFILL_HINT_POSTAL_CODE; + break; + case 'creditCardNumber': + newOptions = android.view.View.AUTOFILL_HINT_CREDIT_CARD_NUMBER; + break; + case 'email': + newOptions = android.view.View.AUTOFILL_HINT_EMAIL_ADDRESS; + break; + case 'name': + newOptions = android.view.View.AUTOFILL_HINT_NAME; + break; + case 'username': + newOptions = android.view.View.AUTOFILL_HINT_USERNAME; + break; + case 'password': + newOptions = android.view.View.AUTOFILL_HINT_PASSWORD; + break; + case 'none': + newOptions = null; + break; + default: { + newOptions = value; + break; + } + } + if (newOptions) { + const array = Array.create(java.lang.String, 1); + array[0] = newOptions; + this.nativeTextViewProtected.setAutofillHints(array); + } else { + this.nativeTextViewProtected.setAutofillHints(null); + } + } + [returnKeyTypeProperty.getDefault](): 'done' | 'next' | 'go' | 'search' | 'send' | string { const ime = this.nativeTextViewProtected.getImeOptions(); switch (ime) { diff --git a/packages/core/ui/editable-text-base/index.d.ts b/packages/core/ui/editable-text-base/index.d.ts index 9e3fafbd00..6e17dd449b 100644 --- a/packages/core/ui/editable-text-base/index.d.ts +++ b/packages/core/ui/editable-text-base/index.d.ts @@ -33,6 +33,11 @@ export class EditableTextBase extends TextBase { */ autocapitalizationType: CoreTypes.AutocapitalizationInputType; + /** + * Gets or sets the autofill type. + */ + autofillType: CoreTypes.AutofillType; + /** * Gets or sets whether the instance is editable. */ diff --git a/packages/core/ui/editable-text-base/index.ios.ts b/packages/core/ui/editable-text-base/index.ios.ts index 6af98a69bb..031de38a03 100644 --- a/packages/core/ui/editable-text-base/index.ios.ts +++ b/packages/core/ui/editable-text-base/index.ios.ts @@ -1,5 +1,6 @@ -import { EditableTextBase as EditableTextBaseCommon, keyboardTypeProperty, returnKeyTypeProperty, autocapitalizationTypeProperty, autocorrectProperty } from './editable-text-base-common'; +import { EditableTextBase as EditableTextBaseCommon, autofillTypeProperty, keyboardTypeProperty, returnKeyTypeProperty, autocapitalizationTypeProperty, autocorrectProperty } from './editable-text-base-common'; import { FormattedString } from '../text-base/formatted-string'; +import { CoreTypes } from '../../core-types'; export * from './editable-text-base-common'; @@ -71,6 +72,39 @@ export abstract class EditableTextBase extends EditableTextBaseCommon { this.nativeTextViewProtected.keyboardType = newKeyboardType; } + [autofillTypeProperty.setNative](value: CoreTypes.AutofillType) { + let newTextContentType: string; + switch (value) { + case 'phone': + newTextContentType = UITextContentTypeTelephoneNumber; + break; + case 'postalCode': + newTextContentType = UITextContentTypePostalCode; + break; + case 'creditCardNumber': + newTextContentType = UITextContentTypeCreditCardNumber; + break; + case 'email': + newTextContentType = UITextContentTypeEmailAddress; + break; + case 'name': + newTextContentType = UITextContentTypeName; + break; + case 'username': + newTextContentType = UITextContentTypeUsername; + break; + case 'password': + newTextContentType = UITextContentTypePassword; + break; + case 'none': + newTextContentType = null; + default: + newTextContentType = value; + break; + } + + this.nativeTextViewProtected.textContentType = newTextContentType; + } [returnKeyTypeProperty.getDefault](): 'done' | 'next' | 'go' | 'search' | 'send' | string { const returnKeyType = this.nativeTextViewProtected.returnKeyType; From d89871d0d8ac48238517b33cdf1556864a4ac168 Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Thu, 5 Aug 2021 09:50:37 +0200 Subject: [PATCH 2/2] fix: autofillType pre 26 --- .../ui/editable-text-base/index.android.ts | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/core/ui/editable-text-base/index.android.ts b/packages/core/ui/editable-text-base/index.android.ts index 4b7e28a7e7..7501b1c3b2 100644 --- a/packages/core/ui/editable-text-base/index.android.ts +++ b/packages/core/ui/editable-text-base/index.android.ts @@ -3,9 +3,13 @@ import { textTransformProperty, textProperty, resetSymbol } from '../text-base'; import { Color } from '../../color'; import { ad } from '../../utils'; import { CoreTypes } from '../../core-types'; +import { Device } from '../../platform'; +import lazy from '../../utils/lazy'; export * from './editable-text-base-common'; +const sdkVersion = lazy(() => parseInt(Device.sdkVersion)); + //https://github.com/NativeScript/NativeScript/issues/2942 export let dismissKeyboardTimeoutId: NodeJS.Timer; export let dismissKeyboardOwner: WeakRef; @@ -139,6 +143,8 @@ function initializeEditTextListeners(): void { EditTextListeners = EditTextListenersImpl; } +let apiLevel: number; + export abstract class EditableTextBase extends EditableTextBaseCommon { /* tslint:disable */ _dirtyTextAccumulator: string; @@ -158,6 +164,9 @@ export abstract class EditableTextBase extends EditableTextBaseCommon { } public createNativeView() { + if (!apiLevel) { + apiLevel = sdkVersion(); + } return new android.widget.EditText(this._context); } @@ -295,28 +304,31 @@ export abstract class EditableTextBase extends EditableTextBaseCommon { } [autofillTypeProperty.setNative](value: CoreTypes.AutofillType) { + if (apiLevel < 26) { + return; + } let newOptions; switch (value) { case 'phone': - newOptions = android.view.View.AUTOFILL_HINT_PHONE; + newOptions = 'phone'; // android.view.View.AUTOFILL_HINT_PHONE break; case 'postalCode': - newOptions = android.view.View.AUTOFILL_HINT_POSTAL_CODE; + newOptions = 'postalCode'; // android.view.View.AUTOFILL_HINT_POSTAL_CODE break; case 'creditCardNumber': - newOptions = android.view.View.AUTOFILL_HINT_CREDIT_CARD_NUMBER; + newOptions = 'creditCardNumber'; // android.view.View.AUTOFILL_HINT_CREDIT_CARD_NUMBER break; case 'email': - newOptions = android.view.View.AUTOFILL_HINT_EMAIL_ADDRESS; + newOptions = 'emailAddress'; // android.view.View.AUTOFILL_HINT_EMAIL_ADDRESS break; case 'name': - newOptions = android.view.View.AUTOFILL_HINT_NAME; + newOptions = 'name'; // android.view.View.AUTOFILL_HINT_NAME break; case 'username': - newOptions = android.view.View.AUTOFILL_HINT_USERNAME; + newOptions = 'username'; // android.view.View.AUTOFILL_HINT_USERNAME break; case 'password': - newOptions = android.view.View.AUTOFILL_HINT_PASSWORD; + newOptions = 'password'; // android.view.View.AUTOFILL_HINT_PASSWORD break; case 'none': newOptions = null;