From 97f27bf1d43e3b4ed4857a572d0eca48f4265026 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 22 Feb 2018 15:20:51 -0800 Subject: [PATCH 01/31] add style, to readme. and also added the properties i just added of highlightColor, placeholderColor, color, and disableFullScreenUI --- README.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b4749ab..ac09fcd 100644 --- a/README.md +++ b/README.md @@ -44,14 +44,19 @@ prompt( ## Props - name | description | type | default -:-------------------- |:------------------------------------------- | --------:|:------------------ - type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' - cancelable | | Boolean | - defaultValue | Default input value | String | '' - placeholder | | String | '' - - +| name | description | type | default | +|---------------------|---------------------------------------------------------------------------|---------|--------------------------------------| +| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' | +| cancelable | | Boolean | true | +| defaultValue | Default input value | String | | +| placeholder | | String | | +| style | `'default', 'shimo'` | String | 'default' | +| disableFullScreenUI | When in landscape mode, don't use fullscreen | Boolean | false | +| highlightColor | Color of text selection | String | colorString or #RRGGBB or ##AARRGGBB | +| placeholderColor | Color of the placeholder | String | colorString or#RRGGBB or ##AARRGGBB | +| color | Color of the text | String | colorString or#RRGGBB or ##AARRGGBB | + +Valid `colorString`: `'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', and 'teal'` ![Android Screen Shoot](./Example/android.png) From 5d68e7fb87a0c7f9f5d2b15d9a886de870ff9e9f Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 22 Feb 2018 15:22:50 -0800 Subject: [PATCH 02/31] Update RNPromptFragment.java --- .../shimo/react/prompt/RNPromptFragment.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java index 5428e43..b0f4a08 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java @@ -10,6 +10,8 @@ import android.view.LayoutInflater; import android.view.WindowManager; import android.widget.EditText; +import android.view.inputmethod.EditorInfo; +import android.graphics.Color; import javax.annotation.Nullable; @@ -25,6 +27,10 @@ public class RNPromptFragment extends DialogFragment implements DialogInterface. /* package */ static final String ARG_STYLE = "style"; /* package */ static final String ARG_DEFAULT_VALUE = "defaultValue"; /* package */ static final String ARG_PLACEHOLDER = "placeholder"; + /* package */ static final String ARG_PLACEHOLDER_COLOR = "placeholderColor"; + /* package */ static final String ARG_DISABLE_FULL_SCREEN_UI = "disableFullscreenUI"; + /* package */ static final String ARG_HIGHLIGHT_COLOR = "highlightColor"; + /* package */ static final String ARG_COLOR = "color"; private EditText mInputText; @@ -108,6 +114,8 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { input = new EditText(activityContext); } + + // input type int type = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; if (arguments.containsKey(ARG_TYPE)) { @@ -134,6 +142,21 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { } input.setInputType(type); + if (arguments.containsKey(ARG_HIGHLIGHT_COLOR)) { + String highlightColor = arguments.getString(ARG_HIGHLIGHT_COLOR); + if (highlightColor != null) { + input.setHighlightColor(Color.parseColor(highlightColor)); + } + } + + if (arguments.containsKey(ARG_DISABLE_FULL_SCREEN_UI)) { + boolean disableFullscreenUI = arguments.getBoolean(ARG_DISABLE_FULL_SCREEN_UI); + if (disableFullscreenUI) { + int imeOptions = input.getImeOptions(); + input.setImeOptions(imeOptions | EditorInfo.IME_FLAG_NO_EXTRACT_UI); + } + } + if (arguments.containsKey(ARG_DEFAULT_VALUE)) { String defaultValue = arguments.getString(ARG_DEFAULT_VALUE); if (defaultValue != null) { @@ -143,11 +166,27 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { } } + + if (arguments.containsKey(ARG_COLOR)) { + String color = arguments.getString(ARG_COLOR); + if (color != null) { + input.setTextColor(Color.parseColor(color)); + } + } + if (arguments.containsKey(ARG_PLACEHOLDER)) { input.setHint(arguments.getString(ARG_PLACEHOLDER)); + if (arguments.containsKey(ARG_PLACEHOLDER_COLOR)) { + String placeholderColor = arguments.getString(ARG_PLACEHOLDER_COLOR); + if (placeholderColor != null) { + input.setHintTextColor(Color.parseColor(arguments.getString(ARG_PLACEHOLDER_COLOR))); + } + } } alertDialog.setView(input, 50, 15, 50, 0); + // input.setLinkTextColor(Color.parseColor("green")); + mInputText = input; return alertDialog; } From 4d870b7fd0b4da3920a9c6da1dd1d58c6863adf6 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 22 Feb 2018 15:23:02 -0800 Subject: [PATCH 03/31] Update RNPromptModule.java --- .../im/shimo/react/prompt/RNPromptModule.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java b/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java index 960b8d7..80e59f9 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java @@ -42,6 +42,10 @@ public class RNPromptModule extends ReactContextBaseJavaModule implements Lifecy /* package */ static final String KEY_STYLE = "style"; /* package */ static final String KEY_DEFAULT_VALUE = "defaultValue"; /* package */ static final String KEY_PLACEHOLDER = "placeholder"; + /* package */ static final String KEY_PLACEHOLDER_COLOR = "placeholderColor"; + /* package */ static final String KEY_DISABLE_FULL_SCREEN_UI = "disableFullscreenUI"; + /* package */ static final String KEY_HIGHLIGHT_COLOR = "highlightColor"; + /* package */ static final String KEY_COLOR = "color"; /* package */ static final Map CONSTANTS = MapBuilder.of( ACTION_BUTTON_CLICKED, ACTION_BUTTON_CLICKED, @@ -127,6 +131,15 @@ public void promptWithArgs(ReadableMap options, final Callback callback) { if (options.hasKey(KEY_CANCELABLE)) { args.putBoolean(KEY_CANCELABLE, options.getBoolean(KEY_CANCELABLE)); } + if (options.hasKey(KEY_DISABLE_FULL_SCREEN_UI)) { + args.putBoolean(KEY_DISABLE_FULL_SCREEN_UI, options.getBoolean(KEY_DISABLE_FULL_SCREEN_UI)); + } + if (options.hasKey(KEY_HIGHLIGHT_COLOR)) { + args.putString(KEY_HIGHLIGHT_COLOR, options.getString(KEY_HIGHLIGHT_COLOR)); + } + if (options.hasKey(KEY_COLOR)) { + args.putString(KEY_COLOR, options.getString(KEY_COLOR)); + } if (options.hasKey(KEY_TYPE)) { args.putString(KEY_TYPE, options.getString(KEY_TYPE)); } @@ -139,6 +152,9 @@ public void promptWithArgs(ReadableMap options, final Callback callback) { if (options.hasKey(KEY_PLACEHOLDER)) { args.putString(KEY_PLACEHOLDER, options.getString(KEY_PLACEHOLDER)); } + if (options.hasKey(KEY_PLACEHOLDER_COLOR)) { + args.putString(KEY_PLACEHOLDER_COLOR, options.getString(KEY_PLACEHOLDER_COLOR)); + } fragmentManagerHelper.showNewAlert(mIsInForeground, args, callback); } From 9b16846a1ba190814fc20279c4e495e03d297170 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:33:15 -0800 Subject: [PATCH 04/31] RNPromptFragment.java updated for buttonColor and cust style name --- .../shimo/react/prompt/RNPromptFragment.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java index b0f4a08..2938991 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java @@ -31,9 +31,12 @@ public class RNPromptFragment extends DialogFragment implements DialogInterface. /* package */ static final String ARG_DISABLE_FULL_SCREEN_UI = "disableFullscreenUI"; /* package */ static final String ARG_HIGHLIGHT_COLOR = "highlightColor"; /* package */ static final String ARG_COLOR = "color"; + /* package */ static final String ARG_BUTTON_COLOR = "buttonColor"; private EditText mInputText; + private String mButtonColor; + public enum PromptTypes { TYPE_DEFAULT("default"), PLAIN_TEXT("plain-text"), @@ -101,6 +104,12 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { builder.setItems(arguments.getCharSequenceArray(ARG_ITEMS), this); } + if (arguments.containsKey(ARG_BUTTON_COLOR)) { + mButtonColor = arguments.getString(ARG_BUTTON_COLOR); + } else { + mButtonColor = ""; + } + AlertDialog alertDialog = builder.create(); // input style @@ -110,6 +119,9 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { case "shimo": input = (EditText) inflater.inflate(R.layout.edit_text, null); break; + case "cust": + input = (EditText) inflater.inflate(R.layout.cust_edit_text, null); + break; default: input = new EditText(activityContext); } @@ -198,6 +210,17 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { return dialog; } + @Override + public void onStart() { + super.onStart(); + + if (!mButtonColor.isEmpty()) { + AlertDialog d = (AlertDialog) getDialog(); + d.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.parseColor(mButtonColor)); + d.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.parseColor(mButtonColor)); + } + } + @Override public void onClick(DialogInterface dialog, int which) { if (mListener != null) { From f9ab93b14b6675841e4ce261d458504fcb6ebd42 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:34:49 -0800 Subject: [PATCH 05/31] RNPromptModule.java update for buttonColor --- .../src/main/java/im/shimo/react/prompt/RNPromptModule.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java b/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java index 80e59f9..28c515b 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java @@ -46,6 +46,7 @@ public class RNPromptModule extends ReactContextBaseJavaModule implements Lifecy /* package */ static final String KEY_DISABLE_FULL_SCREEN_UI = "disableFullscreenUI"; /* package */ static final String KEY_HIGHLIGHT_COLOR = "highlightColor"; /* package */ static final String KEY_COLOR = "color"; + /* package */ static final String KEY_BUTTON_COLOR = "buttonColor"; /* package */ static final Map CONSTANTS = MapBuilder.of( ACTION_BUTTON_CLICKED, ACTION_BUTTON_CLICKED, @@ -155,6 +156,9 @@ public void promptWithArgs(ReadableMap options, final Callback callback) { if (options.hasKey(KEY_PLACEHOLDER_COLOR)) { args.putString(KEY_PLACEHOLDER_COLOR, options.getString(KEY_PLACEHOLDER_COLOR)); } + if (options.hasKey(KEY_BUTTON_COLOR)) { + args.putString(KEY_BUTTON_COLOR, options.getString(KEY_BUTTON_COLOR)); + } fragmentManagerHelper.showNewAlert(mIsInForeground, args, callback); } From cddf659ca54667adc2ced31341ceaae6a80540c2 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:35:32 -0800 Subject: [PATCH 06/31] index.android.js for buttonColor --- index.android.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/index.android.js b/index.android.js index 783340d..a13df8f 100644 --- a/index.android.js +++ b/index.android.js @@ -42,11 +42,15 @@ export type PromptStyle = $Enum<{ }>; type Options = { + disableFullscreenUI?: ?boolean; cancelable?: ?boolean; type?: ?PromptType; defaultValue?: ?String; - placeholder?: ?String; style?: ?PromptStyle; + placeholder?: ?String; + placeholderColor?: ?String; + highlightColor?: ?String; + color?: ?String; }; /** @@ -85,7 +89,7 @@ export default function prompt( let buttons = typeof callbackOrButtons === 'function' ? defaultButtons : callbackOrButtons; - + let config = { title: title || '', message: message || '', @@ -94,11 +98,16 @@ export default function prompt( if (options) { config = { ...config, + highlightColor: options.highlightColor || null, + placeholderColor: options.placeholderColor || null, + color: options.color || null, + disableFullscreenUI: options.disableFullscreenUI === true, cancelable: options.cancelable !== false, type: options.type || 'default', style: options.style || 'default', defaultValue: options.defaultValue || '', - placeholder: options.placeholder || '' + placeholder: options.placeholder || null, + buttonColor: options.buttonColor || null }; } // At most three buttons (neutral, negative, positive). Ignore rest. @@ -121,7 +130,7 @@ export default function prompt( }; } - + console.log('config:', config); PromptAndroid.promptWithArgs( config, (action, buttonKey, input) => { From 8d4b760eac3fc1c75747570ea0adab593575a402 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:36:01 -0800 Subject: [PATCH 07/31] Delete prompt_color.xml --- android/src/main/res/color/prompt_color.xml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 android/src/main/res/color/prompt_color.xml diff --git a/android/src/main/res/color/prompt_color.xml b/android/src/main/res/color/prompt_color.xml deleted file mode 100644 index dac19ec..0000000 --- a/android/src/main/res/color/prompt_color.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - From 97f5166857b97c3e04594ec2a2ccf6c62f4b8e3b Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:36:16 -0800 Subject: [PATCH 08/31] Create colors.xml --- android/src/main/res/values/colors.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 android/src/main/res/values/colors.xml diff --git a/android/src/main/res/values/colors.xml b/android/src/main/res/values/colors.xml new file mode 100644 index 0000000..a7aa8df --- /dev/null +++ b/android/src/main/res/values/colors.xml @@ -0,0 +1,5 @@ + + + #F34336 + #41464b + From 51a4b24491282faf4fea29dff5f8bc7036c12721 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:36:29 -0800 Subject: [PATCH 09/31] Update style.xml --- android/src/main/res/values/style.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/android/src/main/res/values/style.xml b/android/src/main/res/values/style.xml index 14aa009..16f1080 100644 --- a/android/src/main/res/values/style.xml +++ b/android/src/main/res/values/style.xml @@ -9,4 +9,8 @@ @color/prompt_color @color/prompt_color + + From 1dd31e52d3b774144bd27fb61da7b077edbe3735 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:37:01 -0800 Subject: [PATCH 10/31] Create cust_edit_text.xml --- android/src/main/res/layout/cust_edit_text.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 android/src/main/res/layout/cust_edit_text.xml diff --git a/android/src/main/res/layout/cust_edit_text.xml b/android/src/main/res/layout/cust_edit_text.xml new file mode 100644 index 0000000..dd3e55c --- /dev/null +++ b/android/src/main/res/layout/cust_edit_text.xml @@ -0,0 +1,5 @@ + + From 7ee8ae5c1128f72a117a8d484dade821ae2cbd49 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:43:54 -0800 Subject: [PATCH 11/31] how to use cust and also added buttonColor --- README.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ac09fcd..1456db5 100644 --- a/README.md +++ b/README.md @@ -44,20 +44,24 @@ prompt( ## Props -| name | description | type | default | -|---------------------|---------------------------------------------------------------------------|---------|--------------------------------------| -| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' | -| cancelable | | Boolean | true | -| defaultValue | Default input value | String | | -| placeholder | | String | | -| style | `'default', 'shimo'` | String | 'default' | -| disableFullScreenUI | When in landscape mode, don't use fullscreen | Boolean | false | -| highlightColor | Color of text selection | String | colorString or #RRGGBB or ##AARRGGBB | -| placeholderColor | Color of the placeholder | String | colorString or#RRGGBB or ##AARRGGBB | -| color | Color of the text | String | colorString or#RRGGBB or ##AARRGGBB | +| Name | Description | Type | Default | +|---------------------|-----------------------------------------------------------------------------------|---------|--------------------------------------| +| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' | +| cancelable | | Boolean | true | +| defaultValue | Default input value | String | | +| placeholder | | String | | +| style | `'default', 'shimo', 'cust'` | String | 'default' | +| disableFullScreenUI | When in landscape mode, don't use fullscreen | Boolean | false | +| highlightColor | Color of text selection | String | colorString or #RRGGBB or ##AARRGGBB | +| placeholderColor | Color of the placeholder | String | colorString or #RRGGBB or ##AARRGGBB | +| color | Color of the text | String | colorString or #RRGGBB or ##AARRGGBB | +| buttonColor | Color of the buttons | String | colorString or #RRGGBB or ##AARRGGBB | Valid `colorString`: `'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', and 'teal'` +### "cust" Style (change underline, cursor, and handle color) +If you set this style, you can adjust the color of the "underline", "cursor", and "handles" of the input field. The default custom color is a reddish color of "#F34336". You can change this by going to `./node_modules/react-native-prompt-android/android/src/main/res/values/colors.xml` and changing the value of the `custUnderlineAndCursorAndHandleColor` field. + ![Android Screen Shoot](./Example/android.png) ![Android Screen Shoot](./Example/ios.png) From 1293f233c4ce443b11009e457e5433f1428293f6 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:46:32 -0800 Subject: [PATCH 12/31] Update index.android.js --- index.android.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/index.android.js b/index.android.js index a13df8f..3c40305 100644 --- a/index.android.js +++ b/index.android.js @@ -39,6 +39,10 @@ export type PromptStyle = $Enum<{ * Shimo alert dialog style */ 'shimo': string, + /** + * Custom input style + */ + 'cust': string }>; type Options = { @@ -51,6 +55,7 @@ type Options = { placeholderColor?: ?String; highlightColor?: ?String; color?: ?String; + buttonColor?: ?String; }; /** From 0a6c21b78644aed960e8452883495fdb14975b8a Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:47:18 -0800 Subject: [PATCH 13/31] Update index.android.js --- index.android.js | 1 - 1 file changed, 1 deletion(-) diff --git a/index.android.js b/index.android.js index 3c40305..51f19a1 100644 --- a/index.android.js +++ b/index.android.js @@ -135,7 +135,6 @@ export default function prompt( }; } - console.log('config:', config); PromptAndroid.promptWithArgs( config, (action, buttonKey, input) => { From 9b13e6c1517b3f0413db73e79227c8c35b95e4e1 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Thu, 8 Mar 2018 21:51:14 -0800 Subject: [PATCH 14/31] Update RNPromptFragment.java also color neutral button if its there. tested, if the button is not there, it doesnt crash, cool. --- .../src/main/java/im/shimo/react/prompt/RNPromptFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java index 2938991..daa2cd1 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java @@ -218,6 +218,7 @@ public void onStart() { AlertDialog d = (AlertDialog) getDialog(); d.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.parseColor(mButtonColor)); d.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.parseColor(mButtonColor)); + d.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(Color.parseColor(mButtonColor)); } } From 8a3b945a024ac348acc293bfea44898e93d5b835 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Fri, 9 Mar 2018 06:42:28 -0800 Subject: [PATCH 15/31] added manual linking instructions to readme --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1456db5..e093b45 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,47 @@ You can use react-native-cli: react-native link react-native-prompt-android ``` -Or rnpm: -```bash -rnpm link react-native-prompt-android +#### Manual Linking +In case `react-native link` fails you can follow this manual linking. + +1. Include this module in `android/settings.gradle`: + +``` +... +include ':react-native-prompt-android' // Add this +project(':react-native-prompt-android').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-prompt-android/android') // Add this +... +include ':app' +``` + +2. Add a dependency to your app build in `android/app/build.gradle`: + ``` +dependencies { + ... + compile project(':react-native-prompt-android') // Add this +} +``` + +3. Change your main application to "import" and "add" a new package, in `android/app/src/main/.../MainApplication.java`: + +```java +import im.shimo.react.prompt.RNPromptPackage; // Add new import + +public class MainApplication extends Application implements ReactApplication { + ... + + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new RNPromptPackage() // Add the package here + ); + } +} +``` + +4. Re-compile application using `react-native run-android` ### Usage From 37f3e0c99b68caec7797284799004a07cb9d0071 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Fri, 9 Mar 2018 06:44:14 -0800 Subject: [PATCH 16/31] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e093b45..1f3a1e8 100644 --- a/README.md +++ b/README.md @@ -94,9 +94,10 @@ prompt( | color | Color of the text | String | colorString or #RRGGBB or ##AARRGGBB | | buttonColor | Color of the buttons | String | colorString or #RRGGBB or ##AARRGGBB | -Valid `colorString`: `'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', and 'teal'` +#### colorString +Is one of the following: `'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', and 'teal'` -### "cust" Style (change underline, cursor, and handle color) +#### "cust" Style (change underline, cursor, and handle color) If you set this style, you can adjust the color of the "underline", "cursor", and "handles" of the input field. The default custom color is a reddish color of "#F34336". You can change this by going to `./node_modules/react-native-prompt-android/android/src/main/res/values/colors.xml` and changing the value of the `custUnderlineAndCursorAndHandleColor` field. ![Android Screen Shoot](./Example/android.png) From aa955482661b07df892b705603b375273ed034d1 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Fri, 9 Mar 2018 06:47:01 -0800 Subject: [PATCH 17/31] Update README.md --- README.md | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 1f3a1e8..d780365 100644 --- a/README.md +++ b/README.md @@ -79,27 +79,30 @@ prompt( ); ``` -## Props - -| Name | Description | Type | Default | -|---------------------|-----------------------------------------------------------------------------------|---------|--------------------------------------| -| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' | -| cancelable | | Boolean | true | -| defaultValue | Default input value | String | | -| placeholder | | String | | -| style | `'default', 'shimo', 'cust'` | String | 'default' | -| disableFullScreenUI | When in landscape mode, don't use fullscreen | Boolean | false | -| highlightColor | Color of text selection | String | colorString or #RRGGBB or ##AARRGGBB | -| placeholderColor | Color of the placeholder | String | colorString or #RRGGBB or ##AARRGGBB | -| color | Color of the text | String | colorString or #RRGGBB or ##AARRGGBB | -| buttonColor | Color of the buttons | String | colorString or #RRGGBB or ##AARRGGBB | - -#### colorString +### Options +The third argument is an object. It can have any of these keys: + +| Key | Description | Type | Default | +|---------------------|-----------------------------------------------------------------------------------|---------|------------------------------------------------------| +| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' | +| cancelable | | Boolean | true | +| defaultValue | Default input value | String | | +| placeholder | | String | | +| style | `'default', 'shimo', 'cust'` | String | 'default' | +| disableFullScreenUI | When in landscape mode, don't use fullscreen | Boolean | false | +| highlightColor | Color of text selection | String | ![colorString](#colorString) or #RRGGBB or #AARRGGBB | +| placeholderColor | Color of the placeholder | String | ![colorString](#colorString) or #RRGGBB or #AARRGGBB | +| color | Color of the text | String | ![colorString](#colorString) or #RRGGBB or #AARRGGBB | +| buttonColor | Color of the buttons | String | ![colorString](#colorString) or #RRGGBB or #AARRGGBB | + +##### colorString Is one of the following: `'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', and 'teal'` -#### "cust" Style (change underline, cursor, and handle color) +##### "cust" Style (change underline, cursor, and handle color) If you set this style, you can adjust the color of the "underline", "cursor", and "handles" of the input field. The default custom color is a reddish color of "#F34336". You can change this by going to `./node_modules/react-native-prompt-android/android/src/main/res/values/colors.xml` and changing the value of the `custUnderlineAndCursorAndHandleColor` field. +### Screenshots + ![Android Screen Shoot](./Example/android.png) ![Android Screen Shoot](./Example/ios.png) From e8092abbbe23c02583b472f032b6183a503d6860 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Fri, 9 Mar 2018 09:31:52 -0800 Subject: [PATCH 18/31] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d780365..a0b9fa6 100644 --- a/README.md +++ b/README.md @@ -90,10 +90,10 @@ The third argument is an object. It can have any of these keys: | placeholder | | String | | | style | `'default', 'shimo', 'cust'` | String | 'default' | | disableFullScreenUI | When in landscape mode, don't use fullscreen | Boolean | false | -| highlightColor | Color of text selection | String | ![colorString](#colorString) or #RRGGBB or #AARRGGBB | -| placeholderColor | Color of the placeholder | String | ![colorString](#colorString) or #RRGGBB or #AARRGGBB | -| color | Color of the text | String | ![colorString](#colorString) or #RRGGBB or #AARRGGBB | -| buttonColor | Color of the buttons | String | ![colorString](#colorString) or #RRGGBB or #AARRGGBB | +| highlightColor | Color of text selection | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | +| placeholderColor | Color of the placeholder | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | +| color | Color of the text | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | +| buttonColor | Color of the buttons | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | ##### colorString Is one of the following: `'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', and 'teal'` From a08841b0121fc82e76b1ab49f30e157e2e02f6c6 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Fri, 9 Mar 2018 15:38:10 -0800 Subject: [PATCH 19/31] Fixes https://github.com/shimohq/react-native-prompt-android/issues/24 --- .../im/shimo/react/prompt/RNPromptFragment.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java index daa2cd1..62074ef 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java @@ -12,6 +12,8 @@ import android.widget.EditText; import android.view.inputmethod.EditorInfo; import android.graphics.Color; +import android.widget.TextView; +import android.view.KeyEvent; import javax.annotation.Nullable; @@ -110,7 +112,7 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { mButtonColor = ""; } - AlertDialog alertDialog = builder.create(); + final AlertDialog alertDialog = builder.create(); // input style LayoutInflater inflater = LayoutInflater.from(activityContext); @@ -197,9 +199,17 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { } alertDialog.setView(input, 50, 15, 50, 0); - // input.setLinkTextColor(Color.parseColor("green")); - mInputText = input; + + input.setOnEditorActionListener(new TextView.OnEditorActionListener() { + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); + } + return false; + } + }); + return alertDialog; } From dd428a864880209114ff9708f76e21e9d1937aa5 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Fri, 9 Mar 2018 16:30:05 -0800 Subject: [PATCH 20/31] Fixes https://github.com/shimohq/react-native-prompt-android/issues/26 --- .../shimo/react/prompt/RNPromptFragment.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java index 62074ef..7fde40a 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java @@ -1,19 +1,19 @@ package im.shimo.react.prompt; +import android.support.v7.app.AlertDialog; +import android.os.Bundle; +import android.graphics.Color; +import android.content.Context; import android.app.Dialog; import android.app.DialogFragment; -import android.content.Context; import android.content.DialogInterface; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.view.inputmethod.InputMethodManager; import android.text.InputType; +import android.view.KeyEvent; import android.view.LayoutInflater; -import android.view.WindowManager; -import android.widget.EditText; -import android.view.inputmethod.EditorInfo; -import android.graphics.Color; import android.widget.TextView; -import android.view.KeyEvent; import javax.annotation.Nullable; @@ -201,6 +201,17 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { mInputText = input; + alertDialog.setOnShowListener(new DialogInterface.OnShowListener() + { + @Override + public void onShow(final DialogInterface dialog) + { + input.requestFocus(); + ((InputMethodManager) alertDialog.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(input, 0); + } + }); + + input.setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { @@ -216,7 +227,6 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = this.createDialog(getActivity(), getArguments()); - dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); return dialog; } From 1aac796a3124547a2adad98d204862ffc4ea9585 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Tue, 13 Mar 2018 06:57:55 -0700 Subject: [PATCH 21/31] fix typo disableFullscreenUI --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a0b9fa6..590b608 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ import im.shimo.react.prompt.RNPromptPackage; // Add new import public class MainApplication extends Application implements ReactApplication { ... - + @Override protected List getPackages() { return Arrays.asList( @@ -89,7 +89,7 @@ The third argument is an object. It can have any of these keys: | defaultValue | Default input value | String | | | placeholder | | String | | | style | `'default', 'shimo', 'cust'` | String | 'default' | -| disableFullScreenUI | When in landscape mode, don't use fullscreen | Boolean | false | +| disableFullscreenUI | When in landscape mode, don't use fullscreen | Boolean | false | | highlightColor | Color of text selection | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | | placeholderColor | Color of the placeholder | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | | color | Color of the text | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | From 37ceddd116e415ca2a9c3bc05389557d89f42e8d Mon Sep 17 00:00:00 2001 From: Noitidart Date: Tue, 13 Mar 2018 08:20:47 -0700 Subject: [PATCH 22/31] allow null buttonColor --- .../main/java/im/shimo/react/prompt/RNPromptFragment.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java index 7fde40a..f0e427d 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java @@ -108,6 +108,9 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { if (arguments.containsKey(ARG_BUTTON_COLOR)) { mButtonColor = arguments.getString(ARG_BUTTON_COLOR); + if (mButtonColor == null) { + mButtonColor = ""; + } } else { mButtonColor = ""; } @@ -234,7 +237,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { public void onStart() { super.onStart(); - if (!mButtonColor.isEmpty()) { + if (mButtonColor != null && !mButtonColor.isEmpty()) { AlertDialog d = (AlertDialog) getDialog(); d.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.parseColor(mButtonColor)); d.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.parseColor(mButtonColor)); From a3c11992e2f8ee98f79d2ac39d8867e608c9bd1c Mon Sep 17 00:00:00 2001 From: Noitidart Date: Tue, 13 Mar 2018 08:24:36 -0700 Subject: [PATCH 23/31] add screenshot with android options --- Example/android-options.png | Bin 0 -> 86926 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Example/android-options.png diff --git a/Example/android-options.png b/Example/android-options.png new file mode 100644 index 0000000000000000000000000000000000000000..f736e27576cc1dac1786ea33c5f2d36543ce2de5 GIT binary patch literal 86926 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 Date: Tue, 13 Mar 2018 08:24:50 -0700 Subject: [PATCH 24/31] add screenshot to readme --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 590b608..96a23e5 100644 --- a/README.md +++ b/README.md @@ -106,3 +106,22 @@ If you set this style, you can adjust the color of the "underline", "cursor", an ![Android Screen Shoot](./Example/android.png) ![Android Screen Shoot](./Example/ios.png) + +#### Android with options + + prompt('Edit Memo', undefined, + [ + { text:'Cancel', style:'cancel' }, + { text:'OK', onPress: text => dispatch(patchEvent(id, { memo:text })) }, + ], + { + highlightColor: '#80F34336', + color: '#212121', + buttonColor: '#000000', + defaultValue: memo, + style: 'cust' + } + ) + + +![Android Screen Shoot](./Example/android-options.png) From 3e2e89f1a4a9e782217d46157a75ca0408290c66 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Tue, 13 Mar 2018 08:27:28 -0700 Subject: [PATCH 25/31] readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 96a23e5..403d37e 100644 --- a/README.md +++ b/README.md @@ -123,5 +123,7 @@ If you set this style, you can adjust the color of the "underline", "cursor", an } ) +And to get the red colors, the field `custUnderlineAndCursorAndHandleColor` in `./node_modules/react-native-prompt-android/android/src/main/res/values/colors.xml` was updated to `#F34336` + ![Android Screen Shoot](./Example/android-options.png) From 47c5cbabe50bed1f7647f18ac38ae22ec9660257 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Tue, 13 Mar 2018 08:39:46 -0700 Subject: [PATCH 26/31] support the full color format (named, rgba, etc) thanks @jeanregisser! --- README.md | 27 ++++++++++++--------------- index.android.js | 15 ++++++++------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 403d37e..df0c672 100644 --- a/README.md +++ b/README.md @@ -82,21 +82,18 @@ prompt( ### Options The third argument is an object. It can have any of these keys: -| Key | Description | Type | Default | -|---------------------|-----------------------------------------------------------------------------------|---------|------------------------------------------------------| -| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' | -| cancelable | | Boolean | true | -| defaultValue | Default input value | String | | -| placeholder | | String | | -| style | `'default', 'shimo', 'cust'` | String | 'default' | -| disableFullscreenUI | When in landscape mode, don't use fullscreen | Boolean | false | -| highlightColor | Color of text selection | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | -| placeholderColor | Color of the placeholder | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | -| color | Color of the text | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | -| buttonColor | Color of the buttons | String | ![colorString](#colorstring) or #RRGGBB or #AARRGGBB | - -##### colorString -Is one of the following: `'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', and 'teal'` +| Key | Description | Type | Default | +|---------------------|-----------------------------------------------------------------------------------|---------|---------------------------------------------------------------------| +| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' | +| cancelable | | Boolean | true | +| defaultValue | Default input value | String | | +| placeholder | | String | | +| style | `'default', 'shimo', 'cust'` | String | 'default' | +| disableFullscreenUI | When in landscape mode, don't use fullscreen | Boolean | false | +| highlightColor | Color of text selection | String | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| placeholderColor | Color of the placeholder | String | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| color | Color of the text | String | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| buttonColor | Color of the buttons | String | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | ##### "cust" Style (change underline, cursor, and handle color) If you set this style, you can adjust the color of the "underline", "cursor", and "handles" of the input field. The default custom color is a reddish color of "#F34336". You can change this by going to `./node_modules/react-native-prompt-android/android/src/main/res/values/colors.xml` and changing the value of the `custUnderlineAndCursorAndHandleColor` field. diff --git a/index.android.js b/index.android.js index 51f19a1..0cf26f1 100644 --- a/index.android.js +++ b/index.android.js @@ -1,8 +1,9 @@ -import { - NativeModules -} from 'react-native'; +import { NativeModules } from 'react-native'; +import processColor from 'react-native/Libraries/StyleSheet/processColor'; + const PromptAndroid = NativeModules.PromptAndroid; + export type PromptType = $Enum<{ /** * Default alert with no inputs @@ -103,16 +104,16 @@ export default function prompt( if (options) { config = { ...config, - highlightColor: options.highlightColor || null, - placeholderColor: options.placeholderColor || null, - color: options.color || null, + highlightColor: options.highlightColor ? processColor(options.highlightColor) : null, + placeholderColor: options.placeholderColor ? processColor(options.placeholderColor) : null, + color: options.color ? processColor(options.color) : null, disableFullscreenUI: options.disableFullscreenUI === true, cancelable: options.cancelable !== false, type: options.type || 'default', style: options.style || 'default', defaultValue: options.defaultValue || '', placeholder: options.placeholder || null, - buttonColor: options.buttonColor || null + buttonColor: options.buttonColor ? processColor(options.buttonColor) : null }; } // At most three buttons (neutral, negative, positive). Ignore rest. From dcc7a0b22b67ec9ecb44ba95544c1d2055ee5f95 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Tue, 13 Mar 2018 08:50:58 -0700 Subject: [PATCH 27/31] remove Color.parseColor as we do processColor now --- .../im/shimo/react/prompt/RNPromptFragment.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java index f0e427d..6076ffc 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java @@ -2,7 +2,6 @@ import android.support.v7.app.AlertDialog; import android.os.Bundle; -import android.graphics.Color; import android.content.Context; import android.app.Dialog; import android.app.DialogFragment; @@ -162,7 +161,7 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { if (arguments.containsKey(ARG_HIGHLIGHT_COLOR)) { String highlightColor = arguments.getString(ARG_HIGHLIGHT_COLOR); if (highlightColor != null) { - input.setHighlightColor(Color.parseColor(highlightColor)); + input.setHighlightColor(highlightColor); } } @@ -187,7 +186,7 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { if (arguments.containsKey(ARG_COLOR)) { String color = arguments.getString(ARG_COLOR); if (color != null) { - input.setTextColor(Color.parseColor(color)); + input.setTextColor(color); } } @@ -196,7 +195,7 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { if (arguments.containsKey(ARG_PLACEHOLDER_COLOR)) { String placeholderColor = arguments.getString(ARG_PLACEHOLDER_COLOR); if (placeholderColor != null) { - input.setHintTextColor(Color.parseColor(arguments.getString(ARG_PLACEHOLDER_COLOR))); + input.setHintTextColor(arguments.getString(ARG_PLACEHOLDER_COLOR)); } } } @@ -239,9 +238,9 @@ public void onStart() { if (mButtonColor != null && !mButtonColor.isEmpty()) { AlertDialog d = (AlertDialog) getDialog(); - d.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.parseColor(mButtonColor)); - d.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.parseColor(mButtonColor)); - d.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(Color.parseColor(mButtonColor)); + d.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(mButtonColor); + d.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(mButtonColor); + d.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(mButtonColor); } } From 515e3074e933bba7414beaed05a8b1a46c685fb9 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Tue, 13 Mar 2018 10:08:23 -0700 Subject: [PATCH 28/31] swithced to Integer type for colors - tested and it compiles --- .../shimo/react/prompt/RNPromptFragment.java | 26 ++++----------- .../im/shimo/react/prompt/RNPromptModule.java | 16 +++++----- index.android.js | 32 +++++++++---------- 3 files changed, 30 insertions(+), 44 deletions(-) diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java index 6076ffc..041d776 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptFragment.java @@ -36,7 +36,7 @@ public class RNPromptFragment extends DialogFragment implements DialogInterface. private EditText mInputText; - private String mButtonColor; + private Integer mButtonColor; public enum PromptTypes { TYPE_DEFAULT("default"), @@ -106,12 +106,7 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { } if (arguments.containsKey(ARG_BUTTON_COLOR)) { - mButtonColor = arguments.getString(ARG_BUTTON_COLOR); - if (mButtonColor == null) { - mButtonColor = ""; - } - } else { - mButtonColor = ""; + mButtonColor = arguments.getInt(ARG_BUTTON_COLOR); } final AlertDialog alertDialog = builder.create(); @@ -159,10 +154,7 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { input.setInputType(type); if (arguments.containsKey(ARG_HIGHLIGHT_COLOR)) { - String highlightColor = arguments.getString(ARG_HIGHLIGHT_COLOR); - if (highlightColor != null) { - input.setHighlightColor(highlightColor); - } + input.setHighlightColor(arguments.getInt(ARG_HIGHLIGHT_COLOR)); } if (arguments.containsKey(ARG_DISABLE_FULL_SCREEN_UI)) { @@ -184,19 +176,13 @@ public Dialog createDialog(Context activityContext, Bundle arguments) { if (arguments.containsKey(ARG_COLOR)) { - String color = arguments.getString(ARG_COLOR); - if (color != null) { - input.setTextColor(color); - } + input.setTextColor(arguments.getInt(ARG_COLOR)); } if (arguments.containsKey(ARG_PLACEHOLDER)) { input.setHint(arguments.getString(ARG_PLACEHOLDER)); if (arguments.containsKey(ARG_PLACEHOLDER_COLOR)) { - String placeholderColor = arguments.getString(ARG_PLACEHOLDER_COLOR); - if (placeholderColor != null) { - input.setHintTextColor(arguments.getString(ARG_PLACEHOLDER_COLOR)); - } + input.setHintTextColor(arguments.getInt(ARG_PLACEHOLDER_COLOR)); } } alertDialog.setView(input, 50, 15, 50, 0); @@ -236,7 +222,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { public void onStart() { super.onStart(); - if (mButtonColor != null && !mButtonColor.isEmpty()) { + if (mButtonColor != null) { AlertDialog d = (AlertDialog) getDialog(); d.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(mButtonColor); d.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(mButtonColor); diff --git a/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java b/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java index 28c515b..6cea0df 100644 --- a/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java +++ b/android/src/main/java/im/shimo/react/prompt/RNPromptModule.java @@ -135,11 +135,11 @@ public void promptWithArgs(ReadableMap options, final Callback callback) { if (options.hasKey(KEY_DISABLE_FULL_SCREEN_UI)) { args.putBoolean(KEY_DISABLE_FULL_SCREEN_UI, options.getBoolean(KEY_DISABLE_FULL_SCREEN_UI)); } - if (options.hasKey(KEY_HIGHLIGHT_COLOR)) { - args.putString(KEY_HIGHLIGHT_COLOR, options.getString(KEY_HIGHLIGHT_COLOR)); + if (options.hasKey(KEY_HIGHLIGHT_COLOR) && !options.isNull(KEY_HIGHLIGHT_COLOR)) { + args.putInt(KEY_HIGHLIGHT_COLOR, options.getInt(KEY_HIGHLIGHT_COLOR)); } - if (options.hasKey(KEY_COLOR)) { - args.putString(KEY_COLOR, options.getString(KEY_COLOR)); + if (options.hasKey(KEY_COLOR) && !options.isNull(KEY_COLOR)) { + args.putInt(KEY_COLOR, options.getInt(KEY_COLOR)); } if (options.hasKey(KEY_TYPE)) { args.putString(KEY_TYPE, options.getString(KEY_TYPE)); @@ -153,11 +153,11 @@ public void promptWithArgs(ReadableMap options, final Callback callback) { if (options.hasKey(KEY_PLACEHOLDER)) { args.putString(KEY_PLACEHOLDER, options.getString(KEY_PLACEHOLDER)); } - if (options.hasKey(KEY_PLACEHOLDER_COLOR)) { - args.putString(KEY_PLACEHOLDER_COLOR, options.getString(KEY_PLACEHOLDER_COLOR)); + if (options.hasKey(KEY_PLACEHOLDER_COLOR) && !options.isNull(KEY_PLACEHOLDER_COLOR)) { + args.putInt(KEY_PLACEHOLDER_COLOR, options.getInt(KEY_PLACEHOLDER_COLOR)); } - if (options.hasKey(KEY_BUTTON_COLOR)) { - args.putString(KEY_BUTTON_COLOR, options.getString(KEY_BUTTON_COLOR)); + if (options.hasKey(KEY_BUTTON_COLOR) && !options.isNull(KEY_BUTTON_COLOR)) { + args.putInt(KEY_BUTTON_COLOR, options.getInt(KEY_BUTTON_COLOR)); } fragmentManagerHelper.showNewAlert(mIsInForeground, args, callback); } diff --git a/index.android.js b/index.android.js index 0cf26f1..34294d1 100644 --- a/index.android.js +++ b/index.android.js @@ -47,16 +47,16 @@ export type PromptStyle = $Enum<{ }>; type Options = { - disableFullscreenUI?: ?boolean; - cancelable?: ?boolean; - type?: ?PromptType; - defaultValue?: ?String; - style?: ?PromptStyle; - placeholder?: ?String; - placeholderColor?: ?String; - highlightColor?: ?String; - color?: ?String; - buttonColor?: ?String; + disableFullscreenUI?: boolean; + cancelable?: boolean; + type?: PromptType; + defaultValue?: string; + style?: PromptStyle; + placeholder?: string; + placeholderColor?: string; + highlightColor?: string; + color?: string; + buttonColor?: string; }; /** @@ -69,11 +69,11 @@ type ButtonsArray = Array<{ /** * Button label */ - text?: string, + text?: string, /** * Callback function when button pressed */ - onPress?: ?Function, + onPress?: () => void, }>; export default function prompt( @@ -104,16 +104,16 @@ export default function prompt( if (options) { config = { ...config, - highlightColor: options.highlightColor ? processColor(options.highlightColor) : null, - placeholderColor: options.placeholderColor ? processColor(options.placeholderColor) : null, - color: options.color ? processColor(options.color) : null, + highlightColor: options.highlightColor ? processColor(options.highlightColor) : options.highlightColor, + placeholderColor: options.placeholderColor ? processColor(options.placeholderColor) : options.placeholderColor, + color: options.color ? processColor(options.color) : options.color, disableFullscreenUI: options.disableFullscreenUI === true, cancelable: options.cancelable !== false, type: options.type || 'default', style: options.style || 'default', defaultValue: options.defaultValue || '', placeholder: options.placeholder || null, - buttonColor: options.buttonColor ? processColor(options.buttonColor) : null + buttonColor: options.buttonColor ? processColor(options.buttonColor) : options.buttonColor }; } // At most three buttons (neutral, negative, positive). Ignore rest. From e7248728e1273c31218b3825d0a6586ab341a47f Mon Sep 17 00:00:00 2001 From: Noitidart Date: Tue, 13 Mar 2018 10:49:04 -0700 Subject: [PATCH 29/31] better readme --- README.md | 51 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index df0c672..81d25a1 100644 --- a/README.md +++ b/README.md @@ -79,21 +79,48 @@ prompt( ); ``` +### API + +#### `prompt` + +###### Android + static showPopupMenu( + title?: string, + message?: string, + positiveCallbackOrButtons: ()=>void | [ButtonPositive] | [ButtonNegative, ButtonPositive] | [ButtonNeutral, ButtonNegative, ButtonPositive], + options: { + disableFullscreenUI?: boolean, + cancelable?: boolean, + type?: 'default' | 'plain-text' | 'secure-text' | 'numeric' | 'email-address' | 'phone-pad', + defaultValue?: string, + style?: 'default' | 'shimo' | 'cust', + placeholder?: string, + placeholderColor?: string, + highlightColor?: string, + color?: string, + buttonColor?: string + } + ): void + +###### iOS + +TODO: + ### Options The third argument is an object. It can have any of these keys: -| Key | Description | Type | Default | -|---------------------|-----------------------------------------------------------------------------------|---------|---------------------------------------------------------------------| -| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | String | 'default' | -| cancelable | | Boolean | true | -| defaultValue | Default input value | String | | -| placeholder | | String | | -| style | `'default', 'shimo', 'cust'` | String | 'default' | -| disableFullscreenUI | When in landscape mode, don't use fullscreen | Boolean | false | -| highlightColor | Color of text selection | String | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | -| placeholderColor | Color of the placeholder | String | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | -| color | Color of the text | String | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | -| buttonColor | Color of the buttons | String | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| Key | Description | Type | Default | +|---------------------|---------------------------------------------------------------------------|---------|---------------------------------------------------------------------| +| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | string | 'default' | +| cancelable | Android only. If tapping outside of the alert box should cause dismiss. | boolean | true | +| defaultValue | Default input value | string | | +| placeholder | String in input that will be rendered when empty. | string | | +| style | `'default', 'shimo', 'cust'` | string | 'default' | +| disableFullscreenUI | When in landscape mode, don't use fullscreen | boolean | false | +| highlightColor | Color of text selection | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| placeholderColor | Color of the placeholder in input field | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| color | Color of the text in input field | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| buttonColor | Color of the buttons | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | ##### "cust" Style (change underline, cursor, and handle color) If you set this style, you can adjust the color of the "underline", "cursor", and "handles" of the input field. The default custom color is a reddish color of "#F34336". You can change this by going to `./node_modules/react-native-prompt-android/android/src/main/res/values/colors.xml` and changing the value of the `custUnderlineAndCursorAndHandleColor` field. From 88ea270de0376085d2a9ccc03ad4483fd9eb33e6 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Fri, 23 Mar 2018 10:56:41 -0700 Subject: [PATCH 30/31] added android options of onDismiss and onAny - closes https://github.com/shimohq/react-native-prompt-android/issues/34 --- README.md | 37 ++++++++++++++++++++++------------- index.android.js | 50 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 65 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 81d25a1..5d0156a 100644 --- a/README.md +++ b/README.md @@ -109,18 +109,20 @@ TODO: ### Options The third argument is an object. It can have any of these keys: -| Key | Description | Type | Default | -|---------------------|---------------------------------------------------------------------------|---------|---------------------------------------------------------------------| -| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | string | 'default' | -| cancelable | Android only. If tapping outside of the alert box should cause dismiss. | boolean | true | -| defaultValue | Default input value | string | | -| placeholder | String in input that will be rendered when empty. | string | | -| style | `'default', 'shimo', 'cust'` | string | 'default' | -| disableFullscreenUI | When in landscape mode, don't use fullscreen | boolean | false | -| highlightColor | Color of text selection | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | -| placeholderColor | Color of the placeholder in input field | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | -| color | Color of the text in input field | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | -| buttonColor | Color of the buttons | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| Key | Description | Type | Default | +|---------------------|---------------------------------------------------------------------------|----------------------|---------------------------------------------------------------------| +| type | Text input type: `'numeric', 'secure-text', 'phone-pad', 'email-address'` | string | 'default' | +| cancelable | Android only. If tapping outside of the alert box should cause dismiss. | boolean | true | +| defaultValue | Default input value | string | | +| placeholder | String in input that will be rendered when empty. | string | | +| style | `'default', 'shimo', 'cust'` | string | 'default' | +| disableFullscreenUI | When in landscape mode, don't use fullscreen | boolean | false | +| highlightColor | Color of text selection | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| placeholderColor | Color of the placeholder in input field | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| color | Color of the text in input field | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| buttonColor | Color of the buttons | string | ![Color](#https://facebook.github.io/react-native/docs/colors.html) | +| onDismiss | Callback triggered when prompt is dismissed | () => void | | +| onAny | Callback triggered when any action happens | PromptAction => void | | ##### "cust" Style (change underline, cursor, and handle color) If you set this style, you can adjust the color of the "underline", "cursor", and "handles" of the input field. The default custom color is a reddish color of "#F34336". You can change this by going to `./node_modules/react-native-prompt-android/android/src/main/res/values/colors.xml` and changing the value of the `custUnderlineAndCursorAndHandleColor` field. @@ -143,7 +145,16 @@ If you set this style, you can adjust the color of the "underline", "cursor", an color: '#212121', buttonColor: '#000000', defaultValue: memo, - style: 'cust' + style: 'cust', + onDismiss: () => console.log('prompt was dismissed') + onAny: action => { + switch(action) { + case prompt.dismissedAction: return console.log('onAny says dismissed'); + case prompt.positiveAction: return console.log('onAny says positive button clicked'); + case prompt.negativeAction: return console.log('onAny says negative button clicked'); + case prompt.neutralAction: return console.log('onAny says neutral button clicked'); + } + } } ) diff --git a/index.android.js b/index.android.js index 34294d1..18124b7 100644 --- a/index.android.js +++ b/index.android.js @@ -3,7 +3,6 @@ import processColor from 'react-native/Libraries/StyleSheet/processColor'; const PromptAndroid = NativeModules.PromptAndroid; - export type PromptType = $Enum<{ /** * Default alert with no inputs @@ -46,6 +45,12 @@ export type PromptStyle = $Enum<{ 'cust': string }>; +export type PromptAction = + | 'dismissedAction' + | 'positiveAction' + | 'negativeAction' + | 'neutralAction'; + type Options = { disableFullscreenUI?: boolean; cancelable?: boolean; @@ -57,6 +62,8 @@ type Options = { highlightColor?: string; color?: string; buttonColor?: string; + onAny?: PromptAction => void, + onDismiss: () => void }; /** @@ -76,6 +83,10 @@ type ButtonsArray = Array<{ onPress?: () => void, }>; +prompt.dismissedAction = 'dismissedAction'; +prompt.positiveAction = 'positiveAction'; +prompt.negativeAction = 'negativeAction'; +prompt.neutralAction = 'neutralAction'; export default function prompt( title: ?string, message?: ?string, @@ -139,15 +150,36 @@ export default function prompt( PromptAndroid.promptWithArgs( config, (action, buttonKey, input) => { - if (action !== PromptAndroid.buttonClicked) { - return; + if (action === PromptAndroid.dismissed) { + options.onDismiss && options.onDismiss(); + } else if (action === PromptAndroid.buttonClicked) { + switch (buttonKey) { + case PromptAndroid.buttonNeutral: + buttonNeutral.onPress && buttonNeutral.onPress(input); + break; + case PromptAndroid.buttonNegative: + buttonNegative.onPress && buttonNegative.onPress(); + break; + case PromptAndroid.buttonPositive: + buttonPositive.onPress && buttonPositive.onPress(input); + break; + // no default + } } - if (buttonKey === PromptAndroid.buttonNeutral) { - buttonNeutral.onPress && buttonNeutral.onPress(input); - } else if (buttonKey === PromptAndroid.buttonNegative) { - buttonNegative.onPress && buttonNegative.onPress(); - } else if (buttonKey === PromptAndroid.buttonPositive) { - buttonPositive.onPress && buttonPositive.onPress(input); + + if (options.onAny) { + let actionText; + if (action === PromptAndroid.buttonClicked) { + switch (buttonKey) { + case PromptAndroid.buttonNeutral: actionText = prompt.neutralAction; break; + case PromptAndroid.buttonPositive: actionText = prompt.positiveAction; break; + case PromptAndroid.buttonNegative: actionText = prompt.negativeAction; break; + } + } else if (action === PromptAndroid.dismissed) { + actionText = prompt.dismissedAction; + } + + options.onAny(actionText); } } ); From 2f428e677c984aa59676b131e31e5dca8bef2eb3 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Fri, 23 Mar 2018 10:57:46 -0700 Subject: [PATCH 31/31] fixed readme typo highlightColor AARRGGBB to rgba --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d0156a..925cf23 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ If you set this style, you can adjust the color of the "underline", "cursor", an { text:'OK', onPress: text => dispatch(patchEvent(id, { memo:text })) }, ], { - highlightColor: '#80F34336', + highlightColor: 'rgba(243, 67, 54, 0.5)', color: '#212121', buttonColor: '#000000', defaultValue: memo,