Commit 27c20237 authored by shiyunjie's avatar shiyunjie

first commit

parents
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<includedPredefinedLibrary name="Node.js Core" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="JSX" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/agera-app-mask-input.iml" filepath="$PROJECT_DIR$/.idea/agera-app-mask-input.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="c536fcad-7637-4c21-912b-f89c7d2ee84a" name="Default Changelist" comment="" />
<ignored path="$PROJECT_DIR$/.tmp/" />
<ignored path="$PROJECT_DIR$/temp/" />
<ignored path="$PROJECT_DIR$/tmp/" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="152">
<caret line="9" column="23" selection-start-line="9" selection-start-column="23" selection-end-line="9" selection-end-column="23" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/android/build.gradle">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="119">
<caret line="7" column="24" selection-start-line="7" selection-start-column="24" selection-end-line="7" selection-end-column="24" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/.npmignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" column="7" selection-start-line="8" selection-start-column="7" selection-end-line="8" selection-end-column="7" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$USER_HOME$/profile201909171512_zh-cn.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="10234">
<caret line="602" column="24" selection-start-line="602" selection-start-column="24" selection-end-line="602" selection-end-column="24" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$USER_HOME$/profile201909171512_zh-hk.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="10098">
<caret line="594" column="752" selection-start-line="594" selection-start-column="752" selection-end-line="594" selection-end-column="752" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="493">
<caret line="35" column="78" selection-start-line="35" selection-start-column="78" selection-end-line="35" selection-end-column="78" />
<folding>
<element signature="e#0#40#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>versio</find>
</findStrings>
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/android/src/main/java/com/RNTextInputMask/RNTextInputMaskModule.java" />
<option value="$PROJECT_DIR$/index.js" />
<option value="$USER_HOME$/profile201909181352_zh-cn.json" />
<option value="$USER_HOME$/profile201909181352_zh-hk.json" />
<option value="$USER_HOME$/profile201909121358_zh-cn.json" />
<option value="$USER_HOME$/profile201909121358_zh-hk.json" />
<option value="$USER_HOME$/profile201909171512_zh-cn.json" />
<option value="$USER_HOME$/profile201909171512_zh-hk.json" />
<option value="$PROJECT_DIR$/.npmignore" />
<option value="$PROJECT_DIR$/package.json" />
</list>
</option>
</component>
<component name="ProjectFrameBounds">
<option name="y" value="23" />
<option name="width" value="1440" />
<option name="height" value="826" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="javascript.nodejs.core.library.configured.version" value="11.14.0" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="nodejs_interpreter_path" value="node" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="/usr/local/bin/node" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="nodejs_package_manager_path" value="npm" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$" />
<recent name="$PROJECT_DIR$/android/src/main/java/com/RNTextInputMask" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="c536fcad-7637-4c21-912b-f89c7d2ee84a" name="Default Changelist" comment="" />
<created>1568878412327</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1568878412327</updated>
<workItem from="1568878413610" duration="2132000" />
<workItem from="1568944719643" duration="2554000" />
<workItem from="1569460461044" duration="2044000" />
</task>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="6730000" />
</component>
<component name="ToolWindowManager">
<frame x="0" y="23" width="1440" height="826" extended-state="0" />
<layout>
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.1952079" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="npm" order="2" side_tool="true" />
<window_info id="Favorites" order="3" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" weight="0.32911393" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Version Control" order="8" />
<window_info anchor="bottom" id="Event Log" order="9" side_tool="true" />
<window_info active="true" anchor="bottom" id="Terminal" order="10" visible="true" weight="0.5077356" />
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/android/src/main/java/com/RNTextInputMask/RNTextInputMaskPackage.java">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/android/src/main/java/com/RNTextInputMask/RNTextInputMaskModule.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="205">
<caret line="103" column="80" selection-start-line="103" selection-start-column="68" selection-end-line="103" selection-end-column="80" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/profile201909121358_zh-hk.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="151">
<caret line="588" column="784" selection-start-line="588" selection-start-column="784" selection-end-line="588" selection-end-column="784" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/profile201909121358_zh-cn.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="151">
<caret line="588" column="784" selection-start-line="588" selection-start-column="784" selection-end-line="588" selection-end-column="784" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/profile201909181352_zh-hk.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="151">
<caret line="547" column="784" selection-start-line="547" selection-start-column="784" selection-end-line="547" selection-end-column="784" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/profile201909181352_zh-cn.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="151">
<caret line="547" column="784" selection-start-line="547" selection-start-column="766" selection-end-line="547" selection-end-column="784" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="152">
<caret line="9" column="23" selection-start-line="9" selection-start-column="23" selection-end-line="9" selection-end-column="23" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.npmignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" column="7" selection-start-line="8" selection-start-column="7" selection-end-line="8" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/profile201909171512_zh-cn.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="10234">
<caret line="602" column="24" selection-start-line="602" selection-start-column="24" selection-end-line="602" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/profile201909171512_zh-hk.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="10098">
<caret line="594" column="752" selection-start-line="594" selection-start-column="752" selection-end-line="594" selection-end-column="752" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="493">
<caret line="35" column="78" selection-start-line="35" selection-start-column="78" selection-end-line="35" selection-end-column="78" />
<folding>
<element signature="e#0#40#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/android/build.gradle">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="119">
<caret line="7" column="24" selection-start-line="7" selection-start-column="24" selection-end-line="7" selection-end-column="24" />
</state>
</provider>
</entry>
</component>
</project>
\ No newline at end of file
.DS_Store
.\#*
/node_modules
\#*
npm-debug.log
node_modules
*.tgz
.idea
.vscode
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
}
}
}
dependencies {
compile 'com.facebook.react:react-native:+'
compile 'com.redmadrobot:inputmask:2.3.0'
}
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.RNTextInputMask;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.RNTextInputMask";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.RNTextInputMask"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="22" />
</manifest>
\ No newline at end of file
[{"outputType":{"type":"AAPT_FRIENDLY_MERGED_MANIFESTS"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"react-native-text-input-mask-debug.aar","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"com.RNTextInputMask","split":""}}]
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/debug/jniLibs"/></dataSet></merger>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/debug/shaders"/></dataSet></merger>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/assets"/><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/build/intermediates/shader_assets/debug/compileDebugShaders/out"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/debug/assets"/></dataSet></merger>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/res"/><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/build/generated/res/rs/debug"/><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/res"/><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/build/generated/res/rs/debug"/><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/debug/res"/></dataSet><mergedItems/></merger>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.RNTextInputMask"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="22" />
</manifest>
\ No newline at end of file
[{"outputType":{"type":"MERGED_MANIFESTS"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"react-native-text-input-mask-debug.aar","fullName":"debug","baseName":"debug"},"path":"../../library_manifest/debug/AndroidManifest.xml","properties":{"packageId":"com.RNTextInputMask","split":""}}]
\ No newline at end of file
com.RNTextInputMask
anim abc_fade_in
anim abc_fade_out
anim abc_grow_fade_in_from_bottom
anim abc_popup_enter
anim abc_popup_exit
anim abc_shrink_fade_out_from_bottom
anim abc_slide_in_bottom
anim abc_slide_in_top
anim abc_slide_out_bottom
anim abc_slide_out_top
anim abc_tooltip_enter
anim abc_tooltip_exit
anim catalyst_fade_in
anim catalyst_fade_out
anim catalyst_push_up_in
anim catalyst_push_up_out
anim catalyst_slide_down
anim catalyst_slide_up
attr actionBarDivider
attr actionBarItemBackground
attr actionBarPopupTheme
attr actionBarSize
attr actionBarSplitStyle
attr actionBarStyle
attr actionBarTabBarStyle
attr actionBarTabStyle
attr actionBarTabTextStyle
attr actionBarTheme
attr actionBarWidgetTheme
attr actionButtonStyle
attr actionDropDownStyle
attr actionLayout
attr actionMenuTextAppearance
attr actionMenuTextColor
attr actionModeBackground
attr actionModeCloseButtonStyle
attr actionModeCloseDrawable
attr actionModeCopyDrawable
attr actionModeCutDrawable
attr actionModeFindDrawable
attr actionModePasteDrawable
attr actionModePopupWindowStyle
attr actionModeSelectAllDrawable
attr actionModeShareDrawable
attr actionModeSplitBackground
attr actionModeStyle
attr actionModeWebSearchDrawable
attr actionOverflowButtonStyle
attr actionOverflowMenuStyle
attr actionProviderClass
attr actionViewClass
attr activityChooserViewStyle
attr actualImageResource
attr actualImageScaleType
attr actualImageUri
attr alertDialogButtonGroupStyle
attr alertDialogCenterButtons
attr alertDialogStyle
attr alertDialogTheme
attr allowStacking
attr alpha
attr alphabeticModifiers
attr arrowHeadLength
attr arrowShaftLength
attr autoCompleteTextViewStyle
attr autoSizeMaxTextSize
attr autoSizeMinTextSize
attr autoSizePresetSizes
attr autoSizeStepGranularity
attr autoSizeTextType
attr background
attr backgroundImage
attr backgroundSplit
attr backgroundStacked
attr backgroundTint
attr backgroundTintMode
attr barLength
attr borderlessButtonStyle
attr buttonBarButtonStyle
attr buttonBarNegativeButtonStyle
attr buttonBarNeutralButtonStyle
attr buttonBarPositiveButtonStyle
attr buttonBarStyle
attr buttonGravity
attr buttonIconDimen
attr buttonPanelSideLayout
attr buttonStyle
attr buttonStyleSmall
attr buttonTint
attr buttonTintMode
attr checkboxStyle
attr checkedTextViewStyle
attr closeIcon
attr closeItemLayout
attr collapseContentDescription
attr collapseIcon
attr color
attr colorAccent
attr colorBackgroundFloating
attr colorButtonNormal
attr colorControlActivated
attr colorControlHighlight
attr colorControlNormal
attr colorError
attr colorPrimary
attr colorPrimaryDark
attr colorSwitchThumbNormal
attr commitIcon
attr contentDescription
attr contentInsetEnd
attr contentInsetEndWithActions
attr contentInsetLeft
attr contentInsetRight
attr contentInsetStart
attr contentInsetStartWithNavigation
attr controlBackground
attr coordinatorLayoutStyle
attr customNavigationLayout
attr defaultQueryHint
attr dialogCornerRadius
attr dialogPreferredPadding
attr dialogTheme
attr displayOptions
attr divider
attr dividerHorizontal
attr dividerPadding
attr dividerVertical
attr drawableSize
attr drawerArrowStyle
attr dropDownListViewStyle
attr dropdownListPreferredItemHeight
attr editTextBackground
attr editTextColor
attr editTextStyle
attr elevation
attr expandActivityOverflowButtonDrawable
attr fadeDuration
attr failureImage
attr failureImageScaleType
attr firstBaselineToTopHeight
attr font
attr fontFamily
attr fontProviderAuthority
attr fontProviderCerts
attr fontProviderFetchStrategy
attr fontProviderFetchTimeout
attr fontProviderPackage
attr fontProviderQuery
attr fontStyle
attr fontVariationSettings
attr fontWeight
attr gapBetweenBars
attr goIcon
attr height
attr hideOnContentScroll
attr homeAsUpIndicator
attr homeLayout
attr icon
attr iconTint
attr iconTintMode
attr iconifiedByDefault
attr imageButtonStyle
attr indeterminateProgressStyle
attr initialActivityCount
attr isLightTheme
attr itemPadding
attr keylines
attr lastBaselineToBottomHeight
attr layout
attr layout_anchor
attr layout_anchorGravity
attr layout_behavior
attr layout_dodgeInsetEdges
attr layout_insetEdge
attr layout_keyline
attr lineHeight
attr listChoiceBackgroundIndicator
attr listDividerAlertDialog
attr listItemLayout
attr listLayout
attr listMenuViewStyle
attr listPopupWindowStyle
attr listPreferredItemHeight
attr listPreferredItemHeightLarge
attr listPreferredItemHeightSmall
attr listPreferredItemPaddingLeft
attr listPreferredItemPaddingRight
attr logo
attr logoDescription
attr maxButtonHeight
attr measureWithLargestChild
attr multiChoiceItemLayout
attr navigationContentDescription
attr navigationIcon
attr navigationMode
attr numericModifiers
attr overlapAnchor
attr overlayImage
attr paddingBottomNoButtons
attr paddingEnd
attr paddingStart
attr paddingTopNoTitle
attr panelBackground
attr panelMenuListTheme
attr panelMenuListWidth
attr placeholderImage
attr placeholderImageScaleType
attr popupMenuStyle
attr popupTheme
attr popupWindowStyle
attr preserveIconSpacing
attr pressedStateOverlayImage
attr progressBarAutoRotateInterval
attr progressBarImage
attr progressBarImageScaleType
attr progressBarPadding
attr progressBarStyle
attr queryBackground
attr queryHint
attr radioButtonStyle
attr ratingBarStyle
attr ratingBarStyleIndicator
attr ratingBarStyleSmall
attr retryImage
attr retryImageScaleType
attr roundAsCircle
attr roundBottomEnd
attr roundBottomLeft
attr roundBottomRight
attr roundBottomStart
attr roundTopEnd
attr roundTopLeft
attr roundTopRight
attr roundTopStart
attr roundWithOverlayColor
attr roundedCornerRadius
attr roundingBorderColor
attr roundingBorderPadding
attr roundingBorderWidth
attr searchHintIcon
attr searchIcon
attr searchViewStyle
attr seekBarStyle
attr selectableItemBackground
attr selectableItemBackgroundBorderless
attr showAsAction
attr showDividers
attr showText
attr showTitle
attr singleChoiceItemLayout
attr spinBars
attr spinnerDropDownItemStyle
attr spinnerStyle
attr splitTrack
attr srcCompat
attr state_above_anchor
attr statusBarBackground
attr subMenuArrow
attr submitBackground
attr subtitle
attr subtitleTextAppearance
attr subtitleTextColor
attr subtitleTextStyle
attr suggestionRowLayout
attr switchMinWidth
attr switchPadding
attr switchStyle
attr switchTextAppearance
attr textAllCaps
attr textAppearanceLargePopupMenu
attr textAppearanceListItem
attr textAppearanceListItemSecondary
attr textAppearanceListItemSmall
attr textAppearancePopupMenuHeader
attr textAppearanceSearchResultSubtitle
attr textAppearanceSearchResultTitle
attr textAppearanceSmallPopupMenu
attr textColorAlertDialogListItem
attr textColorSearchUrl
attr theme
attr thickness
attr thumbTextPadding
attr thumbTint
attr thumbTintMode
attr tickMark
attr tickMarkTint
attr tickMarkTintMode
attr tint
attr tintMode
attr title
attr titleMargin
attr titleMarginBottom
attr titleMarginEnd
attr titleMarginStart
attr titleMarginTop
attr titleMargins
attr titleTextAppearance
attr titleTextColor
attr titleTextStyle
attr toolbarNavigationButtonStyle
attr toolbarStyle
attr tooltipForegroundColor
attr tooltipFrameBackground
attr tooltipText
attr track
attr trackTint
attr trackTintMode
attr ttcIndex
attr viewAspectRatio
attr viewInflaterClass
attr voiceIcon
attr windowActionBar
attr windowActionBarOverlay
attr windowActionModeOverlay
attr windowFixedHeightMajor
attr windowFixedHeightMinor
attr windowFixedWidthMajor
attr windowFixedWidthMinor
attr windowMinWidthMajor
attr windowMinWidthMinor
attr windowNoTitle
bool abc_action_bar_embed_tabs
bool abc_allow_stacked_button_bar
bool abc_config_actionMenuItemAllCaps
color abc_background_cache_hint_selector_material_dark
color abc_background_cache_hint_selector_material_light
color abc_btn_colored_borderless_text_material
color abc_btn_colored_text_material
color abc_color_highlight_material
color abc_hint_foreground_material_dark
color abc_hint_foreground_material_light
color abc_input_method_navigation_guard
color abc_primary_text_disable_only_material_dark
color abc_primary_text_disable_only_material_light
color abc_primary_text_material_dark
color abc_primary_text_material_light
color abc_search_url_text
color abc_search_url_text_normal
color abc_search_url_text_pressed
color abc_search_url_text_selected
color abc_secondary_text_material_dark
color abc_secondary_text_material_light
color abc_tint_btn_checkable
color abc_tint_default
color abc_tint_edittext
color abc_tint_seek_thumb
color abc_tint_spinner
color abc_tint_switch_track
color accent_material_dark
color accent_material_light
color background_floating_material_dark
color background_floating_material_light
color background_material_dark
color background_material_light
color bright_foreground_disabled_material_dark
color bright_foreground_disabled_material_light
color bright_foreground_inverse_material_dark
color bright_foreground_inverse_material_light
color bright_foreground_material_dark
color bright_foreground_material_light
color button_material_dark
color button_material_light
color catalyst_redbox_background
color dim_foreground_disabled_material_dark
color dim_foreground_disabled_material_light
color dim_foreground_material_dark
color dim_foreground_material_light
color error_color_material_dark
color error_color_material_light
color foreground_material_dark
color foreground_material_light
color highlighted_text_material_dark
color highlighted_text_material_light
color material_blue_grey_800
color material_blue_grey_900
color material_blue_grey_950
color material_deep_teal_200
color material_deep_teal_500
color material_grey_100
color material_grey_300
color material_grey_50
color material_grey_600
color material_grey_800
color material_grey_850
color material_grey_900
color notification_action_color_filter
color notification_icon_bg_color
color primary_dark_material_dark
color primary_dark_material_light
color primary_material_dark
color primary_material_light
color primary_text_default_material_dark
color primary_text_default_material_light
color primary_text_disabled_material_dark
color primary_text_disabled_material_light
color ripple_material_dark
color ripple_material_light
color secondary_text_default_material_dark
color secondary_text_default_material_light
color secondary_text_disabled_material_dark
color secondary_text_disabled_material_light
color switch_thumb_disabled_material_dark
color switch_thumb_disabled_material_light
color switch_thumb_material_dark
color switch_thumb_material_light
color switch_thumb_normal_material_dark
color switch_thumb_normal_material_light
color tooltip_background_dark
color tooltip_background_light
dimen abc_action_bar_content_inset_material
dimen abc_action_bar_content_inset_with_nav
dimen abc_action_bar_default_height_material
dimen abc_action_bar_default_padding_end_material
dimen abc_action_bar_default_padding_start_material
dimen abc_action_bar_elevation_material
dimen abc_action_bar_icon_vertical_padding_material
dimen abc_action_bar_overflow_padding_end_material
dimen abc_action_bar_overflow_padding_start_material
dimen abc_action_bar_stacked_max_height
dimen abc_action_bar_stacked_tab_max_width
dimen abc_action_bar_subtitle_bottom_margin_material
dimen abc_action_bar_subtitle_top_margin_material
dimen abc_action_button_min_height_material
dimen abc_action_button_min_width_material
dimen abc_action_button_min_width_overflow_material
dimen abc_alert_dialog_button_bar_height
dimen abc_alert_dialog_button_dimen
dimen abc_button_inset_horizontal_material
dimen abc_button_inset_vertical_material
dimen abc_button_padding_horizontal_material
dimen abc_button_padding_vertical_material
dimen abc_cascading_menus_min_smallest_width
dimen abc_config_prefDialogWidth
dimen abc_control_corner_material
dimen abc_control_inset_material
dimen abc_control_padding_material
dimen abc_dialog_corner_radius_material
dimen abc_dialog_fixed_height_major
dimen abc_dialog_fixed_height_minor
dimen abc_dialog_fixed_width_major
dimen abc_dialog_fixed_width_minor
dimen abc_dialog_list_padding_bottom_no_buttons
dimen abc_dialog_list_padding_top_no_title
dimen abc_dialog_min_width_major
dimen abc_dialog_min_width_minor
dimen abc_dialog_padding_material
dimen abc_dialog_padding_top_material
dimen abc_dialog_title_divider_material
dimen abc_disabled_alpha_material_dark
dimen abc_disabled_alpha_material_light
dimen abc_dropdownitem_icon_width
dimen abc_dropdownitem_text_padding_left
dimen abc_dropdownitem_text_padding_right
dimen abc_edit_text_inset_bottom_material
dimen abc_edit_text_inset_horizontal_material
dimen abc_edit_text_inset_top_material
dimen abc_floating_window_z
dimen abc_list_item_padding_horizontal_material
dimen abc_panel_menu_list_width
dimen abc_progress_bar_height_material
dimen abc_search_view_preferred_height
dimen abc_search_view_preferred_width
dimen abc_seekbar_track_background_height_material
dimen abc_seekbar_track_progress_height_material
dimen abc_select_dialog_padding_start_material
dimen abc_switch_padding
dimen abc_text_size_body_1_material
dimen abc_text_size_body_2_material
dimen abc_text_size_button_material
dimen abc_text_size_caption_material
dimen abc_text_size_display_1_material
dimen abc_text_size_display_2_material
dimen abc_text_size_display_3_material
dimen abc_text_size_display_4_material
dimen abc_text_size_headline_material
dimen abc_text_size_large_material
dimen abc_text_size_medium_material
dimen abc_text_size_menu_header_material
dimen abc_text_size_menu_material
dimen abc_text_size_small_material
dimen abc_text_size_subhead_material
dimen abc_text_size_subtitle_material_toolbar
dimen abc_text_size_title_material
dimen abc_text_size_title_material_toolbar
dimen compat_button_inset_horizontal_material
dimen compat_button_inset_vertical_material
dimen compat_button_padding_horizontal_material
dimen compat_button_padding_vertical_material
dimen compat_control_corner_material
dimen compat_notification_large_icon_max_height
dimen compat_notification_large_icon_max_width
dimen disabled_alpha_material_dark
dimen disabled_alpha_material_light
dimen highlight_alpha_material_colored
dimen highlight_alpha_material_dark
dimen highlight_alpha_material_light
dimen hint_alpha_material_dark
dimen hint_alpha_material_light
dimen hint_pressed_alpha_material_dark
dimen hint_pressed_alpha_material_light
dimen notification_action_icon_size
dimen notification_action_text_size
dimen notification_big_circle_margin
dimen notification_content_margin_start
dimen notification_large_icon_height
dimen notification_large_icon_width
dimen notification_main_column_padding_top
dimen notification_media_narrow_margin
dimen notification_right_icon_size
dimen notification_right_side_padding_top
dimen notification_small_icon_background_padding
dimen notification_small_icon_size_as_large
dimen notification_subtext_size
dimen notification_top_pad
dimen notification_top_pad_large_text
dimen tooltip_corner_radius
dimen tooltip_horizontal_padding
dimen tooltip_margin
dimen tooltip_precise_anchor_extra_offset
dimen tooltip_precise_anchor_threshold
dimen tooltip_vertical_padding
dimen tooltip_y_offset_non_touch
dimen tooltip_y_offset_touch
drawable abc_ab_share_pack_mtrl_alpha
drawable abc_action_bar_item_background_material
drawable abc_btn_borderless_material
drawable abc_btn_check_material
drawable abc_btn_check_to_on_mtrl_000
drawable abc_btn_check_to_on_mtrl_015
drawable abc_btn_colored_material
drawable abc_btn_default_mtrl_shape
drawable abc_btn_radio_material
drawable abc_btn_radio_to_on_mtrl_000
drawable abc_btn_radio_to_on_mtrl_015
drawable abc_btn_switch_to_on_mtrl_00001
drawable abc_btn_switch_to_on_mtrl_00012
drawable abc_cab_background_internal_bg
drawable abc_cab_background_top_material
drawable abc_cab_background_top_mtrl_alpha
drawable abc_control_background_material
drawable abc_dialog_material_background
drawable abc_edit_text_material
drawable abc_ic_ab_back_material
drawable abc_ic_arrow_drop_right_black_24dp
drawable abc_ic_clear_material
drawable abc_ic_commit_search_api_mtrl_alpha
drawable abc_ic_go_search_api_material
drawable abc_ic_menu_copy_mtrl_am_alpha
drawable abc_ic_menu_cut_mtrl_alpha
drawable abc_ic_menu_overflow_material
drawable abc_ic_menu_paste_mtrl_am_alpha
drawable abc_ic_menu_selectall_mtrl_alpha
drawable abc_ic_menu_share_mtrl_alpha
drawable abc_ic_search_api_material
drawable abc_ic_star_black_16dp
drawable abc_ic_star_black_36dp
drawable abc_ic_star_black_48dp
drawable abc_ic_star_half_black_16dp
drawable abc_ic_star_half_black_36dp
drawable abc_ic_star_half_black_48dp
drawable abc_ic_voice_search_api_material
drawable abc_item_background_holo_dark
drawable abc_item_background_holo_light
drawable abc_list_divider_material
drawable abc_list_divider_mtrl_alpha
drawable abc_list_focused_holo
drawable abc_list_longpressed_holo
drawable abc_list_pressed_holo_dark
drawable abc_list_pressed_holo_light
drawable abc_list_selector_background_transition_holo_dark
drawable abc_list_selector_background_transition_holo_light
drawable abc_list_selector_disabled_holo_dark
drawable abc_list_selector_disabled_holo_light
drawable abc_list_selector_holo_dark
drawable abc_list_selector_holo_light
drawable abc_menu_hardkey_panel_mtrl_mult
drawable abc_popup_background_mtrl_mult
drawable abc_ratingbar_indicator_material
drawable abc_ratingbar_material
drawable abc_ratingbar_small_material
drawable abc_scrubber_control_off_mtrl_alpha
drawable abc_scrubber_control_to_pressed_mtrl_000
drawable abc_scrubber_control_to_pressed_mtrl_005
drawable abc_scrubber_primary_mtrl_alpha
drawable abc_scrubber_track_mtrl_alpha
drawable abc_seekbar_thumb_material
drawable abc_seekbar_tick_mark_material
drawable abc_seekbar_track_material
drawable abc_spinner_mtrl_am_alpha
drawable abc_spinner_textfield_background_material
drawable abc_switch_thumb_material
drawable abc_switch_track_mtrl_alpha
drawable abc_tab_indicator_material
drawable abc_tab_indicator_mtrl_alpha
drawable abc_text_cursor_material
drawable abc_text_select_handle_left_mtrl_dark
drawable abc_text_select_handle_left_mtrl_light
drawable abc_text_select_handle_middle_mtrl_dark
drawable abc_text_select_handle_middle_mtrl_light
drawable abc_text_select_handle_right_mtrl_dark
drawable abc_text_select_handle_right_mtrl_light
drawable abc_textfield_activated_mtrl_alpha
drawable abc_textfield_default_mtrl_alpha
drawable abc_textfield_search_activated_mtrl_alpha
drawable abc_textfield_search_default_mtrl_alpha
drawable abc_textfield_search_material
drawable abc_vector_test
drawable notification_action_background
drawable notification_bg
drawable notification_bg_low
drawable notification_bg_low_normal
drawable notification_bg_low_pressed
drawable notification_bg_normal
drawable notification_bg_normal_pressed
drawable notification_icon_background
drawable notification_template_icon_bg
drawable notification_template_icon_low_bg
drawable notification_tile_bg
drawable notify_panel_notification_icon_bg
drawable redbox_top_border_background
drawable tooltip_frame_dark
drawable tooltip_frame_light
id accessibility_hint
id accessibility_role
id action_bar
id action_bar_activity_content
id action_bar_container
id action_bar_root
id action_bar_spinner
id action_bar_subtitle
id action_bar_title
id action_container
id action_context_bar
id action_divider
id action_image
id action_menu_divider
id action_menu_presenter
id action_mode_bar
id action_mode_bar_stub
id action_mode_close_button
id action_text
id actions
id activity_chooser_view_content
id add
id alertTitle
id async
id blocking
id bottom
id buttonPanel
id catalyst_redbox_title
id center
id centerCrop
id centerInside
id checkbox
id chronometer
id content
id contentPanel
id custom
id customPanel
id decor_content_parent
id default_activity_button
id edit_query
id end
id expand_activities_button
id expanded_menu
id fitBottomStart
id fitCenter
id fitEnd
id fitStart
id fitXY
id focusCrop
id forever
id fps_text
id group_divider
id home
id icon
id icon_group
id image
id info
id italic
id left
id line1
id line3
id listMode
id list_item
id message
id multiply
id none
id normal
id notification_background
id notification_main_column
id notification_main_column_container
id parentPanel
id progress_circular
id progress_horizontal
id radio
id react_test_id
id right
id right_icon
id right_side
id rn_frame_file
id rn_frame_method
id rn_redbox_copy_button
id rn_redbox_dismiss_button
id rn_redbox_line_separator
id rn_redbox_loading_indicator
id rn_redbox_reload_button
id rn_redbox_report_button
id rn_redbox_report_label
id rn_redbox_stack
id screen
id scrollIndicatorDown
id scrollIndicatorUp
id scrollView
id search_badge
id search_bar
id search_button
id search_close_btn
id search_edit_frame
id search_go_btn
id search_mag_icon
id search_plate
id search_src_text
id search_voice_btn
id select_dialog_listview
id shortcut
id spacer
id split_action_bar
id src_atop
id src_in
id src_over
id start
id submenuarrow
id submit_area
id tabMode
id tag_transition_group
id tag_unhandled_key_event_manager
id tag_unhandled_key_listeners
id text
id text2
id textSpacerNoButtons
id textSpacerNoTitle
id time
id title
id titleDividerNoCustom
id title_template
id top
id topPanel
id uniform
id up
id view_tag_instance_handle
id view_tag_native_id
id wrap_content
integer abc_config_activityDefaultDur
integer abc_config_activityShortDur
integer cancel_button_image_alpha
integer config_tooltipAnimTime
integer status_bar_notification_info_maxnum
layout abc_action_bar_title_item
layout abc_action_bar_up_container
layout abc_action_menu_item_layout
layout abc_action_menu_layout
layout abc_action_mode_bar
layout abc_action_mode_close_item_material
layout abc_activity_chooser_view
layout abc_activity_chooser_view_list_item
layout abc_alert_dialog_button_bar_material
layout abc_alert_dialog_material
layout abc_alert_dialog_title_material
layout abc_cascading_menu_item_layout
layout abc_dialog_title_material
layout abc_expanded_menu_layout
layout abc_list_menu_item_checkbox
layout abc_list_menu_item_icon
layout abc_list_menu_item_layout
layout abc_list_menu_item_radio
layout abc_popup_menu_header_item_layout
layout abc_popup_menu_item_layout
layout abc_screen_content_include
layout abc_screen_simple
layout abc_screen_simple_overlay_action_mode
layout abc_screen_toolbar
layout abc_search_dropdown_item_icons_2line
layout abc_search_view
layout abc_select_dialog_material
layout abc_tooltip
layout dev_loading_view
layout fps_view
layout notification_action
layout notification_action_tombstone
layout notification_template_custom_big
layout notification_template_icon_group
layout notification_template_part_chronometer
layout notification_template_part_time
layout redbox_item_frame
layout redbox_item_title
layout redbox_view
layout select_dialog_item_material
layout select_dialog_multichoice_material
layout select_dialog_singlechoice_material
layout support_simple_spinner_dropdown_item
string abc_action_bar_home_description
string abc_action_bar_up_description
string abc_action_menu_overflow_description
string abc_action_mode_done
string abc_activity_chooser_view_see_all
string abc_activitychooserview_choose_application
string abc_capital_off
string abc_capital_on
string abc_font_family_body_1_material
string abc_font_family_body_2_material
string abc_font_family_button_material
string abc_font_family_caption_material
string abc_font_family_display_1_material
string abc_font_family_display_2_material
string abc_font_family_display_3_material
string abc_font_family_display_4_material
string abc_font_family_headline_material
string abc_font_family_menu_material
string abc_font_family_subhead_material
string abc_font_family_title_material
string abc_menu_alt_shortcut_label
string abc_menu_ctrl_shortcut_label
string abc_menu_delete_shortcut_label
string abc_menu_enter_shortcut_label
string abc_menu_function_shortcut_label
string abc_menu_meta_shortcut_label
string abc_menu_shift_shortcut_label
string abc_menu_space_shortcut_label
string abc_menu_sym_shortcut_label
string abc_prepend_shortcut_label
string abc_search_hint
string abc_searchview_description_clear
string abc_searchview_description_query
string abc_searchview_description_search
string abc_searchview_description_submit
string abc_searchview_description_voice
string abc_shareactionprovider_share_with
string abc_shareactionprovider_share_with_application
string abc_toolbar_collapse_description
string adjustable_description
string catalyst_copy_button
string catalyst_debugjs
string catalyst_debugjs_nuclide
string catalyst_debugjs_nuclide_failure
string catalyst_debugjs_off
string catalyst_dismiss_button
string catalyst_element_inspector
string catalyst_heap_capture
string catalyst_hot_module_replacement
string catalyst_hot_module_replacement_off
string catalyst_jsload_error
string catalyst_live_reload
string catalyst_live_reload_off
string catalyst_loading_from_url
string catalyst_perf_monitor
string catalyst_perf_monitor_off
string catalyst_poke_sampling_profiler
string catalyst_reload_button
string catalyst_reloadjs
string catalyst_remotedbg_error
string catalyst_remotedbg_message
string catalyst_report_button
string catalyst_settings
string catalyst_settings_title
string header_description
string image_button_description
string image_description
string link_description
string search_description
string search_menu_title
string status_bar_notification_info_overflow
style AlertDialog_AppCompat
style AlertDialog_AppCompat_Light
style Animation_AppCompat_Dialog
style Animation_AppCompat_DropDownUp
style Animation_AppCompat_Tooltip
style Animation_Catalyst_RedBox
style Base_AlertDialog_AppCompat
style Base_AlertDialog_AppCompat_Light
style Base_Animation_AppCompat_Dialog
style Base_Animation_AppCompat_DropDownUp
style Base_Animation_AppCompat_Tooltip
style Base_DialogWindowTitleBackground_AppCompat
style Base_DialogWindowTitle_AppCompat
style Base_TextAppearance_AppCompat
style Base_TextAppearance_AppCompat_Body1
style Base_TextAppearance_AppCompat_Body2
style Base_TextAppearance_AppCompat_Button
style Base_TextAppearance_AppCompat_Caption
style Base_TextAppearance_AppCompat_Display1
style Base_TextAppearance_AppCompat_Display2
style Base_TextAppearance_AppCompat_Display3
style Base_TextAppearance_AppCompat_Display4
style Base_TextAppearance_AppCompat_Headline
style Base_TextAppearance_AppCompat_Inverse
style Base_TextAppearance_AppCompat_Large
style Base_TextAppearance_AppCompat_Large_Inverse
style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
style Base_TextAppearance_AppCompat_Medium
style Base_TextAppearance_AppCompat_Medium_Inverse
style Base_TextAppearance_AppCompat_Menu
style Base_TextAppearance_AppCompat_SearchResult
style Base_TextAppearance_AppCompat_SearchResult_Subtitle
style Base_TextAppearance_AppCompat_SearchResult_Title
style Base_TextAppearance_AppCompat_Small
style Base_TextAppearance_AppCompat_Small_Inverse
style Base_TextAppearance_AppCompat_Subhead
style Base_TextAppearance_AppCompat_Subhead_Inverse
style Base_TextAppearance_AppCompat_Title
style Base_TextAppearance_AppCompat_Title_Inverse
style Base_TextAppearance_AppCompat_Tooltip
style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu
style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle
style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
style Base_TextAppearance_AppCompat_Widget_ActionBar_Title
style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle
style Base_TextAppearance_AppCompat_Widget_ActionMode_Title
style Base_TextAppearance_AppCompat_Widget_Button
style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored
style Base_TextAppearance_AppCompat_Widget_Button_Colored
style Base_TextAppearance_AppCompat_Widget_Button_Inverse
style Base_TextAppearance_AppCompat_Widget_DropDownItem
style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header
style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large
style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small
style Base_TextAppearance_AppCompat_Widget_Switch
style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem
style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item
style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle
style Base_TextAppearance_Widget_AppCompat_Toolbar_Title
style Base_ThemeOverlay_AppCompat
style Base_ThemeOverlay_AppCompat_ActionBar
style Base_ThemeOverlay_AppCompat_Dark
style Base_ThemeOverlay_AppCompat_Dark_ActionBar
style Base_ThemeOverlay_AppCompat_Dialog
style Base_ThemeOverlay_AppCompat_Dialog_Alert
style Base_ThemeOverlay_AppCompat_Light
style Base_Theme_AppCompat
style Base_Theme_AppCompat_CompactMenu
style Base_Theme_AppCompat_Dialog
style Base_Theme_AppCompat_DialogWhenLarge
style Base_Theme_AppCompat_Dialog_Alert
style Base_Theme_AppCompat_Dialog_FixedSize
style Base_Theme_AppCompat_Dialog_MinWidth
style Base_Theme_AppCompat_Light
style Base_Theme_AppCompat_Light_DarkActionBar
style Base_Theme_AppCompat_Light_Dialog
style Base_Theme_AppCompat_Light_DialogWhenLarge
style Base_Theme_AppCompat_Light_Dialog_Alert
style Base_Theme_AppCompat_Light_Dialog_FixedSize
style Base_Theme_AppCompat_Light_Dialog_MinWidth
style Base_V21_ThemeOverlay_AppCompat_Dialog
style Base_V21_Theme_AppCompat
style Base_V21_Theme_AppCompat_Dialog
style Base_V21_Theme_AppCompat_Light
style Base_V21_Theme_AppCompat_Light_Dialog
style Base_V22_Theme_AppCompat
style Base_V22_Theme_AppCompat_Light
style Base_V23_Theme_AppCompat
style Base_V23_Theme_AppCompat_Light
style Base_V26_Theme_AppCompat
style Base_V26_Theme_AppCompat_Light
style Base_V26_Widget_AppCompat_Toolbar
style Base_V28_Theme_AppCompat
style Base_V28_Theme_AppCompat_Light
style Base_V7_ThemeOverlay_AppCompat_Dialog
style Base_V7_Theme_AppCompat
style Base_V7_Theme_AppCompat_Dialog
style Base_V7_Theme_AppCompat_Light
style Base_V7_Theme_AppCompat_Light_Dialog
style Base_V7_Widget_AppCompat_AutoCompleteTextView
style Base_V7_Widget_AppCompat_EditText
style Base_V7_Widget_AppCompat_Toolbar
style Base_Widget_AppCompat_ActionBar
style Base_Widget_AppCompat_ActionBar_Solid
style Base_Widget_AppCompat_ActionBar_TabBar
style Base_Widget_AppCompat_ActionBar_TabText
style Base_Widget_AppCompat_ActionBar_TabView
style Base_Widget_AppCompat_ActionButton
style Base_Widget_AppCompat_ActionButton_CloseMode
style Base_Widget_AppCompat_ActionButton_Overflow
style Base_Widget_AppCompat_ActionMode
style Base_Widget_AppCompat_ActivityChooserView
style Base_Widget_AppCompat_AutoCompleteTextView
style Base_Widget_AppCompat_Button
style Base_Widget_AppCompat_ButtonBar
style Base_Widget_AppCompat_ButtonBar_AlertDialog
style Base_Widget_AppCompat_Button_Borderless
style Base_Widget_AppCompat_Button_Borderless_Colored
style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog
style Base_Widget_AppCompat_Button_Colored
style Base_Widget_AppCompat_Button_Small
style Base_Widget_AppCompat_CompoundButton_CheckBox
style Base_Widget_AppCompat_CompoundButton_RadioButton
style Base_Widget_AppCompat_CompoundButton_Switch
style Base_Widget_AppCompat_DrawerArrowToggle
style Base_Widget_AppCompat_DrawerArrowToggle_Common
style Base_Widget_AppCompat_DropDownItem_Spinner
style Base_Widget_AppCompat_EditText
style Base_Widget_AppCompat_ImageButton
style Base_Widget_AppCompat_Light_ActionBar
style Base_Widget_AppCompat_Light_ActionBar_Solid
style Base_Widget_AppCompat_Light_ActionBar_TabBar
style Base_Widget_AppCompat_Light_ActionBar_TabText
style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse
style Base_Widget_AppCompat_Light_ActionBar_TabView
style Base_Widget_AppCompat_Light_PopupMenu
style Base_Widget_AppCompat_Light_PopupMenu_Overflow
style Base_Widget_AppCompat_ListMenuView
style Base_Widget_AppCompat_ListPopupWindow
style Base_Widget_AppCompat_ListView
style Base_Widget_AppCompat_ListView_DropDown
style Base_Widget_AppCompat_ListView_Menu
style Base_Widget_AppCompat_PopupMenu
style Base_Widget_AppCompat_PopupMenu_Overflow
style Base_Widget_AppCompat_PopupWindow
style Base_Widget_AppCompat_ProgressBar
style Base_Widget_AppCompat_ProgressBar_Horizontal
style Base_Widget_AppCompat_RatingBar
style Base_Widget_AppCompat_RatingBar_Indicator
style Base_Widget_AppCompat_RatingBar_Small
style Base_Widget_AppCompat_SearchView
style Base_Widget_AppCompat_SearchView_ActionBar
style Base_Widget_AppCompat_SeekBar
style Base_Widget_AppCompat_SeekBar_Discrete
style Base_Widget_AppCompat_Spinner
style Base_Widget_AppCompat_Spinner_Underlined
style Base_Widget_AppCompat_TextView_SpinnerItem
style Base_Widget_AppCompat_Toolbar
style Base_Widget_AppCompat_Toolbar_Button_Navigation
style CalendarDatePickerDialog
style CalendarDatePickerStyle
style ClockTimePickerDialog
style ClockTimePickerStyle
style DialogAnimationFade
style DialogAnimationSlide
style Platform_AppCompat
style Platform_AppCompat_Light
style Platform_ThemeOverlay_AppCompat
style Platform_ThemeOverlay_AppCompat_Dark
style Platform_ThemeOverlay_AppCompat_Light
style Platform_V21_AppCompat
style Platform_V21_AppCompat_Light
style Platform_V25_AppCompat
style Platform_V25_AppCompat_Light
style Platform_Widget_AppCompat_Spinner
style RtlOverlay_DialogWindowTitle_AppCompat
style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem
style RtlOverlay_Widget_AppCompat_DialogTitle_Icon
style RtlOverlay_Widget_AppCompat_PopupMenuItem
style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup
style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut
style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow
style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text
style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title
style RtlOverlay_Widget_AppCompat_SearchView_MagIcon
style RtlOverlay_Widget_AppCompat_Search_DropDown
style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1
style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2
style RtlOverlay_Widget_AppCompat_Search_DropDown_Query
style RtlOverlay_Widget_AppCompat_Search_DropDown_Text
style RtlUnderlay_Widget_AppCompat_ActionButton
style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow
style SpinnerDatePickerDialog
style SpinnerDatePickerStyle
style SpinnerTimePickerDialog
style SpinnerTimePickerStyle
style TextAppearance_AppCompat
style TextAppearance_AppCompat_Body1
style TextAppearance_AppCompat_Body2
style TextAppearance_AppCompat_Button
style TextAppearance_AppCompat_Caption
style TextAppearance_AppCompat_Display1
style TextAppearance_AppCompat_Display2
style TextAppearance_AppCompat_Display3
style TextAppearance_AppCompat_Display4
style TextAppearance_AppCompat_Headline
style TextAppearance_AppCompat_Inverse
style TextAppearance_AppCompat_Large
style TextAppearance_AppCompat_Large_Inverse
style TextAppearance_AppCompat_Light_SearchResult_Subtitle
style TextAppearance_AppCompat_Light_SearchResult_Title
style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
style TextAppearance_AppCompat_Medium
style TextAppearance_AppCompat_Medium_Inverse
style TextAppearance_AppCompat_Menu
style TextAppearance_AppCompat_SearchResult_Subtitle
style TextAppearance_AppCompat_SearchResult_Title
style TextAppearance_AppCompat_Small
style TextAppearance_AppCompat_Small_Inverse
style TextAppearance_AppCompat_Subhead
style TextAppearance_AppCompat_Subhead_Inverse
style TextAppearance_AppCompat_Title
style TextAppearance_AppCompat_Title_Inverse
style TextAppearance_AppCompat_Tooltip
style TextAppearance_AppCompat_Widget_ActionBar_Menu
style TextAppearance_AppCompat_Widget_ActionBar_Subtitle
style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
style TextAppearance_AppCompat_Widget_ActionBar_Title
style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
style TextAppearance_AppCompat_Widget_ActionMode_Subtitle
style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse
style TextAppearance_AppCompat_Widget_ActionMode_Title
style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse
style TextAppearance_AppCompat_Widget_Button
style TextAppearance_AppCompat_Widget_Button_Borderless_Colored
style TextAppearance_AppCompat_Widget_Button_Colored
style TextAppearance_AppCompat_Widget_Button_Inverse
style TextAppearance_AppCompat_Widget_DropDownItem
style TextAppearance_AppCompat_Widget_PopupMenu_Header
style TextAppearance_AppCompat_Widget_PopupMenu_Large
style TextAppearance_AppCompat_Widget_PopupMenu_Small
style TextAppearance_AppCompat_Widget_Switch
style TextAppearance_AppCompat_Widget_TextView_SpinnerItem
style TextAppearance_Compat_Notification
style TextAppearance_Compat_Notification_Info
style TextAppearance_Compat_Notification_Line2
style TextAppearance_Compat_Notification_Time
style TextAppearance_Compat_Notification_Title
style TextAppearance_Widget_AppCompat_ExpandedMenu_Item
style TextAppearance_Widget_AppCompat_Toolbar_Subtitle
style TextAppearance_Widget_AppCompat_Toolbar_Title
style Theme
style ThemeOverlay_AppCompat
style ThemeOverlay_AppCompat_ActionBar
style ThemeOverlay_AppCompat_Dark
style ThemeOverlay_AppCompat_Dark_ActionBar
style ThemeOverlay_AppCompat_Dialog
style ThemeOverlay_AppCompat_Dialog_Alert
style ThemeOverlay_AppCompat_Light
style Theme_AppCompat
style Theme_AppCompat_CompactMenu
style Theme_AppCompat_DayNight
style Theme_AppCompat_DayNight_DarkActionBar
style Theme_AppCompat_DayNight_Dialog
style Theme_AppCompat_DayNight_DialogWhenLarge
style Theme_AppCompat_DayNight_Dialog_Alert
style Theme_AppCompat_DayNight_Dialog_MinWidth
style Theme_AppCompat_DayNight_NoActionBar
style Theme_AppCompat_Dialog
style Theme_AppCompat_DialogWhenLarge
style Theme_AppCompat_Dialog_Alert
style Theme_AppCompat_Dialog_MinWidth
style Theme_AppCompat_Light
style Theme_AppCompat_Light_DarkActionBar
style Theme_AppCompat_Light_Dialog
style Theme_AppCompat_Light_DialogWhenLarge
style Theme_AppCompat_Light_Dialog_Alert
style Theme_AppCompat_Light_Dialog_MinWidth
style Theme_AppCompat_Light_NoActionBar
style Theme_AppCompat_NoActionBar
style Theme_Catalyst
style Theme_Catalyst_RedBox
style Theme_FullScreenDialog
style Theme_FullScreenDialogAnimatedFade
style Theme_FullScreenDialogAnimatedSlide
style Theme_ReactNative_AppCompat_Light
style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen
style Widget_AppCompat_ActionBar
style Widget_AppCompat_ActionBar_Solid
style Widget_AppCompat_ActionBar_TabBar
style Widget_AppCompat_ActionBar_TabText
style Widget_AppCompat_ActionBar_TabView
style Widget_AppCompat_ActionButton
style Widget_AppCompat_ActionButton_CloseMode
style Widget_AppCompat_ActionButton_Overflow
style Widget_AppCompat_ActionMode
style Widget_AppCompat_ActivityChooserView
style Widget_AppCompat_AutoCompleteTextView
style Widget_AppCompat_Button
style Widget_AppCompat_ButtonBar
style Widget_AppCompat_ButtonBar_AlertDialog
style Widget_AppCompat_Button_Borderless
style Widget_AppCompat_Button_Borderless_Colored
style Widget_AppCompat_Button_ButtonBar_AlertDialog
style Widget_AppCompat_Button_Colored
style Widget_AppCompat_Button_Small
style Widget_AppCompat_CompoundButton_CheckBox
style Widget_AppCompat_CompoundButton_RadioButton
style Widget_AppCompat_CompoundButton_Switch
style Widget_AppCompat_DrawerArrowToggle
style Widget_AppCompat_DropDownItem_Spinner
style Widget_AppCompat_EditText
style Widget_AppCompat_ImageButton
style Widget_AppCompat_Light_ActionBar
style Widget_AppCompat_Light_ActionBar_Solid
style Widget_AppCompat_Light_ActionBar_Solid_Inverse
style Widget_AppCompat_Light_ActionBar_TabBar
style Widget_AppCompat_Light_ActionBar_TabBar_Inverse
style Widget_AppCompat_Light_ActionBar_TabText
style Widget_AppCompat_Light_ActionBar_TabText_Inverse
style Widget_AppCompat_Light_ActionBar_TabView
style Widget_AppCompat_Light_ActionBar_TabView_Inverse
style Widget_AppCompat_Light_ActionButton
style Widget_AppCompat_Light_ActionButton_CloseMode
style Widget_AppCompat_Light_ActionButton_Overflow
style Widget_AppCompat_Light_ActionMode_Inverse
style Widget_AppCompat_Light_ActivityChooserView
style Widget_AppCompat_Light_AutoCompleteTextView
style Widget_AppCompat_Light_DropDownItem_Spinner
style Widget_AppCompat_Light_ListPopupWindow
style Widget_AppCompat_Light_ListView_DropDown
style Widget_AppCompat_Light_PopupMenu
style Widget_AppCompat_Light_PopupMenu_Overflow
style Widget_AppCompat_Light_SearchView
style Widget_AppCompat_Light_Spinner_DropDown_ActionBar
style Widget_AppCompat_ListMenuView
style Widget_AppCompat_ListPopupWindow
style Widget_AppCompat_ListView
style Widget_AppCompat_ListView_DropDown
style Widget_AppCompat_ListView_Menu
style Widget_AppCompat_PopupMenu
style Widget_AppCompat_PopupMenu_Overflow
style Widget_AppCompat_PopupWindow
style Widget_AppCompat_ProgressBar
style Widget_AppCompat_ProgressBar_Horizontal
style Widget_AppCompat_RatingBar
style Widget_AppCompat_RatingBar_Indicator
style Widget_AppCompat_RatingBar_Small
style Widget_AppCompat_SearchView
style Widget_AppCompat_SearchView_ActionBar
style Widget_AppCompat_SeekBar
style Widget_AppCompat_SeekBar_Discrete
style Widget_AppCompat_Spinner
style Widget_AppCompat_Spinner_DropDown
style Widget_AppCompat_Spinner_DropDown_ActionBar
style Widget_AppCompat_Spinner_Underlined
style Widget_AppCompat_TextView_SpinnerItem
style Widget_AppCompat_Toolbar
style Widget_AppCompat_Toolbar_Button_Navigation
style Widget_Compat_NotificationActionContainer
style Widget_Compat_NotificationActionText
style Widget_Support_CoordinatorLayout
style redboxButton
styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle
styleable ActionBarLayout android_layout_gravity
styleable ActionMenuItemView android_minWidth
styleable ActionMenuView
styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle
styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount
styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout
styleable AnimatedStateListDrawableCompat android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible
styleable AnimatedStateListDrawableItem android_drawable android_id
styleable AnimatedStateListDrawableTransition android_drawable android_fromId android_reversible android_toId
styleable AppCompatImageView android_src srcCompat tint tintMode
styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode
styleable AppCompatTextHelper android_drawableBottom android_drawableEnd android_drawableLeft android_drawableRight android_drawableStart android_drawableTop android_textAppearance
styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType firstBaselineToTopHeight fontFamily lastBaselineToBottomHeight lineHeight textAllCaps
styleable AppCompatTheme actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme android_windowAnimationStyle android_windowIsFloating autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingLeft listPreferredItemPaddingRight panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle
styleable ButtonBarLayout allowStacking
styleable ColorStateListItem alpha android_alpha android_color
styleable CompoundButton android_button buttonTint buttonTintMode
styleable CoordinatorLayout keylines statusBarBackground
styleable CoordinatorLayout_Layout android_layout_gravity layout_anchor layout_anchorGravity layout_behavior layout_dodgeInsetEdges layout_insetEdge layout_keyline
styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness
styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery
styleable FontFamilyFont android_font android_fontStyle android_fontVariationSettings android_fontWeight android_ttcIndex font fontStyle fontVariationSettings fontWeight ttcIndex
styleable GenericDraweeHierarchy actualImageScaleType backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio
styleable GradientColor android_centerColor android_centerX android_centerY android_endColor android_endX android_endY android_gradientRadius android_startColor android_startX android_startY android_tileMode android_type
styleable GradientColorItem android_color android_offset
styleable LinearLayoutCompat android_baselineAligned android_baselineAlignedChildIndex android_gravity android_orientation android_weightSum divider dividerPadding measureWithLargestChild showDividers
styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_height android_layout_weight android_layout_width
styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset
styleable MenuGroup android_checkableBehavior android_enabled android_id android_menuCategory android_orderInCategory android_visible
styleable MenuItem actionLayout actionProviderClass actionViewClass alphabeticModifiers android_alphabeticShortcut android_checkable android_checked android_enabled android_icon android_id android_menuCategory android_numericShortcut android_onClick android_orderInCategory android_title android_titleCondensed android_visible contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText
styleable MenuView android_headerBackground android_horizontalDivider android_itemBackground android_itemIconDisabledAlpha android_itemTextAppearance android_verticalDivider android_windowAnimationStyle preserveIconSpacing subMenuArrow
styleable PopupWindow android_popupAnimationStyle android_popupBackground overlapAnchor
styleable PopupWindowBackgroundState state_above_anchor
styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle
styleable SearchView android_focusable android_imeOptions android_inputType android_maxWidth closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon
styleable SimpleDraweeView actualImageResource actualImageScaleType actualImageUri backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio
styleable Spinner android_dropDownWidth android_entries android_popupBackground android_prompt popupTheme
styleable StateListDrawable android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible
styleable StateListDrawableItem android_drawable
styleable SwitchCompat android_textOff android_textOn android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode
styleable TextAppearance android_fontFamily android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_textColor android_textColorHint android_textColorLink android_textSize android_textStyle android_typeface fontFamily textAllCaps
styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor
styleable View android_focusable android_theme paddingEnd paddingStart theme
styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode
styleable ViewStubCompat android_id android_inflatedId android_layout
xml rn_dev_preferences
int anim abc_fade_in 0x7f010001
int anim abc_fade_out 0x7f010002
int anim abc_grow_fade_in_from_bottom 0x7f010003
int anim abc_popup_enter 0x7f010004
int anim abc_popup_exit 0x7f010005
int anim abc_shrink_fade_out_from_bottom 0x7f010006
int anim abc_slide_in_bottom 0x7f010007
int anim abc_slide_in_top 0x7f010008
int anim abc_slide_out_bottom 0x7f010009
int anim abc_slide_out_top 0x7f01000a
int anim abc_tooltip_enter 0x7f01000b
int anim abc_tooltip_exit 0x7f01000c
int anim catalyst_fade_in 0x7f01000d
int anim catalyst_fade_out 0x7f01000e
int anim catalyst_push_up_in 0x7f01000f
int anim catalyst_push_up_out 0x7f010010
int anim catalyst_slide_down 0x7f010011
int anim catalyst_slide_up 0x7f010012
int attr actionBarDivider 0x7f040001
int attr actionBarItemBackground 0x7f040002
int attr actionBarPopupTheme 0x7f040003
int attr actionBarSize 0x7f040004
int attr actionBarSplitStyle 0x7f040005
int attr actionBarStyle 0x7f040006
int attr actionBarTabBarStyle 0x7f040007
int attr actionBarTabStyle 0x7f040008
int attr actionBarTabTextStyle 0x7f040009
int attr actionBarTheme 0x7f04000a
int attr actionBarWidgetTheme 0x7f04000b
int attr actionButtonStyle 0x7f04000c
int attr actionDropDownStyle 0x7f04000d
int attr actionLayout 0x7f04000e
int attr actionMenuTextAppearance 0x7f04000f
int attr actionMenuTextColor 0x7f040010
int attr actionModeBackground 0x7f040011
int attr actionModeCloseButtonStyle 0x7f040012
int attr actionModeCloseDrawable 0x7f040013
int attr actionModeCopyDrawable 0x7f040014
int attr actionModeCutDrawable 0x7f040015
int attr actionModeFindDrawable 0x7f040016
int attr actionModePasteDrawable 0x7f040017
int attr actionModePopupWindowStyle 0x7f040018
int attr actionModeSelectAllDrawable 0x7f040019
int attr actionModeShareDrawable 0x7f04001a
int attr actionModeSplitBackground 0x7f04001b
int attr actionModeStyle 0x7f04001c
int attr actionModeWebSearchDrawable 0x7f04001d
int attr actionOverflowButtonStyle 0x7f04001e
int attr actionOverflowMenuStyle 0x7f04001f
int attr actionProviderClass 0x7f040020
int attr actionViewClass 0x7f040021
int attr activityChooserViewStyle 0x7f040022
int attr actualImageResource 0x7f040023
int attr actualImageScaleType 0x7f040024
int attr actualImageUri 0x7f040025
int attr alertDialogButtonGroupStyle 0x7f040026
int attr alertDialogCenterButtons 0x7f040027
int attr alertDialogStyle 0x7f040028
int attr alertDialogTheme 0x7f040029
int attr allowStacking 0x7f04002a
int attr alpha 0x7f04002b
int attr alphabeticModifiers 0x7f04002c
int attr arrowHeadLength 0x7f04002d
int attr arrowShaftLength 0x7f04002e
int attr autoCompleteTextViewStyle 0x7f04002f
int attr autoSizeMaxTextSize 0x7f040030
int attr autoSizeMinTextSize 0x7f040031
int attr autoSizePresetSizes 0x7f040032
int attr autoSizeStepGranularity 0x7f040033
int attr autoSizeTextType 0x7f040034
int attr background 0x7f040035
int attr backgroundImage 0x7f040036
int attr backgroundSplit 0x7f040037
int attr backgroundStacked 0x7f040038
int attr backgroundTint 0x7f040039
int attr backgroundTintMode 0x7f04003a
int attr barLength 0x7f04003b
int attr borderlessButtonStyle 0x7f04003c
int attr buttonBarButtonStyle 0x7f04003d
int attr buttonBarNegativeButtonStyle 0x7f04003e
int attr buttonBarNeutralButtonStyle 0x7f04003f
int attr buttonBarPositiveButtonStyle 0x7f040040
int attr buttonBarStyle 0x7f040041
int attr buttonGravity 0x7f040042
int attr buttonIconDimen 0x7f040043
int attr buttonPanelSideLayout 0x7f040044
int attr buttonStyle 0x7f040045
int attr buttonStyleSmall 0x7f040046
int attr buttonTint 0x7f040047
int attr buttonTintMode 0x7f040048
int attr checkboxStyle 0x7f040049
int attr checkedTextViewStyle 0x7f04004a
int attr closeIcon 0x7f04004b
int attr closeItemLayout 0x7f04004c
int attr collapseContentDescription 0x7f04004d
int attr collapseIcon 0x7f04004e
int attr color 0x7f04004f
int attr colorAccent 0x7f040050
int attr colorBackgroundFloating 0x7f040051
int attr colorButtonNormal 0x7f040052
int attr colorControlActivated 0x7f040053
int attr colorControlHighlight 0x7f040054
int attr colorControlNormal 0x7f040055
int attr colorError 0x7f040056
int attr colorPrimary 0x7f040057
int attr colorPrimaryDark 0x7f040058
int attr colorSwitchThumbNormal 0x7f040059
int attr commitIcon 0x7f04005a
int attr contentDescription 0x7f04005b
int attr contentInsetEnd 0x7f04005c
int attr contentInsetEndWithActions 0x7f04005d
int attr contentInsetLeft 0x7f04005e
int attr contentInsetRight 0x7f04005f
int attr contentInsetStart 0x7f040060
int attr contentInsetStartWithNavigation 0x7f040061
int attr controlBackground 0x7f040062
int attr coordinatorLayoutStyle 0x7f040063
int attr customNavigationLayout 0x7f040064
int attr defaultQueryHint 0x7f040065
int attr dialogCornerRadius 0x7f040066
int attr dialogPreferredPadding 0x7f040067
int attr dialogTheme 0x7f040068
int attr displayOptions 0x7f040069
int attr divider 0x7f04006a
int attr dividerHorizontal 0x7f04006b
int attr dividerPadding 0x7f04006c
int attr dividerVertical 0x7f04006d
int attr drawableSize 0x7f04006e
int attr drawerArrowStyle 0x7f04006f
int attr dropDownListViewStyle 0x7f040070
int attr dropdownListPreferredItemHeight 0x7f040071
int attr editTextBackground 0x7f040072
int attr editTextColor 0x7f040073
int attr editTextStyle 0x7f040074
int attr elevation 0x7f040075
int attr expandActivityOverflowButtonDrawable 0x7f040076
int attr fadeDuration 0x7f040077
int attr failureImage 0x7f040078
int attr failureImageScaleType 0x7f040079
int attr firstBaselineToTopHeight 0x7f04007a
int attr font 0x7f04007b
int attr fontFamily 0x7f04007c
int attr fontProviderAuthority 0x7f04007d
int attr fontProviderCerts 0x7f04007e
int attr fontProviderFetchStrategy 0x7f04007f
int attr fontProviderFetchTimeout 0x7f040080
int attr fontProviderPackage 0x7f040081
int attr fontProviderQuery 0x7f040082
int attr fontStyle 0x7f040083
int attr fontVariationSettings 0x7f040084
int attr fontWeight 0x7f040085
int attr gapBetweenBars 0x7f040086
int attr goIcon 0x7f040087
int attr height 0x7f040088
int attr hideOnContentScroll 0x7f040089
int attr homeAsUpIndicator 0x7f04008a
int attr homeLayout 0x7f04008b
int attr icon 0x7f04008c
int attr iconTint 0x7f04008d
int attr iconTintMode 0x7f04008e
int attr iconifiedByDefault 0x7f04008f
int attr imageButtonStyle 0x7f040090
int attr indeterminateProgressStyle 0x7f040091
int attr initialActivityCount 0x7f040092
int attr isLightTheme 0x7f040093
int attr itemPadding 0x7f040094
int attr keylines 0x7f040095
int attr lastBaselineToBottomHeight 0x7f040096
int attr layout 0x7f040097
int attr layout_anchor 0x7f040098
int attr layout_anchorGravity 0x7f040099
int attr layout_behavior 0x7f04009a
int attr layout_dodgeInsetEdges 0x7f04009b
int attr layout_insetEdge 0x7f04009c
int attr layout_keyline 0x7f04009d
int attr lineHeight 0x7f04009e
int attr listChoiceBackgroundIndicator 0x7f04009f
int attr listDividerAlertDialog 0x7f0400a0
int attr listItemLayout 0x7f0400a1
int attr listLayout 0x7f0400a2
int attr listMenuViewStyle 0x7f0400a3
int attr listPopupWindowStyle 0x7f0400a4
int attr listPreferredItemHeight 0x7f0400a5
int attr listPreferredItemHeightLarge 0x7f0400a6
int attr listPreferredItemHeightSmall 0x7f0400a7
int attr listPreferredItemPaddingLeft 0x7f0400a8
int attr listPreferredItemPaddingRight 0x7f0400a9
int attr logo 0x7f0400aa
int attr logoDescription 0x7f0400ab
int attr maxButtonHeight 0x7f0400ac
int attr measureWithLargestChild 0x7f0400ad
int attr multiChoiceItemLayout 0x7f0400ae
int attr navigationContentDescription 0x7f0400af
int attr navigationIcon 0x7f0400b0
int attr navigationMode 0x7f0400b1
int attr numericModifiers 0x7f0400b2
int attr overlapAnchor 0x7f0400b3
int attr overlayImage 0x7f0400b4
int attr paddingBottomNoButtons 0x7f0400b5
int attr paddingEnd 0x7f0400b6
int attr paddingStart 0x7f0400b7
int attr paddingTopNoTitle 0x7f0400b8
int attr panelBackground 0x7f0400b9
int attr panelMenuListTheme 0x7f0400ba
int attr panelMenuListWidth 0x7f0400bb
int attr placeholderImage 0x7f0400bc
int attr placeholderImageScaleType 0x7f0400bd
int attr popupMenuStyle 0x7f0400be
int attr popupTheme 0x7f0400bf
int attr popupWindowStyle 0x7f0400c0
int attr preserveIconSpacing 0x7f0400c1
int attr pressedStateOverlayImage 0x7f0400c2
int attr progressBarAutoRotateInterval 0x7f0400c3
int attr progressBarImage 0x7f0400c4
int attr progressBarImageScaleType 0x7f0400c5
int attr progressBarPadding 0x7f0400c6
int attr progressBarStyle 0x7f0400c7
int attr queryBackground 0x7f0400c8
int attr queryHint 0x7f0400c9
int attr radioButtonStyle 0x7f0400ca
int attr ratingBarStyle 0x7f0400cb
int attr ratingBarStyleIndicator 0x7f0400cc
int attr ratingBarStyleSmall 0x7f0400cd
int attr retryImage 0x7f0400ce
int attr retryImageScaleType 0x7f0400cf
int attr roundAsCircle 0x7f0400d0
int attr roundBottomEnd 0x7f0400d1
int attr roundBottomLeft 0x7f0400d2
int attr roundBottomRight 0x7f0400d3
int attr roundBottomStart 0x7f0400d4
int attr roundTopEnd 0x7f0400d5
int attr roundTopLeft 0x7f0400d6
int attr roundTopRight 0x7f0400d7
int attr roundTopStart 0x7f0400d8
int attr roundWithOverlayColor 0x7f0400d9
int attr roundedCornerRadius 0x7f0400da
int attr roundingBorderColor 0x7f0400db
int attr roundingBorderPadding 0x7f0400dc
int attr roundingBorderWidth 0x7f0400dd
int attr searchHintIcon 0x7f0400de
int attr searchIcon 0x7f0400df
int attr searchViewStyle 0x7f0400e0
int attr seekBarStyle 0x7f0400e1
int attr selectableItemBackground 0x7f0400e2
int attr selectableItemBackgroundBorderless 0x7f0400e3
int attr showAsAction 0x7f0400e4
int attr showDividers 0x7f0400e5
int attr showText 0x7f0400e6
int attr showTitle 0x7f0400e7
int attr singleChoiceItemLayout 0x7f0400e8
int attr spinBars 0x7f0400e9
int attr spinnerDropDownItemStyle 0x7f0400ea
int attr spinnerStyle 0x7f0400eb
int attr splitTrack 0x7f0400ec
int attr srcCompat 0x7f0400ed
int attr state_above_anchor 0x7f0400ee
int attr statusBarBackground 0x7f0400ef
int attr subMenuArrow 0x7f0400f0
int attr submitBackground 0x7f0400f1
int attr subtitle 0x7f0400f2
int attr subtitleTextAppearance 0x7f0400f3
int attr subtitleTextColor 0x7f0400f4
int attr subtitleTextStyle 0x7f0400f5
int attr suggestionRowLayout 0x7f0400f6
int attr switchMinWidth 0x7f0400f7
int attr switchPadding 0x7f0400f8
int attr switchStyle 0x7f0400f9
int attr switchTextAppearance 0x7f0400fa
int attr textAllCaps 0x7f0400fb
int attr textAppearanceLargePopupMenu 0x7f0400fc
int attr textAppearanceListItem 0x7f0400fd
int attr textAppearanceListItemSecondary 0x7f0400fe
int attr textAppearanceListItemSmall 0x7f0400ff
int attr textAppearancePopupMenuHeader 0x7f040100
int attr textAppearanceSearchResultSubtitle 0x7f040101
int attr textAppearanceSearchResultTitle 0x7f040102
int attr textAppearanceSmallPopupMenu 0x7f040103
int attr textColorAlertDialogListItem 0x7f040104
int attr textColorSearchUrl 0x7f040105
int attr theme 0x7f040106
int attr thickness 0x7f040107
int attr thumbTextPadding 0x7f040108
int attr thumbTint 0x7f040109
int attr thumbTintMode 0x7f04010a
int attr tickMark 0x7f04010b
int attr tickMarkTint 0x7f04010c
int attr tickMarkTintMode 0x7f04010d
int attr tint 0x7f04010e
int attr tintMode 0x7f04010f
int attr title 0x7f040110
int attr titleMargin 0x7f040111
int attr titleMarginBottom 0x7f040112
int attr titleMarginEnd 0x7f040113
int attr titleMarginStart 0x7f040114
int attr titleMarginTop 0x7f040115
int attr titleMargins 0x7f040116
int attr titleTextAppearance 0x7f040117
int attr titleTextColor 0x7f040118
int attr titleTextStyle 0x7f040119
int attr toolbarNavigationButtonStyle 0x7f04011a
int attr toolbarStyle 0x7f04011b
int attr tooltipForegroundColor 0x7f04011c
int attr tooltipFrameBackground 0x7f04011d
int attr tooltipText 0x7f04011e
int attr track 0x7f04011f
int attr trackTint 0x7f040120
int attr trackTintMode 0x7f040121
int attr ttcIndex 0x7f040122
int attr viewAspectRatio 0x7f040123
int attr viewInflaterClass 0x7f040124
int attr voiceIcon 0x7f040125
int attr windowActionBar 0x7f040126
int attr windowActionBarOverlay 0x7f040127
int attr windowActionModeOverlay 0x7f040128
int attr windowFixedHeightMajor 0x7f040129
int attr windowFixedHeightMinor 0x7f04012a
int attr windowFixedWidthMajor 0x7f04012b
int attr windowFixedWidthMinor 0x7f04012c
int attr windowMinWidthMajor 0x7f04012d
int attr windowMinWidthMinor 0x7f04012e
int attr windowNoTitle 0x7f04012f
int bool abc_action_bar_embed_tabs 0x7f050001
int bool abc_allow_stacked_button_bar 0x7f050002
int bool abc_config_actionMenuItemAllCaps 0x7f050003
int color abc_background_cache_hint_selector_material_dark 0x7f060001
int color abc_background_cache_hint_selector_material_light 0x7f060002
int color abc_btn_colored_borderless_text_material 0x7f060003
int color abc_btn_colored_text_material 0x7f060004
int color abc_color_highlight_material 0x7f060005
int color abc_hint_foreground_material_dark 0x7f060006
int color abc_hint_foreground_material_light 0x7f060007
int color abc_input_method_navigation_guard 0x7f060008
int color abc_primary_text_disable_only_material_dark 0x7f060009
int color abc_primary_text_disable_only_material_light 0x7f06000a
int color abc_primary_text_material_dark 0x7f06000b
int color abc_primary_text_material_light 0x7f06000c
int color abc_search_url_text 0x7f06000d
int color abc_search_url_text_normal 0x7f06000e
int color abc_search_url_text_pressed 0x7f06000f
int color abc_search_url_text_selected 0x7f060010
int color abc_secondary_text_material_dark 0x7f060011
int color abc_secondary_text_material_light 0x7f060012
int color abc_tint_btn_checkable 0x7f060013
int color abc_tint_default 0x7f060014
int color abc_tint_edittext 0x7f060015
int color abc_tint_seek_thumb 0x7f060016
int color abc_tint_spinner 0x7f060017
int color abc_tint_switch_track 0x7f060018
int color accent_material_dark 0x7f060019
int color accent_material_light 0x7f06001a
int color background_floating_material_dark 0x7f06001b
int color background_floating_material_light 0x7f06001c
int color background_material_dark 0x7f06001d
int color background_material_light 0x7f06001e
int color bright_foreground_disabled_material_dark 0x7f06001f
int color bright_foreground_disabled_material_light 0x7f060020
int color bright_foreground_inverse_material_dark 0x7f060021
int color bright_foreground_inverse_material_light 0x7f060022
int color bright_foreground_material_dark 0x7f060023
int color bright_foreground_material_light 0x7f060024
int color button_material_dark 0x7f060025
int color button_material_light 0x7f060026
int color catalyst_redbox_background 0x7f060027
int color dim_foreground_disabled_material_dark 0x7f060028
int color dim_foreground_disabled_material_light 0x7f060029
int color dim_foreground_material_dark 0x7f06002a
int color dim_foreground_material_light 0x7f06002b
int color error_color_material_dark 0x7f06002c
int color error_color_material_light 0x7f06002d
int color foreground_material_dark 0x7f06002e
int color foreground_material_light 0x7f06002f
int color highlighted_text_material_dark 0x7f060030
int color highlighted_text_material_light 0x7f060031
int color material_blue_grey_800 0x7f060032
int color material_blue_grey_900 0x7f060033
int color material_blue_grey_950 0x7f060034
int color material_deep_teal_200 0x7f060035
int color material_deep_teal_500 0x7f060036
int color material_grey_100 0x7f060037
int color material_grey_300 0x7f060038
int color material_grey_50 0x7f060039
int color material_grey_600 0x7f06003a
int color material_grey_800 0x7f06003b
int color material_grey_850 0x7f06003c
int color material_grey_900 0x7f06003d
int color notification_action_color_filter 0x7f06003e
int color notification_icon_bg_color 0x7f06003f
int color primary_dark_material_dark 0x7f060040
int color primary_dark_material_light 0x7f060041
int color primary_material_dark 0x7f060042
int color primary_material_light 0x7f060043
int color primary_text_default_material_dark 0x7f060044
int color primary_text_default_material_light 0x7f060045
int color primary_text_disabled_material_dark 0x7f060046
int color primary_text_disabled_material_light 0x7f060047
int color ripple_material_dark 0x7f060048
int color ripple_material_light 0x7f060049
int color secondary_text_default_material_dark 0x7f06004a
int color secondary_text_default_material_light 0x7f06004b
int color secondary_text_disabled_material_dark 0x7f06004c
int color secondary_text_disabled_material_light 0x7f06004d
int color switch_thumb_disabled_material_dark 0x7f06004e
int color switch_thumb_disabled_material_light 0x7f06004f
int color switch_thumb_material_dark 0x7f060050
int color switch_thumb_material_light 0x7f060051
int color switch_thumb_normal_material_dark 0x7f060052
int color switch_thumb_normal_material_light 0x7f060053
int color tooltip_background_dark 0x7f060054
int color tooltip_background_light 0x7f060055
int dimen abc_action_bar_content_inset_material 0x7f070001
int dimen abc_action_bar_content_inset_with_nav 0x7f070002
int dimen abc_action_bar_default_height_material 0x7f070003
int dimen abc_action_bar_default_padding_end_material 0x7f070004
int dimen abc_action_bar_default_padding_start_material 0x7f070005
int dimen abc_action_bar_elevation_material 0x7f070006
int dimen abc_action_bar_icon_vertical_padding_material 0x7f070007
int dimen abc_action_bar_overflow_padding_end_material 0x7f070008
int dimen abc_action_bar_overflow_padding_start_material 0x7f070009
int dimen abc_action_bar_stacked_max_height 0x7f07000a
int dimen abc_action_bar_stacked_tab_max_width 0x7f07000b
int dimen abc_action_bar_subtitle_bottom_margin_material 0x7f07000c
int dimen abc_action_bar_subtitle_top_margin_material 0x7f07000d
int dimen abc_action_button_min_height_material 0x7f07000e
int dimen abc_action_button_min_width_material 0x7f07000f
int dimen abc_action_button_min_width_overflow_material 0x7f070010
int dimen abc_alert_dialog_button_bar_height 0x7f070011
int dimen abc_alert_dialog_button_dimen 0x7f070012
int dimen abc_button_inset_horizontal_material 0x7f070013
int dimen abc_button_inset_vertical_material 0x7f070014
int dimen abc_button_padding_horizontal_material 0x7f070015
int dimen abc_button_padding_vertical_material 0x7f070016
int dimen abc_cascading_menus_min_smallest_width 0x7f070017
int dimen abc_config_prefDialogWidth 0x7f070018
int dimen abc_control_corner_material 0x7f070019
int dimen abc_control_inset_material 0x7f07001a
int dimen abc_control_padding_material 0x7f07001b
int dimen abc_dialog_corner_radius_material 0x7f07001c
int dimen abc_dialog_fixed_height_major 0x7f07001d
int dimen abc_dialog_fixed_height_minor 0x7f07001e
int dimen abc_dialog_fixed_width_major 0x7f07001f
int dimen abc_dialog_fixed_width_minor 0x7f070020
int dimen abc_dialog_list_padding_bottom_no_buttons 0x7f070021
int dimen abc_dialog_list_padding_top_no_title 0x7f070022
int dimen abc_dialog_min_width_major 0x7f070023
int dimen abc_dialog_min_width_minor 0x7f070024
int dimen abc_dialog_padding_material 0x7f070025
int dimen abc_dialog_padding_top_material 0x7f070026
int dimen abc_dialog_title_divider_material 0x7f070027
int dimen abc_disabled_alpha_material_dark 0x7f070028
int dimen abc_disabled_alpha_material_light 0x7f070029
int dimen abc_dropdownitem_icon_width 0x7f07002a
int dimen abc_dropdownitem_text_padding_left 0x7f07002b
int dimen abc_dropdownitem_text_padding_right 0x7f07002c
int dimen abc_edit_text_inset_bottom_material 0x7f07002d
int dimen abc_edit_text_inset_horizontal_material 0x7f07002e
int dimen abc_edit_text_inset_top_material 0x7f07002f
int dimen abc_floating_window_z 0x7f070030
int dimen abc_list_item_padding_horizontal_material 0x7f070031
int dimen abc_panel_menu_list_width 0x7f070032
int dimen abc_progress_bar_height_material 0x7f070033
int dimen abc_search_view_preferred_height 0x7f070034
int dimen abc_search_view_preferred_width 0x7f070035
int dimen abc_seekbar_track_background_height_material 0x7f070036
int dimen abc_seekbar_track_progress_height_material 0x7f070037
int dimen abc_select_dialog_padding_start_material 0x7f070038
int dimen abc_switch_padding 0x7f070039
int dimen abc_text_size_body_1_material 0x7f07003a
int dimen abc_text_size_body_2_material 0x7f07003b
int dimen abc_text_size_button_material 0x7f07003c
int dimen abc_text_size_caption_material 0x7f07003d
int dimen abc_text_size_display_1_material 0x7f07003e
int dimen abc_text_size_display_2_material 0x7f07003f
int dimen abc_text_size_display_3_material 0x7f070040
int dimen abc_text_size_display_4_material 0x7f070041
int dimen abc_text_size_headline_material 0x7f070042
int dimen abc_text_size_large_material 0x7f070043
int dimen abc_text_size_medium_material 0x7f070044
int dimen abc_text_size_menu_header_material 0x7f070045
int dimen abc_text_size_menu_material 0x7f070046
int dimen abc_text_size_small_material 0x7f070047
int dimen abc_text_size_subhead_material 0x7f070048
int dimen abc_text_size_subtitle_material_toolbar 0x7f070049
int dimen abc_text_size_title_material 0x7f07004a
int dimen abc_text_size_title_material_toolbar 0x7f07004b
int dimen compat_button_inset_horizontal_material 0x7f07004c
int dimen compat_button_inset_vertical_material 0x7f07004d
int dimen compat_button_padding_horizontal_material 0x7f07004e
int dimen compat_button_padding_vertical_material 0x7f07004f
int dimen compat_control_corner_material 0x7f070050
int dimen compat_notification_large_icon_max_height 0x7f070051
int dimen compat_notification_large_icon_max_width 0x7f070052
int dimen disabled_alpha_material_dark 0x7f070053
int dimen disabled_alpha_material_light 0x7f070054
int dimen highlight_alpha_material_colored 0x7f070055
int dimen highlight_alpha_material_dark 0x7f070056
int dimen highlight_alpha_material_light 0x7f070057
int dimen hint_alpha_material_dark 0x7f070058
int dimen hint_alpha_material_light 0x7f070059
int dimen hint_pressed_alpha_material_dark 0x7f07005a
int dimen hint_pressed_alpha_material_light 0x7f07005b
int dimen notification_action_icon_size 0x7f07005c
int dimen notification_action_text_size 0x7f07005d
int dimen notification_big_circle_margin 0x7f07005e
int dimen notification_content_margin_start 0x7f07005f
int dimen notification_large_icon_height 0x7f070060
int dimen notification_large_icon_width 0x7f070061
int dimen notification_main_column_padding_top 0x7f070062
int dimen notification_media_narrow_margin 0x7f070063
int dimen notification_right_icon_size 0x7f070064
int dimen notification_right_side_padding_top 0x7f070065
int dimen notification_small_icon_background_padding 0x7f070066
int dimen notification_small_icon_size_as_large 0x7f070067
int dimen notification_subtext_size 0x7f070068
int dimen notification_top_pad 0x7f070069
int dimen notification_top_pad_large_text 0x7f07006a
int dimen tooltip_corner_radius 0x7f07006b
int dimen tooltip_horizontal_padding 0x7f07006c
int dimen tooltip_margin 0x7f07006d
int dimen tooltip_precise_anchor_extra_offset 0x7f07006e
int dimen tooltip_precise_anchor_threshold 0x7f07006f
int dimen tooltip_vertical_padding 0x7f070070
int dimen tooltip_y_offset_non_touch 0x7f070071
int dimen tooltip_y_offset_touch 0x7f070072
int drawable abc_ab_share_pack_mtrl_alpha 0x7f080001
int drawable abc_action_bar_item_background_material 0x7f080002
int drawable abc_btn_borderless_material 0x7f080003
int drawable abc_btn_check_material 0x7f080004
int drawable abc_btn_check_to_on_mtrl_000 0x7f080005
int drawable abc_btn_check_to_on_mtrl_015 0x7f080006
int drawable abc_btn_colored_material 0x7f080007
int drawable abc_btn_default_mtrl_shape 0x7f080008
int drawable abc_btn_radio_material 0x7f080009
int drawable abc_btn_radio_to_on_mtrl_000 0x7f08000a
int drawable abc_btn_radio_to_on_mtrl_015 0x7f08000b
int drawable abc_btn_switch_to_on_mtrl_00001 0x7f08000c
int drawable abc_btn_switch_to_on_mtrl_00012 0x7f08000d
int drawable abc_cab_background_internal_bg 0x7f08000e
int drawable abc_cab_background_top_material 0x7f08000f
int drawable abc_cab_background_top_mtrl_alpha 0x7f080010
int drawable abc_control_background_material 0x7f080011
int drawable abc_dialog_material_background 0x7f080012
int drawable abc_edit_text_material 0x7f080013
int drawable abc_ic_ab_back_material 0x7f080014
int drawable abc_ic_arrow_drop_right_black_24dp 0x7f080015
int drawable abc_ic_clear_material 0x7f080016
int drawable abc_ic_commit_search_api_mtrl_alpha 0x7f080017
int drawable abc_ic_go_search_api_material 0x7f080018
int drawable abc_ic_menu_copy_mtrl_am_alpha 0x7f080019
int drawable abc_ic_menu_cut_mtrl_alpha 0x7f08001a
int drawable abc_ic_menu_overflow_material 0x7f08001b
int drawable abc_ic_menu_paste_mtrl_am_alpha 0x7f08001c
int drawable abc_ic_menu_selectall_mtrl_alpha 0x7f08001d
int drawable abc_ic_menu_share_mtrl_alpha 0x7f08001e
int drawable abc_ic_search_api_material 0x7f08001f
int drawable abc_ic_star_black_16dp 0x7f080020
int drawable abc_ic_star_black_36dp 0x7f080021
int drawable abc_ic_star_black_48dp 0x7f080022
int drawable abc_ic_star_half_black_16dp 0x7f080023
int drawable abc_ic_star_half_black_36dp 0x7f080024
int drawable abc_ic_star_half_black_48dp 0x7f080025
int drawable abc_ic_voice_search_api_material 0x7f080026
int drawable abc_item_background_holo_dark 0x7f080027
int drawable abc_item_background_holo_light 0x7f080028
int drawable abc_list_divider_material 0x7f080029
int drawable abc_list_divider_mtrl_alpha 0x7f08002a
int drawable abc_list_focused_holo 0x7f08002b
int drawable abc_list_longpressed_holo 0x7f08002c
int drawable abc_list_pressed_holo_dark 0x7f08002d
int drawable abc_list_pressed_holo_light 0x7f08002e
int drawable abc_list_selector_background_transition_holo_dark 0x7f08002f
int drawable abc_list_selector_background_transition_holo_light 0x7f080030
int drawable abc_list_selector_disabled_holo_dark 0x7f080031
int drawable abc_list_selector_disabled_holo_light 0x7f080032
int drawable abc_list_selector_holo_dark 0x7f080033
int drawable abc_list_selector_holo_light 0x7f080034
int drawable abc_menu_hardkey_panel_mtrl_mult 0x7f080035
int drawable abc_popup_background_mtrl_mult 0x7f080036
int drawable abc_ratingbar_indicator_material 0x7f080037
int drawable abc_ratingbar_material 0x7f080038
int drawable abc_ratingbar_small_material 0x7f080039
int drawable abc_scrubber_control_off_mtrl_alpha 0x7f08003a
int drawable abc_scrubber_control_to_pressed_mtrl_000 0x7f08003b
int drawable abc_scrubber_control_to_pressed_mtrl_005 0x7f08003c
int drawable abc_scrubber_primary_mtrl_alpha 0x7f08003d
int drawable abc_scrubber_track_mtrl_alpha 0x7f08003e
int drawable abc_seekbar_thumb_material 0x7f08003f
int drawable abc_seekbar_tick_mark_material 0x7f080040
int drawable abc_seekbar_track_material 0x7f080041
int drawable abc_spinner_mtrl_am_alpha 0x7f080042
int drawable abc_spinner_textfield_background_material 0x7f080043
int drawable abc_switch_thumb_material 0x7f080044
int drawable abc_switch_track_mtrl_alpha 0x7f080045
int drawable abc_tab_indicator_material 0x7f080046
int drawable abc_tab_indicator_mtrl_alpha 0x7f080047
int drawable abc_text_cursor_material 0x7f080048
int drawable abc_text_select_handle_left_mtrl_dark 0x7f080049
int drawable abc_text_select_handle_left_mtrl_light 0x7f08004a
int drawable abc_text_select_handle_middle_mtrl_dark 0x7f08004b
int drawable abc_text_select_handle_middle_mtrl_light 0x7f08004c
int drawable abc_text_select_handle_right_mtrl_dark 0x7f08004d
int drawable abc_text_select_handle_right_mtrl_light 0x7f08004e
int drawable abc_textfield_activated_mtrl_alpha 0x7f08004f
int drawable abc_textfield_default_mtrl_alpha 0x7f080050
int drawable abc_textfield_search_activated_mtrl_alpha 0x7f080051
int drawable abc_textfield_search_default_mtrl_alpha 0x7f080052
int drawable abc_textfield_search_material 0x7f080053
int drawable abc_vector_test 0x7f080054
int drawable notification_action_background 0x7f080055
int drawable notification_bg 0x7f080056
int drawable notification_bg_low 0x7f080057
int drawable notification_bg_low_normal 0x7f080058
int drawable notification_bg_low_pressed 0x7f080059
int drawable notification_bg_normal 0x7f08005a
int drawable notification_bg_normal_pressed 0x7f08005b
int drawable notification_icon_background 0x7f08005c
int drawable notification_template_icon_bg 0x7f08005d
int drawable notification_template_icon_low_bg 0x7f08005e
int drawable notification_tile_bg 0x7f08005f
int drawable notify_panel_notification_icon_bg 0x7f080060
int drawable redbox_top_border_background 0x7f080061
int drawable tooltip_frame_dark 0x7f080062
int drawable tooltip_frame_light 0x7f080063
int id accessibility_hint 0x7f0b0001
int id accessibility_role 0x7f0b0002
int id action_bar 0x7f0b0003
int id action_bar_activity_content 0x7f0b0004
int id action_bar_container 0x7f0b0005
int id action_bar_root 0x7f0b0006
int id action_bar_spinner 0x7f0b0007
int id action_bar_subtitle 0x7f0b0008
int id action_bar_title 0x7f0b0009
int id action_container 0x7f0b000a
int id action_context_bar 0x7f0b000b
int id action_divider 0x7f0b000c
int id action_image 0x7f0b000d
int id action_menu_divider 0x7f0b000e
int id action_menu_presenter 0x7f0b000f
int id action_mode_bar 0x7f0b0010
int id action_mode_bar_stub 0x7f0b0011
int id action_mode_close_button 0x7f0b0012
int id action_text 0x7f0b0013
int id actions 0x7f0b0014
int id activity_chooser_view_content 0x7f0b0015
int id add 0x7f0b0016
int id alertTitle 0x7f0b0017
int id async 0x7f0b0018
int id blocking 0x7f0b0019
int id bottom 0x7f0b001a
int id buttonPanel 0x7f0b001b
int id catalyst_redbox_title 0x7f0b001c
int id center 0x7f0b001d
int id centerCrop 0x7f0b001e
int id centerInside 0x7f0b001f
int id checkbox 0x7f0b0020
int id chronometer 0x7f0b0021
int id content 0x7f0b0022
int id contentPanel 0x7f0b0023
int id custom 0x7f0b0024
int id customPanel 0x7f0b0025
int id decor_content_parent 0x7f0b0026
int id default_activity_button 0x7f0b0027
int id edit_query 0x7f0b0028
int id end 0x7f0b0029
int id expand_activities_button 0x7f0b002a
int id expanded_menu 0x7f0b002b
int id fitBottomStart 0x7f0b002c
int id fitCenter 0x7f0b002d
int id fitEnd 0x7f0b002e
int id fitStart 0x7f0b002f
int id fitXY 0x7f0b0030
int id focusCrop 0x7f0b0031
int id forever 0x7f0b0032
int id fps_text 0x7f0b0033
int id group_divider 0x7f0b0034
int id home 0x7f0b0035
int id icon 0x7f0b0036
int id icon_group 0x7f0b0037
int id image 0x7f0b0038
int id info 0x7f0b0039
int id italic 0x7f0b003a
int id left 0x7f0b003b
int id line1 0x7f0b003c
int id line3 0x7f0b003d
int id listMode 0x7f0b003e
int id list_item 0x7f0b003f
int id message 0x7f0b0040
int id multiply 0x7f0b0041
int id none 0x7f0b0042
int id normal 0x7f0b0043
int id notification_background 0x7f0b0044
int id notification_main_column 0x7f0b0045
int id notification_main_column_container 0x7f0b0046
int id parentPanel 0x7f0b0047
int id progress_circular 0x7f0b0048
int id progress_horizontal 0x7f0b0049
int id radio 0x7f0b004a
int id react_test_id 0x7f0b004b
int id right 0x7f0b004c
int id right_icon 0x7f0b004d
int id right_side 0x7f0b004e
int id rn_frame_file 0x7f0b004f
int id rn_frame_method 0x7f0b0050
int id rn_redbox_copy_button 0x7f0b0051
int id rn_redbox_dismiss_button 0x7f0b0052
int id rn_redbox_line_separator 0x7f0b0053
int id rn_redbox_loading_indicator 0x7f0b0054
int id rn_redbox_reload_button 0x7f0b0055
int id rn_redbox_report_button 0x7f0b0056
int id rn_redbox_report_label 0x7f0b0057
int id rn_redbox_stack 0x7f0b0058
int id screen 0x7f0b0059
int id scrollIndicatorDown 0x7f0b005a
int id scrollIndicatorUp 0x7f0b005b
int id scrollView 0x7f0b005c
int id search_badge 0x7f0b005d
int id search_bar 0x7f0b005e
int id search_button 0x7f0b005f
int id search_close_btn 0x7f0b0060
int id search_edit_frame 0x7f0b0061
int id search_go_btn 0x7f0b0062
int id search_mag_icon 0x7f0b0063
int id search_plate 0x7f0b0064
int id search_src_text 0x7f0b0065
int id search_voice_btn 0x7f0b0066
int id select_dialog_listview 0x7f0b0067
int id shortcut 0x7f0b0068
int id spacer 0x7f0b0069
int id split_action_bar 0x7f0b006a
int id src_atop 0x7f0b006b
int id src_in 0x7f0b006c
int id src_over 0x7f0b006d
int id start 0x7f0b006e
int id submenuarrow 0x7f0b006f
int id submit_area 0x7f0b0070
int id tabMode 0x7f0b0071
int id tag_transition_group 0x7f0b0072
int id tag_unhandled_key_event_manager 0x7f0b0073
int id tag_unhandled_key_listeners 0x7f0b0074
int id text 0x7f0b0075
int id text2 0x7f0b0076
int id textSpacerNoButtons 0x7f0b0077
int id textSpacerNoTitle 0x7f0b0078
int id time 0x7f0b0079
int id title 0x7f0b007a
int id titleDividerNoCustom 0x7f0b007b
int id title_template 0x7f0b007c
int id top 0x7f0b007d
int id topPanel 0x7f0b007e
int id uniform 0x7f0b007f
int id up 0x7f0b0080
int id view_tag_instance_handle 0x7f0b0081
int id view_tag_native_id 0x7f0b0082
int id wrap_content 0x7f0b0083
int integer abc_config_activityDefaultDur 0x7f0c0001
int integer abc_config_activityShortDur 0x7f0c0002
int integer cancel_button_image_alpha 0x7f0c0003
int integer config_tooltipAnimTime 0x7f0c0004
int integer status_bar_notification_info_maxnum 0x7f0c0005
int layout abc_action_bar_title_item 0x7f0e0001
int layout abc_action_bar_up_container 0x7f0e0002
int layout abc_action_menu_item_layout 0x7f0e0003
int layout abc_action_menu_layout 0x7f0e0004
int layout abc_action_mode_bar 0x7f0e0005
int layout abc_action_mode_close_item_material 0x7f0e0006
int layout abc_activity_chooser_view 0x7f0e0007
int layout abc_activity_chooser_view_list_item 0x7f0e0008
int layout abc_alert_dialog_button_bar_material 0x7f0e0009
int layout abc_alert_dialog_material 0x7f0e000a
int layout abc_alert_dialog_title_material 0x7f0e000b
int layout abc_cascading_menu_item_layout 0x7f0e000c
int layout abc_dialog_title_material 0x7f0e000d
int layout abc_expanded_menu_layout 0x7f0e000e
int layout abc_list_menu_item_checkbox 0x7f0e000f
int layout abc_list_menu_item_icon 0x7f0e0010
int layout abc_list_menu_item_layout 0x7f0e0011
int layout abc_list_menu_item_radio 0x7f0e0012
int layout abc_popup_menu_header_item_layout 0x7f0e0013
int layout abc_popup_menu_item_layout 0x7f0e0014
int layout abc_screen_content_include 0x7f0e0015
int layout abc_screen_simple 0x7f0e0016
int layout abc_screen_simple_overlay_action_mode 0x7f0e0017
int layout abc_screen_toolbar 0x7f0e0018
int layout abc_search_dropdown_item_icons_2line 0x7f0e0019
int layout abc_search_view 0x7f0e001a
int layout abc_select_dialog_material 0x7f0e001b
int layout abc_tooltip 0x7f0e001c
int layout dev_loading_view 0x7f0e001d
int layout fps_view 0x7f0e001e
int layout notification_action 0x7f0e001f
int layout notification_action_tombstone 0x7f0e0020
int layout notification_template_custom_big 0x7f0e0021
int layout notification_template_icon_group 0x7f0e0022
int layout notification_template_part_chronometer 0x7f0e0023
int layout notification_template_part_time 0x7f0e0024
int layout redbox_item_frame 0x7f0e0025
int layout redbox_item_title 0x7f0e0026
int layout redbox_view 0x7f0e0027
int layout select_dialog_item_material 0x7f0e0028
int layout select_dialog_multichoice_material 0x7f0e0029
int layout select_dialog_singlechoice_material 0x7f0e002a
int layout support_simple_spinner_dropdown_item 0x7f0e002b
int string abc_action_bar_home_description 0x7f140001
int string abc_action_bar_up_description 0x7f140002
int string abc_action_menu_overflow_description 0x7f140003
int string abc_action_mode_done 0x7f140004
int string abc_activity_chooser_view_see_all 0x7f140005
int string abc_activitychooserview_choose_application 0x7f140006
int string abc_capital_off 0x7f140007
int string abc_capital_on 0x7f140008
int string abc_font_family_body_1_material 0x7f140009
int string abc_font_family_body_2_material 0x7f14000a
int string abc_font_family_button_material 0x7f14000b
int string abc_font_family_caption_material 0x7f14000c
int string abc_font_family_display_1_material 0x7f14000d
int string abc_font_family_display_2_material 0x7f14000e
int string abc_font_family_display_3_material 0x7f14000f
int string abc_font_family_display_4_material 0x7f140010
int string abc_font_family_headline_material 0x7f140011
int string abc_font_family_menu_material 0x7f140012
int string abc_font_family_subhead_material 0x7f140013
int string abc_font_family_title_material 0x7f140014
int string abc_menu_alt_shortcut_label 0x7f140015
int string abc_menu_ctrl_shortcut_label 0x7f140016
int string abc_menu_delete_shortcut_label 0x7f140017
int string abc_menu_enter_shortcut_label 0x7f140018
int string abc_menu_function_shortcut_label 0x7f140019
int string abc_menu_meta_shortcut_label 0x7f14001a
int string abc_menu_shift_shortcut_label 0x7f14001b
int string abc_menu_space_shortcut_label 0x7f14001c
int string abc_menu_sym_shortcut_label 0x7f14001d
int string abc_prepend_shortcut_label 0x7f14001e
int string abc_search_hint 0x7f14001f
int string abc_searchview_description_clear 0x7f140020
int string abc_searchview_description_query 0x7f140021
int string abc_searchview_description_search 0x7f140022
int string abc_searchview_description_submit 0x7f140023
int string abc_searchview_description_voice 0x7f140024
int string abc_shareactionprovider_share_with 0x7f140025
int string abc_shareactionprovider_share_with_application 0x7f140026
int string abc_toolbar_collapse_description 0x7f140027
int string adjustable_description 0x7f140028
int string catalyst_copy_button 0x7f140029
int string catalyst_debugjs 0x7f14002a
int string catalyst_debugjs_nuclide 0x7f14002b
int string catalyst_debugjs_nuclide_failure 0x7f14002c
int string catalyst_debugjs_off 0x7f14002d
int string catalyst_dismiss_button 0x7f14002e
int string catalyst_element_inspector 0x7f14002f
int string catalyst_heap_capture 0x7f140030
int string catalyst_hot_module_replacement 0x7f140031
int string catalyst_hot_module_replacement_off 0x7f140032
int string catalyst_jsload_error 0x7f140033
int string catalyst_live_reload 0x7f140034
int string catalyst_live_reload_off 0x7f140035
int string catalyst_loading_from_url 0x7f140036
int string catalyst_perf_monitor 0x7f140037
int string catalyst_perf_monitor_off 0x7f140038
int string catalyst_poke_sampling_profiler 0x7f140039
int string catalyst_reload_button 0x7f14003a
int string catalyst_reloadjs 0x7f14003b
int string catalyst_remotedbg_error 0x7f14003c
int string catalyst_remotedbg_message 0x7f14003d
int string catalyst_report_button 0x7f14003e
int string catalyst_settings 0x7f14003f
int string catalyst_settings_title 0x7f140040
int string header_description 0x7f140041
int string image_button_description 0x7f140042
int string image_description 0x7f140043
int string link_description 0x7f140044
int string search_description 0x7f140045
int string search_menu_title 0x7f140046
int string status_bar_notification_info_overflow 0x7f140047
int style AlertDialog_AppCompat 0x7f150001
int style AlertDialog_AppCompat_Light 0x7f150002
int style Animation_AppCompat_Dialog 0x7f150003
int style Animation_AppCompat_DropDownUp 0x7f150004
int style Animation_AppCompat_Tooltip 0x7f150005
int style Animation_Catalyst_RedBox 0x7f150006
int style Base_AlertDialog_AppCompat 0x7f150007
int style Base_AlertDialog_AppCompat_Light 0x7f150008
int style Base_Animation_AppCompat_Dialog 0x7f150009
int style Base_Animation_AppCompat_DropDownUp 0x7f15000a
int style Base_Animation_AppCompat_Tooltip 0x7f15000b
int style Base_DialogWindowTitleBackground_AppCompat 0x7f15000c
int style Base_DialogWindowTitle_AppCompat 0x7f15000d
int style Base_TextAppearance_AppCompat 0x7f15000e
int style Base_TextAppearance_AppCompat_Body1 0x7f15000f
int style Base_TextAppearance_AppCompat_Body2 0x7f150010
int style Base_TextAppearance_AppCompat_Button 0x7f150011
int style Base_TextAppearance_AppCompat_Caption 0x7f150012
int style Base_TextAppearance_AppCompat_Display1 0x7f150013
int style Base_TextAppearance_AppCompat_Display2 0x7f150014
int style Base_TextAppearance_AppCompat_Display3 0x7f150015
int style Base_TextAppearance_AppCompat_Display4 0x7f150016
int style Base_TextAppearance_AppCompat_Headline 0x7f150017
int style Base_TextAppearance_AppCompat_Inverse 0x7f150018
int style Base_TextAppearance_AppCompat_Large 0x7f150019
int style Base_TextAppearance_AppCompat_Large_Inverse 0x7f15001a
int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f15001b
int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f15001c
int style Base_TextAppearance_AppCompat_Medium 0x7f15001d
int style Base_TextAppearance_AppCompat_Medium_Inverse 0x7f15001e
int style Base_TextAppearance_AppCompat_Menu 0x7f15001f
int style Base_TextAppearance_AppCompat_SearchResult 0x7f150020
int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x7f150021
int style Base_TextAppearance_AppCompat_SearchResult_Title 0x7f150022
int style Base_TextAppearance_AppCompat_Small 0x7f150023
int style Base_TextAppearance_AppCompat_Small_Inverse 0x7f150024
int style Base_TextAppearance_AppCompat_Subhead 0x7f150025
int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x7f150026
int style Base_TextAppearance_AppCompat_Title 0x7f150027
int style Base_TextAppearance_AppCompat_Title_Inverse 0x7f150028
int style Base_TextAppearance_AppCompat_Tooltip 0x7f150029
int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f15002a
int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f15002b
int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f15002c
int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f15002d
int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f15002e
int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f15002f
int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f150030
int style Base_TextAppearance_AppCompat_Widget_Button 0x7f150031
int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f150032
int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x7f150033
int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x7f150034
int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x7f150035
int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f150036
int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f150037
int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f150038
int style Base_TextAppearance_AppCompat_Widget_Switch 0x7f150039
int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f15003a
int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f15003b
int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f15003c
int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f15003d
int style Base_ThemeOverlay_AppCompat 0x7f15003e
int style Base_ThemeOverlay_AppCompat_ActionBar 0x7f15003f
int style Base_ThemeOverlay_AppCompat_Dark 0x7f150040
int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x7f150041
int style Base_ThemeOverlay_AppCompat_Dialog 0x7f150042
int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x7f150043
int style Base_ThemeOverlay_AppCompat_Light 0x7f150044
int style Base_Theme_AppCompat 0x7f150045
int style Base_Theme_AppCompat_CompactMenu 0x7f150046
int style Base_Theme_AppCompat_Dialog 0x7f150047
int style Base_Theme_AppCompat_DialogWhenLarge 0x7f150048
int style Base_Theme_AppCompat_Dialog_Alert 0x7f150049
int style Base_Theme_AppCompat_Dialog_FixedSize 0x7f15004a
int style Base_Theme_AppCompat_Dialog_MinWidth 0x7f15004b
int style Base_Theme_AppCompat_Light 0x7f15004c
int style Base_Theme_AppCompat_Light_DarkActionBar 0x7f15004d
int style Base_Theme_AppCompat_Light_Dialog 0x7f15004e
int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x7f15004f
int style Base_Theme_AppCompat_Light_Dialog_Alert 0x7f150050
int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x7f150051
int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x7f150052
int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x7f150053
int style Base_V21_Theme_AppCompat 0x7f150054
int style Base_V21_Theme_AppCompat_Dialog 0x7f150055
int style Base_V21_Theme_AppCompat_Light 0x7f150056
int style Base_V21_Theme_AppCompat_Light_Dialog 0x7f150057
int style Base_V22_Theme_AppCompat 0x7f150058
int style Base_V22_Theme_AppCompat_Light 0x7f150059
int style Base_V23_Theme_AppCompat 0x7f15005a
int style Base_V23_Theme_AppCompat_Light 0x7f15005b
int style Base_V26_Theme_AppCompat 0x7f15005c
int style Base_V26_Theme_AppCompat_Light 0x7f15005d
int style Base_V26_Widget_AppCompat_Toolbar 0x7f15005e
int style Base_V28_Theme_AppCompat 0x7f15005f
int style Base_V28_Theme_AppCompat_Light 0x7f150060
int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x7f150061
int style Base_V7_Theme_AppCompat 0x7f150062
int style Base_V7_Theme_AppCompat_Dialog 0x7f150063
int style Base_V7_Theme_AppCompat_Light 0x7f150064
int style Base_V7_Theme_AppCompat_Light_Dialog 0x7f150065
int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x7f150066
int style Base_V7_Widget_AppCompat_EditText 0x7f150067
int style Base_V7_Widget_AppCompat_Toolbar 0x7f150068
int style Base_Widget_AppCompat_ActionBar 0x7f150069
int style Base_Widget_AppCompat_ActionBar_Solid 0x7f15006a
int style Base_Widget_AppCompat_ActionBar_TabBar 0x7f15006b
int style Base_Widget_AppCompat_ActionBar_TabText 0x7f15006c
int style Base_Widget_AppCompat_ActionBar_TabView 0x7f15006d
int style Base_Widget_AppCompat_ActionButton 0x7f15006e
int style Base_Widget_AppCompat_ActionButton_CloseMode 0x7f15006f
int style Base_Widget_AppCompat_ActionButton_Overflow 0x7f150070
int style Base_Widget_AppCompat_ActionMode 0x7f150071
int style Base_Widget_AppCompat_ActivityChooserView 0x7f150072
int style Base_Widget_AppCompat_AutoCompleteTextView 0x7f150073
int style Base_Widget_AppCompat_Button 0x7f150074
int style Base_Widget_AppCompat_ButtonBar 0x7f150075
int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x7f150076
int style Base_Widget_AppCompat_Button_Borderless 0x7f150077
int style Base_Widget_AppCompat_Button_Borderless_Colored 0x7f150078
int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f150079
int style Base_Widget_AppCompat_Button_Colored 0x7f15007a
int style Base_Widget_AppCompat_Button_Small 0x7f15007b
int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x7f15007c
int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x7f15007d
int style Base_Widget_AppCompat_CompoundButton_Switch 0x7f15007e
int style Base_Widget_AppCompat_DrawerArrowToggle 0x7f15007f
int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x7f150080
int style Base_Widget_AppCompat_DropDownItem_Spinner 0x7f150081
int style Base_Widget_AppCompat_EditText 0x7f150082
int style Base_Widget_AppCompat_ImageButton 0x7f150083
int style Base_Widget_AppCompat_Light_ActionBar 0x7f150084
int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x7f150085
int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x7f150086
int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x7f150087
int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f150088
int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x7f150089
int style Base_Widget_AppCompat_Light_PopupMenu 0x7f15008a
int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x7f15008b
int style Base_Widget_AppCompat_ListMenuView 0x7f15008c
int style Base_Widget_AppCompat_ListPopupWindow 0x7f15008d
int style Base_Widget_AppCompat_ListView 0x7f15008e
int style Base_Widget_AppCompat_ListView_DropDown 0x7f15008f
int style Base_Widget_AppCompat_ListView_Menu 0x7f150090
int style Base_Widget_AppCompat_PopupMenu 0x7f150091
int style Base_Widget_AppCompat_PopupMenu_Overflow 0x7f150092
int style Base_Widget_AppCompat_PopupWindow 0x7f150093
int style Base_Widget_AppCompat_ProgressBar 0x7f150094
int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x7f150095
int style Base_Widget_AppCompat_RatingBar 0x7f150096
int style Base_Widget_AppCompat_RatingBar_Indicator 0x7f150097
int style Base_Widget_AppCompat_RatingBar_Small 0x7f150098
int style Base_Widget_AppCompat_SearchView 0x7f150099
int style Base_Widget_AppCompat_SearchView_ActionBar 0x7f15009a
int style Base_Widget_AppCompat_SeekBar 0x7f15009b
int style Base_Widget_AppCompat_SeekBar_Discrete 0x7f15009c
int style Base_Widget_AppCompat_Spinner 0x7f15009d
int style Base_Widget_AppCompat_Spinner_Underlined 0x7f15009e
int style Base_Widget_AppCompat_TextView_SpinnerItem 0x7f15009f
int style Base_Widget_AppCompat_Toolbar 0x7f1500a0
int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x7f1500a1
int style CalendarDatePickerDialog 0x7f1500a2
int style CalendarDatePickerStyle 0x7f1500a3
int style ClockTimePickerDialog 0x7f1500a4
int style ClockTimePickerStyle 0x7f1500a5
int style DialogAnimationFade 0x7f1500a6
int style DialogAnimationSlide 0x7f1500a7
int style Platform_AppCompat 0x7f1500a8
int style Platform_AppCompat_Light 0x7f1500a9
int style Platform_ThemeOverlay_AppCompat 0x7f1500aa
int style Platform_ThemeOverlay_AppCompat_Dark 0x7f1500ab
int style Platform_ThemeOverlay_AppCompat_Light 0x7f1500ac
int style Platform_V21_AppCompat 0x7f1500ad
int style Platform_V21_AppCompat_Light 0x7f1500ae
int style Platform_V25_AppCompat 0x7f1500af
int style Platform_V25_AppCompat_Light 0x7f1500b0
int style Platform_Widget_AppCompat_Spinner 0x7f1500b1
int style RtlOverlay_DialogWindowTitle_AppCompat 0x7f1500b2
int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x7f1500b3
int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x7f1500b4
int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x7f1500b5
int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x7f1500b6
int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x7f1500b7
int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x7f1500b8
int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x7f1500b9
int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x7f1500ba
int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x7f1500bb
int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x7f1500bc
int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x7f1500bd
int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x7f1500be
int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x7f1500bf
int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x7f1500c0
int style RtlUnderlay_Widget_AppCompat_ActionButton 0x7f1500c1
int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x7f1500c2
int style SpinnerDatePickerDialog 0x7f1500c3
int style SpinnerDatePickerStyle 0x7f1500c4
int style SpinnerTimePickerDialog 0x7f1500c5
int style SpinnerTimePickerStyle 0x7f1500c6
int style TextAppearance_AppCompat 0x7f1500c7
int style TextAppearance_AppCompat_Body1 0x7f1500c8
int style TextAppearance_AppCompat_Body2 0x7f1500c9
int style TextAppearance_AppCompat_Button 0x7f1500ca
int style TextAppearance_AppCompat_Caption 0x7f1500cb
int style TextAppearance_AppCompat_Display1 0x7f1500cc
int style TextAppearance_AppCompat_Display2 0x7f1500cd
int style TextAppearance_AppCompat_Display3 0x7f1500ce
int style TextAppearance_AppCompat_Display4 0x7f1500cf
int style TextAppearance_AppCompat_Headline 0x7f1500d0
int style TextAppearance_AppCompat_Inverse 0x7f1500d1
int style TextAppearance_AppCompat_Large 0x7f1500d2
int style TextAppearance_AppCompat_Large_Inverse 0x7f1500d3
int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x7f1500d4
int style TextAppearance_AppCompat_Light_SearchResult_Title 0x7f1500d5
int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f1500d6
int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f1500d7
int style TextAppearance_AppCompat_Medium 0x7f1500d8
int style TextAppearance_AppCompat_Medium_Inverse 0x7f1500d9
int style TextAppearance_AppCompat_Menu 0x7f1500da
int style TextAppearance_AppCompat_SearchResult_Subtitle 0x7f1500db
int style TextAppearance_AppCompat_SearchResult_Title 0x7f1500dc
int style TextAppearance_AppCompat_Small 0x7f1500dd
int style TextAppearance_AppCompat_Small_Inverse 0x7f1500de
int style TextAppearance_AppCompat_Subhead 0x7f1500df
int style TextAppearance_AppCompat_Subhead_Inverse 0x7f1500e0
int style TextAppearance_AppCompat_Title 0x7f1500e1
int style TextAppearance_AppCompat_Title_Inverse 0x7f1500e2
int style TextAppearance_AppCompat_Tooltip 0x7f1500e3
int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f1500e4
int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f1500e5
int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f1500e6
int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f1500e7
int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f1500e8
int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f1500e9
int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x7f1500ea
int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f1500eb
int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x7f1500ec
int style TextAppearance_AppCompat_Widget_Button 0x7f1500ed
int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f1500ee
int style TextAppearance_AppCompat_Widget_Button_Colored 0x7f1500ef
int style TextAppearance_AppCompat_Widget_Button_Inverse 0x7f1500f0
int style TextAppearance_AppCompat_Widget_DropDownItem 0x7f1500f1
int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f1500f2
int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f1500f3
int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f1500f4
int style TextAppearance_AppCompat_Widget_Switch 0x7f1500f5
int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f1500f6
int style TextAppearance_Compat_Notification 0x7f1500f7
int style TextAppearance_Compat_Notification_Info 0x7f1500f8
int style TextAppearance_Compat_Notification_Line2 0x7f1500f9
int style TextAppearance_Compat_Notification_Time 0x7f1500fa
int style TextAppearance_Compat_Notification_Title 0x7f1500fb
int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f1500fc
int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f1500fd
int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f1500fe
int style Theme 0x7f1500ff
int style ThemeOverlay_AppCompat 0x7f150100
int style ThemeOverlay_AppCompat_ActionBar 0x7f150101
int style ThemeOverlay_AppCompat_Dark 0x7f150102
int style ThemeOverlay_AppCompat_Dark_ActionBar 0x7f150103
int style ThemeOverlay_AppCompat_Dialog 0x7f150104
int style ThemeOverlay_AppCompat_Dialog_Alert 0x7f150105
int style ThemeOverlay_AppCompat_Light 0x7f150106
int style Theme_AppCompat 0x7f150107
int style Theme_AppCompat_CompactMenu 0x7f150108
int style Theme_AppCompat_DayNight 0x7f150109
int style Theme_AppCompat_DayNight_DarkActionBar 0x7f15010a
int style Theme_AppCompat_DayNight_Dialog 0x7f15010b
int style Theme_AppCompat_DayNight_DialogWhenLarge 0x7f15010c
int style Theme_AppCompat_DayNight_Dialog_Alert 0x7f15010d
int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x7f15010e
int style Theme_AppCompat_DayNight_NoActionBar 0x7f15010f
int style Theme_AppCompat_Dialog 0x7f150110
int style Theme_AppCompat_DialogWhenLarge 0x7f150111
int style Theme_AppCompat_Dialog_Alert 0x7f150112
int style Theme_AppCompat_Dialog_MinWidth 0x7f150113
int style Theme_AppCompat_Light 0x7f150114
int style Theme_AppCompat_Light_DarkActionBar 0x7f150115
int style Theme_AppCompat_Light_Dialog 0x7f150116
int style Theme_AppCompat_Light_DialogWhenLarge 0x7f150117
int style Theme_AppCompat_Light_Dialog_Alert 0x7f150118
int style Theme_AppCompat_Light_Dialog_MinWidth 0x7f150119
int style Theme_AppCompat_Light_NoActionBar 0x7f15011a
int style Theme_AppCompat_NoActionBar 0x7f15011b
int style Theme_Catalyst 0x7f15011c
int style Theme_Catalyst_RedBox 0x7f15011d
int style Theme_FullScreenDialog 0x7f15011e
int style Theme_FullScreenDialogAnimatedFade 0x7f15011f
int style Theme_FullScreenDialogAnimatedSlide 0x7f150120
int style Theme_ReactNative_AppCompat_Light 0x7f150121
int style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen 0x7f150122
int style Widget_AppCompat_ActionBar 0x7f150123
int style Widget_AppCompat_ActionBar_Solid 0x7f150124
int style Widget_AppCompat_ActionBar_TabBar 0x7f150125
int style Widget_AppCompat_ActionBar_TabText 0x7f150126
int style Widget_AppCompat_ActionBar_TabView 0x7f150127
int style Widget_AppCompat_ActionButton 0x7f150128
int style Widget_AppCompat_ActionButton_CloseMode 0x7f150129
int style Widget_AppCompat_ActionButton_Overflow 0x7f15012a
int style Widget_AppCompat_ActionMode 0x7f15012b
int style Widget_AppCompat_ActivityChooserView 0x7f15012c
int style Widget_AppCompat_AutoCompleteTextView 0x7f15012d
int style Widget_AppCompat_Button 0x7f15012e
int style Widget_AppCompat_ButtonBar 0x7f15012f
int style Widget_AppCompat_ButtonBar_AlertDialog 0x7f150130
int style Widget_AppCompat_Button_Borderless 0x7f150131
int style Widget_AppCompat_Button_Borderless_Colored 0x7f150132
int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f150133
int style Widget_AppCompat_Button_Colored 0x7f150134
int style Widget_AppCompat_Button_Small 0x7f150135
int style Widget_AppCompat_CompoundButton_CheckBox 0x7f150136
int style Widget_AppCompat_CompoundButton_RadioButton 0x7f150137
int style Widget_AppCompat_CompoundButton_Switch 0x7f150138
int style Widget_AppCompat_DrawerArrowToggle 0x7f150139
int style Widget_AppCompat_DropDownItem_Spinner 0x7f15013a
int style Widget_AppCompat_EditText 0x7f15013b
int style Widget_AppCompat_ImageButton 0x7f15013c
int style Widget_AppCompat_Light_ActionBar 0x7f15013d
int style Widget_AppCompat_Light_ActionBar_Solid 0x7f15013e
int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x7f15013f
int style Widget_AppCompat_Light_ActionBar_TabBar 0x7f150140
int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x7f150141
int style Widget_AppCompat_Light_ActionBar_TabText 0x7f150142
int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f150143
int style Widget_AppCompat_Light_ActionBar_TabView 0x7f150144
int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x7f150145
int style Widget_AppCompat_Light_ActionButton 0x7f150146
int style Widget_AppCompat_Light_ActionButton_CloseMode 0x7f150147
int style Widget_AppCompat_Light_ActionButton_Overflow 0x7f150148
int style Widget_AppCompat_Light_ActionMode_Inverse 0x7f150149
int style Widget_AppCompat_Light_ActivityChooserView 0x7f15014a
int style Widget_AppCompat_Light_AutoCompleteTextView 0x7f15014b
int style Widget_AppCompat_Light_DropDownItem_Spinner 0x7f15014c
int style Widget_AppCompat_Light_ListPopupWindow 0x7f15014d
int style Widget_AppCompat_Light_ListView_DropDown 0x7f15014e
int style Widget_AppCompat_Light_PopupMenu 0x7f15014f
int style Widget_AppCompat_Light_PopupMenu_Overflow 0x7f150150
int style Widget_AppCompat_Light_SearchView 0x7f150151
int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x7f150152
int style Widget_AppCompat_ListMenuView 0x7f150153
int style Widget_AppCompat_ListPopupWindow 0x7f150154
int style Widget_AppCompat_ListView 0x7f150155
int style Widget_AppCompat_ListView_DropDown 0x7f150156
int style Widget_AppCompat_ListView_Menu 0x7f150157
int style Widget_AppCompat_PopupMenu 0x7f150158
int style Widget_AppCompat_PopupMenu_Overflow 0x7f150159
int style Widget_AppCompat_PopupWindow 0x7f15015a
int style Widget_AppCompat_ProgressBar 0x7f15015b
int style Widget_AppCompat_ProgressBar_Horizontal 0x7f15015c
int style Widget_AppCompat_RatingBar 0x7f15015d
int style Widget_AppCompat_RatingBar_Indicator 0x7f15015e
int style Widget_AppCompat_RatingBar_Small 0x7f15015f
int style Widget_AppCompat_SearchView 0x7f150160
int style Widget_AppCompat_SearchView_ActionBar 0x7f150161
int style Widget_AppCompat_SeekBar 0x7f150162
int style Widget_AppCompat_SeekBar_Discrete 0x7f150163
int style Widget_AppCompat_Spinner 0x7f150164
int style Widget_AppCompat_Spinner_DropDown 0x7f150165
int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x7f150166
int style Widget_AppCompat_Spinner_Underlined 0x7f150167
int style Widget_AppCompat_TextView_SpinnerItem 0x7f150168
int style Widget_AppCompat_Toolbar 0x7f150169
int style Widget_AppCompat_Toolbar_Button_Navigation 0x7f15016a
int style Widget_Compat_NotificationActionContainer 0x7f15016b
int style Widget_Compat_NotificationActionText 0x7f15016c
int style Widget_Support_CoordinatorLayout 0x7f15016d
int style redboxButton 0x7f15016e
int[] styleable ActionBar { 0x7f040035, 0x7f040037, 0x7f040038, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f040060, 0x7f040061, 0x7f040064, 0x7f040069, 0x7f04006a, 0x7f040075, 0x7f040088, 0x7f040089, 0x7f04008a, 0x7f04008b, 0x7f04008c, 0x7f040091, 0x7f040094, 0x7f0400aa, 0x7f0400b1, 0x7f0400bf, 0x7f0400c6, 0x7f0400c7, 0x7f0400f2, 0x7f0400f5, 0x7f040110, 0x7f040119 }
int styleable ActionBar_background 0
int styleable ActionBar_backgroundSplit 1
int styleable ActionBar_backgroundStacked 2
int styleable ActionBar_contentInsetEnd 3
int styleable ActionBar_contentInsetEndWithActions 4
int styleable ActionBar_contentInsetLeft 5
int styleable ActionBar_contentInsetRight 6
int styleable ActionBar_contentInsetStart 7
int styleable ActionBar_contentInsetStartWithNavigation 8
int styleable ActionBar_customNavigationLayout 9
int styleable ActionBar_displayOptions 10
int styleable ActionBar_divider 11
int styleable ActionBar_elevation 12
int styleable ActionBar_height 13
int styleable ActionBar_hideOnContentScroll 14
int styleable ActionBar_homeAsUpIndicator 15
int styleable ActionBar_homeLayout 16
int styleable ActionBar_icon 17
int styleable ActionBar_indeterminateProgressStyle 18
int styleable ActionBar_itemPadding 19
int styleable ActionBar_logo 20
int styleable ActionBar_navigationMode 21
int styleable ActionBar_popupTheme 22
int styleable ActionBar_progressBarPadding 23
int styleable ActionBar_progressBarStyle 24
int styleable ActionBar_subtitle 25
int styleable ActionBar_subtitleTextStyle 26
int styleable ActionBar_title 27
int styleable ActionBar_titleTextStyle 28
int[] styleable ActionBarLayout { 0x10100b3 }
int styleable ActionBarLayout_android_layout_gravity 0
int[] styleable ActionMenuItemView { 0x101013f }
int styleable ActionMenuItemView_android_minWidth 0
int[] styleable ActionMenuView { }
int[] styleable ActionMode { 0x7f040035, 0x7f040037, 0x7f04004c, 0x7f040088, 0x7f0400f5, 0x7f040119 }
int styleable ActionMode_background 0
int styleable ActionMode_backgroundSplit 1
int styleable ActionMode_closeItemLayout 2
int styleable ActionMode_height 3
int styleable ActionMode_subtitleTextStyle 4
int styleable ActionMode_titleTextStyle 5
int[] styleable ActivityChooserView { 0x7f040076, 0x7f040092 }
int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0
int styleable ActivityChooserView_initialActivityCount 1
int[] styleable AlertDialog { 0x10100f2, 0x7f040043, 0x7f040044, 0x7f0400a1, 0x7f0400a2, 0x7f0400ae, 0x7f0400e7, 0x7f0400e8 }
int styleable AlertDialog_android_layout 0
int styleable AlertDialog_buttonIconDimen 1
int styleable AlertDialog_buttonPanelSideLayout 2
int styleable AlertDialog_listItemLayout 3
int styleable AlertDialog_listLayout 4
int styleable AlertDialog_multiChoiceItemLayout 5
int styleable AlertDialog_showTitle 6
int styleable AlertDialog_singleChoiceItemLayout 7
int[] styleable AnimatedStateListDrawableCompat { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 }
int styleable AnimatedStateListDrawableCompat_android_constantSize 0
int styleable AnimatedStateListDrawableCompat_android_dither 1
int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 2
int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 3
int styleable AnimatedStateListDrawableCompat_android_variablePadding 4
int styleable AnimatedStateListDrawableCompat_android_visible 5
int[] styleable AnimatedStateListDrawableItem { 0x1010199, 0x10100d0 }
int styleable AnimatedStateListDrawableItem_android_drawable 0
int styleable AnimatedStateListDrawableItem_android_id 1
int[] styleable AnimatedStateListDrawableTransition { 0x1010199, 0x101044a, 0x101044b, 0x1010449 }
int styleable AnimatedStateListDrawableTransition_android_drawable 0
int styleable AnimatedStateListDrawableTransition_android_fromId 1
int styleable AnimatedStateListDrawableTransition_android_reversible 2
int styleable AnimatedStateListDrawableTransition_android_toId 3
int[] styleable AppCompatImageView { 0x1010119, 0x7f0400ed, 0x7f04010e, 0x7f04010f }
int styleable AppCompatImageView_android_src 0
int styleable AppCompatImageView_srcCompat 1
int styleable AppCompatImageView_tint 2
int styleable AppCompatImageView_tintMode 3
int[] styleable AppCompatSeekBar { 0x1010142, 0x7f04010b, 0x7f04010c, 0x7f04010d }
int styleable AppCompatSeekBar_android_thumb 0
int styleable AppCompatSeekBar_tickMark 1
int styleable AppCompatSeekBar_tickMarkTint 2
int styleable AppCompatSeekBar_tickMarkTintMode 3
int[] styleable AppCompatTextHelper { 0x101016e, 0x1010393, 0x101016f, 0x1010170, 0x1010392, 0x101016d, 0x1010034 }
int styleable AppCompatTextHelper_android_drawableBottom 0
int styleable AppCompatTextHelper_android_drawableEnd 1
int styleable AppCompatTextHelper_android_drawableLeft 2
int styleable AppCompatTextHelper_android_drawableRight 3
int styleable AppCompatTextHelper_android_drawableStart 4
int styleable AppCompatTextHelper_android_drawableTop 5
int styleable AppCompatTextHelper_android_textAppearance 6
int[] styleable AppCompatTextView { 0x1010034, 0x7f040030, 0x7f040031, 0x7f040032, 0x7f040033, 0x7f040034, 0x7f04007a, 0x7f04007c, 0x7f040096, 0x7f04009e, 0x7f0400fb }
int styleable AppCompatTextView_android_textAppearance 0
int styleable AppCompatTextView_autoSizeMaxTextSize 1
int styleable AppCompatTextView_autoSizeMinTextSize 2
int styleable AppCompatTextView_autoSizePresetSizes 3
int styleable AppCompatTextView_autoSizeStepGranularity 4
int styleable AppCompatTextView_autoSizeTextType 5
int styleable AppCompatTextView_firstBaselineToTopHeight 6
int styleable AppCompatTextView_fontFamily 7
int styleable AppCompatTextView_lastBaselineToBottomHeight 8
int styleable AppCompatTextView_lineHeight 9
int styleable AppCompatTextView_textAllCaps 10
int[] styleable AppCompatTheme { 0x7f040001, 0x7f040002, 0x7f040003, 0x7f040004, 0x7f040005, 0x7f040006, 0x7f040007, 0x7f040008, 0x7f040009, 0x7f04000a, 0x7f04000b, 0x7f04000c, 0x7f04000d, 0x7f04000f, 0x7f040010, 0x7f040011, 0x7f040012, 0x7f040013, 0x7f040014, 0x7f040015, 0x7f040016, 0x7f040017, 0x7f040018, 0x7f040019, 0x7f04001a, 0x7f04001b, 0x7f04001c, 0x7f04001d, 0x7f04001e, 0x7f04001f, 0x7f040022, 0x7f040026, 0x7f040027, 0x7f040028, 0x7f040029, 0x10100ae, 0x1010057, 0x7f04002f, 0x7f04003c, 0x7f04003d, 0x7f04003e, 0x7f04003f, 0x7f040040, 0x7f040041, 0x7f040045, 0x7f040046, 0x7f040049, 0x7f04004a, 0x7f040050, 0x7f040051, 0x7f040052, 0x7f040053, 0x7f040054, 0x7f040055, 0x7f040056, 0x7f040057, 0x7f040058, 0x7f040059, 0x7f040062, 0x7f040066, 0x7f040067, 0x7f040068, 0x7f04006b, 0x7f04006d, 0x7f040070, 0x7f040071, 0x7f040072, 0x7f040073, 0x7f040074, 0x7f04008a, 0x7f040090, 0x7f04009f, 0x7f0400a0, 0x7f0400a3, 0x7f0400a4, 0x7f0400a5, 0x7f0400a6, 0x7f0400a7, 0x7f0400a8, 0x7f0400a9, 0x7f0400b9, 0x7f0400ba, 0x7f0400bb, 0x7f0400be, 0x7f0400c0, 0x7f0400ca, 0x7f0400cb, 0x7f0400cc, 0x7f0400cd, 0x7f0400e0, 0x7f0400e1, 0x7f0400e2, 0x7f0400e3, 0x7f0400ea, 0x7f0400eb, 0x7f0400f9, 0x7f0400fc, 0x7f0400fd, 0x7f0400fe, 0x7f0400ff, 0x7f040100, 0x7f040101, 0x7f040102, 0x7f040103, 0x7f040104, 0x7f040105, 0x7f04011a, 0x7f04011b, 0x7f04011c, 0x7f04011d, 0x7f040124, 0x7f040126, 0x7f040127, 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c, 0x7f04012d, 0x7f04012e, 0x7f04012f }
int styleable AppCompatTheme_actionBarDivider 0
int styleable AppCompatTheme_actionBarItemBackground 1
int styleable AppCompatTheme_actionBarPopupTheme 2
int styleable AppCompatTheme_actionBarSize 3
int styleable AppCompatTheme_actionBarSplitStyle 4
int styleable AppCompatTheme_actionBarStyle 5
int styleable AppCompatTheme_actionBarTabBarStyle 6
int styleable AppCompatTheme_actionBarTabStyle 7
int styleable AppCompatTheme_actionBarTabTextStyle 8
int styleable AppCompatTheme_actionBarTheme 9
int styleable AppCompatTheme_actionBarWidgetTheme 10
int styleable AppCompatTheme_actionButtonStyle 11
int styleable AppCompatTheme_actionDropDownStyle 12
int styleable AppCompatTheme_actionMenuTextAppearance 13
int styleable AppCompatTheme_actionMenuTextColor 14
int styleable AppCompatTheme_actionModeBackground 15
int styleable AppCompatTheme_actionModeCloseButtonStyle 16
int styleable AppCompatTheme_actionModeCloseDrawable 17
int styleable AppCompatTheme_actionModeCopyDrawable 18
int styleable AppCompatTheme_actionModeCutDrawable 19
int styleable AppCompatTheme_actionModeFindDrawable 20
int styleable AppCompatTheme_actionModePasteDrawable 21
int styleable AppCompatTheme_actionModePopupWindowStyle 22
int styleable AppCompatTheme_actionModeSelectAllDrawable 23
int styleable AppCompatTheme_actionModeShareDrawable 24
int styleable AppCompatTheme_actionModeSplitBackground 25
int styleable AppCompatTheme_actionModeStyle 26
int styleable AppCompatTheme_actionModeWebSearchDrawable 27
int styleable AppCompatTheme_actionOverflowButtonStyle 28
int styleable AppCompatTheme_actionOverflowMenuStyle 29
int styleable AppCompatTheme_activityChooserViewStyle 30
int styleable AppCompatTheme_alertDialogButtonGroupStyle 31
int styleable AppCompatTheme_alertDialogCenterButtons 32
int styleable AppCompatTheme_alertDialogStyle 33
int styleable AppCompatTheme_alertDialogTheme 34
int styleable AppCompatTheme_android_windowAnimationStyle 35
int styleable AppCompatTheme_android_windowIsFloating 36
int styleable AppCompatTheme_autoCompleteTextViewStyle 37
int styleable AppCompatTheme_borderlessButtonStyle 38
int styleable AppCompatTheme_buttonBarButtonStyle 39
int styleable AppCompatTheme_buttonBarNegativeButtonStyle 40
int styleable AppCompatTheme_buttonBarNeutralButtonStyle 41
int styleable AppCompatTheme_buttonBarPositiveButtonStyle 42
int styleable AppCompatTheme_buttonBarStyle 43
int styleable AppCompatTheme_buttonStyle 44
int styleable AppCompatTheme_buttonStyleSmall 45
int styleable AppCompatTheme_checkboxStyle 46
int styleable AppCompatTheme_checkedTextViewStyle 47
int styleable AppCompatTheme_colorAccent 48
int styleable AppCompatTheme_colorBackgroundFloating 49
int styleable AppCompatTheme_colorButtonNormal 50
int styleable AppCompatTheme_colorControlActivated 51
int styleable AppCompatTheme_colorControlHighlight 52
int styleable AppCompatTheme_colorControlNormal 53
int styleable AppCompatTheme_colorError 54
int styleable AppCompatTheme_colorPrimary 55
int styleable AppCompatTheme_colorPrimaryDark 56
int styleable AppCompatTheme_colorSwitchThumbNormal 57
int styleable AppCompatTheme_controlBackground 58
int styleable AppCompatTheme_dialogCornerRadius 59
int styleable AppCompatTheme_dialogPreferredPadding 60
int styleable AppCompatTheme_dialogTheme 61
int styleable AppCompatTheme_dividerHorizontal 62
int styleable AppCompatTheme_dividerVertical 63
int styleable AppCompatTheme_dropDownListViewStyle 64
int styleable AppCompatTheme_dropdownListPreferredItemHeight 65
int styleable AppCompatTheme_editTextBackground 66
int styleable AppCompatTheme_editTextColor 67
int styleable AppCompatTheme_editTextStyle 68
int styleable AppCompatTheme_homeAsUpIndicator 69
int styleable AppCompatTheme_imageButtonStyle 70
int styleable AppCompatTheme_listChoiceBackgroundIndicator 71
int styleable AppCompatTheme_listDividerAlertDialog 72
int styleable AppCompatTheme_listMenuViewStyle 73
int styleable AppCompatTheme_listPopupWindowStyle 74
int styleable AppCompatTheme_listPreferredItemHeight 75
int styleable AppCompatTheme_listPreferredItemHeightLarge 76
int styleable AppCompatTheme_listPreferredItemHeightSmall 77
int styleable AppCompatTheme_listPreferredItemPaddingLeft 78
int styleable AppCompatTheme_listPreferredItemPaddingRight 79
int styleable AppCompatTheme_panelBackground 80
int styleable AppCompatTheme_panelMenuListTheme 81
int styleable AppCompatTheme_panelMenuListWidth 82
int styleable AppCompatTheme_popupMenuStyle 83
int styleable AppCompatTheme_popupWindowStyle 84
int styleable AppCompatTheme_radioButtonStyle 85
int styleable AppCompatTheme_ratingBarStyle 86
int styleable AppCompatTheme_ratingBarStyleIndicator 87
int styleable AppCompatTheme_ratingBarStyleSmall 88
int styleable AppCompatTheme_searchViewStyle 89
int styleable AppCompatTheme_seekBarStyle 90
int styleable AppCompatTheme_selectableItemBackground 91
int styleable AppCompatTheme_selectableItemBackgroundBorderless 92
int styleable AppCompatTheme_spinnerDropDownItemStyle 93
int styleable AppCompatTheme_spinnerStyle 94
int styleable AppCompatTheme_switchStyle 95
int styleable AppCompatTheme_textAppearanceLargePopupMenu 96
int styleable AppCompatTheme_textAppearanceListItem 97
int styleable AppCompatTheme_textAppearanceListItemSecondary 98
int styleable AppCompatTheme_textAppearanceListItemSmall 99
int styleable AppCompatTheme_textAppearancePopupMenuHeader 100
int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 101
int styleable AppCompatTheme_textAppearanceSearchResultTitle 102
int styleable AppCompatTheme_textAppearanceSmallPopupMenu 103
int styleable AppCompatTheme_textColorAlertDialogListItem 104
int styleable AppCompatTheme_textColorSearchUrl 105
int styleable AppCompatTheme_toolbarNavigationButtonStyle 106
int styleable AppCompatTheme_toolbarStyle 107
int styleable AppCompatTheme_tooltipForegroundColor 108
int styleable AppCompatTheme_tooltipFrameBackground 109
int styleable AppCompatTheme_viewInflaterClass 110
int styleable AppCompatTheme_windowActionBar 111
int styleable AppCompatTheme_windowActionBarOverlay 112
int styleable AppCompatTheme_windowActionModeOverlay 113
int styleable AppCompatTheme_windowFixedHeightMajor 114
int styleable AppCompatTheme_windowFixedHeightMinor 115
int styleable AppCompatTheme_windowFixedWidthMajor 116
int styleable AppCompatTheme_windowFixedWidthMinor 117
int styleable AppCompatTheme_windowMinWidthMajor 118
int styleable AppCompatTheme_windowMinWidthMinor 119
int styleable AppCompatTheme_windowNoTitle 120
int[] styleable ButtonBarLayout { 0x7f04002a }
int styleable ButtonBarLayout_allowStacking 0
int[] styleable ColorStateListItem { 0x7f04002b, 0x101031f, 0x10101a5 }
int styleable ColorStateListItem_alpha 0
int styleable ColorStateListItem_android_alpha 1
int styleable ColorStateListItem_android_color 2
int[] styleable CompoundButton { 0x1010107, 0x7f040047, 0x7f040048 }
int styleable CompoundButton_android_button 0
int styleable CompoundButton_buttonTint 1
int styleable CompoundButton_buttonTintMode 2
int[] styleable CoordinatorLayout { 0x7f040095, 0x7f0400ef }
int styleable CoordinatorLayout_keylines 0
int styleable CoordinatorLayout_statusBarBackground 1
int[] styleable CoordinatorLayout_Layout { 0x10100b3, 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f04009d }
int styleable CoordinatorLayout_Layout_android_layout_gravity 0
int styleable CoordinatorLayout_Layout_layout_anchor 1
int styleable CoordinatorLayout_Layout_layout_anchorGravity 2
int styleable CoordinatorLayout_Layout_layout_behavior 3
int styleable CoordinatorLayout_Layout_layout_dodgeInsetEdges 4
int styleable CoordinatorLayout_Layout_layout_insetEdge 5
int styleable CoordinatorLayout_Layout_layout_keyline 6
int[] styleable DrawerArrowToggle { 0x7f04002d, 0x7f04002e, 0x7f04003b, 0x7f04004f, 0x7f04006e, 0x7f040086, 0x7f0400e9, 0x7f040107 }
int styleable DrawerArrowToggle_arrowHeadLength 0
int styleable DrawerArrowToggle_arrowShaftLength 1
int styleable DrawerArrowToggle_barLength 2
int styleable DrawerArrowToggle_color 3
int styleable DrawerArrowToggle_drawableSize 4
int styleable DrawerArrowToggle_gapBetweenBars 5
int styleable DrawerArrowToggle_spinBars 6
int styleable DrawerArrowToggle_thickness 7
int[] styleable FontFamily { 0x7f04007d, 0x7f04007e, 0x7f04007f, 0x7f040080, 0x7f040081, 0x7f040082 }
int styleable FontFamily_fontProviderAuthority 0
int styleable FontFamily_fontProviderCerts 1
int styleable FontFamily_fontProviderFetchStrategy 2
int styleable FontFamily_fontProviderFetchTimeout 3
int styleable FontFamily_fontProviderPackage 4
int styleable FontFamily_fontProviderQuery 5
int[] styleable FontFamilyFont { 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f04007b, 0x7f040083, 0x7f040084, 0x7f040085, 0x7f040122 }
int styleable FontFamilyFont_android_font 0
int styleable FontFamilyFont_android_fontStyle 1
int styleable FontFamilyFont_android_fontVariationSettings 2
int styleable FontFamilyFont_android_fontWeight 3
int styleable FontFamilyFont_android_ttcIndex 4
int styleable FontFamilyFont_font 5
int styleable FontFamilyFont_fontStyle 6
int styleable FontFamilyFont_fontVariationSettings 7
int styleable FontFamilyFont_fontWeight 8
int styleable FontFamilyFont_ttcIndex 9
int[] styleable GenericDraweeHierarchy { 0x7f040024, 0x7f040036, 0x7f040077, 0x7f040078, 0x7f040079, 0x7f0400b4, 0x7f0400bc, 0x7f0400bd, 0x7f0400c2, 0x7f0400c3, 0x7f0400c4, 0x7f0400c5, 0x7f0400ce, 0x7f0400cf, 0x7f0400d0, 0x7f0400d1, 0x7f0400d2, 0x7f0400d3, 0x7f0400d4, 0x7f0400d5, 0x7f0400d6, 0x7f0400d7, 0x7f0400d8, 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f040123 }
int styleable GenericDraweeHierarchy_actualImageScaleType 0
int styleable GenericDraweeHierarchy_backgroundImage 1
int styleable GenericDraweeHierarchy_fadeDuration 2
int styleable GenericDraweeHierarchy_failureImage 3
int styleable GenericDraweeHierarchy_failureImageScaleType 4
int styleable GenericDraweeHierarchy_overlayImage 5
int styleable GenericDraweeHierarchy_placeholderImage 6
int styleable GenericDraweeHierarchy_placeholderImageScaleType 7
int styleable GenericDraweeHierarchy_pressedStateOverlayImage 8
int styleable GenericDraweeHierarchy_progressBarAutoRotateInterval 9
int styleable GenericDraweeHierarchy_progressBarImage 10
int styleable GenericDraweeHierarchy_progressBarImageScaleType 11
int styleable GenericDraweeHierarchy_retryImage 12
int styleable GenericDraweeHierarchy_retryImageScaleType 13
int styleable GenericDraweeHierarchy_roundAsCircle 14
int styleable GenericDraweeHierarchy_roundBottomEnd 15
int styleable GenericDraweeHierarchy_roundBottomLeft 16
int styleable GenericDraweeHierarchy_roundBottomRight 17
int styleable GenericDraweeHierarchy_roundBottomStart 18
int styleable GenericDraweeHierarchy_roundTopEnd 19
int styleable GenericDraweeHierarchy_roundTopLeft 20
int styleable GenericDraweeHierarchy_roundTopRight 21
int styleable GenericDraweeHierarchy_roundTopStart 22
int styleable GenericDraweeHierarchy_roundWithOverlayColor 23
int styleable GenericDraweeHierarchy_roundedCornerRadius 24
int styleable GenericDraweeHierarchy_roundingBorderColor 25
int styleable GenericDraweeHierarchy_roundingBorderPadding 26
int styleable GenericDraweeHierarchy_roundingBorderWidth 27
int styleable GenericDraweeHierarchy_viewAspectRatio 28
int[] styleable GradientColor { 0x101020b, 0x10101a2, 0x10101a3, 0x101019e, 0x0, 0x0, 0x10101a4, 0x101019d, 0x0, 0x0, 0x1010201, 0x10101a1 }
int styleable GradientColor_android_centerColor 0
int styleable GradientColor_android_centerX 1
int styleable GradientColor_android_centerY 2
int styleable GradientColor_android_endColor 3
int styleable GradientColor_android_endX 4
int styleable GradientColor_android_endY 5
int styleable GradientColor_android_gradientRadius 6
int styleable GradientColor_android_startColor 7
int styleable GradientColor_android_startX 8
int styleable GradientColor_android_startY 9
int styleable GradientColor_android_tileMode 10
int styleable GradientColor_android_type 11
int[] styleable GradientColorItem { 0x10101a5, 0x0 }
int styleable GradientColorItem_android_color 0
int styleable GradientColorItem_android_offset 1
int[] styleable LinearLayoutCompat { 0x1010126, 0x1010127, 0x10100af, 0x10100c4, 0x1010128, 0x7f04006a, 0x7f04006c, 0x7f0400ad, 0x7f0400e5 }
int styleable LinearLayoutCompat_android_baselineAligned 0
int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 1
int styleable LinearLayoutCompat_android_gravity 2
int styleable LinearLayoutCompat_android_orientation 3
int styleable LinearLayoutCompat_android_weightSum 4
int styleable LinearLayoutCompat_divider 5
int styleable LinearLayoutCompat_dividerPadding 6
int styleable LinearLayoutCompat_measureWithLargestChild 7
int styleable LinearLayoutCompat_showDividers 8
int[] styleable LinearLayoutCompat_Layout { 0x10100b3, 0x10100f5, 0x1010181, 0x10100f4 }
int styleable LinearLayoutCompat_Layout_android_layout_gravity 0
int styleable LinearLayoutCompat_Layout_android_layout_height 1
int styleable LinearLayoutCompat_Layout_android_layout_weight 2
int styleable LinearLayoutCompat_Layout_android_layout_width 3
int[] styleable ListPopupWindow { 0x10102ac, 0x10102ad }
int styleable ListPopupWindow_android_dropDownHorizontalOffset 0
int styleable ListPopupWindow_android_dropDownVerticalOffset 1
int[] styleable MenuGroup { 0x10101e0, 0x101000e, 0x10100d0, 0x10101de, 0x10101df, 0x1010194 }
int styleable MenuGroup_android_checkableBehavior 0
int styleable MenuGroup_android_enabled 1
int styleable MenuGroup_android_id 2
int styleable MenuGroup_android_menuCategory 3
int styleable MenuGroup_android_orderInCategory 4
int styleable MenuGroup_android_visible 5
int[] styleable MenuItem { 0x7f04000e, 0x7f040020, 0x7f040021, 0x7f04002c, 0x10101e3, 0x10101e5, 0x1010106, 0x101000e, 0x1010002, 0x10100d0, 0x10101de, 0x10101e4, 0x101026f, 0x10101df, 0x10101e1, 0x10101e2, 0x1010194, 0x7f04005b, 0x7f04008d, 0x7f04008e, 0x7f0400b2, 0x7f0400e4, 0x7f04011e }
int styleable MenuItem_actionLayout 0
int styleable MenuItem_actionProviderClass 1
int styleable MenuItem_actionViewClass 2
int styleable MenuItem_alphabeticModifiers 3
int styleable MenuItem_android_alphabeticShortcut 4
int styleable MenuItem_android_checkable 5
int styleable MenuItem_android_checked 6
int styleable MenuItem_android_enabled 7
int styleable MenuItem_android_icon 8
int styleable MenuItem_android_id 9
int styleable MenuItem_android_menuCategory 10
int styleable MenuItem_android_numericShortcut 11
int styleable MenuItem_android_onClick 12
int styleable MenuItem_android_orderInCategory 13
int styleable MenuItem_android_title 14
int styleable MenuItem_android_titleCondensed 15
int styleable MenuItem_android_visible 16
int styleable MenuItem_contentDescription 17
int styleable MenuItem_iconTint 18
int styleable MenuItem_iconTintMode 19
int styleable MenuItem_numericModifiers 20
int styleable MenuItem_showAsAction 21
int styleable MenuItem_tooltipText 22
int[] styleable MenuView { 0x101012f, 0x101012d, 0x1010130, 0x1010131, 0x101012c, 0x101012e, 0x10100ae, 0x7f0400c1, 0x7f0400f0 }
int styleable MenuView_android_headerBackground 0
int styleable MenuView_android_horizontalDivider 1
int styleable MenuView_android_itemBackground 2
int styleable MenuView_android_itemIconDisabledAlpha 3
int styleable MenuView_android_itemTextAppearance 4
int styleable MenuView_android_verticalDivider 5
int styleable MenuView_android_windowAnimationStyle 6
int styleable MenuView_preserveIconSpacing 7
int styleable MenuView_subMenuArrow 8
int[] styleable PopupWindow { 0x10102c9, 0x1010176, 0x7f0400b3 }
int styleable PopupWindow_android_popupAnimationStyle 0
int styleable PopupWindow_android_popupBackground 1
int styleable PopupWindow_overlapAnchor 2
int[] styleable PopupWindowBackgroundState { 0x7f0400ee }
int styleable PopupWindowBackgroundState_state_above_anchor 0
int[] styleable RecycleListView { 0x7f0400b5, 0x7f0400b8 }
int styleable RecycleListView_paddingBottomNoButtons 0
int styleable RecycleListView_paddingTopNoTitle 1
int[] styleable SearchView { 0x10100da, 0x1010264, 0x1010220, 0x101011f, 0x7f04004b, 0x7f04005a, 0x7f040065, 0x7f040087, 0x7f04008f, 0x7f040097, 0x7f0400c8, 0x7f0400c9, 0x7f0400de, 0x7f0400df, 0x7f0400f1, 0x7f0400f6, 0x7f040125 }
int styleable SearchView_android_focusable 0
int styleable SearchView_android_imeOptions 1
int styleable SearchView_android_inputType 2
int styleable SearchView_android_maxWidth 3
int styleable SearchView_closeIcon 4
int styleable SearchView_commitIcon 5
int styleable SearchView_defaultQueryHint 6
int styleable SearchView_goIcon 7
int styleable SearchView_iconifiedByDefault 8
int styleable SearchView_layout 9
int styleable SearchView_queryBackground 10
int styleable SearchView_queryHint 11
int styleable SearchView_searchHintIcon 12
int styleable SearchView_searchIcon 13
int styleable SearchView_submitBackground 14
int styleable SearchView_suggestionRowLayout 15
int styleable SearchView_voiceIcon 16
int[] styleable SimpleDraweeView { 0x7f040023, 0x7f040024, 0x7f040025, 0x7f040036, 0x7f040077, 0x7f040078, 0x7f040079, 0x7f0400b4, 0x7f0400bc, 0x7f0400bd, 0x7f0400c2, 0x7f0400c3, 0x7f0400c4, 0x7f0400c5, 0x7f0400ce, 0x7f0400cf, 0x7f0400d0, 0x7f0400d1, 0x7f0400d2, 0x7f0400d3, 0x7f0400d4, 0x7f0400d5, 0x7f0400d6, 0x7f0400d7, 0x7f0400d8, 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f040123 }
int styleable SimpleDraweeView_actualImageResource 0
int styleable SimpleDraweeView_actualImageScaleType 1
int styleable SimpleDraweeView_actualImageUri 2
int styleable SimpleDraweeView_backgroundImage 3
int styleable SimpleDraweeView_fadeDuration 4
int styleable SimpleDraweeView_failureImage 5
int styleable SimpleDraweeView_failureImageScaleType 6
int styleable SimpleDraweeView_overlayImage 7
int styleable SimpleDraweeView_placeholderImage 8
int styleable SimpleDraweeView_placeholderImageScaleType 9
int styleable SimpleDraweeView_pressedStateOverlayImage 10
int styleable SimpleDraweeView_progressBarAutoRotateInterval 11
int styleable SimpleDraweeView_progressBarImage 12
int styleable SimpleDraweeView_progressBarImageScaleType 13
int styleable SimpleDraweeView_retryImage 14
int styleable SimpleDraweeView_retryImageScaleType 15
int styleable SimpleDraweeView_roundAsCircle 16
int styleable SimpleDraweeView_roundBottomEnd 17
int styleable SimpleDraweeView_roundBottomLeft 18
int styleable SimpleDraweeView_roundBottomRight 19
int styleable SimpleDraweeView_roundBottomStart 20
int styleable SimpleDraweeView_roundTopEnd 21
int styleable SimpleDraweeView_roundTopLeft 22
int styleable SimpleDraweeView_roundTopRight 23
int styleable SimpleDraweeView_roundTopStart 24
int styleable SimpleDraweeView_roundWithOverlayColor 25
int styleable SimpleDraweeView_roundedCornerRadius 26
int styleable SimpleDraweeView_roundingBorderColor 27
int styleable SimpleDraweeView_roundingBorderPadding 28
int styleable SimpleDraweeView_roundingBorderWidth 29
int styleable SimpleDraweeView_viewAspectRatio 30
int[] styleable Spinner { 0x1010262, 0x10100b2, 0x1010176, 0x101017b, 0x7f0400bf }
int styleable Spinner_android_dropDownWidth 0
int styleable Spinner_android_entries 1
int styleable Spinner_android_popupBackground 2
int styleable Spinner_android_prompt 3
int styleable Spinner_popupTheme 4
int[] styleable StateListDrawable { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 }
int styleable StateListDrawable_android_constantSize 0
int styleable StateListDrawable_android_dither 1
int styleable StateListDrawable_android_enterFadeDuration 2
int styleable StateListDrawable_android_exitFadeDuration 3
int styleable StateListDrawable_android_variablePadding 4
int styleable StateListDrawable_android_visible 5
int[] styleable StateListDrawableItem { 0x1010199 }
int styleable StateListDrawableItem_android_drawable 0
int[] styleable SwitchCompat { 0x1010125, 0x1010124, 0x1010142, 0x7f0400e6, 0x7f0400ec, 0x7f0400f7, 0x7f0400f8, 0x7f0400fa, 0x7f040108, 0x7f040109, 0x7f04010a, 0x7f04011f, 0x7f040120, 0x7f040121 }
int styleable SwitchCompat_android_textOff 0
int styleable SwitchCompat_android_textOn 1
int styleable SwitchCompat_android_thumb 2
int styleable SwitchCompat_showText 3
int styleable SwitchCompat_splitTrack 4
int styleable SwitchCompat_switchMinWidth 5
int styleable SwitchCompat_switchPadding 6
int styleable SwitchCompat_switchTextAppearance 7
int styleable SwitchCompat_thumbTextPadding 8
int styleable SwitchCompat_thumbTint 9
int styleable SwitchCompat_thumbTintMode 10
int styleable SwitchCompat_track 11
int styleable SwitchCompat_trackTint 12
int styleable SwitchCompat_trackTintMode 13
int[] styleable TextAppearance { 0x10103ac, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x1010098, 0x101009a, 0x101009b, 0x1010095, 0x1010097, 0x1010096, 0x7f04007c, 0x7f0400fb }
int styleable TextAppearance_android_fontFamily 0
int styleable TextAppearance_android_shadowColor 1
int styleable TextAppearance_android_shadowDx 2
int styleable TextAppearance_android_shadowDy 3
int styleable TextAppearance_android_shadowRadius 4
int styleable TextAppearance_android_textColor 5
int styleable TextAppearance_android_textColorHint 6
int styleable TextAppearance_android_textColorLink 7
int styleable TextAppearance_android_textSize 8
int styleable TextAppearance_android_textStyle 9
int styleable TextAppearance_android_typeface 10
int styleable TextAppearance_fontFamily 11
int styleable TextAppearance_textAllCaps 12
int[] styleable Toolbar { 0x10100af, 0x1010140, 0x7f040042, 0x7f04004d, 0x7f04004e, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f040060, 0x7f040061, 0x7f0400aa, 0x7f0400ab, 0x7f0400ac, 0x7f0400af, 0x7f0400b0, 0x7f0400bf, 0x7f0400f2, 0x7f0400f3, 0x7f0400f4, 0x7f040110, 0x7f040111, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040115, 0x7f040116, 0x7f040117, 0x7f040118 }
int styleable Toolbar_android_gravity 0
int styleable Toolbar_android_minHeight 1
int styleable Toolbar_buttonGravity 2
int styleable Toolbar_collapseContentDescription 3
int styleable Toolbar_collapseIcon 4
int styleable Toolbar_contentInsetEnd 5
int styleable Toolbar_contentInsetEndWithActions 6
int styleable Toolbar_contentInsetLeft 7
int styleable Toolbar_contentInsetRight 8
int styleable Toolbar_contentInsetStart 9
int styleable Toolbar_contentInsetStartWithNavigation 10
int styleable Toolbar_logo 11
int styleable Toolbar_logoDescription 12
int styleable Toolbar_maxButtonHeight 13
int styleable Toolbar_navigationContentDescription 14
int styleable Toolbar_navigationIcon 15
int styleable Toolbar_popupTheme 16
int styleable Toolbar_subtitle 17
int styleable Toolbar_subtitleTextAppearance 18
int styleable Toolbar_subtitleTextColor 19
int styleable Toolbar_title 20
int styleable Toolbar_titleMargin 21
int styleable Toolbar_titleMarginBottom 22
int styleable Toolbar_titleMarginEnd 23
int styleable Toolbar_titleMarginStart 24
int styleable Toolbar_titleMarginTop 25
int styleable Toolbar_titleMargins 26
int styleable Toolbar_titleTextAppearance 27
int styleable Toolbar_titleTextColor 28
int[] styleable View { 0x10100da, 0x1010000, 0x7f0400b6, 0x7f0400b7, 0x7f040106 }
int styleable View_android_focusable 0
int styleable View_android_theme 1
int styleable View_paddingEnd 2
int styleable View_paddingStart 3
int styleable View_theme 4
int[] styleable ViewBackgroundHelper { 0x10100d4, 0x7f040039, 0x7f04003a }
int styleable ViewBackgroundHelper_android_background 0
int styleable ViewBackgroundHelper_backgroundTint 1
int styleable ViewBackgroundHelper_backgroundTintMode 2
int[] styleable ViewStubCompat { 0x10100d0, 0x10100f3, 0x10100f2 }
int styleable ViewStubCompat_android_id 0
int styleable ViewStubCompat_android_inflatedId 1
int styleable ViewStubCompat_android_layout 2
int xml rn_dev_preferences 0x7f180001
[{"name":"resources","index":0,"scopes":["PROJECT"],"types":["NATIVE_LIBS"],"format":"DIRECTORY","present":false}]
\ No newline at end of file
-- Merging decision tree log ---
manifest
ADDED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
package
ADDED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:2:11-40
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
android:versionName
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
ADDED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
android:versionCode
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
ADDED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:1-3:12
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
xmlns:android
ADDED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml:1:11-69
uses-sdk
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml reason: use-sdk injection requested
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
android:targetSdkVersion
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
ADDED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
android:minSdkVersion
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
ADDED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
INJECTED from /Users/shiyunjie/WebstormProjects/HG/BasicApp/node_modules/react-native-text-input-mask/android/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":react-native-text-input-mask" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/../../../android" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":react-native-text-input-mask" />
</configuration>
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<afterSyncTasks>
<task>generateDebugSources</task>
</afterSyncTasks>
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
<option name="PROJECT_TYPE" value="1" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
<output url="file://$MODULE_DIR$/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes" />
<output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debug/compileDebugAidl/out" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debug/compileDebugRenderscript/out" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debugAndroidTest/compileDebugAndroidTestAidl/out" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debugAndroidTest/compileDebugAndroidTestRenderscript/out" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/aapt_friendly_merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotation_processor_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/check_manifest_result" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/compile_only_not_namespaced_r_class_jar" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/intermediate-jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javac" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/library_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/library_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint_jar" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/packaged_res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/public_res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shader_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp-urlconnection:3.12.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:customview-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.fresco:fbcore-1.10.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:localbroadcastmanager-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.fresco:drawee-1.10.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.fresco:fresco-1.10.0" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline-okhttp3-1.10.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:interpolator-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.parse.bolts:bolts-tasks:1.4.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-utils-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp:3.12.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-ui-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:slidingpanelayout-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:drawerlayout-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:coordinatorlayout-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:collections:28.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:documentfile-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:swiperefreshlayout-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:cursoradapter-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:asynclayoutinflater-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:common:1.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:versionedparcelable-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.react:react-native-0.59.5" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.soloader:soloader-0.6.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:runtime-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.infer.annotation:infer-annotation:0.11.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:print-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:loader-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.google.code.findbugs:jsr305:3.0.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:viewpager-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-fragment-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-annotations:28.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline-1.10.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-compat-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.15.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.2-3@jar" level="project" />
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline-base-1.10.0" level="project" />
<orderEntry type="library" name="Gradle: com.redmadrobot:inputmask-2.3.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime-1.1.1" level="project" />
</component>
</module>
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.RNTextInputMask">
</manifest>
package com.RNTextInputMask;
import android.app.Activity;
import android.text.Editable;
import android.widget.EditText;
import android.text.TextWatcher;
import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.UIBlock;
import com.facebook.react.uimanager.NativeViewHierarchyManager;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.Callback;
import com.redmadrobot.inputmask.MaskedTextChangedListener;
import com.redmadrobot.inputmask.PolyMaskTextChangedListener;
import com.redmadrobot.inputmask.model.CaretString;
import com.redmadrobot.inputmask.helper.Mask;
import android.support.annotation.NonNull;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RNTextInputMaskModule extends ReactContextBaseJavaModule {
ReactApplicationContext reactContext;
public RNTextInputMaskModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
}
@Override
public String getName() {
return "RNTextInputMask";
}
@ReactMethod
public void mask(final String maskString,
final String inputValue,
final Callback onResult) {
final Mask mask = new Mask(maskString);
final String input = inputValue;
final Mask.Result result = mask.apply(
new CaretString(
input,
input.length()
),
true
);
final String output = result.getFormattedText().getString();
onResult.invoke(output);
}
@ReactMethod
public void unmask(final String maskString,
final String inputValue,
final Callback onResult) {
final Mask mask = new Mask(maskString);
final String input = inputValue;
final Mask.Result result = mask.apply(
new CaretString(
input,
input.length()
),
true
);
final String output = result.getExtractedValue();
onResult.invoke(output);
}
public void setTextChanged(EditText editText, String extractedValue, String regular) {
if (regular != null) {
Pattern p = Pattern.compile(regular);
Matcher m = p.matcher(extractedValue);
//删掉不是字母或数字的字符
String str = m.replaceAll("").trim();
if (!extractedValue.equals(str)) {
editText.setText(str);
//因为删除了字符,要重写设置新的光标所在位置
editText.setSelection(str.length());
}
}
}
@ReactMethod
public void setRegular(final int view, final String regular) {
final Activity currentActivity = this.reactContext.getCurrentActivity();
final ReactApplicationContext rctx = this.reactContext;
currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
UIManagerModule uiManager = rctx.getNativeModule(UIManagerModule.class);
uiManager.addUIBlock(new UIBlock() {
@Override
public void execute(NativeViewHierarchyManager nativeViewHierarchyManager) {
final EditText editText = (EditText) nativeViewHierarchyManager.resolveView(view);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
setTextChanged(editText, s.toString(), regular);
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
});
}
});
}
@ReactMethod
public void setMask(final int view, final String mask, final String regular) {
final Activity currentActivity = this.reactContext.getCurrentActivity();
final ReactApplicationContext rctx = this.reactContext;
currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
UIManagerModule uiManager = rctx.getNativeModule(UIManagerModule.class);
uiManager.addUIBlock(new UIBlock() {
@Override
public void execute(NativeViewHierarchyManager nativeViewHierarchyManager) {
final EditText editText = (EditText) nativeViewHierarchyManager.resolveView(view);
final MaskedTextChangedListener listener = new MaskedTextChangedListener(
mask,
true,
editText,
null,
new MaskedTextChangedListener.ValueListener() {
@Override
public void onTextChanged(boolean maskFilled, @NonNull final String extractedValue) {
setTextChanged(editText, extractedValue, regular);
}
}
);
if (editText.getTag() != null) {
editText.removeTextChangedListener((TextWatcher) editText.getTag());
}
editText.setTag(listener);
editText.addTextChangedListener(listener);
}
});
}
});
}
}
package com.RNTextInputMask;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.bridge.JavaScriptModule;
public class RNTextInputMaskPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new RNTextInputMaskModule(reactContext));
return modules;
}
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
import React, { Component } from 'react'
import {
TextInput,
findNodeHandle,
NativeModules
} from 'react-native'
const mask = NativeModules.RNTextInputMask.mask
const unmask = NativeModules.RNTextInputMask.unmask
const setMask = NativeModules.RNTextInputMask.setMask
const setRegular = NativeModules.RNTextInputMask.setRegular
export { mask, unmask, setMask }
export default class TextInputMask extends Component {
static defaultProps = {
maskDefaultValue: true,
}
masked = false
componentDidMount() {
if (this.props.maskDefaultValue &&
this.props.mask &&
this.props.value) {
mask(this.props.mask, '' + this.props.value, text =>
this.input && this.input.setNativeProps({ text }),
)
}
if (this.props.mask && !this.masked) {
this.masked = true
setMask(findNodeHandle(this.input), this.props.mask, this.props.regular)
}else {
// 处理没有传mask情况
setRegular(findNodeHandle(this.input), this.props.regular || '/(.*)/mg')
}
}
componentWillReceiveProps(nextProps) {
if (nextProps.mask && (this.props.value !== nextProps.value)) {
mask(this.props.mask, '' + nextProps.value, text =>
this.input && this.input.setNativeProps({ text })
);
}
if (this.props.mask !== nextProps.mask) {
setMask(findNodeHandle(this.input), nextProps.mask, this.props.regular)
}
}
render() {
return (<TextInput
{...this.props}
value={undefined}
ref={ref => {
this.input = ref
if (typeof this.props.refInput === 'function') {
this.props.refInput(ref)
}
}}
onChangeText={masked => {
if (this.props.mask) {
const _unmasked = unmask(this.props.mask, masked, unmasked => {
this.props.onChangeText && this.props.onChangeText(masked, unmasked)
})
} else {
this.props.onChangeText && this.props.onChangeText(masked)
}
}}
/>);
}
}
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
00FED3D91F34AE0400BDB60B /* RNMask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00FED3D81F34AE0400BDB60B /* RNMask.swift */; };
8A0185471D6498F9007B5EBD /* FreeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0185461D6498F9007B5EBD /* FreeState.swift */; };
8A0185481D6498F9007B5EBD /* FreeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0185461D6498F9007B5EBD /* FreeState.swift */; };
8A01854A1D649BC9007B5EBD /* PhoneCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0185491D649BC9007B5EBD /* PhoneCase.swift */; };
8A01854D1D64ABCC007B5EBD /* MaskedTextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A01854C1D64ABCC007B5EBD /* MaskedTextFieldDelegate.swift */; };
8A1E3C4D1D64649200589799 /* CaretStringIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C4C1D64649200589799 /* CaretStringIterator.swift */; };
8A1E3C4E1D64649500589799 /* CaretStringIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C4C1D64649200589799 /* CaretStringIterator.swift */; };
8A1E3C501D647BA800589799 /* DayMonthYearCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C4F1D647BA800589799 /* DayMonthYearCase.swift */; };
8A1E3C521D647E1700589799 /* MonthYearDoubleSlashCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C511D647E1700589799 /* MonthYearDoubleSlashCase.swift */; };
8A1E3C541D64807800589799 /* Mask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C531D64807800589799 /* Mask.swift */; };
8A1E3C551D64809900589799 /* Mask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C531D64807800589799 /* Mask.swift */; };
8A1E3C571D64847D00589799 /* OptionalValueState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C561D64847D00589799 /* OptionalValueState.swift */; };
8A1E3C581D64847F00589799 /* OptionalValueState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C561D64847D00589799 /* OptionalValueState.swift */; };
8A1E3C5E1D648A0F00589799 /* DayMonthYearShortCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C5C1D648A0F00589799 /* DayMonthYearShortCase.swift */; };
8A1E3C601D648C9E00589799 /* FormatSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C5F1D648C9E00589799 /* FormatSanitizer.swift */; };
8A1E3C611D648C9E00589799 /* FormatSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1E3C5F1D648C9E00589799 /* FormatSanitizer.swift */; };
8A485DDA1DD4735A009351FB /* PolyMaskTextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A485DD91DD4735A009351FB /* PolyMaskTextFieldDelegate.swift */; };
8A75D98D1E2392B300F7D244 /* YearACCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A75D98C1E2392B300F7D244 /* YearACCase.swift */; };
8A808ED61D5B0FEC00A75B9C /* InputMask.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A808ECB1D5B0FEC00A75B9C /* InputMask.framework */; };
8A808EFB1D5B110300A75B9C /* InputMask.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A808EFA1D5B110300A75B9C /* InputMask.h */; settings = {ATTRIBUTES = (Public, ); }; };
8A808F091D5B1A8E00A75B9C /* MaskTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A808F081D5B1A8E00A75B9C /* MaskTestCase.swift */; };
8A808F0B1D5B1CDD00A75B9C /* MonthYearCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A808F0A1D5B1CDD00A75B9C /* MonthYearCase.swift */; };
8A83CCB01D5B579800C0184F /* NSCharacterSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A83CCAF1D5B579800C0184F /* NSCharacterSet.swift */; };
8A83CCB11D5B579800C0184F /* NSCharacterSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A83CCAF1D5B579800C0184F /* NSCharacterSet.swift */; };
8A83CCB31D5B5E1F00C0184F /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A83CCB21D5B5E1F00C0184F /* String.swift */; };
8A83CCB41D5B5E1F00C0184F /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A83CCB21D5B5E1F00C0184F /* String.swift */; };
8AB1E8861D63746400892C3B /* CaretString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8851D63746400892C3B /* CaretString.swift */; };
8AB1E8871D63746400892C3B /* CaretString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8851D63746400892C3B /* CaretString.swift */; };
8AB1E8891D63753E00892C3B /* Compiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8881D63753E00892C3B /* Compiler.swift */; };
8AB1E88A1D63753E00892C3B /* Compiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8881D63753E00892C3B /* Compiler.swift */; };
8AB1E88C1D63755300892C3B /* State.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E88B1D63755300892C3B /* State.swift */; };
8AB1E88D1D63755300892C3B /* State.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E88B1D63755300892C3B /* State.swift */; };
8AB1E8901D6375FC00892C3B /* EOLState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E88F1D6375FC00892C3B /* EOLState.swift */; };
8AB1E8911D6375FC00892C3B /* EOLState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E88F1D6375FC00892C3B /* EOLState.swift */; };
8AB1E8931D63773400892C3B /* Next.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8921D63773400892C3B /* Next.swift */; };
8AB1E8941D63773400892C3B /* Next.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8921D63773400892C3B /* Next.swift */; };
8AB1E8961D6378D400892C3B /* ValueState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8951D6378D400892C3B /* ValueState.swift */; };
8AB1E8971D6378D400892C3B /* ValueState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8951D6378D400892C3B /* ValueState.swift */; };
8AB1E8991D637BFD00892C3B /* FixedState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8981D637BFD00892C3B /* FixedState.swift */; };
8AB1E89A1D637BFD00892C3B /* FixedState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB1E8981D637BFD00892C3B /* FixedState.swift */; };
8ACF16E81D65B9A4004F3374 /* InterfaceBuilderSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ACF16E71D65B9A4004F3374 /* InterfaceBuilderSupport.swift */; };
8ACF16E91D65CFB6004F3374 /* MaskedTextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A01854C1D64ABCC007B5EBD /* MaskedTextFieldDelegate.swift */; };
8ACF16EA1D65CFB8004F3374 /* InterfaceBuilderSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ACF16E71D65B9A4004F3374 /* InterfaceBuilderSupport.swift */; };
8AE8CA091E4489B400EDC9C4 /* YearCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE8CA081E4489B400EDC9C4 /* YearCase.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
8A808ED71D5B0FEC00A75B9C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 8A808EC21D5B0FEC00A75B9C /* Project object */;
proxyType = 1;
remoteGlobalIDString = 8A808ECA1D5B0FEC00A75B9C;
remoteInfo = InputMask;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
00FED3D81F34AE0400BDB60B /* RNMask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RNMask.swift; sourceTree = "<group>"; };
5147936F1EB89544009CD671 /* InputMask.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = InputMask.podspec; path = ../../../../InputMask.podspec; sourceTree = "<group>"; };
8A0185461D6498F9007B5EBD /* FreeState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FreeState.swift; sourceTree = "<group>"; };
8A0185491D649BC9007B5EBD /* PhoneCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneCase.swift; sourceTree = "<group>"; };
8A01854C1D64ABCC007B5EBD /* MaskedTextFieldDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MaskedTextFieldDelegate.swift; sourceTree = "<group>"; };
8A1E3C4C1D64649200589799 /* CaretStringIterator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretStringIterator.swift; sourceTree = "<group>"; };
8A1E3C4F1D647BA800589799 /* DayMonthYearCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DayMonthYearCase.swift; sourceTree = "<group>"; };
8A1E3C511D647E1700589799 /* MonthYearDoubleSlashCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MonthYearDoubleSlashCase.swift; sourceTree = "<group>"; };
8A1E3C531D64807800589799 /* Mask.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Mask.swift; sourceTree = "<group>"; };
8A1E3C561D64847D00589799 /* OptionalValueState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionalValueState.swift; sourceTree = "<group>"; };
8A1E3C5C1D648A0F00589799 /* DayMonthYearShortCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DayMonthYearShortCase.swift; sourceTree = "<group>"; };
8A1E3C5F1D648C9E00589799 /* FormatSanitizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormatSanitizer.swift; sourceTree = "<group>"; };
8A485DD91DD4735A009351FB /* PolyMaskTextFieldDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PolyMaskTextFieldDelegate.swift; sourceTree = "<group>"; };
8A75D98C1E2392B300F7D244 /* YearACCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YearACCase.swift; sourceTree = "<group>"; };
8A808ECB1D5B0FEC00A75B9C /* InputMask.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = InputMask.framework; sourceTree = BUILT_PRODUCTS_DIR; };
8A808ED51D5B0FEC00A75B9C /* InputMaskTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = InputMaskTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
8A808EED1D5B104A00A75B9C /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8A808EF21D5B104A00A75B9C /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8A808EFA1D5B110300A75B9C /* InputMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputMask.h; sourceTree = "<group>"; };
8A808F081D5B1A8E00A75B9C /* MaskTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MaskTestCase.swift; sourceTree = "<group>"; };
8A808F0A1D5B1CDD00A75B9C /* MonthYearCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MonthYearCase.swift; sourceTree = "<group>"; };
8A83CCAF1D5B579800C0184F /* NSCharacterSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSCharacterSet.swift; sourceTree = "<group>"; };
8A83CCB21D5B5E1F00C0184F /* String.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = "<group>"; };
8AB1E8851D63746400892C3B /* CaretString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretString.swift; sourceTree = "<group>"; };
8AB1E8881D63753E00892C3B /* Compiler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Compiler.swift; sourceTree = "<group>"; };
8AB1E88B1D63755300892C3B /* State.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = State.swift; sourceTree = "<group>"; };
8AB1E88F1D6375FC00892C3B /* EOLState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EOLState.swift; sourceTree = "<group>"; };
8AB1E8921D63773400892C3B /* Next.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Next.swift; sourceTree = "<group>"; };
8AB1E8951D6378D400892C3B /* ValueState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueState.swift; sourceTree = "<group>"; };
8AB1E8981D637BFD00892C3B /* FixedState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FixedState.swift; sourceTree = "<group>"; };
8ACF16E71D65B9A4004F3374 /* InterfaceBuilderSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InterfaceBuilderSupport.swift; sourceTree = "<group>"; };
8AE8CA081E4489B400EDC9C4 /* YearCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YearCase.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8A808EC71D5B0FEC00A75B9C /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
8A808ED21D5B0FEC00A75B9C /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8A808ED61D5B0FEC00A75B9C /* InputMask.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
8A01854B1D64AB9B007B5EBD /* View */ = {
isa = PBXGroup;
children = (
8A01854C1D64ABCC007B5EBD /* MaskedTextFieldDelegate.swift */,
8ACF16E71D65B9A4004F3374 /* InterfaceBuilderSupport.swift */,
8A485DD91DD4735A009351FB /* PolyMaskTextFieldDelegate.swift */,
);
path = View;
sourceTree = "<group>";
};
8A808EC11D5B0FEC00A75B9C = {
isa = PBXGroup;
children = (
8A808EE91D5B104A00A75B9C /* InputMask */,
8A808EEE1D5B104A00A75B9C /* InputMaskTests */,
8A808ECC1D5B0FEC00A75B9C /* Products */,
);
sourceTree = "<group>";
};
8A808ECC1D5B0FEC00A75B9C /* Products */ = {
isa = PBXGroup;
children = (
8A808ECB1D5B0FEC00A75B9C /* InputMask.framework */,
8A808ED51D5B0FEC00A75B9C /* InputMaskTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
8A808EE91D5B104A00A75B9C /* InputMask */ = {
isa = PBXGroup;
children = (
8A808EEA1D5B104A00A75B9C /* Classes */,
8A808EEC1D5B104A00A75B9C /* Supporting Files */,
);
path = InputMask;
sourceTree = "<group>";
};
8A808EEA1D5B104A00A75B9C /* Classes */ = {
isa = PBXGroup;
children = (
8A808EFC1D5B124100A75B9C /* Helper */,
8A808F001D5B15DF00A75B9C /* Model */,
8A01854B1D64AB9B007B5EBD /* View */,
8A1E3C531D64807800589799 /* Mask.swift */,
8A808EFA1D5B110300A75B9C /* InputMask.h */,
00FED3D81F34AE0400BDB60B /* RNMask.swift */,
);
path = Classes;
sourceTree = "<group>";
};
8A808EEC1D5B104A00A75B9C /* Supporting Files */ = {
isa = PBXGroup;
children = (
5147936F1EB89544009CD671 /* InputMask.podspec */,
8A808EED1D5B104A00A75B9C /* Info.plist */,
);
path = "Supporting Files";
sourceTree = "<group>";
};
8A808EEE1D5B104A00A75B9C /* InputMaskTests */ = {
isa = PBXGroup;
children = (
8A808EEF1D5B104A00A75B9C /* Classes */,
8A808EF11D5B104A00A75B9C /* Supporting Files */,
);
path = InputMaskTests;
sourceTree = "<group>";
};
8A808EEF1D5B104A00A75B9C /* Classes */ = {
isa = PBXGroup;
children = (
8A808F071D5B1A8100A75B9C /* Mask */,
);
path = Classes;
sourceTree = "<group>";
};
8A808EF11D5B104A00A75B9C /* Supporting Files */ = {
isa = PBXGroup;
children = (
8A808EF21D5B104A00A75B9C /* Info.plist */,
);
path = "Supporting Files";
sourceTree = "<group>";
};
8A808EFC1D5B124100A75B9C /* Helper */ = {
isa = PBXGroup;
children = (
8A1E3C4C1D64649200589799 /* CaretStringIterator.swift */,
8AB1E8881D63753E00892C3B /* Compiler.swift */,
8A1E3C5F1D648C9E00589799 /* FormatSanitizer.swift */,
8A83CCAF1D5B579800C0184F /* NSCharacterSet.swift */,
8A83CCB21D5B5E1F00C0184F /* String.swift */,
);
path = Helper;
sourceTree = "<group>";
};
8A808F001D5B15DF00A75B9C /* Model */ = {
isa = PBXGroup;
children = (
8AB1E88E1D6375F400892C3B /* State */,
8AB1E8851D63746400892C3B /* CaretString.swift */,
8AB1E8921D63773400892C3B /* Next.swift */,
8AB1E88B1D63755300892C3B /* State.swift */,
);
path = Model;
sourceTree = "<group>";
};
8A808F071D5B1A8100A75B9C /* Mask */ = {
isa = PBXGroup;
children = (
8A1E3C4F1D647BA800589799 /* DayMonthYearCase.swift */,
8A1E3C5C1D648A0F00589799 /* DayMonthYearShortCase.swift */,
8A808F081D5B1A8E00A75B9C /* MaskTestCase.swift */,
8A808F0A1D5B1CDD00A75B9C /* MonthYearCase.swift */,
8A1E3C511D647E1700589799 /* MonthYearDoubleSlashCase.swift */,
8A0185491D649BC9007B5EBD /* PhoneCase.swift */,
8A75D98C1E2392B300F7D244 /* YearACCase.swift */,
8AE8CA081E4489B400EDC9C4 /* YearCase.swift */,
);
path = Mask;
sourceTree = "<group>";
};
8AB1E88E1D6375F400892C3B /* State */ = {
isa = PBXGroup;
children = (
8AB1E88F1D6375FC00892C3B /* EOLState.swift */,
8AB1E8981D637BFD00892C3B /* FixedState.swift */,
8A0185461D6498F9007B5EBD /* FreeState.swift */,
8A1E3C561D64847D00589799 /* OptionalValueState.swift */,
8AB1E8951D6378D400892C3B /* ValueState.swift */,
);
path = State;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
8A808EC81D5B0FEC00A75B9C /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
8A808EFB1D5B110300A75B9C /* InputMask.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
8A808ECA1D5B0FEC00A75B9C /* InputMask */ = {
isa = PBXNativeTarget;
buildConfigurationList = 8A808EDF1D5B0FEC00A75B9C /* Build configuration list for PBXNativeTarget "InputMask" */;
buildPhases = (
8A808EC61D5B0FEC00A75B9C /* Sources */,
8A808EC71D5B0FEC00A75B9C /* Frameworks */,
8A808EC81D5B0FEC00A75B9C /* Headers */,
8A808EC91D5B0FEC00A75B9C /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = InputMask;
productName = InputMask;
productReference = 8A808ECB1D5B0FEC00A75B9C /* InputMask.framework */;
productType = "com.apple.product-type.framework";
};
8A808ED41D5B0FEC00A75B9C /* InputMaskTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 8A808EE21D5B0FEC00A75B9C /* Build configuration list for PBXNativeTarget "InputMaskTests" */;
buildPhases = (
8A808ED11D5B0FEC00A75B9C /* Sources */,
8A808ED21D5B0FEC00A75B9C /* Frameworks */,
8A808ED31D5B0FEC00A75B9C /* Resources */,
);
buildRules = (
);
dependencies = (
8A808ED81D5B0FEC00A75B9C /* PBXTargetDependency */,
);
name = InputMaskTests;
productName = InputMaskTests;
productReference = 8A808ED51D5B0FEC00A75B9C /* InputMaskTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
8A808EC21D5B0FEC00A75B9C /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0730;
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Egor Taflanidi";
TargetAttributes = {
8A808ECA1D5B0FEC00A75B9C = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 0800;
};
8A808ED41D5B0FEC00A75B9C = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 0800;
};
};
};
buildConfigurationList = 8A808EC51D5B0FEC00A75B9C /* Build configuration list for PBXProject "InputMask" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 8A808EC11D5B0FEC00A75B9C;
productRefGroup = 8A808ECC1D5B0FEC00A75B9C /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
8A808ECA1D5B0FEC00A75B9C /* InputMask */,
8A808ED41D5B0FEC00A75B9C /* InputMaskTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8A808EC91D5B0FEC00A75B9C /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
8A808ED31D5B0FEC00A75B9C /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8A808EC61D5B0FEC00A75B9C /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
00FED3D91F34AE0400BDB60B /* RNMask.swift in Sources */,
8AB1E8961D6378D400892C3B /* ValueState.swift in Sources */,
8A1E3C541D64807800589799 /* Mask.swift in Sources */,
8AB1E8991D637BFD00892C3B /* FixedState.swift in Sources */,
8A1E3C571D64847D00589799 /* OptionalValueState.swift in Sources */,
8AB1E8901D6375FC00892C3B /* EOLState.swift in Sources */,
8A83CCB31D5B5E1F00C0184F /* String.swift in Sources */,
8A01854D1D64ABCC007B5EBD /* MaskedTextFieldDelegate.swift in Sources */,
8A1E3C4D1D64649200589799 /* CaretStringIterator.swift in Sources */,
8AB1E8891D63753E00892C3B /* Compiler.swift in Sources */,
8AB1E8931D63773400892C3B /* Next.swift in Sources */,
8A485DDA1DD4735A009351FB /* PolyMaskTextFieldDelegate.swift in Sources */,
8AB1E8861D63746400892C3B /* CaretString.swift in Sources */,
8A83CCB01D5B579800C0184F /* NSCharacterSet.swift in Sources */,
8A0185471D6498F9007B5EBD /* FreeState.swift in Sources */,
8ACF16E81D65B9A4004F3374 /* InterfaceBuilderSupport.swift in Sources */,
8A1E3C601D648C9E00589799 /* FormatSanitizer.swift in Sources */,
8AB1E88C1D63755300892C3B /* State.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8A808ED11D5B0FEC00A75B9C /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8ACF16E91D65CFB6004F3374 /* MaskedTextFieldDelegate.swift in Sources */,
8A1E3C611D648C9E00589799 /* FormatSanitizer.swift in Sources */,
8A1E3C501D647BA800589799 /* DayMonthYearCase.swift in Sources */,
8AB1E8941D63773400892C3B /* Next.swift in Sources */,
8A808F0B1D5B1CDD00A75B9C /* MonthYearCase.swift in Sources */,
8A01854A1D649BC9007B5EBD /* PhoneCase.swift in Sources */,
8AE8CA091E4489B400EDC9C4 /* YearCase.swift in Sources */,
8AB1E89A1D637BFD00892C3B /* FixedState.swift in Sources */,
8A75D98D1E2392B300F7D244 /* YearACCase.swift in Sources */,
8A83CCB11D5B579800C0184F /* NSCharacterSet.swift in Sources */,
8A1E3C4E1D64649500589799 /* CaretStringIterator.swift in Sources */,
8A1E3C521D647E1700589799 /* MonthYearDoubleSlashCase.swift in Sources */,
8A1E3C581D64847F00589799 /* OptionalValueState.swift in Sources */,
8ACF16EA1D65CFB8004F3374 /* InterfaceBuilderSupport.swift in Sources */,
8AB1E88A1D63753E00892C3B /* Compiler.swift in Sources */,
8AB1E88D1D63755300892C3B /* State.swift in Sources */,
8A0185481D6498F9007B5EBD /* FreeState.swift in Sources */,
8AB1E8911D6375FC00892C3B /* EOLState.swift in Sources */,
8A83CCB41D5B5E1F00C0184F /* String.swift in Sources */,
8AB1E8971D6378D400892C3B /* ValueState.swift in Sources */,
8A808F091D5B1A8E00A75B9C /* MaskTestCase.swift in Sources */,
8AB1E8871D63746400892C3B /* CaretString.swift in Sources */,
8A1E3C551D64809900589799 /* Mask.swift in Sources */,
8A1E3C5E1D648A0F00589799 /* DayMonthYearShortCase.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
8A808ED81D5B0FEC00A75B9C /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 8A808ECA1D5B0FEC00A75B9C /* InputMask */;
targetProxy = 8A808ED71D5B0FEC00A75B9C /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
8A808EDD1D5B0FEC00A75B9C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
8A808EDE1D5B0FEC00A75B9C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
8A808EE01D5B0FEC00A75B9C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "$(SRCROOT)/InputMask/Supporting Files/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.redmadrobot.InputMask;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
8A808EE11D5B0FEC00A75B9C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "$(SRCROOT)/InputMask/Supporting Files/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.redmadrobot.InputMask;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
};
name = Release;
};
8A808EE31D5B0FEC00A75B9C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
INFOPLIST_FILE = "InputMaskTests/Supporting Files/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.redmadrobot.InputMaskTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
8A808EE41D5B0FEC00A75B9C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
INFOPLIST_FILE = "InputMaskTests/Supporting Files/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.redmadrobot.InputMaskTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
8A808EC51D5B0FEC00A75B9C /* Build configuration list for PBXProject "InputMask" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8A808EDD1D5B0FEC00A75B9C /* Debug */,
8A808EDE1D5B0FEC00A75B9C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8A808EDF1D5B0FEC00A75B9C /* Build configuration list for PBXNativeTarget "InputMask" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8A808EE01D5B0FEC00A75B9C /* Debug */,
8A808EE11D5B0FEC00A75B9C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8A808EE21D5B0FEC00A75B9C /* Build configuration list for PBXNativeTarget "InputMaskTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8A808EE31D5B0FEC00A75B9C /* Debug */,
8A808EE41D5B0FEC00A75B9C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 8A808EC21D5B0FEC00A75B9C /* Project object */;
}
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:InputMask.xcodeproj">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0810"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8A808ECA1D5B0FEC00A75B9C"
BuildableName = "InputMask.framework"
BlueprintName = "InputMask"
ReferencedContainer = "container:InputMask.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8A808ED41D5B0FEC00A75B9C"
BuildableName = "InputMaskTests.xctest"
BlueprintName = "InputMaskTests"
ReferencedContainer = "container:InputMask.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8A808ECA1D5B0FEC00A75B9C"
BuildableName = "InputMask.framework"
BlueprintName = "InputMask"
ReferencedContainer = "container:InputMask.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8A808ECA1D5B0FEC00A75B9C"
BuildableName = "InputMask.framework"
BlueprintName = "InputMask"
ReferencedContainer = "container:InputMask.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8A808ECA1D5B0FEC00A75B9C"
BuildableName = "InputMask.framework"
BlueprintName = "InputMask"
ReferencedContainer = "container:InputMask.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>8A808ECA1D5B0FEC00A75B9C</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>8A808ED41D5B0FEC00A75B9C</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>InputMask.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>10</integer>
</dict>
</dict>
</dict>
</plist>
//
// InputMask
//
// Created by Egor Taflanidi on 17.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### CaretStringIterator
Iterates over CaretString.string characters. Each ```next()``` call returns current character and adjusts iterator
position.
```CaretStringIterator``` is used by the ```Mask``` instance to iterate over the string that should be formatted.
*/
class CaretStringIterator {
private let caretString: CaretString
private var currentIndex: String.Index
/**
Constructor
- parameter caretString: ```CaretString``` object, over which the iterator is going to iterate.
- returns: Initialized ```CaretStringIterator``` pointing at the beginning of provided ```CaretString.string```
*/
init(caretString: CaretString) {
self.caretString = caretString
self.currentIndex = self.caretString.string.startIndex
}
/**
Inspect, whether ```CaretStringIterator``` has reached ```CaretString.caretPosition``` or not.
Each ```CaretString``` object contains cursor position for its ```CaretString.string```.
For the ```Mask``` instance it is important to know, whether it should adjust the cursor position or not when
inserting new symbols into the formatted line.
**Example**
Let the ```CaretString``` instance contains two symbols, with the caret at the end of the line.
```
string: ab
caret: ^
```
In this case ```CaretStringIterator.beforeCaret()``` will always return ```true``` until there's no more
characters left in the line to iterate over.
**Example 2**
Let the ```CaretString``` instance contains two symbols, with the caret at the beginning of the line.
```
string: ab
caret: ^
```
In this case ```CaretStringIterator.beforeCaret()``` will only return ```true``` for the first iteration. After the
```next()``` method is fired, ```beforeCaret()``` will return false.
- returns: ```True```, if current iterator position is less than or equal to ```CaretString.caretPosition```
*/
func beforeCaret() -> Bool {
let startIndex: String.Index = self.caretString.string.startIndex
let currentIndex: Int = self.caretString.string.distance(from: startIndex, to: self.currentIndex)
let caretPosition: Int = self.caretString.string.distance(from: startIndex, to: self.caretString.caretPosition)
return self.currentIndex <= self.caretString.caretPosition
|| (0 == currentIndex && 0 == caretPosition)
}
/**
Iterate over the ```CaretString.string```
- postcondition: Iterator position is moved to the next symbol.
- returns: Current symbol. If the iterator reached the end of the line, returns ```nil```.
*/
func next() -> Character? {
if self.currentIndex >= self.caretString.string.endIndex {
return nil
}
let character: Character = self.caretString.string.characters[self.currentIndex]
self.currentIndex = self.caretString.string.index(after: self.currentIndex)
return character
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 16.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### Compiler
Creates a sequence of states from the mask format string.
- seealso: ```State``` class.
- complexity: ```O(formatString.characters.count)``` plus ```FormatSanitizer``` complexity.
- requires: Format string to contain only flat groups of symbols in ```[]``` and ```{}``` brackets without nested
brackets, like ```[[000]99]```. Also, ```[…]``` groups may contain only the specified characters ("0", "9", "A", "a",
"_" and "-"). Square bracket ```[]``` groups cannot contain mixed types of symbols ("0" and "9" with "A" and "a" or
"_" and "-").
```Compiler``` object is initialized and ```Compiler.compile(formatString:)``` is called during the ```Mask``` instance
initialization.
```Compiler``` uses ```FormatSanitizer``` to prepare ```formatString``` for the compilation.
*/
public class Compiler {
/**
### CompilerError
Compiler error exception type, thrown when ```formatString``` contains inappropriate character sequences.
```CompilerError``` is used by the ```Compiler``` and ```FormatSanitizer``` classes.
*/
public enum CompilerError: Error {
case WrongFormat
}
/**
Compile ```formatString``` into the sequence of states.
* "Free" characters from ```formatString``` are converted to ```FreeState```-s.
* Characters in square brackets are converted to ```ValueState```-s and ```OptionalValueState```-s.
* Characters in curly brackets are converted to ```FixedState```-s.
* End of the formatString line makes ```EOLState```.
For instance,
```
[09]{.}[09]{.}19[00]
```
is converted to sequence:
```
0. ValueState.Numeric [0]
1. OptionalValueState.Numeric [9]
2. FixedState {.}
3. ValueState.Numeric [0]
4. OptionalValueState.Numeric [9]
5. FixedState {.}
6. FreeState 1
7. FreeState 9
8. ValueState.Numeric [0]
9. ValueState.Numeric [0]
```
- parameter formatString: string with a mask format.
- seealso: ```State``` class.
- complexity: ```O(formatString.characters.count)``` plus ```FormatSanitizer``` complexity.
- requires: Format string to contain only flat groups of symbols in ```[]``` and ```{}``` brackets without nested
brackets, like ```[[000]99]```. Also, ```[…]``` groups may contain only the specified characters ("0", "9", "A", "a",
"_" and "-").
- returns: Initialized ```State``` object with assigned ```State.child``` chain.
- throws: ```CompilerError``` if ```formatString``` does not conform to the method requirements.
*/
func compile(formatString string: String) throws -> State {
let sanitizedFormat: String = try FormatSanitizer().sanitize(formatString: string)
return try self.compile(
sanitizedFormat,
valueable: false,
fixed: false
)
}
}
private extension Compiler {
func compile(_ string: String, valueable: Bool, fixed: Bool) throws -> State {
guard
let char: Character = string.characters.first
else {
return EOLState()
}
if "[" == char {
return try self.compile(
string.truncateFirst(),
valueable: true,
fixed: false
)
}
if "{" == char {
return try self.compile(
string.truncateFirst(),
valueable: false,
fixed: true
)
}
if "]" == char {
return try self.compile(
string.truncateFirst(),
valueable: false,
fixed: false
)
}
if "}" == char {
return try self.compile(
string.truncateFirst(),
valueable: false,
fixed: false
)
}
if valueable {
if "0" == char {
return ValueState(
child: try self.compile(
string.truncateFirst(),
valueable: true,
fixed: false
),
type: ValueState.StateType.Numeric
)
}
if "A" == char {
return ValueState(
child: try self.compile(
string.truncateFirst(),
valueable: true,
fixed: false
),
type: ValueState.StateType.Literal
)
}
if "_" == char {
return ValueState(
child: try self.compile(
string.truncateFirst(),
valueable: true,
fixed: false
),
type: ValueState.StateType.AlphaNumeric
)
}
if "9" == char {
return OptionalValueState(
child: try self.compile(
string.truncateFirst(),
valueable: true,
fixed: false
),
type: OptionalValueState.StateType.Numeric
)
}
if "a" == char {
return OptionalValueState(
child: try self.compile(
string.truncateFirst(),
valueable: true,
fixed: false
),
type: OptionalValueState.StateType.Literal
)
}
if "-" == char {
return OptionalValueState(
child: try self.compile(
string.truncateFirst(),
valueable: true,
fixed: false
),
type: OptionalValueState.StateType.AlphaNumeric
)
}
throw CompilerError.WrongFormat
}
if fixed {
return FixedState(
child: try self.compile(
string.truncateFirst(),
valueable: false,
fixed: true
),
ownCharacter: char
)
}
return FreeState(
child: try self.compile(
string.truncateFirst(),
valueable: false,
fixed: false),
ownCharacter: char
)
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 17.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### FormatSanitizer
Sanitizes given ```formatString``` before it's compilation.
- complexity: ```O(2*floor(log(n)))```, and switches to ```O(n^2)``` for ```n < 20``` where
```n = formatString.characters.count```
- requires: Format string to contain only flat groups of symbols in ```[]``` and ```{}``` brackets without nested
brackets, like ```[[000]99]```. Square bracket ```[]``` groups may contain mixed types of symbols ("0" and "9" with
"A" and "a" or "_" and "-"), which sanitizer will divide into separate groups. Such that, ```[0000Aa]``` group will
be divided in two groups: ```[0000]``` and ```[Aa]```.
```FormatSanitizer``` is used by ```Compiler``` before format string compilation.
*/
class FormatSanitizer {
/**
Sanitize ```formatString``` before compilation.
In order to do so, sanitizer splits the string into groups of regular symbols, symbols in square brackets [] and
symbols in curly brackets {}. Then, characters in square brackets are sorted in a way that mandatory symbols go
before optional symbols. For instance,
```
a ([0909]) b
```
mask format is rearranged to
```
a ([0099]) b
```
- complexity: ```O(2*floor(log(n)))```, and switches to ```O(n^2)``` for ```n < 20``` where
```n = formatString.characters.count```
- requires: Format string to contain only flat groups of symbols in ```[]``` and ```{}``` brackets without nested
brackets, like ```[[000]99]```. Square bracket ```[]``` groups may contain mixed types of symbols ("0" and "9" with
"A" and "a" or "_" and "-"), which sanitizer will divide into separate groups. Such that, ```[0000Aa]``` group will
be divided in two groups: ```[0000]``` and ```[Aa]```.
- parameter formatString: mask format string.
- returns: Sanitized format string.
- throws: ```CompilerError``` if ```formatString``` does not conform to the method requirements.
*/
func sanitize(formatString string: String) throws -> String {
try self.checkOpenBraces(string)
let blocks: [String] = self.divideBlocksWithMixedCharacters(self.getFormatBlocks(string))
return self.sortFormatBlocks(blocks).joined(separator: "")
}
}
private extension FormatSanitizer {
func checkOpenBraces(_ string: String) throws {
var squareBraceOpen: Bool = false
var curlyBraceOpen: Bool = false
for char in string.characters {
if "[" == char {
if squareBraceOpen {
throw Compiler.CompilerError.WrongFormat
}
squareBraceOpen = true
}
if "]" == char {
squareBraceOpen = false
}
if "{" == char {
if curlyBraceOpen {
throw Compiler.CompilerError.WrongFormat
}
curlyBraceOpen = true
}
if "}" == char {
curlyBraceOpen = false
}
}
}
func getFormatBlocks(_ string: String) -> [String] {
var blocks: [String] = []
var currentBlock: String = ""
for char in string.characters {
if "[" == char
|| "{" == char {
if 0 < currentBlock.characters.count {
blocks.append(currentBlock)
}
currentBlock = ""
}
currentBlock += String(char)
if "]" == char
|| "}" == char {
blocks.append(currentBlock)
currentBlock = ""
}
}
if !currentBlock.isEmpty {
blocks.append(currentBlock)
}
return blocks
}
func divideBlocksWithMixedCharacters(_ blocks: [String]) -> [String] {
var resultingBlocks: [String] = []
for block in blocks {
if block.hasPrefix("[") {
var blockBuffer: String = ""
for blockCharacter in block.characters {
if blockCharacter == "[" {
blockBuffer += String(blockCharacter)
continue
}
if blockCharacter == "]" {
blockBuffer += String(blockCharacter)
resultingBlocks.append(blockBuffer)
break
}
if blockCharacter == "0"
|| blockCharacter == "9" {
if blockBuffer.contains("A")
|| blockBuffer.contains("a")
|| blockBuffer.contains("-")
|| blockBuffer.contains("_") {
blockBuffer += "]"
resultingBlocks.append(blockBuffer)
blockBuffer = "[" + String(blockCharacter)
continue
}
}
if blockCharacter == "A"
|| blockCharacter == "a" {
if blockBuffer.contains("0")
|| blockBuffer.contains("9")
|| blockBuffer.contains("-")
|| blockBuffer.contains("_") {
blockBuffer += "]"
resultingBlocks.append(blockBuffer)
blockBuffer = "[" + String(blockCharacter)
continue
}
}
if blockCharacter == "-"
|| blockCharacter == "_" {
if blockBuffer.contains("0")
|| blockBuffer.contains("9")
|| blockBuffer.contains("A")
|| blockBuffer.contains("a") {
blockBuffer += "]"
resultingBlocks.append(blockBuffer)
blockBuffer = "[" + String(blockCharacter)
continue
}
}
blockBuffer += String(blockCharacter)
}
} else {
resultingBlocks.append(block)
}
}
return resultingBlocks
}
func sortFormatBlocks(_ blocks: [String]) -> [String] {
var sortedBlocks: [String] = []
for block in blocks {
var sortedBlock: String
if block.hasPrefix("[") {
if block.contains("0")
|| block.contains("9") {
sortedBlock = self.sortBlock(block: block)
} else if block.contains("a")
|| block.contains("A") {
sortedBlock = self.sortBlock(block: block)
} else {
sortedBlock =
"["
+ String(block
.replacingOccurrences(of: "[", with: "")
.replacingOccurrences(of: "]", with: "")
.replacingOccurrences(of: "_", with: "A")
.replacingOccurrences(of: "-", with: "a")
.characters.sorted()
)
+ "]"
sortedBlock = sortedBlock
.replacingOccurrences(of: "A", with: "_")
.replacingOccurrences(of: "a", with: "-")
}
} else {
sortedBlock = block
}
sortedBlocks.append(sortedBlock)
}
return sortedBlocks
}
private func sortBlock(block: String) -> String {
return
"["
+ String(block
.replacingOccurrences(of: "[", with: "")
.replacingOccurrences(of: "]", with: "")
.characters.sorted()
)
+ "]"
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
Utility extension to make ```NSCharacterSet``` interact with ```Character``` instances.
*/
extension CharacterSet {
/**
Implements ```NSCharacterSet.characterIsMember(:unichar)``` for ```Character``` instances.
*/
func isMember(character: Character) -> Bool {
let string: String = String(character)
for char in string.unicodeScalars {
if !self.contains(char) {
return false
}
}
return true
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
Utility extension for comonly used ```Mask``` operations upon strings.
*/
extension String {
/**
Make a string by cutting the first character of current.
- returns: Current string without first character.
- throws: EXC_BAD_INSTRUCTION for empty strings.
*/
func truncateFirst() -> String {
return self.substring(from: self.index(after: self.startIndex))
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for InputMask.
FOUNDATION_EXPORT double InputMaskVersionNumber;
//! Project version string for InputMask.
FOUNDATION_EXPORT const unsigned char InputMaskVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <InputMask/PublicHeader.h>
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### Mask
Iterates over user input. Creates formatted strings from it. Extracts value specified by mask format.
Provided mask format string is translated by the ```Compiler``` class into a set of states, which define the formatting
and value extraction.
- seealso: ```Compiler```, ```State``` and ```CaretString``` classes.
*/
public class Mask: CustomDebugStringConvertible, CustomStringConvertible {
/**
### Result
The end result of mask application to the user input string.
*/
public struct Result: CustomDebugStringConvertible, CustomStringConvertible {
/**
Formatted text with updated caret position.
*/
public let formattedText: CaretString
/**
Value, extracted from formatted text according to mask format.
*/
public let extractedValue: String
/**
Calculated absolute affinity value between the mask format and input text.
*/
public let affinity: Int
/**
User input is complete.
*/
public let complete: Bool
public var debugDescription: String {
get {
return "FORMATTED TEXT: \(self.formattedText)\nEXTRACTED VALUE: \(self.extractedValue)\nAFFINITY: \(self.affinity)\nCOMPLETE: \(self.complete)"
}
}
public var description: String {
get {
return self.debugDescription
}
}
}
private let initialState: State
private static var cache: [String : Mask] = [:]
/**
Constructor.
- parameter format: mask format.
- returns: Initialized ```Mask``` instance.
- throws: ```CompilerError``` if format string is incorrect.
*/
public required init(format: String) throws {
self.initialState = try Compiler().compile(formatString: format)
}
/**
Constructor.
Operates over own ```Mask``` cache where initialized ```Mask``` objects are stored under corresponding format key:
```[format : mask]```
- returns: Previously cached ```Mask``` object for requested format string. If such it doesn't exist in cache, the
object is constructed, cached and returned.
*/
public static func getOrCreate(withFormat format: String) throws -> Mask {
if let cachedMask: Mask = cache[format] {
return cachedMask
} else {
let mask: Mask = try Mask(format: format)
cache[format] = mask
return mask
}
}
/**
Apply mask to the user input string.
- parameter toText: user input string with current cursor position
- returns: Formatted text with extracted value an adjusted cursor position.
*/
public func apply(toText text: CaretString, autocomplete: Bool = false) -> Result {
let iterator: CaretStringIterator = CaretStringIterator(caretString: text)
var affinity: Int = 0
var extractedValue: String = ""
var modifiedString: String = ""
var modifiedCaretPosition: Int =
text.string.distance(from: text.string.startIndex, to: text.caretPosition)
var state: State = self.initialState
var beforeCaret: Bool = iterator.beforeCaret()
var character: Character? = iterator.next()
while let char: Character = character {
if let next: Next = state.accept(character: char) {
state = next.state
modifiedString += nil != next.insert ? String(next.insert!) : ""
extractedValue += nil != next.value ? String(next.value!) : ""
if next.pass {
beforeCaret = iterator.beforeCaret()
character = iterator.next()
affinity += 1
} else {
if beforeCaret && nil != next.insert {
modifiedCaretPosition += 1
}
affinity -= 1
}
} else {
if iterator.beforeCaret() {
modifiedCaretPosition -= 1
}
beforeCaret = iterator.beforeCaret()
character = iterator.next()
affinity -= 1
}
}
while autocomplete && beforeCaret, let next: Next = state.autocomplete() {
state = next.state
modifiedString += nil != next.insert ? String(next.insert!) : ""
extractedValue += nil != next.value ? String(next.value!) : ""
if nil != next.insert {
modifiedCaretPosition += 1
}
}
return Result(
formattedText: CaretString(
string: modifiedString,
caretPosition: modifiedString.index(modifiedString.startIndex, offsetBy: modifiedCaretPosition)
),
extractedValue: extractedValue,
affinity: affinity,
complete: self.noMandatoryCharactersLeftAfterState(state)
)
}
/**
Generate placeholder.
- returns: Placeholder string.
*/
public func placeholder() -> String {
return self.appendPlaceholder(withState: self.initialState, placeholder: "")
}
/**
Minimal length of the text inside the field to fill all mandatory characters in the mask.
- returns: Minimal satisfying count of characters inside the text field.
*/
public func acceptableTextLength() -> Int {
var state: State? = self.initialState
var length: Int = 0
while let s: State = state, !(state is EOLState) {
if s is FixedState || s is FreeState || s is ValueState {
length += 1
}
state = s.child
}
return length
}
/**
Maximal length of the text inside the field.
- returns: Total available count of mandatory and optional characters inside the text field.
*/
public func totalTextLength() -> Int {
var state: State? = self.initialState
var length: Int = 0
while let s: State = state, !(state is EOLState) {
if s is FixedState || s is FreeState || s is ValueState || s is OptionalValueState {
length += 1
}
state = s.child
}
return length
}
/**
Minimal length of the extracted value with all mandatory characters filled.
- returns: Minimal satisfying count of characters in extracted value.
*/
public func acceptableValueLength() -> Int {
var state: State? = self.initialState
var length: Int = 0
while let s: State = state, !(state is EOLState) {
if s is FixedState || s is ValueState {
length += 1
}
state = s.child
}
return length
}
/**
Maximal length of the extracted value.
- returns: Total available count of mandatory and optional characters for extracted value.
*/
public func totalValueLength() -> Int {
var state: State? = self.initialState
var length: Int = 0
while let s: State = state, !(state is EOLState) {
if s is FixedState || s is ValueState || s is OptionalValueState {
length += 1
}
state = s.child
}
return length
}
public var debugDescription: String {
get {
return self.initialState.debugDescription
}
}
public var description: String {
get {
return self.debugDescription
}
}
}
private extension Mask {
func appendPlaceholder(withState state: State?, placeholder: String) -> String {
guard let state: State = state
else { return placeholder }
if state is EOLState {
return placeholder
}
if let state = state as? FixedState {
return self.appendPlaceholder(withState: state.child, placeholder: placeholder + String(state.ownCharacter))
}
if let state = state as? FreeState {
return self.appendPlaceholder(withState: state.child, placeholder: placeholder + String(state.ownCharacter))
}
if let state = state as? OptionalValueState {
switch state.type {
case .AlphaNumeric:
return self.appendPlaceholder(withState: state.child, placeholder: placeholder + "-")
case .Literal:
return self.appendPlaceholder(withState: state.child, placeholder: placeholder + "a")
case .Numeric:
return self.appendPlaceholder(withState: state.child, placeholder: placeholder + "0")
}
}
if let state = state as? ValueState {
switch state.type {
case .AlphaNumeric:
return self.appendPlaceholder(withState: state.child, placeholder: placeholder + "-")
case .Literal:
return self.appendPlaceholder(withState: state.child, placeholder: placeholder + "a")
case .Numeric:
return self.appendPlaceholder(withState: state.child, placeholder: placeholder + "0")
}
}
return placeholder
}
func noMandatoryCharactersLeftAfterState(_ state: State) -> Bool {
if (state is EOLState) {
return true
} else if (state is FixedState
|| state is FreeState
|| state is ValueState) {
return false
} else {
return self.noMandatoryCharactersLeftAfterState(state.nextState())
}
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 16.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### CaretString
Model object that represents string with current cursor position.
*/
public struct CaretString: CustomDebugStringConvertible, CustomStringConvertible {
/**
Text from the user.
*/
public let string: String
/**
Cursor position from the input text field.
*/
public let caretPosition: String.Index
/**
Constructor.
- parameter string: text from the user.
- parameter caretPosition: cursor position from the input text field.
*/
public init(string: String, caretPosition: String.Index) {
self.string = string
self.caretPosition = caretPosition
}
public var debugDescription: String {
get {
return "STRING: \(self.string)\nCARET POSITION: \(self.caretPosition)"
}
}
public var description: String {
get {
return self.debugDescription
}
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 16.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### Next
Model object that represents a set of actions that should take place when transition from one ```State``` to another
occurs.
*/
struct Next {
/**
Next ```State``` of the ```Mask```.
*/
let state: State
/**
Insert a character into the resulting formatted string.
*/
let insert: Character?
/**
Pass to the next character of the input string.
*/
let pass: Bool
/**
Add character to the extracted value string.
Value is extracted from the user input string.
*/
let value: Character?
}
//
// InputMask
//
// Created by Egor Taflanidi on 16.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### State
State of the mask, similar to the state in regular expressions.
Each state represents a character from the mask format string.
*/
class State: CustomDebugStringConvertible, CustomStringConvertible {
/**
Next ```State```.
*/
let child: State?
/**
Abstract method.
Defines, whether the state accepts user input character or not, and which actions should take place when the
character is accepted.
- parameter character: character from the user input string.
- returns: ```Next``` object instance with a set of actions that should take place when the user input character is
accepted.
- throws: Fatal error, if the method is not implemeted.
*/
/* abstract */ func accept(character char: Character) -> Next? {
fatalError("accept(character:) method is abstract")
}
/**
Automatically complete user input.
- returns: ```Next``` object instance with a set of actions to complete user input. If no autocomplete available,
returns ```nil```.
*/
func autocomplete() -> Next? {
return nil
}
/**
Obtain the next state.
Sometimes it is necessary to override this behavior. For instance, ```State``` may want to return ```self``` as the
next state under certain conditions.
- returns: ```State``` object.
*/
func nextState() -> State {
return self.child!
}
/**
Constructor.
- parameter child: next state.
- returns: Initialized state.
*/
init(child: State?) {
self.child = child
}
var debugDescription: String {
get {
return "BASE -> " + (nil != self.child ? self.child!.debugDescription : "nil")
}
}
var description: String {
get {
return self.debugDescription
}
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 16.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### EOLState
End-of-line state. Serves as mask format terminator character.
Does not accept any character. Always returns ```self``` as the next state, ignoring the child state given during
initialization.
*/
class EOLState: State {
convenience init() {
self.init(child: nil)
}
override init(child: State?) {
super.init(child: nil)
}
override func nextState() -> State {
return self
}
override func accept(character char: Character) -> Next? {
return nil
}
override var debugDescription: String {
get {
return "EOL"
}
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 16.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### FixedState
Represents characters in curly braces {}.
Accepts every character but does not put it into the result string, unless the character equals the one from the mask
format. If it's not, inserts the symbol from the mask format into the result.
Always returns self as an extracted value.
*/
class FixedState: State {
let ownCharacter: Character
override func accept(character char: Character) -> Next? {
if self.ownCharacter == char {
return Next(
state: self.nextState(),
insert: char,
pass: true,
value: char
)
} else {
return Next(
state: self.nextState(),
insert: self.ownCharacter,
pass: false,
value: self.ownCharacter
)
}
}
override func autocomplete() -> Next? {
return Next(
state: self.nextState(),
insert: self.ownCharacter,
pass: false,
value: self.ownCharacter
)
}
/**
Constructor.
- parameter child: next ```State```
- parameter ownCharacter: the character in the curly braces {}
- returns: Initialized ```FixedState``` instance.
*/
init(
child: State,
ownCharacter: Character
) {
self.ownCharacter = ownCharacter
super.init(child: child)
}
override var debugDescription: String {
get {
return "{\(self.ownCharacter)} -> " + (nil != self.child ? self.child!.debugDescription : "nil")
}
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 17.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### FreeState
Represents "free" characters outside square and curly brackets.
Accepts every character but does not put it into the result string, unless the character equals the one from the mask
format. If it's not, inserts the symbol from the mask format into the result.
Always returns ```nil``` as an extracted value, does not affect the resulting value.
*/
class FreeState: State {
let ownCharacter: Character
override func accept(character char: Character) -> Next? {
if self.ownCharacter == char {
return Next(
state: self.nextState(),
insert: char,
pass: true,
value: nil
)
} else {
return Next(
state: self.nextState(),
insert: self.ownCharacter,
pass: false,
value: nil
)
}
}
override func autocomplete() -> Next? {
return Next(
state: self.nextState(),
insert: self.ownCharacter,
pass: false,
value: nil
)
}
/**
Constructor.
- parameter child: next ```State```
- parameter ownCharacter: represented "free" character
- returns: Initialized ```FreeState``` instance.
*/
init(
child: State,
ownCharacter: Character
) {
self.ownCharacter = ownCharacter
super.init(child: child)
}
override var debugDescription: String {
get {
return "\(self.ownCharacter) -> " + (nil != self.child ? self.child!.debugDescription : "nil")
}
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 17.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### OptionalValueState
Represents optional characters in square brackets [].
Accepts any characters, but puts into the result string only the characters of own type (see ```StateType```).
Returns accepted characters of own type as an extracted value.
- seealso: ```OptionalValueState.StateType```
*/
class OptionalValueState: State {
/**
### StateType
* ```Numeric``` stands for [9] characters
* ```Literal``` stands for [a] characters
* ```AlphaNumeric``` stands for [-] characters
*/
enum StateType {
case Numeric
case Literal
case AlphaNumeric
}
let type: StateType
func accepts(character char: Character) -> Bool {
switch self.type {
case .Numeric:
return CharacterSet.decimalDigits.isMember(character: char)
case .Literal:
return CharacterSet.letters.isMember(character: char)
case .AlphaNumeric:
return CharacterSet.alphanumerics.isMember(character: char)
}
}
override func accept(character char: Character) -> Next? {
if self.accepts(character: char) {
return Next(
state: self.nextState(),
insert: char,
pass: true,
value: char
)
} else {
return Next(
state: self.nextState(),
insert: nil,
pass: false,
value: nil
)
}
}
/**
Constructor.
- parameter child: next ```State```
- parameter type: type of the accepted characters
- seealso: ```OptionalValueState.StateType```
- returns: Initialized ```OptionalValueState``` instance.
*/
init(
child: State,
type: StateType
) {
self.type = type
super.init(child: child)
}
override var debugDescription: String {
get {
switch self.type {
case .Literal:
return "[a] -> " + (nil != self.child ? self.child!.debugDescription : "nil")
case .Numeric:
return "[9] -> " + (nil != self.child ? self.child!.debugDescription : "nil")
case .AlphaNumeric:
return "[-] -> " + (nil != self.child ? self.child!.debugDescription : "nil")
}
}
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 16.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
/**
### ValueState
Represents mandatory characters in square brackets [].
Accepts only characters of own type (see ```StateType```). Puts accepted characters into the result string.
Returns accepted characters as an extracted value.
- seealso: ```ValueState.StateType```
*/
class ValueState: State {
/**
### StateType
* ```Numeric``` stands for [9] characters
* ```Literal``` stands for [a] characters
* ```AlphaNumeric``` stands for [-] characters
*/
enum StateType {
case Numeric
case Literal
case AlphaNumeric
}
let type: StateType
func accepts(character char: Character) -> Bool {
switch self.type {
case .Numeric:
return CharacterSet.decimalDigits.isMember(character: char)
case .Literal:
return CharacterSet.letters.isMember(character: char)
case .AlphaNumeric:
return CharacterSet.alphanumerics.isMember(character: char)
}
}
override func accept(character char: Character) -> Next? {
if !self.accepts(character: char) {
return nil
}
return Next(
state: self.nextState(),
insert: char,
pass: true,
value: char
)
}
/**
Constructor.
- parameter child: next ```State```
- parameter type: type of the accepted characters
- seealso: ```ValueState.StateType```
- returns: Initialized ```ValueState``` instance.
*/
init(
child: State,
type: StateType
) {
self.type = type
super.init(child: child)
}
override var debugDescription: String {
get {
switch self.type {
case .Literal:
return "[A] -> " + (nil != self.child ? self.child!.debugDescription : "nil")
case .Numeric:
return "[0] -> " + (nil != self.child ? self.child!.debugDescription : "nil")
case .AlphaNumeric:
return "[_] -> " + (nil != self.child ? self.child!.debugDescription : "nil")
}
}
}
}
//
// RNMask.swift
// InputMask
//
// Created by Ivan Zotov on 8/4/17.
// Copyright © 2017 Ivan Zotov. All rights reserved.
//
import Foundation
open class RNMask : NSObject {
public static func maskValue(text: String, format: String) -> String {
let mask : Mask = try! Mask.getOrCreate(withFormat: format)
let result: Mask.Result = mask.apply(
toText: CaretString(
string: text,
caretPosition: text.endIndex
),
autocomplete: true
)
return result.formattedText.string
}
public static func unmaskValue(text: String, format: String) -> String {
let mask : Mask = try! Mask.getOrCreate(withFormat: format)
let result: Mask.Result = mask.apply(
toText: CaretString(
string: text,
caretPosition: text.endIndex
),
autocomplete: true
)
return result.extractedValue
}
}
//
// InterfaceBuilderSupport.swift
// InputMask
//
// Created by Egor Taflanidi on 18.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
public extension MaskedTextFieldDelegate {
/**
Workaround to support Interface Builder delegate outlets.
Allows assigning ```MaskedTextFieldDelegate.listener``` within the Interface Builder.
Consider using ```MaskedTextFieldDelegate.listener``` property from your source code instead of
```MaskedTextFieldDelegate.delegate``` outlet.
*/
@IBOutlet public var delegate: NSObject? {
get {
return self.listener as? NSObject
}
set(newDelegate) {
if let listener = newDelegate as? MaskedTextFieldDelegateListener {
self.listener = listener
}
}
}
}
//
// MaskedTextFieldDelegate.swift
// InputMask
//
// Created by Egor Taflanidi on 17.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
import UIKit
/**
### MaskedTextFieldDelegateListener
Allows clients to obtain value extracted by the mask from user input.
Provides callbacks from listened UITextField.
*/
@objc public protocol MaskedTextFieldDelegateListener: UITextFieldDelegate {
/**
Callback to return extracted value and to signal whether the user has complete input.
*/
@objc optional func textField(
_ textField: UITextField,
didFillMandatoryCharacters complete: Bool,
didExtractValue value: String
)
}
/**
### MaskedTextFieldDelegate
UITextFieldDelegate, which applies masking to the user input.
Might be used as a decorator, which forwards UITextFieldDelegate calls to its own listener.
*/
@IBDesignable
open class MaskedTextFieldDelegate: NSObject, UITextFieldDelegate {
private var _maskFormat: String
private var _autocomplete: Bool
private var _autocompleteOnFocus: Bool
public var mask: Mask
@IBInspectable public var maskFormat: String {
get {
return self._maskFormat
}
set(newFormat) {
self._maskFormat = newFormat
self.mask = try! Mask.getOrCreate(withFormat: newFormat)
}
}
@IBInspectable public var autocomplete: Bool {
get {
return self._autocomplete
}
set(newAutocomplete) {
self._autocomplete = newAutocomplete
}
}
@IBInspectable public var autocompleteOnFocus: Bool {
get {
return self._autocompleteOnFocus
}
set(newAutocompleteOnFocus) {
self._autocompleteOnFocus = newAutocompleteOnFocus
}
}
open weak var listener: MaskedTextFieldDelegateListener?
public init(format: String) {
self._maskFormat = format
self.mask = try! Mask.getOrCreate(withFormat: format)
self._autocomplete = false
self._autocompleteOnFocus = false
super.init()
}
public override convenience init() {
self.init(format: "")
}
open func put(text: String, into field: UITextField) {
let result: Mask.Result = self.mask.apply(
toText: CaretString(
string: text,
caretPosition: text.endIndex
),
autocomplete: self._autocomplete
)
field.text = result.formattedText.string
let position: Int =
result.formattedText.string.distance(from: result.formattedText.string.startIndex, to: result.formattedText.caretPosition)
self.setCaretPosition(position, inField: field)
self.listener?.textField?(
field,
didFillMandatoryCharacters: result.complete,
didExtractValue: result.extractedValue
)
}
/**
Maximal length of the text inside the field.
- returns: Total available count of mandatory and optional characters inside the text field.
*/
open func placeholder() -> String {
return self.mask.placeholder()
}
/**
Minimal length of the text inside the field to fill all mandatory characters in the mask.
- returns: Minimal satisfying count of characters inside the text field.
*/
open func acceptableTextLength() -> Int {
return self.mask.acceptableTextLength()
}
/**
Maximal length of the text inside the field.
- returns: Total available count of mandatory and optional characters inside the text field.
*/
open func totalTextLength() -> Int {
return self.mask.totalTextLength()
}
/**
Minimal length of the extracted value with all mandatory characters filled.
- returns: Minimal satisfying count of characters in extracted value.
*/
open func acceptableValueLength() -> Int {
return self.mask.acceptableValueLength()
}
/**
Maximal length of the extracted value.
- returns: Total available count of mandatory and optional characters for extracted value.
*/
open func totalValueLength() -> Int {
return self.mask.totalValueLength()
}
// MARK: - UITextFieldDelegate
open func textField(
_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
let extractedValue: String
let complete: Bool
if isDeletion(
inRange: range,
string: string
) {
(extractedValue, complete) = self.deleteText(inRange: range, inField: textField)
} else {
(extractedValue, complete) = self.modifyText(inRange: range, inField: textField, withText: string)
}
self.listener?.textField?(
textField,
didFillMandatoryCharacters: complete,
didExtractValue: extractedValue
)
let _ = self.listener?.textField?(textField, shouldChangeCharactersIn: range, replacementString: string)
return false
}
open func deleteText(
inRange range: NSRange,
inField field: UITextField
) -> (String, Bool) {
let text: String = self.replaceCharacters(
inText: field.text,
range: range,
withCharacters: ""
)
let result: Mask.Result = self.mask.apply(
toText: CaretString(
string: text,
caretPosition: text.index(text.startIndex, offsetBy: range.location)
),
autocomplete: false
)
field.text = result.formattedText.string
self.setCaretPosition(range.location, inField: field)
return (result.extractedValue, result.complete)
}
open func modifyText(
inRange range: NSRange,
inField field: UITextField,
withText text: String
) -> (String, Bool) {
let updatedText: String = self.replaceCharacters(
inText: field.text,
range: range,
withCharacters: text
)
let result: Mask.Result = self.mask.apply(
toText: CaretString(
string: updatedText,
caretPosition: updatedText.index(updatedText.startIndex, offsetBy: self.caretPosition(inField: field) + text.characters.count)
),
autocomplete: self.autocomplete
)
field.text = result.formattedText.string
let position: Int =
result.formattedText.string.distance(from: result.formattedText.string.startIndex, to: result.formattedText.caretPosition)
self.setCaretPosition(position, inField: field)
return (result.extractedValue, result.complete)
}
open func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return self.listener?.textFieldShouldBeginEditing?(textField) ?? true
}
open func textFieldDidBeginEditing(_ textField: UITextField) {
if self._autocompleteOnFocus && textField.text!.isEmpty {
let _ = self.textField(
textField,
shouldChangeCharactersIn: NSMakeRange(0, 0),
replacementString: ""
)
}
self.listener?.textFieldDidBeginEditing?(textField)
}
open func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
return self.listener?.textFieldShouldEndEditing?(textField) ?? true
}
open func textFieldDidEndEditing(_ textField: UITextField) {
self.listener?.textFieldDidEndEditing?(textField)
}
open func textFieldShouldClear(_ textField: UITextField) -> Bool {
let shouldClear: Bool = self.listener?.textFieldShouldClear?(textField) ?? true
if shouldClear {
let result: Mask.Result = self.mask.apply(
toText: CaretString(
string: "",
caretPosition: "".endIndex
),
autocomplete: self.autocomplete
)
self.listener?.textField?(
textField,
didFillMandatoryCharacters: result.complete,
didExtractValue: result.extractedValue
)
}
return shouldClear
}
open func textFieldShouldReturn(_ textField: UITextField) -> Bool {
return self.listener?.textFieldShouldReturn?(textField) ?? true
}
open override var debugDescription: String {
get {
return self.mask.debugDescription
}
}
open override var description: String {
get {
return self.debugDescription
}
}
}
internal extension MaskedTextFieldDelegate {
func isDeletion(inRange range: NSRange, string: String) -> Bool {
return 0 < range.length && 0 == string.characters.count
}
func replaceCharacters(inText text: String?, range: NSRange, withCharacters newText: String) -> String {
if let text = text {
if 0 < range.length {
let result = NSMutableString(string: text)
result.replaceCharacters(in: range, with: newText)
return result as String
} else {
let result = NSMutableString(string: text)
result.insert(newText, at: range.location)
return result as String
}
} else {
return ""
}
}
func caretPosition(inField field: UITextField) -> Int {
// Workaround for non-optional `field.beginningOfDocument`, which could actually be nil if field doesn't have focus
guard field.isFirstResponder
else {
return field.text?.characters.count ?? 0
}
if let range: UITextRange = field.selectedTextRange {
let selectedTextLocation: UITextPosition = range.start
return field.offset(from: field.beginningOfDocument, to: selectedTextLocation)
} else {
return 0
}
}
func setCaretPosition(_ position: Int, inField field: UITextField) {
// Workaround for non-optional `field.beginningOfDocument`, which could actually be nil if field doesn't have focus
guard field.isFirstResponder
else {
return
}
if position > field.text!.characters.count {
return
}
let from: UITextPosition = field.position(from: field.beginningOfDocument, offset: position)!
let to: UITextPosition = field.position(from: from, offset: 0)!
field.selectedTextRange = field.textRange(from: from, to: to)
}
}
//
// PolyMaskTextFieldDelegate.swift
// InputMask
//
// Created by Egor Taflanidi on 10.11.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import Foundation
import UIKit
/**
### PolyMaskTextFieldDelegate
UITextFieldDelegate, which applies masking to the user input, picking the most suitable mask for the text.
Might be used as a decorator, which forwards UITextFieldDelegate calls to its own listener.
*/
@IBDesignable
open class PolyMaskTextFieldDelegate: MaskedTextFieldDelegate {
fileprivate var _affineFormats: [String]
public var affineFormats: [String] {
get {
return self._affineFormats
}
set(newFormats) {
self._affineFormats = newFormats
}
}
public init(primaryFormat: String, affineFormats: [String]) {
self._affineFormats = affineFormats
super.init(format: primaryFormat)
}
public override init(format: String) {
self._affineFormats = []
super.init(format: format)
}
open override func put(text: String, into field: UITextField) {
let mask: Mask = self.pickMask(
forText: text,
caretPosition: text.endIndex,
autocomplete: self.autocomplete
)
let result: Mask.Result = mask.apply(
toText: CaretString(
string: text,
caretPosition: text.endIndex
),
autocomplete: self.autocomplete
)
field.text = result.formattedText.string
let position: Int =
result.formattedText.string.distance(from: result.formattedText.string.startIndex, to: result.formattedText.caretPosition)
self.setCaretPosition(position, inField: field)
self.listener?.textField?(
field,
didFillMandatoryCharacters: result.complete,
didExtractValue: result.extractedValue
)
}
override open func deleteText(
inRange range: NSRange,
inField field: UITextField
) -> (String, Bool) {
let text: String = self.replaceCharacters(
inText: field.text,
range: range,
withCharacters: ""
)
let mask: Mask = self.pickMask(
forText: text,
caretPosition: text.index(text.startIndex, offsetBy: range.location),
autocomplete: false
)
let result: Mask.Result = mask.apply(
toText: CaretString(
string: text,
caretPosition: text.index(text.startIndex, offsetBy: range.location)
),
autocomplete: false
)
field.text = result.formattedText.string
self.setCaretPosition(range.location, inField: field)
return (result.extractedValue, result.complete)
}
override open func modifyText(
inRange range: NSRange,
inField field: UITextField,
withText text: String
) -> (String, Bool) {
let updatedText: String = self.replaceCharacters(
inText: field.text,
range: range,
withCharacters: text
)
let mask: Mask = self.pickMask(
forText: updatedText,
caretPosition: updatedText.index(updatedText.startIndex, offsetBy: self.caretPosition(inField: field) + text.characters.count),
autocomplete: self.autocomplete
)
let result: Mask.Result = mask.apply(
toText: CaretString(
string: updatedText,
caretPosition: updatedText.index(updatedText.startIndex, offsetBy: self.caretPosition(inField: field) + text.characters.count)
),
autocomplete: self.autocomplete
)
field.text = result.formattedText.string
let position: Int =
result.formattedText.string.distance(from: result.formattedText.string.startIndex, to: result.formattedText.caretPosition)
self.setCaretPosition(position, inField: field)
return (result.extractedValue, result.complete)
}
open override var debugDescription: String {
get {
return self._affineFormats.reduce(self.mask.debugDescription) { (debugDescription: String, affineFormat: String) -> String in
return try! debugDescription + "\n" + Mask.getOrCreate(withFormat: affineFormat).debugDescription
}
}
}
}
internal extension PolyMaskTextFieldDelegate {
func pickMask(
forText text: String,
caretPosition: String.Index,
autocomplete: Bool
) -> Mask {
let primaryAffinity: Int = self.calculateAffinity(
ofMask: self.mask,
forText: text,
caretPosition: caretPosition,
autocomplete: autocomplete
)
var masks: [(Mask, Int)] = self.affineFormats.map { (affineFormat: String) -> (Mask, Int) in
let mask: Mask = try! Mask.getOrCreate(withFormat: affineFormat)
let affinity: Int = self.calculateAffinity(
ofMask: mask,
forText: text,
caretPosition: caretPosition,
autocomplete: autocomplete
)
return (mask, affinity)
}
masks.sort { (left: (Mask, Int), right: (Mask, Int)) -> Bool in
return left.1 > right.1
}
var insertIndex: Int = -1
for (index, maskAffinity) in masks.enumerated() {
if primaryAffinity >= maskAffinity.1 {
insertIndex = index
break
}
}
if (insertIndex >= 0) {
masks.insert((self.mask, primaryAffinity), at: insertIndex)
} else {
masks.append((self.mask, primaryAffinity))
}
return masks.first!.0
}
func calculateAffinity(
ofMask mask: Mask,
forText text: String,
caretPosition: String.Index,
autocomplete: Bool
) -> Int {
return mask.apply(
toText: CaretString(
string: text,
caretPosition: caretPosition
),
autocomplete: autocomplete
).affinity
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import XCTest
@testable import InputMask
class DayMonthYearCase: MaskTestCase {
override func format() -> String {
return "[00]{.}[00]{.}[0000]"
}
func testInit_correctFormat_maskInitialized() {
XCTAssertNotNil(try self.mask())
}
func testInit_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! self.mask()
)
}
}
}
func testGetOrCreate_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! Mask.getOrCreate(withFormat: self.format())
)
}
}
}
func testGetPlaceholder_allSet_returnsCorrectPlaceholder() {
let placeholder: String = try! self.mask().placeholder()
XCTAssertEqual(placeholder, "00.00.0000")
}
func testAcceptableTextLength_allSet_returnsCorrectCount() {
let acceptableTextLength: Int = try! self.mask().acceptableTextLength()
XCTAssertEqual(acceptableTextLength, 10)
}
func testTotalTextLength_allSet_returnsCorrectCount() {
let totalTextLength: Int = try! self.mask().totalTextLength()
XCTAssertEqual(totalTextLength, 10)
}
func testAcceptableValueLength_allSet_returnsCorrectCount() {
let acceptableValueLength: Int = try! self.mask().acceptableValueLength()
XCTAssertEqual(acceptableValueLength, 10)
}
func testTotalValueLength_allSet_returnsCorrectCount() {
let totalValueLength: Int = try! self.mask().totalValueLength()
XCTAssertEqual(totalValueLength, 10)
}
func testApply_1_returns_1() {
let inputString: String = "1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_11_returns_11() {
let inputString: String = "11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_111_returns_11dot1() {
let inputString: String = "111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_returns_11dot11() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.11"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_123456_returns_12dot34dot56() {
let inputString: String = "123456"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.56"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12dot3_returns_12dot3() {
let inputString: String = "12.3"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.3"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12dot34_returns_12dot34() {
let inputString: String = "12.34"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12dot34dot5_returns_12dot34dot5() {
let inputString: String = "12.34.5"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.5"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12dot34dot56_returns_12dot34dot56() {
let inputString: String = "12.34.56"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.56"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1234567_returns_12dot34dot567() {
let inputString: String = "1234567"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.567"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12345678_returns_12dot34dot5678() {
let inputString: String = "12345678"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.5678"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_1111_StartIndex_returns_11dot11_StartIndex() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.startIndex
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.startIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_ThirdIndex_returns_11dot11_FourthIndex() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.index(inputString.startIndex, offsetBy: 2)
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.index(expectedString.startIndex, offsetBy: 3)
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1111_returns_11dot11() {
let inputString: String = "abc1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1de111_returns_11dot11() {
let inputString: String = "abc1de111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1de1fg11_returns_11dot11() {
let inputString: String = "abc1de1fg11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_empty_returns_empty() {
let inputString: String = ""
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = ""
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_1_returns_1() {
let inputString: String = "1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_11_returns_11dot() {
let inputString: String = "11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11."
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_111_returns_11dot1() {
let inputString: String = "111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_1111_returns_11dot11dot() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11."
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_11111_returns_11dot11dot1() {
let inputString: String = "11111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11.1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_111111_returns_11dot11dot11() {
let inputString: String = "111111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11.11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_1111111_returns_11dot11dot111() {
let inputString: String = "1111111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11.111"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_11111111_returns_11dot11dot1111() {
let inputString: String = "11111111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11.1111"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApplyAutocomplete_111111111_returns_11dot11dot1111() {
let inputString: String = "111111111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11.1111"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import XCTest
@testable import InputMask
class DayMonthYearShortCase: MaskTestCase {
override func format() -> String {
return "[90]{.}[90]{.}[0000]"
}
func testInit_correctFormat_maskInitialized() {
XCTAssertNotNil(try self.mask())
}
func testInit_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! self.mask()
)
}
}
}
func testGetOrCreate_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! Mask.getOrCreate(withFormat: self.format())
)
}
}
}
func testGetPlaceholder_allSet_returnsCorrectPlaceholder() {
let placeholder: String = try! self.mask().placeholder()
XCTAssertEqual(placeholder, "00.00.0000")
}
func testAcceptableTextLength_allSet_returnsCorrectCount() {
let acceptableTextLength: Int = try! self.mask().acceptableTextLength()
XCTAssertEqual(acceptableTextLength, 8)
}
func testTotalTextLength_allSet_returnsCorrectCount() {
let totalTextLength: Int = try! self.mask().totalTextLength()
XCTAssertEqual(totalTextLength, 10)
}
func testAcceptableValueLength_allSet_returnsCorrectCount() {
let acceptableValueLength: Int = try! self.mask().acceptableValueLength()
XCTAssertEqual(acceptableValueLength, 8)
}
func testTotalValueLength_allSet_returnsCorrectCount() {
let totalValueLength: Int = try! self.mask().totalValueLength()
XCTAssertEqual(totalValueLength, 10)
}
func testApply_1_returns_1() {
let inputString: String = "1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(1, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_11_returns_11() {
let inputString: String = "11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(2, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_111_returns_11dot1() {
let inputString: String = "111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.1"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(2, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_returns_11dot11() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.11"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(3, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_123456_returns_12dot34dot56() {
let inputString: String = "123456"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.56"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12.34.56"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(4, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_12dot3_returns_12dot3() {
let inputString: String = "12.3"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.3"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12.3"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(4, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_12dot34_returns_12dot34() {
let inputString: String = "12.34"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12.34"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(5, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_12dot34dot5_returns_12dot34dot5() {
let inputString: String = "12.34.5"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.5"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12.34.5"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(7, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_12dot34dot56_returns_12dot34dot56() {
let inputString: String = "12.34.56"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.56"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12.34.56"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(8, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_1234567_returns_12dot34dot567() {
let inputString: String = "1234567"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.567"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12.34.567"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(5, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_12345678_returns_12dot34dot5678() {
let inputString: String = "12345678"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12.34.5678"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12.34.5678"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(6, result.affinity)
XCTAssertEqual(true, result.complete)
}
func testApply_1111_StartIndex_returns_11dot11_StartIndex() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.startIndex
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.startIndex
let expectedValue: String = "11.11"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(3, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_ThirdIndex_returns_11dot11_FourthIndex() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.index(inputString.startIndex, offsetBy: 2)
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.index(expectedString.startIndex, offsetBy: 3)
let expectedValue: String = "11.11"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(3, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1111_returns_11dot11() {
let inputString: String = "abc1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.11"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(0, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1de111_returns_11dot11() {
let inputString: String = "abc1de111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1.11.1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1.11.1"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(-4, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1de1fg11_returns_11dot11() {
let inputString: String = "abc1de1fg11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1.1.11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1.1.11"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(-7, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApply_a_returns_empty() {
let inputString: String = "a"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = ""
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(-1, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_empty_returns_empty() {
let inputString: String = ""
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = ""
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(0, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_1_returns_1() {
let inputString: String = "1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(1, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_11_returns_11dot() {
let inputString: String = "11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11."
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11."
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(2, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_112_returns_11dot2() {
let inputString: String = "112"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.2"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.2"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(2, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_1122_returns_11dot22dot() {
let inputString: String = "1122"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.22."
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.22."
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(3, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_11223_returns_11dot22dot3() {
let inputString: String = "11223"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.22.3"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.22.3"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(3, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_112233_returns_11dot22dot33() {
let inputString: String = "112233"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.22.33"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.22.33"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(4, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_1122333_returns_11dot22dot333() {
let inputString: String = "1122333"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.22.333"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.22.333"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(5, result.affinity)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_11223333_returns_11dot22dot3333() {
let inputString: String = "11223333"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.22.3333"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.22.3333"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(6, result.affinity)
XCTAssertEqual(true, result.complete)
}
func testApplyAutocomplete_112233334_returns_11dot22dot3333() {
let inputString: String = "112233334"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11.22.3333"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "11.22.3333"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(5, result.affinity)
XCTAssertEqual(true, result.complete)
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import XCTest
@testable import InputMask
class MaskTestCase: XCTestCase {
func mask() throws -> Mask {
return try Mask(format: self.format())
}
func format() -> String {
fatalError("format() method is abstract")
}
func testInit_nestedBrackets_throwsWrongFormatCompilerError() {
do {
_ = try Mask(format: "[[00]000]")
XCTFail()
} catch Compiler.CompilerError.WrongFormat {
// success
} catch {
XCTFail()
}
}
func testInit_mixedCharacters_initialized() {
do {
_ = try Mask(format: "[00000Aa]")
} catch Compiler.CompilerError.WrongFormat {
XCTFail()
} catch {
XCTFail()
}
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import XCTest
@testable import InputMask
class MonthYearCase: MaskTestCase {
override func format() -> String {
return "[00]{/}[0000]"
}
func testInit_correctFormat_maskInitialized() {
XCTAssertNotNil(try self.mask())
}
func testInit_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! self.mask()
)
}
}
}
func testGetOrCreate_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! Mask.getOrCreate(withFormat: self.format())
)
}
}
}
func testGetPlaceholder_allSet_returnsCorrectPlaceholder() {
let placeholder: String = try! self.mask().placeholder()
XCTAssertEqual(placeholder, "00/0000")
}
func testAcceptableTextLength_allSet_returnsCorrectCount() {
let acceptableTextLength: Int = try! self.mask().acceptableTextLength()
XCTAssertEqual(acceptableTextLength, 7)
}
func testTotalTextLength_allSet_returnsCorrectCount() {
let totalTextLength: Int = try! self.mask().totalTextLength()
XCTAssertEqual(totalTextLength, 7)
}
func testAcceptableValueLength_allSet_returnsCorrectCount() {
let acceptableValueLength: Int = try! self.mask().acceptableValueLength()
XCTAssertEqual(acceptableValueLength, 7)
}
func testTotalValueLength_allSet_returnsCorrectCount() {
let totalValueLength: Int = try! self.mask().totalValueLength()
XCTAssertEqual(totalValueLength, 7)
}
func testApply_1_returns_1() {
let inputString: String = "1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_11_returns_11() {
let inputString: String = "11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_111_returns_11slash1() {
let inputString: String = "111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11/1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_returns_11slash11() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11/11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_123456_returns_12slash3456() {
let inputString: String = "123456"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12/3456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_12slash3_returns_12slash3() {
let inputString: String = "12/3"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12/3"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12slash34_returns_12slash34() {
let inputString: String = "12/34"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12/34"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12slash345_returns_12slash345() {
let inputString: String = "12/345"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12/345"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12slash3456_returns_12slash3456() {
let inputString: String = "12/3456"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12/3456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_1234567_returns_12slash3456() {
let inputString: String = "1234567"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12/3456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_12345678_returns_12slash3456() {
let inputString: String = "12345678"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12/3456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_1111_StartIndex_returns_11slash11_StartIndex() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.startIndex
let expectedString: String = "11/11"
let expectedCaret: String.Index = expectedString.startIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_ThirdIndex_returns_11slash11_FourthIndex() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.index(inputString.startIndex, offsetBy: 2)
let expectedString: String = "11/11"
let expectedCaret: String.Index = expectedString.index(expectedString.startIndex, offsetBy: 3)
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1111_returns_11slash11() {
let inputString: String = "abc1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11/11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1de111_returns_11slash11() {
let inputString: String = "abc1de111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11/11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1de1fg11_returns_11slash11() {
let inputString: String = "abc1de1fg11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11/11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_a_returns_empty() {
let inputString: String = "a"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = ""
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
}
//
// InputMask
//
// Created by Egor Taflanidi on 10.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import XCTest
@testable import InputMask
class MonthYearDoubledoubleShashCase: MaskTestCase {
override func format() -> String {
return "[00]{//}[0000]"
}
func testInit_correctFormat_maskInitialized() {
XCTAssertNotNil(try self.mask())
}
func testInit_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! self.mask()
)
}
}
}
func testGetOrCreate_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! Mask.getOrCreate(withFormat: self.format())
)
}
}
}
func testGetPlaceholder_allSet_returnsCorrectPlaceholder() {
let placeholder: String = try! self.mask().placeholder()
XCTAssertEqual(placeholder, "00//0000")
}
func testAcceptableTextLength_allSet_returnsCorrectCount() {
let acceptableTextLength: Int = try! self.mask().acceptableTextLength()
XCTAssertEqual(acceptableTextLength, 8)
}
func testTotalTextLength_allSet_returnsCorrectCount() {
let totalTextLength: Int = try! self.mask().totalTextLength()
XCTAssertEqual(totalTextLength, 8)
}
func testAcceptableValueLength_allSet_returnsCorrectCount() {
let acceptableValueLength: Int = try! self.mask().acceptableValueLength()
XCTAssertEqual(acceptableValueLength, 8)
}
func testTotalValueLength_allSet_returnsCorrectCount() {
let totalValueLength: Int = try! self.mask().totalValueLength()
XCTAssertEqual(totalValueLength, 8)
}
func testApply_1_returns_1() {
let inputString: String = "1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_11_returns_11() {
let inputString: String = "11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_111_returns_11doubleShash1() {
let inputString: String = "111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11//1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_returns_11doubleShash11() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11//11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_123456_returns_12doubleShash3456() {
let inputString: String = "123456"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//3456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_12shash3_returns_12doubleShash3() {
let inputString: String = "12/3"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//3"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12doubleShash3_returns_12doubleShash3() {
let inputString: String = "12//3"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//3"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12shash34_returns_12doubleShash34() {
let inputString: String = "12/34"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//34"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12doubleShash34_returns_12doubleShash34() {
let inputString: String = "12//34"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//34"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12doubleShash345_returns_12doubleShash345() {
let inputString: String = "12//345"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//345"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_12doubleShash3456_returns_12doubleShash3456() {
let inputString: String = "12//3456"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//3456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_1234567_returns_12doubleShash3456() {
let inputString: String = "1234567"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//3456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_12345678_returns_12doubleShash3456() {
let inputString: String = "12345678"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "12//3456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_1111_StartIndex_returns_11doubleShash11_StartIndex() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.startIndex
let expectedString: String = "11//11"
let expectedCaret: String.Index = expectedString.startIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_ThirdIndex_returns_11doubleShash11_FourthIndex() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.index(inputString.startIndex, offsetBy: 2)
let expectedString: String = "11//11"
let expectedCaret: String.Index = expectedString.index(expectedString.startIndex, offsetBy: 4)
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1111_returns_11doubleShash11() {
let inputString: String = "abc1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11//11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1de111_returns_11doubleShash11() {
let inputString: String = "abc1de111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11//11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_abc1de1fg11_returns_11doubleShash11() {
let inputString: String = "abc1de1fg11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11//11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
}
//
// PhoneCase.swift
// InputMask
//
// Created by Egor Taflanidi on 17.08.28.
// Copyright © 28 Heisei Egor Taflanidi. All rights reserved.
//
import XCTest
@testable import InputMask
class PhoneCase: MaskTestCase {
override func format() -> String {
return "+7 ([000]) [000] [00] [00]"
}
func testInit_correctFormat_maskInitialized() {
XCTAssertNotNil(try self.mask())
}
func testInit_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! self.mask()
)
}
}
}
func testGetOrCreate_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! Mask.getOrCreate(withFormat: self.format())
)
}
}
}
func testGetPlaceholder_allSet_returnsCorrectPlaceholder() {
let placeholder: String = try! self.mask().placeholder()
XCTAssertEqual(placeholder, "+7 (000) 000 00 00")
}
func testAcceptableTextLength_allSet_returnsCorrectCount() {
let acceptableTextLength: Int = try! self.mask().acceptableTextLength()
XCTAssertEqual(acceptableTextLength, 18)
}
func testTotalTextLength_allSet_returnsCorrectCount() {
let totalTextLength: Int = try! self.mask().totalTextLength()
XCTAssertEqual(totalTextLength, 18)
}
func testAcceptableValueLength_allSet_returnsCorrectCount() {
let acceptableValueLength: Int = try! self.mask().acceptableValueLength()
XCTAssertEqual(acceptableValueLength, 10)
}
func testTotalValueLength_allSet_returnsCorrectCount() {
let totalValueLength: Int = try! self.mask().totalValueLength()
XCTAssertEqual(totalValueLength, 10)
}
func testApply_plus_return_plus() {
let inputString: String = "+"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7_return_plus7() {
let inputString: String = "+7"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7space_return_plus7space() {
let inputString: String = "+7 "
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 "
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace_return_plus7spaceBrace() {
let inputString: String = "+7 ("
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 ("
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace1_return_plus7spaceBrace1() {
let inputString: String = "+7 (1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace12_return_plus7spaceBrace12() {
let inputString: String = "+7 (12"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (12"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123_return_plus7spaceBrace123() {
let inputString: String = "+7 (123"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "123"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123brace_return_plus7spaceBrace123brace() {
let inputString: String = "+7 (123)"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123)"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "123"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace_return_plus7spaceBrace123braceSpace() {
let inputString: String = "+7 (123) "
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) "
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "123"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace4_return_plus7spaceBrace123braceSpace4() {
let inputString: String = "+7 (123) 4"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 4"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1234"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace45_return_plus7spaceBrace123braceSpace45() {
let inputString: String = "+7 (123) 45"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 45"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12345"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace456_return_plus7spaceBrace123braceSpace456() {
let inputString: String = "+7 (123) 456"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "123456"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace456space_return_plus7spaceBrace123braceSpace456space() {
let inputString: String = "+7 (123) 456 "
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 "
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "123456"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace456space7_return_plus7spaceBrace123braceSpace456space7() {
let inputString: String = "+7 (123) 456 7"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 7"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1234567"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace456space78_return_plus7spaceBrace123braceSpace456space78() {
let inputString: String = "+7 (123) 456 78"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 78"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12345678"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace456space78space_return_plus7spaceBrace123braceSpace456space78space() {
let inputString: String = "+7 (123) 456 78 "
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 78 "
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "12345678"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace456space78space9_return_plus7spaceBrace123braceSpace456space78space9() {
let inputString: String = "+7 (123) 456 78 9"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 78 9"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "123456789"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_plus7spaceBrace123braceSpace456space78space90_return_plus7spaceBrace123braceSpace456space78space90() {
let inputString: String = "+7 (123) 456 78 90"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 78 90"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1234567890"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_7_return_plus7() {
let inputString: String = "7"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_9_return_plus7spaceBrace9() {
let inputString: String = "9"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (9"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "9"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1234567890_return_plus7spaceBrace123braceSpace456space78space90() {
let inputString: String = "1234567890"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 78 90"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1234567890"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_12345678901_return_plus7spaceBrace123braceSpace456space78space90() {
let inputString: String = "12345678901"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 78 90"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1234567890"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_plus1234567890_return_plus7spaceBrace123braceSpace456space78space90() {
let inputString: String = "+1234567890"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 78 90"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1234567890"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_plusBrace123brace456dash78dash90_return_plus7spaceBrace123braceSpace456space78space90() {
let inputString: String = "+(123)456-78-90"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (123) 456 78 90"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1234567890"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApplyAutocomplete_empty_return_plus7spaceBrace() {
let inputString: String = ""
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 ("
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_plus_return_plus7spaceBrace() {
let inputString: String = "+"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 ("
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_plus7_return_plus7spaceBrace() {
let inputString: String = "+7"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 ("
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_plus7space_return_plus7spaceBrace() {
let inputString: String = "+7 "
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 ("
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_plus7spaceBrace_return_plus7spaceBrace() {
let inputString: String = "+7 ("
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 ("
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_a_return_plus7spaceBrace() {
let inputString: String = "a"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 ("
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_aPlus7spaceBrace_return_plus7spaceBrace() {
let inputString: String = "a+7 ("
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 (7"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "7"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApplyAutocomplete_7space_return_plus7spaceBrace() {
let inputString: String = "7 "
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "+7 ("
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = ""
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
}
//
// YearACCase.swift
// InputMask
//
// Created by Egor Taflanidi on 09.01.29.
// Copyright © 29 Heisei Egor Taflanidi. All rights reserved.
//
import XCTest
@testable import InputMask
class YearACCase: MaskTestCase {
override func format() -> String {
return "[9990] AC"
}
func testInit_correctFormat_maskInitialized() {
XCTAssertNotNil(try self.mask())
}
func testInit_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! self.mask()
)
}
}
}
func testGetOrCreate_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! Mask.getOrCreate(withFormat: self.format())
)
}
}
}
func testGetPlaceholder_allSet_returnsCorrectPlaceholder() {
let placeholder: String = try! self.mask().placeholder()
XCTAssertEqual(placeholder, "0000 AC")
}
func testAcceptableTextLength_allSet_returnsCorrectCount() {
let acceptableTextLength: Int = try! self.mask().acceptableTextLength()
XCTAssertEqual(acceptableTextLength, 4)
}
func testTotalTextLength_allSet_returnsCorrectCount() {
let totalTextLength: Int = try! self.mask().totalTextLength()
XCTAssertEqual(totalTextLength, 7)
}
func testAcceptableValueLength_allSet_returnsCorrectCount() {
let acceptableValueLength: Int = try! self.mask().acceptableValueLength()
XCTAssertEqual(acceptableValueLength, 1)
}
func testTotalValueLength_allSet_returnsCorrectCount() {
let totalValueLength: Int = try! self.mask().totalValueLength()
XCTAssertEqual(totalValueLength, 4)
}
func testApply_1_returns_1() {
let inputString: String = "1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_11_returns_11() {
let inputString: String = "11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_111_returns_111() {
let inputString: String = "111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "111"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_1111_returns_1111() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1111"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_11112_returns_1111spaceAC() {
let inputString: String = "11112"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1111 AC"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1111"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApplyAutocomplete_1111_returns_1111spaceAC() {
let inputString: String = "1111"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1111 AC"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = "1111"
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
),
autocomplete: true
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
}
//
// YearCase.swift
// InputMask
//
// Created by Egor Taflanidi on 03.02.29.
// Copyright © 29 Heisei Egor Taflanidi. All rights reserved.
//
import XCTest
@testable import InputMask
class YearCase: MaskTestCase {
override func format() -> String {
return "[0099]"
}
func testInit_correctFormat_maskInitialized() {
XCTAssertNotNil(try self.mask())
}
func testInit_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! self.mask()
)
}
}
}
func testGetOrCreate_correctFormat_measureTime() {
self.measure {
var masks: [Mask] = []
for _ in 1...1000 {
masks.append(
try! Mask.getOrCreate(withFormat: self.format())
)
}
}
}
func testGetPlaceholder_allSet_returnsCorrectPlaceholder() {
let placeholder: String = try! self.mask().placeholder()
XCTAssertEqual(placeholder, "0000")
}
func testAcceptableTextLength_allSet_returnsCorrectCount() {
let acceptableTextLength: Int = try! self.mask().acceptableTextLength()
XCTAssertEqual(acceptableTextLength, 2)
}
func testTotalTextLength_allSet_returnsCorrectCount() {
let totalTextLength: Int = try! self.mask().totalTextLength()
XCTAssertEqual(totalTextLength, 4)
}
func testAcceptableValueLength_allSet_returnsCorrectCount() {
let acceptableValueLength: Int = try! self.mask().acceptableValueLength()
XCTAssertEqual(acceptableValueLength, 2)
}
func testTotalValueLength_allSet_returnsCorrectCount() {
let totalValueLength: Int = try! self.mask().totalValueLength()
XCTAssertEqual(totalValueLength, 4)
}
func testApply_1_returns_1() {
let inputString: String = "1"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(false, result.complete)
}
func testApply_11_returns_11() {
let inputString: String = "11"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "11"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_112_returns_112() {
let inputString: String = "112"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "112"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
func testApply_1122_returns_1122() {
let inputString: String = "1122"
let inputCaret: String.Index = inputString.endIndex
let expectedString: String = "1122"
let expectedCaret: String.Index = expectedString.endIndex
let expectedValue: String = expectedString
let result: Mask.Result = try! self.mask().apply(
toText: CaretString(
string: inputString,
caretPosition: inputCaret
)
)
XCTAssertEqual(expectedString, result.formattedText.string)
XCTAssertEqual(expectedCaret, result.formattedText.caretPosition)
XCTAssertEqual(expectedValue, result.extractedValue)
XCTAssertEqual(true, result.complete)
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
00037D451F30732D008B5389 /* InputMask.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0031887C1F2F2D1500755291 /* InputMask.framework */; };
00278A051F2F25CE0023E794 /* RNTextInputMask.m in Sources */ = {isa = PBXBuildFile; fileRef = 00278A041F2F25CE0023E794 /* RNTextInputMask.m */; };
00278A061F2F25CE0023E794 /* RNTextInputMask.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 00278A031F2F25CE0023E794 /* RNTextInputMask.h */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
0031887B1F2F2D1500755291 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 003188761F2F2D1500755291 /* InputMask.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 8A808ECB1D5B0FEC00A75B9C;
remoteInfo = InputMask;
};
0031887D1F2F2D1500755291 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 003188761F2F2D1500755291 /* InputMask.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 8A808ED51D5B0FEC00A75B9C;
remoteInfo = InputMaskTests;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
002789FE1F2F25CE0023E794 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "include/$(PRODUCT_NAME)";
dstSubfolderSpec = 16;
files = (
00278A061F2F25CE0023E794 /* RNTextInputMask.h in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
00278A001F2F25CE0023E794 /* libRNTextInputMask.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNTextInputMask.a; sourceTree = BUILT_PRODUCTS_DIR; };
00278A031F2F25CE0023E794 /* RNTextInputMask.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNTextInputMask.h; sourceTree = "<group>"; };
00278A041F2F25CE0023E794 /* RNTextInputMask.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNTextInputMask.m; sourceTree = "<group>"; };
003188761F2F2D1500755291 /* InputMask.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = InputMask.xcodeproj; path = InputMask/InputMask.xcodeproj; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
002789FD1F2F25CE0023E794 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
00037D451F30732D008B5389 /* InputMask.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
002789F71F2F25CE0023E794 = {
isa = PBXGroup;
children = (
00278A0C1F2F260C0023E794 /* Libraries */,
00278A021F2F25CE0023E794 /* RNTextInputMask */,
00278A011F2F25CE0023E794 /* Products */,
);
sourceTree = "<group>";
};
00278A011F2F25CE0023E794 /* Products */ = {
isa = PBXGroup;
children = (
00278A001F2F25CE0023E794 /* libRNTextInputMask.a */,
);
name = Products;
sourceTree = "<group>";
};
00278A021F2F25CE0023E794 /* RNTextInputMask */ = {
isa = PBXGroup;
children = (
00278A031F2F25CE0023E794 /* RNTextInputMask.h */,
00278A041F2F25CE0023E794 /* RNTextInputMask.m */,
);
path = RNTextInputMask;
sourceTree = "<group>";
};
00278A0C1F2F260C0023E794 /* Libraries */ = {
isa = PBXGroup;
children = (
003188761F2F2D1500755291 /* InputMask.xcodeproj */,
);
name = Libraries;
sourceTree = "<group>";
};
003188771F2F2D1500755291 /* Products */ = {
isa = PBXGroup;
children = (
0031887C1F2F2D1500755291 /* InputMask.framework */,
0031887E1F2F2D1500755291 /* InputMaskTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
002789FF1F2F25CE0023E794 /* RNTextInputMask */ = {
isa = PBXNativeTarget;
buildConfigurationList = 00278A091F2F25CE0023E794 /* Build configuration list for PBXNativeTarget "RNTextInputMask" */;
buildPhases = (
002789FC1F2F25CE0023E794 /* Sources */,
002789FD1F2F25CE0023E794 /* Frameworks */,
002789FE1F2F25CE0023E794 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = RNTextInputMask;
productName = RNTextInputMask;
productReference = 00278A001F2F25CE0023E794 /* libRNTextInputMask.a */;
productType = "com.apple.product-type.library.static";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
002789F81F2F25CE0023E794 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0830;
ORGANIZATIONNAME = "Ivan Zotov";
TargetAttributes = {
002789FF1F2F25CE0023E794 = {
CreatedOnToolsVersion = 8.3.3;
DevelopmentTeam = YRYY3MUZEK;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 002789FB1F2F25CE0023E794 /* Build configuration list for PBXProject "RNTextInputMask" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 002789F71F2F25CE0023E794;
productRefGroup = 00278A011F2F25CE0023E794 /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 003188771F2F2D1500755291 /* Products */;
ProjectRef = 003188761F2F2D1500755291 /* InputMask.xcodeproj */;
},
);
projectRoot = "";
targets = (
002789FF1F2F25CE0023E794 /* RNTextInputMask */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
0031887C1F2F2D1500755291 /* InputMask.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = InputMask.framework;
remoteRef = 0031887B1F2F2D1500755291 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0031887E1F2F2D1500755291 /* InputMaskTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = InputMaskTests.xctest;
remoteRef = 0031887D1F2F2D1500755291 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXSourcesBuildPhase section */
002789FC1F2F25CE0023E794 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
00278A051F2F25CE0023E794 /* RNTextInputMask.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
00278A071F2F25CE0023E794 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 10.3;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
00278A081F2F25CE0023E794 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 10.3;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
00278A0A1F2F25CE0023E794 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
DEVELOPMENT_TEAM = YRYY3MUZEK;
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../react-native/Libraries/Text/**";
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
};
name = Debug;
};
00278A0B1F2F25CE0023E794 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
DEVELOPMENT_TEAM = YRYY3MUZEK;
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../react-native/Libraries/Text/**";
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
002789FB1F2F25CE0023E794 /* Build configuration list for PBXProject "RNTextInputMask" */ = {
isa = XCConfigurationList;
buildConfigurations = (
00278A071F2F25CE0023E794 /* Debug */,
00278A081F2F25CE0023E794 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
00278A091F2F25CE0023E794 /* Build configuration list for PBXNativeTarget "RNTextInputMask" */ = {
isa = XCConfigurationList;
buildConfigurations = (
00278A0A1F2F25CE0023E794 /* Debug */,
00278A0B1F2F25CE0023E794 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 002789F81F2F25CE0023E794 /* Project object */;
}
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:RNTextInputMask.xcodeproj">
</FileRef>
</Workspace>
{
"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "FD4D1DD9ED94882CDE2BBFBA505170F3AD6F47D8",
"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
},
"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
"FD4D1DD9ED94882CDE2BBFBA505170F3AD6F47D8" : 9223372036854775807,
"ED15D557B9B333C8B7761924B3DBF02994584ED6" : 9223372036854775807
},
"DVTSourceControlWorkspaceBlueprintIdentifierKey" : "860C39D2-D628-4EE8-A783-177E89BDA83B",
"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
"FD4D1DD9ED94882CDE2BBFBA505170F3AD6F47D8" : "react-native-text-input-mask\/",
"ED15D557B9B333C8B7761924B3DBF02994584ED6" : "input-mask-ios\/"
},
"DVTSourceControlWorkspaceBlueprintNameKey" : "RNTextInputMask",
"DVTSourceControlWorkspaceBlueprintVersion" : 204,
"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "ios\/RNTextInputMask\/RNTextInputMask.xcodeproj",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/RedMadRobot\/input-mask-ios.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "ED15D557B9B333C8B7761924B3DBF02994584ED6"
},
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:ivanzotov\/react-native-text-input-mask.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "FD4D1DD9ED94882CDE2BBFBA505170F3AD6F47D8"
}
]
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0830"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "002789FF1F2F25CE0023E794"
BuildableName = "libRNTextInputMask.a"
BlueprintName = "RNTextInputMask"
ReferencedContainer = "container:RNTextInputMask.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "002789FF1F2F25CE0023E794"
BuildableName = "libRNTextInputMask.a"
BlueprintName = "RNTextInputMask"
ReferencedContainer = "container:RNTextInputMask.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "002789FF1F2F25CE0023E794"
BuildableName = "libRNTextInputMask.a"
BlueprintName = "RNTextInputMask"
ReferencedContainer = "container:RNTextInputMask.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>RNTextInputMask.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>002789FF1F2F25CE0023E794</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>RNTextInputMask.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>11</integer>
</dict>
</dict>
</dict>
</plist>
//
// RNTextInputMask.h
// RNTextInputMask
//
// Created by Ivan Zotov on 7/29/17.
//
//
#import <UIKit/UIKit.h>
#import <React/RCTBridgeModule.h>
@import InputMask;
@interface RNTextInputMask : NSObject <RCTBridgeModule, MaskedTextFieldDelegateListener>
@end
//
// RNTextInputMask.m
// RNTextInputMask
//
// Created by Ivan Zotov on 7/29/17.
//
//
#import <React/RCTBridge.h>
#import <React/RCTConvert.h>
#import <React/RCTUIManager.h>
#import <React/RCTEventDispatcher.h>
#import "RCTSinglelineTextInputView.h"
#import "RCTUITextField.h"
#import "RNTextInputMask.h"
@import InputMask;
@implementation RNTextInputMask {
NSMutableDictionary *masks;
}
@synthesize bridge = _bridge;
RCT_EXPORT_MODULE();
- (dispatch_queue_t)methodQueue {
return self.bridge.uiManager.methodQueue;
}
RCT_EXPORT_METHOD(mask:(NSString *)maskString inputValue:(NSString *)inputValue onResult:(RCTResponseSenderBlock)onResult) {
NSString *output = [RNMask maskValueWithText:inputValue format:maskString];
onResult(@[output]);
}
RCT_EXPORT_METHOD(unmask:(NSString *)maskString inputValue:(NSString *)inputValue onResult:(RCTResponseSenderBlock)onResult) {
NSString *output = [RNMask unmaskValueWithText:inputValue format:maskString];
onResult(@[output]);
}
RCT_EXPORT_METHOD(setMask:(nonnull NSNumber *)reactNode mask:(NSString *)mask) {
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, RCTSinglelineTextInputView *> *viewRegistry ) {
dispatch_async(dispatch_get_main_queue(), ^{
RCTSinglelineTextInputView *view = viewRegistry[reactNode];
RCTUITextField *textView = [view backedTextInputView];
if (!masks) {
masks = [[NSMutableDictionary alloc] init];
}
NSString *key = [NSString stringWithFormat:@"%@", reactNode];
MaskedTextFieldDelegate* maskedDelegate = [[MaskedTextFieldDelegate alloc] initWithFormat:mask];
masks[key] = maskedDelegate;
[masks[key] setListener:self];
textView.delegate = masks[key];
[self updateTextField:maskedDelegate textView:textView];
});
}];
}
- (void)textField:(RCTUITextField *)textField didFillMandatoryCharacters:(BOOL)complete didExtractValue:(NSString *)value
{
[self.bridge.eventDispatcher sendTextEventWithType:RCTTextEventTypeChange
reactTag:[[textField reactSuperview] reactTag]
text:textField.attributedText.string
key:nil
eventCount:1];
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[self.bridge.eventDispatcher sendTextEventWithType:RCTTextEventTypeFocus
reactTag:[[textField reactSuperview] reactTag]
text:textField.attributedText.string
key:nil
eventCount:1];
}
- (void)textFieldDidEndEditing:(RCTUITextField *)textField
{
[self.bridge.eventDispatcher sendTextEventWithType:RCTTextEventTypeBlur
reactTag:[[textField reactSuperview] reactTag]
text:textField.attributedText.string
key:nil
eventCount:1];
}
- (void)updateTextField:(MaskedTextFieldDelegate *)maskedDelegate textView:(RCTUITextField *)textView {
if(textView.attributedText.string.length> 0){
NSString *originalString = textView.attributedText.string;
NSString *croppedText = [originalString substringToIndex:[originalString length] -1];
[textView setAttributedText:[[NSAttributedString alloc] initWithString:croppedText]];
NSString *last = [originalString substringFromIndex:[originalString length] - 1];
[maskedDelegate textField:(UITextField*)textView
shouldChangeCharactersInRange: (NSRange){[textView.attributedText.string length], 0}
replacementString:last];
}
}
@end
{
"name": "agera-app-mask-input",
"version": "0.0.3",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "hungraim",
"license": "ISC"
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment