react-native-platform-components 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PlatformComponents.podspec +1 -1
- package/README.md +33 -31
- package/android/src/main/java/com/platformcomponents/PCButtonGroupView.kt +175 -9
- package/android/src/main/java/com/platformcomponents/PCButtonGroupViewManager.kt +52 -2
- package/android/src/main/java/com/platformcomponents/PCButtonSupport.kt +44 -12
- package/android/src/main/java/com/platformcomponents/PCButtonView.kt +187 -5
- package/android/src/main/java/com/platformcomponents/PCButtonViewManager.kt +85 -7
- package/android/src/main/java/com/platformcomponents/PCContextMenuView.kt +41 -151
- package/android/src/main/java/com/platformcomponents/PCContextMenuViewManager.kt +7 -63
- package/android/src/main/java/com/platformcomponents/PCDatePickerView.kt +310 -115
- package/android/src/main/java/com/platformcomponents/PCDatePickerViewManager.kt +23 -3
- package/android/src/main/java/com/platformcomponents/PCExpressive.kt +6 -1
- package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonView.kt +485 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonViewManager.kt +109 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarView.kt +132 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarViewManager.kt +8 -0
- package/android/src/main/java/com/platformcomponents/PCHaptics.kt +46 -0
- package/android/src/main/java/com/platformcomponents/PCImageLoader.kt +42 -7
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerView.kt +32 -0
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerViewManager.kt +31 -0
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassView.kt +32 -6
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassViewManager.kt +4 -0
- package/android/src/main/java/com/platformcomponents/PCMenuSupport.kt +280 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationBarSupport.kt +332 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationRailView.kt +448 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationRailViewManager.kt +176 -0
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlView.kt +24 -14
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlViewManager.kt +14 -2
- package/android/src/main/java/com/platformcomponents/PCSelectionMenuView.kt +371 -39
- package/android/src/main/java/com/platformcomponents/PCSelectionMenuViewManager.kt +18 -4
- package/android/src/main/java/com/platformcomponents/PCTabBarView.kt +397 -0
- package/android/src/main/java/com/platformcomponents/PCTabBarViewManager.kt +182 -0
- package/android/src/main/java/com/platformcomponents/PCTextFieldView.kt +415 -40
- package/android/src/main/java/com/platformcomponents/PCTextFieldViewManager.kt +109 -3
- package/android/src/main/java/com/platformcomponents/PCThemeSupport.kt +37 -0
- package/android/src/main/java/com/platformcomponents/PlatformComponentsPackage.kt +4 -0
- package/android/src/main/res/drawable/pc_ic_search.xml +12 -0
- package/android/src/main/res/values/ids.xml +5 -0
- package/android/src/main/res/values/styles.xml +24 -0
- package/ios/PCButton.mm +122 -7
- package/ios/PCButtonGroup.mm +68 -1
- package/ios/PCButtonGroupView.swift +225 -6
- package/ios/PCButtonSupport.swift +181 -10
- package/ios/PCButtonView.swift +297 -14
- package/ios/PCConstants.swift +23 -2
- package/ios/PCContextMenu.mm +28 -110
- package/ios/PCContextMenu.swift +106 -167
- package/ios/PCDatePicker.mm +21 -9
- package/ios/PCDatePickerView.swift +94 -20
- package/ios/PCFloatingActionButton.h +10 -0
- package/ios/PCFloatingActionButton.mm +177 -0
- package/ios/PCFloatingActionButtonView.swift +426 -0
- package/ios/PCFloatingToolbar.mm +27 -0
- package/ios/PCFloatingToolbarView.swift +241 -0
- package/ios/PCHaptics.swift +91 -0
- package/ios/PCImageLoader.swift +76 -12
- package/ios/PCLiquidGlass.mm +36 -0
- package/ios/PCLiquidGlass.swift +221 -114
- package/ios/PCLiquidGlassContainer.h +10 -0
- package/ios/PCLiquidGlassContainer.mm +84 -0
- package/ios/PCLiquidGlassContainer.swift +69 -0
- package/ios/PCMenuItems.h +76 -0
- package/ios/PCMenuSupport.swift +350 -0
- package/ios/PCNavigationRail.h +10 -0
- package/ios/PCNavigationRail.mm +270 -0
- package/ios/PCNavigationRailView.swift +415 -0
- package/ios/PCSegmentedControl.mm +17 -2
- package/ios/PCSegmentedControl.swift +57 -7
- package/ios/PCSelectionMenu.mm +36 -8
- package/ios/PCSelectionMenu.swift +224 -48
- package/ios/PCTabBar.h +10 -0
- package/ios/PCTabBar.mm +285 -0
- package/ios/PCTabBarAccessory.h +10 -0
- package/ios/PCTabBarAccessory.mm +93 -0
- package/ios/PCTabBarAccessoryView.swift +96 -0
- package/ios/PCTabBarView.swift +671 -0
- package/ios/PCTextField.mm +159 -4
- package/ios/PCTextFieldView.swift +603 -57
- package/lib/commonjs/Button.js +73 -1
- package/lib/commonjs/Button.js.map +1 -1
- package/lib/commonjs/ButtonGroup.js +13 -3
- package/lib/commonjs/ButtonGroup.js.map +1 -1
- package/lib/commonjs/ButtonGroupNativeComponent.ts +74 -4
- package/lib/commonjs/ButtonNativeComponent.ts +119 -3
- package/lib/commonjs/ContextMenu.js +9 -48
- package/lib/commonjs/ContextMenu.js.map +1 -1
- package/lib/commonjs/ContextMenuNativeComponent.ts +47 -49
- package/lib/commonjs/DatePicker.js +98 -2
- package/lib/commonjs/DatePicker.js.map +1 -1
- package/lib/commonjs/DatePickerNativeComponent.ts +19 -2
- package/lib/commonjs/FloatingActionButton.js +60 -0
- package/lib/commonjs/FloatingActionButton.js.map +1 -0
- package/lib/commonjs/FloatingActionButtonNativeComponent.ts +58 -0
- package/lib/commonjs/FloatingToolbar.js +9 -1
- package/lib/commonjs/FloatingToolbar.js.map +1 -1
- package/lib/commonjs/FloatingToolbarNativeComponent.ts +16 -0
- package/lib/commonjs/LiquidGlass.js +7 -1
- package/lib/commonjs/LiquidGlass.js.map +1 -1
- package/lib/commonjs/LiquidGlassContainer.js +32 -0
- package/lib/commonjs/LiquidGlassContainer.js.map +1 -0
- package/lib/commonjs/LiquidGlassContainerNativeComponent.ts +17 -0
- package/lib/commonjs/LiquidGlassNativeComponent.ts +8 -0
- package/lib/commonjs/NavigationRail.js +104 -0
- package/lib/commonjs/NavigationRail.js.map +1 -0
- package/lib/commonjs/NavigationRailNativeComponent.ts +107 -0
- package/lib/commonjs/PlatformComponentsProvider.js +18 -0
- package/lib/commonjs/PlatformComponentsProvider.js.map +1 -0
- package/lib/commonjs/SegmentedControl.js +7 -0
- package/lib/commonjs/SegmentedControl.js.map +1 -1
- package/lib/commonjs/SegmentedControlNativeComponent.ts +11 -0
- package/lib/commonjs/SelectionMenu.js +27 -3
- package/lib/commonjs/SelectionMenu.js.map +1 -1
- package/lib/commonjs/SelectionMenuNativeComponent.ts +26 -4
- package/lib/commonjs/SplitButton.js +98 -0
- package/lib/commonjs/SplitButton.js.map +1 -0
- package/lib/commonjs/TabBar.js +203 -0
- package/lib/commonjs/TabBar.js.map +1 -0
- package/lib/commonjs/TabBarAccessoryNativeComponent.ts +19 -0
- package/lib/commonjs/TabBarNativeComponent.ts +145 -0
- package/lib/commonjs/TextField.js +171 -8
- package/lib/commonjs/TextField.js.map +1 -1
- package/lib/commonjs/TextFieldNativeComponent.ts +110 -4
- package/lib/commonjs/focusRegistry.js +2 -1
- package/lib/commonjs/focusRegistry.js.map +1 -1
- package/lib/commonjs/haptics.js +2 -0
- package/lib/commonjs/haptics.js.map +1 -0
- package/lib/commonjs/icons.js +15 -1
- package/lib/commonjs/icons.js.map +1 -1
- package/lib/commonjs/index.js +77 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +156 -92
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/jest.js +910 -0
- package/lib/commonjs/jest.js.map +1 -0
- package/lib/commonjs/menuItems.js +68 -0
- package/lib/commonjs/menuItems.js.map +1 -0
- package/lib/commonjs/selectionIdentifiers.js +18 -0
- package/lib/commonjs/selectionIdentifiers.js.map +1 -0
- package/lib/commonjs/submitBehavior.js +19 -0
- package/lib/commonjs/submitBehavior.js.map +1 -0
- package/lib/commonjs/tabItems.js +49 -0
- package/lib/commonjs/tabItems.js.map +1 -0
- package/lib/commonjs/web/Button.js +170 -0
- package/lib/commonjs/web/Button.js.map +1 -0
- package/lib/commonjs/web/ButtonGroup.js +119 -0
- package/lib/commonjs/web/ButtonGroup.js.map +1 -0
- package/lib/commonjs/web/DatePicker.js +168 -0
- package/lib/commonjs/web/DatePicker.js.map +1 -0
- package/lib/commonjs/web/DateRangePicker.js +137 -0
- package/lib/commonjs/web/DateRangePicker.js.map +1 -0
- package/lib/commonjs/web/Dialog.js +54 -0
- package/lib/commonjs/web/Dialog.js.map +1 -0
- package/lib/commonjs/web/FloatingActionButton.js +98 -0
- package/lib/commonjs/web/FloatingActionButton.js.map +1 -0
- package/lib/commonjs/web/Icon.js +34 -0
- package/lib/commonjs/web/Icon.js.map +1 -0
- package/lib/commonjs/web/NativeTheme.js +28 -0
- package/lib/commonjs/web/NativeTheme.js.map +1 -0
- package/lib/commonjs/web/NavigationRail.js +139 -0
- package/lib/commonjs/web/NavigationRail.js.map +1 -0
- package/lib/commonjs/web/PlatformComponentsProvider.js +51 -0
- package/lib/commonjs/web/PlatformComponentsProvider.js.map +1 -0
- package/lib/commonjs/web/SegmentedControl.js +117 -0
- package/lib/commonjs/web/SegmentedControl.js.map +1 -0
- package/lib/commonjs/web/SelectionMenu.js +142 -0
- package/lib/commonjs/web/SelectionMenu.js.map +1 -0
- package/lib/commonjs/web/SplitButton.js +35 -0
- package/lib/commonjs/web/SplitButton.js.map +1 -0
- package/lib/commonjs/web/TabBar.js +131 -0
- package/lib/commonjs/web/TabBar.js.map +1 -0
- package/lib/commonjs/web/TextField.js +322 -0
- package/lib/commonjs/web/TextField.js.map +1 -0
- package/lib/commonjs/web/components.js +36 -0
- package/lib/commonjs/web/components.js.map +1 -0
- package/lib/commonjs/web/containers.js +121 -0
- package/lib/commonjs/web/containers.js.map +1 -0
- package/lib/commonjs/web/dateInput.js +116 -0
- package/lib/commonjs/web/dateInput.js.map +1 -0
- package/lib/commonjs/web/shared.js +192 -0
- package/lib/commonjs/web/shared.js.map +1 -0
- package/lib/commonjs/webComponents.js +6 -0
- package/lib/commonjs/webComponents.js.map +1 -0
- package/lib/module/Button.js +74 -2
- package/lib/module/Button.js.map +1 -1
- package/lib/module/ButtonGroup.js +13 -3
- package/lib/module/ButtonGroup.js.map +1 -1
- package/lib/module/ButtonGroupNativeComponent.ts +74 -4
- package/lib/module/ButtonNativeComponent.ts +119 -3
- package/lib/module/ContextMenu.js +9 -48
- package/lib/module/ContextMenu.js.map +1 -1
- package/lib/module/ContextMenuNativeComponent.ts +47 -49
- package/lib/module/DatePicker.js +98 -4
- package/lib/module/DatePicker.js.map +1 -1
- package/lib/module/DatePickerNativeComponent.ts +19 -2
- package/lib/module/FloatingActionButton.js +53 -0
- package/lib/module/FloatingActionButton.js.map +1 -0
- package/lib/module/FloatingActionButtonNativeComponent.ts +58 -0
- package/lib/module/FloatingToolbar.js +9 -1
- package/lib/module/FloatingToolbar.js.map +1 -1
- package/lib/module/FloatingToolbarNativeComponent.ts +16 -0
- package/lib/module/LiquidGlass.js +7 -1
- package/lib/module/LiquidGlass.js.map +1 -1
- package/lib/module/LiquidGlassContainer.js +26 -0
- package/lib/module/LiquidGlassContainer.js.map +1 -0
- package/lib/module/LiquidGlassContainerNativeComponent.ts +17 -0
- package/lib/module/LiquidGlassNativeComponent.ts +8 -0
- package/lib/module/NavigationRail.js +99 -0
- package/lib/module/NavigationRail.js.map +1 -0
- package/lib/module/NavigationRailNativeComponent.ts +107 -0
- package/lib/module/PlatformComponentsProvider.js +13 -0
- package/lib/module/PlatformComponentsProvider.js.map +1 -0
- package/lib/module/SegmentedControl.js +9 -1
- package/lib/module/SegmentedControl.js.map +1 -1
- package/lib/module/SegmentedControlNativeComponent.ts +11 -0
- package/lib/module/SelectionMenu.js +27 -3
- package/lib/module/SelectionMenu.js.map +1 -1
- package/lib/module/SelectionMenuNativeComponent.ts +26 -4
- package/lib/module/SplitButton.js +91 -0
- package/lib/module/SplitButton.js.map +1 -0
- package/lib/module/TabBar.js +196 -0
- package/lib/module/TabBar.js.map +1 -0
- package/lib/module/TabBarAccessoryNativeComponent.ts +19 -0
- package/lib/module/TabBarNativeComponent.ts +145 -0
- package/lib/module/TextField.js +172 -9
- package/lib/module/TextField.js.map +1 -1
- package/lib/module/TextFieldNativeComponent.ts +110 -4
- package/lib/module/focusRegistry.js +1 -0
- package/lib/module/focusRegistry.js.map +1 -1
- package/lib/module/haptics.js +2 -0
- package/lib/module/haptics.js.map +1 -0
- package/lib/module/icons.js +15 -1
- package/lib/module/icons.js.map +1 -1
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +12 -87
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/jest.js +840 -0
- package/lib/module/jest.js.map +1 -0
- package/lib/module/menuItems.js +65 -0
- package/lib/module/menuItems.js.map +1 -0
- package/lib/module/selectionIdentifiers.js +14 -0
- package/lib/module/selectionIdentifiers.js.map +1 -0
- package/lib/module/submitBehavior.js +15 -0
- package/lib/module/submitBehavior.js.map +1 -0
- package/lib/module/tabItems.js +45 -0
- package/lib/module/tabItems.js.map +1 -0
- package/lib/module/web/Button.js +164 -0
- package/lib/module/web/Button.js.map +1 -0
- package/lib/module/web/ButtonGroup.js +113 -0
- package/lib/module/web/ButtonGroup.js.map +1 -0
- package/lib/module/web/DatePicker.js +162 -0
- package/lib/module/web/DatePicker.js.map +1 -0
- package/lib/module/web/DateRangePicker.js +131 -0
- package/lib/module/web/DateRangePicker.js.map +1 -0
- package/lib/module/web/Dialog.js +48 -0
- package/lib/module/web/Dialog.js.map +1 -0
- package/lib/module/web/FloatingActionButton.js +94 -0
- package/lib/module/web/FloatingActionButton.js.map +1 -0
- package/lib/module/web/Icon.js +29 -0
- package/lib/module/web/Icon.js.map +1 -0
- package/lib/module/web/NativeTheme.js +23 -0
- package/lib/module/web/NativeTheme.js.map +1 -0
- package/lib/module/web/NavigationRail.js +133 -0
- package/lib/module/web/NavigationRail.js.map +1 -0
- package/lib/module/web/PlatformComponentsProvider.js +44 -0
- package/lib/module/web/PlatformComponentsProvider.js.map +1 -0
- package/lib/module/web/SegmentedControl.js +112 -0
- package/lib/module/web/SegmentedControl.js.map +1 -0
- package/lib/module/web/SelectionMenu.js +137 -0
- package/lib/module/web/SelectionMenu.js.map +1 -0
- package/lib/module/web/SplitButton.js +30 -0
- package/lib/module/web/SplitButton.js.map +1 -0
- package/lib/module/web/TabBar.js +126 -0
- package/lib/module/web/TabBar.js.map +1 -0
- package/lib/module/web/TextField.js +316 -0
- package/lib/module/web/TextField.js.map +1 -0
- package/lib/module/web/components.js +33 -0
- package/lib/module/web/components.js.map +1 -0
- package/lib/module/web/containers.js +112 -0
- package/lib/module/web/containers.js.map +1 -0
- package/lib/module/web/dateInput.js +109 -0
- package/lib/module/web/dateInput.js.map +1 -0
- package/lib/module/web/shared.js +179 -0
- package/lib/module/web/shared.js.map +1 -0
- package/lib/module/webComponents.js +4 -0
- package/lib/module/webComponents.js.map +1 -0
- package/lib/typescript/commonjs/docs/sidebars.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/Button.d.ts +111 -3
- package/lib/typescript/commonjs/src/Button.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts +21 -6
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts +64 -3
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts +94 -3
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ContextMenu.d.ts +20 -33
- package/lib/typescript/commonjs/src/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts +45 -47
- package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePicker.d.ts +74 -1
- package/lib/typescript/commonjs/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts +16 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/FloatingActionButton.d.ts +67 -0
- package/lib/typescript/commonjs/src/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts +43 -0
- package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts +30 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts +12 -0
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/LiquidGlass.d.ts +17 -0
- package/lib/typescript/commonjs/src/LiquidGlass.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts +27 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts +7 -0
- package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/NavigationRail.d.ts +86 -0
- package/lib/typescript/commonjs/src/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts +81 -0
- package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts +6 -0
- package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts +18 -1
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts +9 -0
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SelectionMenu.d.ts +44 -2
- package/lib/typescript/commonjs/src/SelectionMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts +20 -4
- package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SplitButton.d.ts +83 -0
- package/lib/typescript/commonjs/src/SplitButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBar.d.ts +144 -0
- package/lib/typescript/commonjs/src/TabBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts +13 -0
- package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts +110 -0
- package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TextField.d.ts +166 -8
- package/lib/typescript/commonjs/src/TextField.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts +81 -3
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/focusRegistry.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/haptics.d.ts +20 -0
- package/lib/typescript/commonjs/src/haptics.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/icons.d.ts +7 -1
- package/lib/typescript/commonjs/src/icons.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +7 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.web.d.ts +25 -254
- package/lib/typescript/commonjs/src/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/jest.d.ts +139 -0
- package/lib/typescript/commonjs/src/jest.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/menuItems.d.ts +100 -0
- package/lib/typescript/commonjs/src/menuItems.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts +3 -0
- package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/submitBehavior.d.ts +9 -0
- package/lib/typescript/commonjs/src/submitBehavior.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/tabItems.d.ts +55 -0
- package/lib/typescript/commonjs/src/tabItems.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Button.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/Button.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts +11 -0
- package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/DatePicker.d.ts +14 -0
- package/lib/typescript/commonjs/src/web/DatePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts +11 -0
- package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Dialog.d.ts +12 -0
- package/lib/typescript/commonjs/src/web/Dialog.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Icon.d.ts +12 -0
- package/lib/typescript/commonjs/src/web/Icon.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/NativeTheme.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/NativeTheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/NavigationRail.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SplitButton.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/SplitButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/TabBar.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/TabBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/TextField.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/TextField.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/components.d.ts +17 -0
- package/lib/typescript/commonjs/src/web/components.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/containers.d.ts +24 -0
- package/lib/typescript/commonjs/src/web/containers.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/dateInput.d.ts +20 -0
- package/lib/typescript/commonjs/src/web/dateInput.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/shared.d.ts +43 -0
- package/lib/typescript/commonjs/src/web/shared.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/webComponents.d.ts +43 -0
- package/lib/typescript/commonjs/src/webComponents.d.ts.map +1 -0
- package/lib/typescript/module/docs/sidebars.d.ts.map +1 -1
- package/lib/typescript/module/src/Button.d.ts +111 -3
- package/lib/typescript/module/src/Button.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonGroup.d.ts +21 -6
- package/lib/typescript/module/src/ButtonGroup.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts +64 -3
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts +94 -3
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/ContextMenu.d.ts +20 -33
- package/lib/typescript/module/src/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts +45 -47
- package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePicker.d.ts +74 -1
- package/lib/typescript/module/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts +16 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/FloatingActionButton.d.ts +67 -0
- package/lib/typescript/module/src/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts +43 -0
- package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts +30 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts.map +1 -1
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts +12 -0
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/LiquidGlass.d.ts +17 -0
- package/lib/typescript/module/src/LiquidGlass.d.ts.map +1 -1
- package/lib/typescript/module/src/LiquidGlassContainer.d.ts +27 -0
- package/lib/typescript/module/src/LiquidGlassContainer.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
- package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts +7 -0
- package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/NavigationRail.d.ts +86 -0
- package/lib/typescript/module/src/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts +81 -0
- package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/PlatformComponentsProvider.d.ts +6 -0
- package/lib/typescript/module/src/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/SegmentedControl.d.ts +18 -1
- package/lib/typescript/module/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts +9 -0
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/SelectionMenu.d.ts +44 -2
- package/lib/typescript/module/src/SelectionMenu.d.ts.map +1 -1
- package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts +20 -4
- package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/SplitButton.d.ts +83 -0
- package/lib/typescript/module/src/SplitButton.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBar.d.ts +144 -0
- package/lib/typescript/module/src/TabBar.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts +13 -0
- package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBarNativeComponent.d.ts +110 -0
- package/lib/typescript/module/src/TabBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/TextField.d.ts +166 -8
- package/lib/typescript/module/src/TextField.d.ts.map +1 -1
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts +81 -3
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/focusRegistry.d.ts.map +1 -1
- package/lib/typescript/module/src/haptics.d.ts +20 -0
- package/lib/typescript/module/src/haptics.d.ts.map +1 -0
- package/lib/typescript/module/src/icons.d.ts +7 -1
- package/lib/typescript/module/src/icons.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +7 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/index.web.d.ts +25 -254
- package/lib/typescript/module/src/index.web.d.ts.map +1 -1
- package/lib/typescript/module/src/jest.d.ts +139 -0
- package/lib/typescript/module/src/jest.d.ts.map +1 -0
- package/lib/typescript/module/src/menuItems.d.ts +100 -0
- package/lib/typescript/module/src/menuItems.d.ts.map +1 -0
- package/lib/typescript/module/src/selectionIdentifiers.d.ts +3 -0
- package/lib/typescript/module/src/selectionIdentifiers.d.ts.map +1 -0
- package/lib/typescript/module/src/submitBehavior.d.ts +9 -0
- package/lib/typescript/module/src/submitBehavior.d.ts.map +1 -0
- package/lib/typescript/module/src/tabItems.d.ts +55 -0
- package/lib/typescript/module/src/tabItems.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Button.d.ts +9 -0
- package/lib/typescript/module/src/web/Button.d.ts.map +1 -0
- package/lib/typescript/module/src/web/ButtonGroup.d.ts +11 -0
- package/lib/typescript/module/src/web/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/module/src/web/DatePicker.d.ts +14 -0
- package/lib/typescript/module/src/web/DatePicker.d.ts.map +1 -0
- package/lib/typescript/module/src/web/DateRangePicker.d.ts +11 -0
- package/lib/typescript/module/src/web/DateRangePicker.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Dialog.d.ts +12 -0
- package/lib/typescript/module/src/web/Dialog.d.ts.map +1 -0
- package/lib/typescript/module/src/web/FloatingActionButton.d.ts +8 -0
- package/lib/typescript/module/src/web/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Icon.d.ts +12 -0
- package/lib/typescript/module/src/web/Icon.d.ts.map +1 -0
- package/lib/typescript/module/src/web/NativeTheme.d.ts +10 -0
- package/lib/typescript/module/src/web/NativeTheme.d.ts.map +1 -0
- package/lib/typescript/module/src/web/NavigationRail.d.ts +8 -0
- package/lib/typescript/module/src/web/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts +10 -0
- package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SegmentedControl.d.ts +8 -0
- package/lib/typescript/module/src/web/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SelectionMenu.d.ts +10 -0
- package/lib/typescript/module/src/web/SelectionMenu.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SplitButton.d.ts +9 -0
- package/lib/typescript/module/src/web/SplitButton.d.ts.map +1 -0
- package/lib/typescript/module/src/web/TabBar.d.ts +9 -0
- package/lib/typescript/module/src/web/TabBar.d.ts.map +1 -0
- package/lib/typescript/module/src/web/TextField.d.ts +9 -0
- package/lib/typescript/module/src/web/TextField.d.ts.map +1 -0
- package/lib/typescript/module/src/web/components.d.ts +17 -0
- package/lib/typescript/module/src/web/components.d.ts.map +1 -0
- package/lib/typescript/module/src/web/containers.d.ts +24 -0
- package/lib/typescript/module/src/web/containers.d.ts.map +1 -0
- package/lib/typescript/module/src/web/dateInput.d.ts +20 -0
- package/lib/typescript/module/src/web/dateInput.d.ts.map +1 -0
- package/lib/typescript/module/src/web/shared.d.ts +43 -0
- package/lib/typescript/module/src/web/shared.d.ts.map +1 -0
- package/lib/typescript/module/src/webComponents.d.ts +43 -0
- package/lib/typescript/module/src/webComponents.d.ts.map +1 -0
- package/package.json +32 -2
- package/plugin/build/index.d.ts +3 -2
- package/plugin/build/index.d.ts.map +1 -1
- package/react-native.config.js +3 -0
- package/shared/PCFloatingActionButtonComponentDescriptors-custom.h +22 -0
- package/shared/PCFloatingActionButtonShadowNode-custom.cpp +48 -0
- package/shared/PCFloatingActionButtonShadowNode-custom.h +54 -0
- package/shared/PCFloatingActionButtonState-custom.h +61 -0
- package/shared/PCNavigationRailComponentDescriptors-custom.h +47 -0
- package/shared/PCNavigationRailShadowNode-custom.h +42 -0
- package/shared/PCNavigationRailState-custom.h +62 -0
- package/shared/PCTabBarComponentDescriptors-custom.h +22 -0
- package/shared/PCTabBarShadowNode-custom.cpp +54 -0
- package/shared/PCTabBarShadowNode-custom.h +54 -0
- package/shared/PCTabBarState-custom.h +62 -0
- package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +3 -0
- package/src/Button.tsx +222 -7
- package/src/ButtonGroup.tsx +29 -11
- package/src/ButtonGroupNativeComponent.ts +74 -4
- package/src/ButtonNativeComponent.ts +119 -3
- package/src/ContextMenu.tsx +34 -81
- package/src/ContextMenuNativeComponent.ts +47 -49
- package/src/DatePicker.tsx +182 -4
- package/src/DatePickerNativeComponent.ts +19 -2
- package/src/FloatingActionButton.tsx +121 -0
- package/src/FloatingActionButtonNativeComponent.ts +58 -0
- package/src/FloatingToolbar.tsx +54 -3
- package/src/FloatingToolbarNativeComponent.ts +16 -0
- package/src/LiquidGlass.tsx +24 -1
- package/src/LiquidGlassContainer.tsx +42 -0
- package/src/LiquidGlassContainerNativeComponent.ts +17 -0
- package/src/LiquidGlassNativeComponent.ts +8 -0
- package/src/NavigationRail.tsx +203 -0
- package/src/NavigationRailNativeComponent.ts +107 -0
- package/src/PlatformComponentsProvider.tsx +15 -0
- package/src/SegmentedControl.tsx +31 -1
- package/src/SegmentedControlNativeComponent.ts +11 -0
- package/src/SelectionMenu.tsx +81 -6
- package/src/SelectionMenuNativeComponent.ts +26 -4
- package/src/SplitButton.tsx +198 -0
- package/src/TabBar.tsx +373 -0
- package/src/TabBarAccessoryNativeComponent.ts +19 -0
- package/src/TabBarNativeComponent.ts +145 -0
- package/src/TextField.tsx +428 -14
- package/src/TextFieldNativeComponent.ts +110 -4
- package/src/focusRegistry.ts +1 -0
- package/src/haptics.ts +31 -0
- package/src/icons.ts +28 -1
- package/src/index.tsx +7 -0
- package/src/index.web.tsx +51 -391
- package/src/jest.tsx +958 -0
- package/src/menuItems.ts +152 -0
- package/src/selectionIdentifiers.ts +17 -0
- package/src/submitBehavior.ts +16 -0
- package/src/tabItems.ts +113 -0
- package/src/web/Button.tsx +201 -0
- package/src/web/ButtonGroup.tsx +154 -0
- package/src/web/DatePicker.tsx +204 -0
- package/src/web/DateRangePicker.tsx +135 -0
- package/src/web/Dialog.tsx +54 -0
- package/src/web/FloatingActionButton.tsx +76 -0
- package/src/web/Icon.tsx +33 -0
- package/src/web/NativeTheme.ts +23 -0
- package/src/web/NavigationRail.tsx +148 -0
- package/src/web/PlatformComponentsProvider.tsx +48 -0
- package/src/web/SegmentedControl.tsx +127 -0
- package/src/web/SelectionMenu.tsx +149 -0
- package/src/web/SplitButton.tsx +32 -0
- package/src/web/TabBar.tsx +150 -0
- package/src/web/TextField.tsx +361 -0
- package/src/web/components.tsx +71 -0
- package/src/web/containers.tsx +130 -0
- package/src/web/dateInput.ts +137 -0
- package/src/web/shared.ts +176 -0
- package/src/webComponents.ts +45 -0
- package/android/src/main/java/com/platformcomponents/DateConstraints.kt +0 -83
|
@@ -15,11 +15,14 @@ import android.view.KeyEvent
|
|
|
15
15
|
import android.view.View
|
|
16
16
|
import android.view.ViewGroup
|
|
17
17
|
import android.view.inputmethod.EditorInfo
|
|
18
|
+
import android.view.inputmethod.InputConnection
|
|
18
19
|
import android.view.inputmethod.InputMethodManager
|
|
19
20
|
import android.widget.FrameLayout
|
|
20
21
|
import android.widget.LinearLayout
|
|
21
22
|
import android.widget.TextView
|
|
22
23
|
import android.content.res.ColorStateList
|
|
24
|
+
import android.view.accessibility.AccessibilityNodeInfo
|
|
25
|
+
import android.widget.Button
|
|
23
26
|
import android.util.TypedValue
|
|
24
27
|
import android.view.MotionEvent
|
|
25
28
|
import androidx.core.widget.TextViewCompat
|
|
@@ -32,6 +35,7 @@ import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper
|
|
|
32
35
|
import com.facebook.react.views.scroll.ReactScrollViewHelper
|
|
33
36
|
import com.google.android.material.textfield.TextInputEditText
|
|
34
37
|
import com.google.android.material.textfield.TextInputLayout
|
|
38
|
+
import com.google.android.material.R as MaterialR
|
|
35
39
|
|
|
36
40
|
/**
|
|
37
41
|
* A Material 3 text field: a TextInputLayout (floating label, box, icons,
|
|
@@ -83,6 +87,7 @@ class PCTextFieldView(context: Context) :
|
|
|
83
87
|
var autoCorrect: Boolean = true
|
|
84
88
|
var secure: Boolean = false
|
|
85
89
|
var multiline: Boolean = false
|
|
90
|
+
var submitBehavior: String = "" // "" | "submit" | "blurAndSubmit" | "newline"
|
|
86
91
|
var fieldEnabled: Boolean = true
|
|
87
92
|
var autoFocus: Boolean = false
|
|
88
93
|
var selectTextOnFocus: Boolean = false
|
|
@@ -92,15 +97,33 @@ class PCTextFieldView(context: Context) :
|
|
|
92
97
|
var fontSize: Float = 0f
|
|
93
98
|
var fontWeight: String = ""
|
|
94
99
|
var fontStyle: String = ""
|
|
95
|
-
var variant: String = "outlined" // "outlined" | "filled"
|
|
100
|
+
var variant: String = "outlined" // "outlined" | "filled" | "plain"
|
|
96
101
|
var dense: Boolean = false
|
|
97
102
|
var materialMode: String = "m3" // "m3" | "system"
|
|
103
|
+
var inputTestID: String = ""
|
|
104
|
+
var leadingIconTestID: String = ""
|
|
105
|
+
var leadingIconSpokenLabel: String = ""
|
|
106
|
+
var trailingIconTestID: String = ""
|
|
107
|
+
var trailingIconSpokenLabel: String = ""
|
|
108
|
+
var activeColor: Int? = null
|
|
109
|
+
var outlineColor: Int? = null
|
|
110
|
+
var errorColor: Int? = null
|
|
111
|
+
var containerColor: Int? = null
|
|
112
|
+
var textColor: Int? = null
|
|
113
|
+
var placeholderTextColor: Int? = null
|
|
114
|
+
var maxFontSizeMultiplier: Float = 0f
|
|
115
|
+
var textAlign: String = "" // "" | "left" | "center" | "right"
|
|
116
|
+
var minLines: Int = 0
|
|
117
|
+
var maxLines: Int = 0
|
|
118
|
+
var pressable: Boolean = false
|
|
98
119
|
|
|
99
120
|
// --- Events ---
|
|
100
121
|
var onChange: ((text: String, eventCount: Int) -> Unit)? = null
|
|
101
122
|
var onFocusChange: ((focused: Boolean, text: String) -> Unit)? = null
|
|
102
123
|
var onSubmit: ((text: String) -> Unit)? = null
|
|
124
|
+
var onSelectionChange: ((start: Int, end: Int) -> Unit)? = null
|
|
103
125
|
var onTrailingIconPress: (() -> Unit)? = null
|
|
126
|
+
var onPress: (() -> Unit)? = null
|
|
104
127
|
|
|
105
128
|
// --- Text state (survives rebuilds) ---
|
|
106
129
|
private var text: String = ""
|
|
@@ -109,6 +132,13 @@ class PCTextFieldView(context: Context) :
|
|
|
109
132
|
private var initialTextApplied = false
|
|
110
133
|
private var autoFocusDone = false
|
|
111
134
|
|
|
135
|
+
// The selection JS last heard of, so a change is reported once. Text and
|
|
136
|
+
// selection set from JS update it without an event. Declared before init:
|
|
137
|
+
// the edit text reports selections while rebuildUI() builds it.
|
|
138
|
+
private var reportedSelectionStart = -1
|
|
139
|
+
private var reportedSelectionEnd = -1
|
|
140
|
+
private var applyingSelection = false
|
|
141
|
+
|
|
112
142
|
// --- UI ---
|
|
113
143
|
/** The top-level widget: the TextInputLayout, or the system field's column. */
|
|
114
144
|
private var widget: View? = null
|
|
@@ -118,6 +148,8 @@ class PCTextFieldView(context: Context) :
|
|
|
118
148
|
|
|
119
149
|
/** The Material style's error icon, shown in the end slot while there is an error. */
|
|
120
150
|
private var defaultErrorIcon: Drawable? = null
|
|
151
|
+
private var defaultStartIconTint: ColorStateList? = null
|
|
152
|
+
private var defaultEndIconTint: ColorStateList? = null
|
|
121
153
|
|
|
122
154
|
/** Bumped on every rebuild and icon change so late image loads can't touch stale widgets. */
|
|
123
155
|
private var startIconGeneration = 0
|
|
@@ -279,12 +311,22 @@ class PCTextFieldView(context: Context) :
|
|
|
279
311
|
applyInputType()
|
|
280
312
|
}
|
|
281
313
|
|
|
314
|
+
fun applySubmitBehavior(value: String) {
|
|
315
|
+
if (submitBehavior == value) return
|
|
316
|
+
submitBehavior = value
|
|
317
|
+
// The IME asks for the enter key's action when input starts
|
|
318
|
+
val edit = editText ?: return
|
|
319
|
+
if (multiline && edit.isFocused) {
|
|
320
|
+
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
|
|
321
|
+
imm?.restartInput(edit)
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
282
325
|
fun applyInteractivity(value: String?) {
|
|
283
326
|
val next = value != "disabled"
|
|
284
327
|
if (fieldEnabled == next) return
|
|
285
328
|
fieldEnabled = next
|
|
286
|
-
|
|
287
|
-
if (layout == null) editText?.isEnabled = next
|
|
329
|
+
applyPressMode()
|
|
288
330
|
}
|
|
289
331
|
|
|
290
332
|
fun applyAutoFocus(value: Boolean) {
|
|
@@ -321,7 +363,10 @@ class PCTextFieldView(context: Context) :
|
|
|
321
363
|
}
|
|
322
364
|
|
|
323
365
|
fun applyVariant(value: String?) {
|
|
324
|
-
val next =
|
|
366
|
+
val next = when (value) {
|
|
367
|
+
"filled", "plain" -> value
|
|
368
|
+
else -> "outlined"
|
|
369
|
+
}
|
|
325
370
|
if (variant == next) return
|
|
326
371
|
variant = next
|
|
327
372
|
rebuildUI()
|
|
@@ -341,6 +386,66 @@ class PCTextFieldView(context: Context) :
|
|
|
341
386
|
rebuildUI()
|
|
342
387
|
}
|
|
343
388
|
|
|
389
|
+
fun applyInputTestID(value: String) {
|
|
390
|
+
if (inputTestID == value) return
|
|
391
|
+
inputTestID = value
|
|
392
|
+
applyTestIDs()
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
fun applyIconAccessibility(leadingID: String, leadingLabel: String, trailingID: String, trailingLabel: String) {
|
|
396
|
+
if (leadingIconTestID == leadingID && leadingIconSpokenLabel == leadingLabel &&
|
|
397
|
+
trailingIconTestID == trailingID && trailingIconSpokenLabel == trailingLabel
|
|
398
|
+
) return
|
|
399
|
+
leadingIconTestID = leadingID
|
|
400
|
+
leadingIconSpokenLabel = leadingLabel
|
|
401
|
+
trailingIconTestID = trailingID
|
|
402
|
+
trailingIconSpokenLabel = trailingLabel
|
|
403
|
+
applyTestIDs()
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
fun applyColors(active: Int?, outline: Int?, error: Int?, container: Int?, textValue: Int?, placeholderValue: Int?) {
|
|
407
|
+
if (activeColor == active && outlineColor == outline && errorColor == error &&
|
|
408
|
+
containerColor == container && textColor == textValue && placeholderTextColor == placeholderValue
|
|
409
|
+
) return
|
|
410
|
+
// A color going back to the default needs fresh widgets; the rest applies live
|
|
411
|
+
val cleared = (activeColor != null && active == null) || (outlineColor != null && outline == null) ||
|
|
412
|
+
(errorColor != null && error == null) || (containerColor != null && container == null) ||
|
|
413
|
+
(textColor != null && textValue == null) || (placeholderTextColor != null && placeholderValue == null)
|
|
414
|
+
activeColor = active
|
|
415
|
+
outlineColor = outline
|
|
416
|
+
errorColor = error
|
|
417
|
+
containerColor = container
|
|
418
|
+
textColor = textValue
|
|
419
|
+
placeholderTextColor = placeholderValue
|
|
420
|
+
if (cleared) rebuildUI() else applyColors()
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
fun applyMaxFontSizeMultiplier(value: Float) {
|
|
424
|
+
if (maxFontSizeMultiplier == value) return
|
|
425
|
+
maxFontSizeMultiplier = value
|
|
426
|
+
// Fresh widgets start from their uncapped sizes
|
|
427
|
+
rebuildUI()
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
fun applyTextAlign(value: String) {
|
|
431
|
+
if (textAlign == value) return
|
|
432
|
+
textAlign = value
|
|
433
|
+
applyInputType()
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
fun applyLineBounds(min: Int, max: Int) {
|
|
437
|
+
if (minLines == min && maxLines == max) return
|
|
438
|
+
minLines = min
|
|
439
|
+
maxLines = max
|
|
440
|
+
applyInputType()
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
fun applyPressable(value: Boolean) {
|
|
444
|
+
if (pressable == value) return
|
|
445
|
+
pressable = value
|
|
446
|
+
applyPressMode()
|
|
447
|
+
}
|
|
448
|
+
|
|
344
449
|
// ---- Commands ----
|
|
345
450
|
|
|
346
451
|
fun focusFromJS() {
|
|
@@ -373,6 +478,23 @@ class PCTextFieldView(context: Context) :
|
|
|
373
478
|
setTextInternal(value, moveCursorToEnd = false)
|
|
374
479
|
}
|
|
375
480
|
|
|
481
|
+
/**
|
|
482
|
+
* A selection from JS, clamped to the text. Dropped like a stale
|
|
483
|
+
* [setTextFromJS] when the user has edited since [eventCount].
|
|
484
|
+
*/
|
|
485
|
+
fun setSelectionFromJS(eventCount: Int, start: Int, end: Int) {
|
|
486
|
+
if (eventCount < nativeEventCount) return
|
|
487
|
+
val edit = editText ?: return
|
|
488
|
+
val length = edit.length()
|
|
489
|
+
val from = start.coerceIn(0, length)
|
|
490
|
+
val to = end.coerceIn(from, length)
|
|
491
|
+
applyingSelection = true
|
|
492
|
+
edit.setSelection(from, to)
|
|
493
|
+
applyingSelection = false
|
|
494
|
+
reportedSelectionStart = edit.selectionStart
|
|
495
|
+
reportedSelectionEnd = edit.selectionEnd
|
|
496
|
+
}
|
|
497
|
+
|
|
376
498
|
// ---- Touch ----
|
|
377
499
|
|
|
378
500
|
// The widgets have generated view ids, which React Native's touch handling
|
|
@@ -453,8 +575,8 @@ class PCTextFieldView(context: Context) :
|
|
|
453
575
|
// Material widgets need a Material theme; fall back to Material 3 defaults instead of crashing.
|
|
454
576
|
val base = PCThemeSupport.materialContext(context, "TextField")
|
|
455
577
|
val styleOverlay = when {
|
|
456
|
-
variant
|
|
457
|
-
variant
|
|
578
|
+
variant != "outlined" && dense -> R.style.PCTextField_Filled_Dense
|
|
579
|
+
variant != "outlined" -> R.style.PCTextField_Filled
|
|
458
580
|
dense -> R.style.PCTextField_Outlined_Dense
|
|
459
581
|
else -> R.style.PCTextField_Outlined
|
|
460
582
|
}
|
|
@@ -473,6 +595,14 @@ class PCTextFieldView(context: Context) :
|
|
|
473
595
|
setSelectAllOnFocus(selectTextOnFocus)
|
|
474
596
|
contentDescription = spokenLabel.ifEmpty { null }
|
|
475
597
|
}
|
|
598
|
+
// Before it joins the layout, which sizes the resting label from it
|
|
599
|
+
applyFont(edit)
|
|
600
|
+
// The plain variant is the filled field without its box or underline;
|
|
601
|
+
// the mode must be set before the layout gives the edit text its box
|
|
602
|
+
if (variant == "plain") {
|
|
603
|
+
til.boxBackgroundMode = TextInputLayout.BOX_BACKGROUND_NONE
|
|
604
|
+
edit.background = null
|
|
605
|
+
}
|
|
476
606
|
|
|
477
607
|
til.addView(edit)
|
|
478
608
|
addView(til)
|
|
@@ -480,9 +610,24 @@ class PCTextFieldView(context: Context) :
|
|
|
480
610
|
layout = til
|
|
481
611
|
editText = edit
|
|
482
612
|
defaultErrorIcon = til.errorIconDrawable
|
|
613
|
+
// TextInputLayout has tint setters but no getters. Resolve the same
|
|
614
|
+
// styled attributes its constructor uses, preserving host theme state
|
|
615
|
+
// colors so changing an image's template mode need not replace the input.
|
|
616
|
+
// https://github.com/material-components/material-components-android/blob/1.14.0/lib/java/com/google/android/material/textfield/TextInputLayout.java
|
|
617
|
+
val iconTints = til.context.obtainStyledAttributes(
|
|
618
|
+
null,
|
|
619
|
+
MaterialR.styleable.TextInputLayout,
|
|
620
|
+
MaterialR.attr.textInputStyle,
|
|
621
|
+
MaterialR.style.Widget_Design_TextInputLayout
|
|
622
|
+
)
|
|
623
|
+
try {
|
|
624
|
+
defaultStartIconTint = iconTints.getColorStateList(MaterialR.styleable.TextInputLayout_startIconTint)
|
|
625
|
+
defaultEndIconTint = iconTints.getColorStateList(MaterialR.styleable.TextInputLayout_endIconTint)
|
|
626
|
+
} finally {
|
|
627
|
+
iconTints.recycle()
|
|
628
|
+
}
|
|
483
629
|
til.prefixText = prefix.ifEmpty { null }
|
|
484
630
|
til.suffixText = suffix.ifEmpty { null }
|
|
485
|
-
til.isEnabled = fieldEnabled
|
|
486
631
|
}
|
|
487
632
|
|
|
488
633
|
applyInputType()
|
|
@@ -492,13 +637,19 @@ class PCTextFieldView(context: Context) :
|
|
|
492
637
|
applyEndIcon()
|
|
493
638
|
applyCounterAndLength()
|
|
494
639
|
applyAutofill()
|
|
640
|
+
applyColors()
|
|
641
|
+
applyPressMode()
|
|
642
|
+
applyTestIDs()
|
|
495
643
|
|
|
496
644
|
// Restore the text without reporting it as an edit
|
|
497
645
|
settingTextInternally = true
|
|
498
646
|
edit.setText(text)
|
|
647
|
+
text = edit.text?.toString().orEmpty()
|
|
499
648
|
val length = edit.length()
|
|
500
649
|
edit.setSelection(if (selection in 0..length) selection else length)
|
|
501
650
|
settingTextInternally = false
|
|
651
|
+
reportedSelectionStart = edit.selectionStart
|
|
652
|
+
reportedSelectionEnd = edit.selectionEnd
|
|
502
653
|
|
|
503
654
|
edit.addTextChangedListener(textWatcher)
|
|
504
655
|
// Focus changes are reported from FieldEditText.onFocusChanged: the Material
|
|
@@ -510,19 +661,37 @@ class PCTextFieldView(context: Context) :
|
|
|
510
661
|
requestLayout()
|
|
511
662
|
}
|
|
512
663
|
|
|
664
|
+
/** What the return key does; a single-line field has no newline to insert. */
|
|
665
|
+
private val returnKeyBehavior: String
|
|
666
|
+
get() = when {
|
|
667
|
+
submitBehavior == "submit" -> "submit"
|
|
668
|
+
multiline && submitBehavior != "blurAndSubmit" -> "newline"
|
|
669
|
+
else -> "blurAndSubmit"
|
|
670
|
+
}
|
|
671
|
+
|
|
513
672
|
private fun onEditorAction(actionId: Int, event: KeyEvent?): Boolean {
|
|
514
|
-
|
|
515
|
-
|
|
673
|
+
val behavior = returnKeyBehavior
|
|
674
|
+
// Multi-line fields keep the return key for newlines unless they submit
|
|
675
|
+
if (behavior == "newline") return false
|
|
516
676
|
// A hardware / IME Enter reports IME_ACTION_UNSPECIFIED twice (key down and up)
|
|
517
677
|
if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED && event != null && event.action != KeyEvent.ACTION_DOWN) {
|
|
518
678
|
return true
|
|
519
679
|
}
|
|
520
680
|
onSubmit?.invoke(text)
|
|
521
|
-
//
|
|
522
|
-
|
|
681
|
+
// Fields blur on submit unless submitBehavior is 'submit', as the core
|
|
682
|
+
// TextInput does; returning true keeps the keyboard up otherwise
|
|
683
|
+
if (behavior == "blurAndSubmit") blurFromJS()
|
|
523
684
|
return true
|
|
524
685
|
}
|
|
525
686
|
|
|
687
|
+
private fun selectionChanged(start: Int, end: Int) {
|
|
688
|
+
if (settingTextInternally || applyingSelection) return
|
|
689
|
+
if (start == reportedSelectionStart && end == reportedSelectionEnd) return
|
|
690
|
+
reportedSelectionStart = start
|
|
691
|
+
reportedSelectionEnd = end
|
|
692
|
+
onSelectionChange?.invoke(start, end)
|
|
693
|
+
}
|
|
694
|
+
|
|
526
695
|
private fun setTextInternal(value: String, moveCursorToEnd: Boolean) {
|
|
527
696
|
val edit = editText
|
|
528
697
|
if (edit == null) {
|
|
@@ -533,10 +702,15 @@ class PCTextFieldView(context: Context) :
|
|
|
533
702
|
val wasAtEnd = edit.selectionEnd == edit.length()
|
|
534
703
|
val cursor = edit.selectionStart
|
|
535
704
|
edit.setText(value)
|
|
536
|
-
|
|
705
|
+
// InputFilter (notably maxLength) can change the supplied value. Events
|
|
706
|
+
// must report the text the user sees, including after a widget rebuild.
|
|
707
|
+
text = edit.text?.toString().orEmpty()
|
|
537
708
|
val length = edit.length()
|
|
538
709
|
edit.setSelection(if (moveCursorToEnd || wasAtEnd) length else cursor.coerceIn(0, length))
|
|
539
710
|
settingTextInternally = false
|
|
711
|
+
// The cursor moved with the text; JS knows, so there is no event
|
|
712
|
+
reportedSelectionStart = edit.selectionStart
|
|
713
|
+
reportedSelectionEnd = edit.selectionEnd
|
|
540
714
|
}
|
|
541
715
|
|
|
542
716
|
// ---- Decorations ----
|
|
@@ -596,7 +770,7 @@ class PCTextFieldView(context: Context) :
|
|
|
596
770
|
helper.text = message
|
|
597
771
|
helper.visibility = if (message.isEmpty()) View.GONE else View.VISIBLE
|
|
598
772
|
val color = if (showsError) {
|
|
599
|
-
themeColor(AppCompatR.attr.colorError, 0xFFB3261E.toInt())
|
|
773
|
+
errorColor ?: themeColor(AppCompatR.attr.colorError, 0xFFB3261E.toInt())
|
|
600
774
|
} else {
|
|
601
775
|
themeColor(android.R.attr.textColorSecondary, 0xFF757575.toInt())
|
|
602
776
|
}
|
|
@@ -620,12 +794,13 @@ class PCTextFieldView(context: Context) :
|
|
|
620
794
|
val edit = editText ?: return
|
|
621
795
|
val start = systemStart
|
|
622
796
|
val end = systemEnd
|
|
797
|
+
val tint = ColorStateList.valueOf(themeColor(android.R.attr.colorControlNormal, 0xFF757575.toInt()))
|
|
798
|
+
// TextView's compound tint applies to every side. Each icon has its own
|
|
799
|
+
// template preference, so put the tint on the drawable instead.
|
|
800
|
+
// https://developer.android.com/reference/android/widget/TextView#setCompoundDrawableTintList(android.content.res.ColorStateList)
|
|
801
|
+
start?.mutate()?.setTintList(if (leadingIcon.tinted) tint else null)
|
|
802
|
+
end?.mutate()?.setTintList(if (trailingIcon.tinted) tint else null)
|
|
623
803
|
edit.setCompoundDrawablesRelativeWithIntrinsicBounds(start, null, end, null)
|
|
624
|
-
val tinted = (start != null && leadingIcon.tinted) || (end != null && trailingIcon.tinted)
|
|
625
|
-
TextViewCompat.setCompoundDrawableTintList(
|
|
626
|
-
edit,
|
|
627
|
-
if (tinted) ColorStateList.valueOf(themeColor(android.R.attr.colorControlNormal, 0xFF757575.toInt())) else null
|
|
628
|
-
)
|
|
629
804
|
if (end != null) {
|
|
630
805
|
edit.setOnTouchListener { v, event ->
|
|
631
806
|
if (event.action == MotionEvent.ACTION_UP) {
|
|
@@ -669,8 +844,9 @@ class PCTextFieldView(context: Context) :
|
|
|
669
844
|
}
|
|
670
845
|
loadIcon(leadingIcon) { drawable ->
|
|
671
846
|
if (generation != startIconGeneration || layout !== til) return@loadIcon
|
|
672
|
-
if (
|
|
847
|
+
til.setStartIconTintList(if (leadingIcon.tinted) defaultStartIconTint else null)
|
|
673
848
|
til.startIconDrawable = drawable
|
|
849
|
+
applyTestIDs()
|
|
674
850
|
requestLayout()
|
|
675
851
|
}
|
|
676
852
|
}
|
|
@@ -696,14 +872,15 @@ class PCTextFieldView(context: Context) :
|
|
|
696
872
|
applySystemIcons()
|
|
697
873
|
return
|
|
698
874
|
}
|
|
875
|
+
til.setEndIconTintList(if (trailingIcon.isPresent && !trailingIcon.tinted) null else defaultEndIconTint)
|
|
699
876
|
when {
|
|
700
877
|
trailingIcon.isPresent -> {
|
|
701
878
|
til.endIconMode = TextInputLayout.END_ICON_CUSTOM
|
|
702
879
|
til.setEndIconOnClickListener { onTrailingIconPress?.invoke() }
|
|
703
880
|
loadIcon(trailingIcon) { drawable ->
|
|
704
881
|
if (generation != endIconGeneration || layout !== til) return@loadIcon
|
|
705
|
-
if (!trailingIcon.tinted) til.setEndIconTintList(null)
|
|
706
882
|
til.endIconDrawable = drawable
|
|
883
|
+
applyTestIDs()
|
|
707
884
|
requestLayout()
|
|
708
885
|
}
|
|
709
886
|
}
|
|
@@ -714,9 +891,121 @@ class PCTextFieldView(context: Context) :
|
|
|
714
891
|
// Material replaces the end icon with its error icon while an error shows;
|
|
715
892
|
// a password toggle or a custom icon stays, since the user still needs it
|
|
716
893
|
til.errorIconDrawable = if (trailingIcon.isPresent || passwordToggle) null else defaultErrorIcon
|
|
894
|
+
applyTestIDs()
|
|
717
895
|
requestLayout()
|
|
718
896
|
}
|
|
719
897
|
|
|
898
|
+
// ---- Test ids, colors, font scale, press ----
|
|
899
|
+
|
|
900
|
+
/**
|
|
901
|
+
* testID sits on the EditText, where Espresso's typeText / clearText work
|
|
902
|
+
* (Detox matches the view tag); the icon ids on the Material icon buttons.
|
|
903
|
+
* The system field's icons are compound drawables and can't carry one.
|
|
904
|
+
*/
|
|
905
|
+
private fun applyTestIDs() {
|
|
906
|
+
val edit = editText ?: return
|
|
907
|
+
edit.tag = inputTestID.ifEmpty { null }
|
|
908
|
+
val til = layout ?: return
|
|
909
|
+
til.findViewById<View>(MaterialR.id.text_input_start_icon)?.tag = leadingIconTestID.ifEmpty { null }
|
|
910
|
+
til.startIconContentDescription = leadingIconSpokenLabel.ifEmpty { null }
|
|
911
|
+
// The password toggle and clear button keep Material's own descriptions
|
|
912
|
+
if (trailingIcon.isPresent) {
|
|
913
|
+
til.findViewById<View>(MaterialR.id.text_input_end_icon)?.tag = trailingIconTestID.ifEmpty { null }
|
|
914
|
+
til.endIconContentDescription = trailingIconSpokenLabel.ifEmpty { null }
|
|
915
|
+
} else {
|
|
916
|
+
til.findViewById<View>(MaterialR.id.text_input_end_icon)?.tag = null
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
/** Applies the color props over the style's colors; unset ones keep them. */
|
|
921
|
+
private fun applyColors() {
|
|
922
|
+
val edit = editText ?: return
|
|
923
|
+
textColor?.let { edit.setTextColor(it) }
|
|
924
|
+
placeholderTextColor?.let { edit.setHintTextColor(it) }
|
|
925
|
+
val til = layout
|
|
926
|
+
if (til == null) {
|
|
927
|
+
// The platform field: the underline follows the focus state
|
|
928
|
+
if (activeColor != null || outlineColor != null) {
|
|
929
|
+
val normal = outlineColor ?: themeColor(android.R.attr.colorControlNormal, 0xFF757575.toInt())
|
|
930
|
+
val focused = activeColor ?: themeColor(android.R.attr.colorControlActivated, normal)
|
|
931
|
+
edit.backgroundTintList = ColorStateList(
|
|
932
|
+
arrayOf(intArrayOf(android.R.attr.state_focused), intArrayOf()),
|
|
933
|
+
intArrayOf(focused, normal)
|
|
934
|
+
)
|
|
935
|
+
}
|
|
936
|
+
applySystemHelper()
|
|
937
|
+
return
|
|
938
|
+
}
|
|
939
|
+
if (activeColor != null || outlineColor != null) {
|
|
940
|
+
// The Material 3 stroke colors: outline (filled: on-surface-variant),
|
|
941
|
+
// on-surface while hovered, on-surface at 38% while disabled
|
|
942
|
+
fun attr(id: Int, fallback: Int): Int {
|
|
943
|
+
val value = TypedValue()
|
|
944
|
+
if (!til.context.theme.resolveAttribute(id, value, true)) return fallback
|
|
945
|
+
return if (value.resourceId != 0) til.context.getColor(value.resourceId) else value.data
|
|
946
|
+
}
|
|
947
|
+
val onSurface = attr(MaterialR.attr.colorOnSurface, 0xFF1D1B20.toInt())
|
|
948
|
+
val baseNormal = if (variant == "outlined") {
|
|
949
|
+
attr(MaterialR.attr.colorOutline, 0xFF79747E.toInt())
|
|
950
|
+
} else {
|
|
951
|
+
attr(MaterialR.attr.colorOnSurfaceVariant, 0xFF49454F.toInt())
|
|
952
|
+
}
|
|
953
|
+
val normal = outlineColor ?: baseNormal
|
|
954
|
+
val focused = activeColor ?: til.boxStrokeColor
|
|
955
|
+
val hovered = outlineColor ?: onSurface
|
|
956
|
+
val disabled = (onSurface and 0x00FFFFFF) or (0x61 shl 24)
|
|
957
|
+
til.setBoxStrokeColorStateList(
|
|
958
|
+
ColorStateList(
|
|
959
|
+
arrayOf(
|
|
960
|
+
intArrayOf(-android.R.attr.state_enabled),
|
|
961
|
+
intArrayOf(android.R.attr.state_focused),
|
|
962
|
+
intArrayOf(android.R.attr.state_hovered),
|
|
963
|
+
intArrayOf()
|
|
964
|
+
),
|
|
965
|
+
intArrayOf(disabled, focused, hovered, normal)
|
|
966
|
+
)
|
|
967
|
+
)
|
|
968
|
+
}
|
|
969
|
+
activeColor?.let {
|
|
970
|
+
til.hintTextColor = ColorStateList.valueOf(it)
|
|
971
|
+
til.cursorColor = ColorStateList.valueOf(it)
|
|
972
|
+
}
|
|
973
|
+
errorColor?.let {
|
|
974
|
+
val list = ColorStateList.valueOf(it)
|
|
975
|
+
til.setErrorTextColor(list)
|
|
976
|
+
til.setBoxStrokeErrorColor(list)
|
|
977
|
+
til.setErrorIconTintList(list)
|
|
978
|
+
til.cursorErrorColor = list
|
|
979
|
+
}
|
|
980
|
+
containerColor?.let { if (til.boxBackgroundMode != TextInputLayout.BOX_BACKGROUND_NONE) til.boxBackgroundColor = it }
|
|
981
|
+
placeholderTextColor?.let { til.placeholderTextColor = ColorStateList.valueOf(it) }
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
private val actsAsButton: Boolean
|
|
985
|
+
get() = pressable && !fieldEnabled
|
|
986
|
+
|
|
987
|
+
/**
|
|
988
|
+
* Enabled state, or a non-editable field that acts as a button: enabled
|
|
989
|
+
* look, no focus or keyboard, presses reported through onPress.
|
|
990
|
+
*/
|
|
991
|
+
private fun applyPressMode() {
|
|
992
|
+
val edit = editText ?: return
|
|
993
|
+
val button = actsAsButton
|
|
994
|
+
val enabled = fieldEnabled || button
|
|
995
|
+
layout?.isEnabled = enabled
|
|
996
|
+
if (layout == null) edit.isEnabled = enabled
|
|
997
|
+
edit.isFocusable = !button
|
|
998
|
+
edit.isFocusableInTouchMode = !button
|
|
999
|
+
edit.isCursorVisible = !button
|
|
1000
|
+
edit.isLongClickable = !button
|
|
1001
|
+
if (button) {
|
|
1002
|
+
if (edit.isFocused) clearFocusAndMaybeRefocus(edit)
|
|
1003
|
+
edit.setOnClickListener { onPress?.invoke() }
|
|
1004
|
+
} else {
|
|
1005
|
+
edit.setOnClickListener(null)
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
|
|
720
1009
|
private fun applyCounterAndLength() {
|
|
721
1010
|
val edit = editText ?: return
|
|
722
1011
|
edit.filters = if (maxLength > 0) arrayOf(InputFilter.LengthFilter(maxLength)) else emptyArray()
|
|
@@ -785,11 +1074,18 @@ class PCTextFieldView(context: Context) :
|
|
|
785
1074
|
else -> EditorInfo.IME_ACTION_UNSPECIFIED
|
|
786
1075
|
}
|
|
787
1076
|
|
|
1077
|
+
val horizontal = when (textAlign) {
|
|
1078
|
+
"left" -> Gravity.LEFT
|
|
1079
|
+
"center" -> Gravity.CENTER_HORIZONTAL
|
|
1080
|
+
"right" -> Gravity.RIGHT
|
|
1081
|
+
else -> Gravity.START
|
|
1082
|
+
}
|
|
788
1083
|
if (multiline) {
|
|
789
|
-
edit.gravity = Gravity.TOP or
|
|
790
|
-
edit.minLines = 1
|
|
1084
|
+
edit.gravity = Gravity.TOP or horizontal
|
|
1085
|
+
edit.minLines = if (minLines > 0) minLines else 1
|
|
1086
|
+
edit.maxLines = if (maxLines > 0) maxLines else Int.MAX_VALUE
|
|
791
1087
|
} else {
|
|
792
|
-
edit.gravity = Gravity.CENTER_VERTICAL or
|
|
1088
|
+
edit.gravity = Gravity.CENTER_VERTICAL or horizontal
|
|
793
1089
|
}
|
|
794
1090
|
|
|
795
1091
|
applyFont(edit)
|
|
@@ -798,6 +1094,8 @@ class PCTextFieldView(context: Context) :
|
|
|
798
1094
|
|
|
799
1095
|
private fun applyFont(edit: TextInputEditText) {
|
|
800
1096
|
PCButtonSupport.applyFont(edit, fontFamily, fontSize, fontWeight, fontStyle)
|
|
1097
|
+
edit.setTag(R.id.pc_capped_text_size, null)
|
|
1098
|
+
PCThemeSupport.capTextSize(edit, maxFontSizeMultiplier)
|
|
801
1099
|
}
|
|
802
1100
|
|
|
803
1101
|
private fun applyAutofill() {
|
|
@@ -820,23 +1118,61 @@ class PCTextFieldView(context: Context) :
|
|
|
820
1118
|
}
|
|
821
1119
|
}
|
|
822
1120
|
|
|
823
|
-
/**
|
|
1121
|
+
/**
|
|
1122
|
+
* React Native autoComplete values onto the Android autofill hints: the
|
|
1123
|
+
* core TextInput's map, plus the HTML names it leaves out. The values are
|
|
1124
|
+
* androidx.autofill HintConstants, spelled out because the React Native
|
|
1125
|
+
* floor ships an older androidx.autofill. Unknown values give no hint.
|
|
1126
|
+
*/
|
|
824
1127
|
private fun autofillHint(value: String): String? = when (value) {
|
|
825
|
-
"username" ->
|
|
826
|
-
"
|
|
827
|
-
"
|
|
828
|
-
"
|
|
829
|
-
"
|
|
830
|
-
"
|
|
831
|
-
"
|
|
832
|
-
"
|
|
833
|
-
"
|
|
834
|
-
"
|
|
835
|
-
"
|
|
836
|
-
"
|
|
837
|
-
"
|
|
838
|
-
"
|
|
839
|
-
"
|
|
1128
|
+
"username" -> "username"
|
|
1129
|
+
"username-new" -> "newUsername"
|
|
1130
|
+
"password", "current-password" -> "password"
|
|
1131
|
+
"new-password", "password-new" -> "newPassword"
|
|
1132
|
+
"one-time-code", "sms-otp" -> "smsOTPCode"
|
|
1133
|
+
"email-otp" -> "emailOTPCode"
|
|
1134
|
+
"2fa-app-otp" -> "2faAppOTPCode"
|
|
1135
|
+
"email" -> "emailAddress"
|
|
1136
|
+
"name" -> "personName"
|
|
1137
|
+
"given-name", "name-given" -> "personGivenName"
|
|
1138
|
+
"family-name", "name-family" -> "personFamilyName"
|
|
1139
|
+
"additional-name", "name-middle" -> "personMiddleName"
|
|
1140
|
+
"name-middle-initial" -> "personMiddleInitial"
|
|
1141
|
+
"honorific-prefix", "name-prefix" -> "personNamePrefix"
|
|
1142
|
+
"honorific-suffix", "name-suffix" -> "personNameSuffix"
|
|
1143
|
+
"tel" -> "phoneNumber"
|
|
1144
|
+
"tel-country-code" -> "phoneCountryCode"
|
|
1145
|
+
"tel-national" -> "phoneNational"
|
|
1146
|
+
"tel-device" -> "phoneNumberDevice"
|
|
1147
|
+
"street-address", "address-line1" -> "streetAddress"
|
|
1148
|
+
"address-line2", "postal-address-extended" -> "extendedAddress"
|
|
1149
|
+
"postal-address" -> "postalAddress"
|
|
1150
|
+
"postal-address-country", "country" -> "addressCountry"
|
|
1151
|
+
"postal-address-extended-postal-code" -> "extendedPostalCode"
|
|
1152
|
+
"postal-address-locality" -> "addressLocality"
|
|
1153
|
+
"postal-address-region" -> "addressRegion"
|
|
1154
|
+
"postal-address-dependent-locality" -> "dependentLocality"
|
|
1155
|
+
"postal-address-unit" -> "aptNumber"
|
|
1156
|
+
"postal-code" -> "postalCode"
|
|
1157
|
+
"birthdate-full" -> "birthDateFull"
|
|
1158
|
+
"birthdate-day" -> "birthDateDay"
|
|
1159
|
+
"birthdate-month" -> "birthDateMonth"
|
|
1160
|
+
"birthdate-year" -> "birthDateYear"
|
|
1161
|
+
"gender" -> "gender"
|
|
1162
|
+
"cc-number" -> "creditCardNumber"
|
|
1163
|
+
"cc-exp" -> "creditCardExpirationDate"
|
|
1164
|
+
"cc-exp-day" -> "creditCardExpirationDay"
|
|
1165
|
+
"cc-exp-month" -> "creditCardExpirationMonth"
|
|
1166
|
+
"cc-exp-year" -> "creditCardExpirationYear"
|
|
1167
|
+
"cc-csc" -> "creditCardSecurityCode"
|
|
1168
|
+
"flight-number" -> "flightNumber"
|
|
1169
|
+
"flight-confirmation-code" -> "flightConfirmationCode"
|
|
1170
|
+
"gift-card-number" -> "giftCardNumber"
|
|
1171
|
+
"gift-card-pin" -> "giftCardPIN"
|
|
1172
|
+
"loyalty-account-number" -> "loyaltyAccountNumber"
|
|
1173
|
+
"promo-code" -> "promoCode"
|
|
1174
|
+
"upi-vpa" -> "upiVirtualPaymentAddress"
|
|
1175
|
+
"wifi-password" -> "wifiPassword"
|
|
840
1176
|
else -> null
|
|
841
1177
|
}
|
|
842
1178
|
|
|
@@ -853,7 +1189,7 @@ class PCTextFieldView(context: Context) :
|
|
|
853
1189
|
if (!uri.contains(':')) {
|
|
854
1190
|
onLoaded(ResourceDrawableIdHelper.instance.getResourceDrawable(context, uri))
|
|
855
1191
|
} else {
|
|
856
|
-
PCImageLoader.load(context, uri, icon.scale) { bitmap ->
|
|
1192
|
+
PCImageLoader.load(context, uri, icon.scale, icon.request) { bitmap ->
|
|
857
1193
|
onLoaded(bitmap?.let { BitmapDrawable(context.resources, it) })
|
|
858
1194
|
}
|
|
859
1195
|
}
|
|
@@ -906,6 +1242,42 @@ class PCTextFieldView(context: Context) :
|
|
|
906
1242
|
onFocusChange?.invoke(focused, this@PCTextFieldView.text)
|
|
907
1243
|
}
|
|
908
1244
|
|
|
1245
|
+
override fun onSelectionChanged(selStart: Int, selEnd: Int) {
|
|
1246
|
+
super.onSelectionChanged(selStart, selEnd)
|
|
1247
|
+
selectionChanged(selStart, selEnd)
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
/**
|
|
1251
|
+
* A multi-line field that submits on return asks the IME for its action
|
|
1252
|
+
* key (Send, Done) in place of Enter, which TextView turns off for
|
|
1253
|
+
* multi-line input.
|
|
1254
|
+
*/
|
|
1255
|
+
override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? {
|
|
1256
|
+
val connection = super.onCreateInputConnection(outAttrs)
|
|
1257
|
+
if (multiline && returnKeyBehavior != "newline") {
|
|
1258
|
+
outAttrs.imeOptions = outAttrs.imeOptions and EditorInfo.IME_FLAG_NO_ENTER_ACTION.inv()
|
|
1259
|
+
}
|
|
1260
|
+
return connection
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo) {
|
|
1264
|
+
super.onInitializeAccessibilityNodeInfo(info)
|
|
1265
|
+
if (actsAsButton) {
|
|
1266
|
+
info.className = Button::class.java.name
|
|
1267
|
+
info.isEditable = false
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
/** A multi-line field capped at maxLines scrolls itself, not the ScrollView around it. */
|
|
1272
|
+
override fun onTouchEvent(event: MotionEvent): Boolean {
|
|
1273
|
+
if (multiline && maxLines > 0 && (canScrollVertically(1) || canScrollVertically(-1))) {
|
|
1274
|
+
when (event.actionMasked) {
|
|
1275
|
+
MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> parent?.requestDisallowInterceptTouchEvent(true)
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
return super.onTouchEvent(event)
|
|
1279
|
+
}
|
|
1280
|
+
|
|
909
1281
|
override fun onKeyPreIme(keyCode: Int, event: KeyEvent): Boolean {
|
|
910
1282
|
if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP && isFocused) {
|
|
911
1283
|
clearFocusAndMaybeRefocus(this)
|
|
@@ -983,6 +1355,9 @@ class PCTextFieldView(context: Context) :
|
|
|
983
1355
|
val child = widget ?: return
|
|
984
1356
|
// Keep the widget at its natural height even when Yoga hasn't caught up
|
|
985
1357
|
child.layout(0, 0, right - left, child.measuredHeight)
|
|
1358
|
+
// Material creates the helper, error, counter and placeholder views as
|
|
1359
|
+
// they are needed; cap the new ones (a changed size asks for a new pass)
|
|
1360
|
+
PCThemeSupport.capTextSizes(child, maxFontSizeMultiplier)
|
|
986
1361
|
// TextInputLayout makes room for its start icon and prefix (invisible
|
|
987
1362
|
// compound drawables on the edit text) from a ViewTreeObserver global
|
|
988
1363
|
// layout callback, which only a window traversal delivers. React Native's
|