From c4664fed17d97b78c7fc7c215b62e7ed28bdc537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskari=20Lepp=C3=A4aho?= Date: Thu, 24 Aug 2017 16:32:10 +0300 Subject: [PATCH 01/64] Rename classes.jar to UnityPlayer.jar Seems like classes.jar name might have been causing some trouble when making the build in Unity. --- src/androidProj/nativeeditplugin/build.gradle | 4 ++-- .../libs/{classes.jar => UnityPlayer.jar} | Bin 2 files changed, 2 insertions(+), 2 deletions(-) rename src/androidProj/nativeeditplugin/libs/{classes.jar => UnityPlayer.jar} (100%) diff --git a/src/androidProj/nativeeditplugin/build.gradle b/src/androidProj/nativeeditplugin/build.gradle index fa59dfa..bf1e273 100644 --- a/src/androidProj/nativeeditplugin/build.gradle +++ b/src/androidProj/nativeeditplugin/build.gradle @@ -36,8 +36,8 @@ task clearJar(type: Delete) { task makeJar(type: Copy) { from('build/intermediates/bundles/release/') into('build/outputs/') - include('classes.jar') - rename ('classes.jar', 'nativeeditplugin.jar') + include('UnityPlayer.jar') + rename ('UnityPlayer.jar', 'nativeeditplugin.jar') } makeJar.dependsOn(clearJar, build) \ No newline at end of file diff --git a/src/androidProj/nativeeditplugin/libs/classes.jar b/src/androidProj/nativeeditplugin/libs/UnityPlayer.jar similarity index 100% rename from src/androidProj/nativeeditplugin/libs/classes.jar rename to src/androidProj/nativeeditplugin/libs/UnityPlayer.jar From a293f510ff4122a9d01c41fe0772912409fcfbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskari=20Lepp=C3=A4aho?= Date: Thu, 24 Aug 2017 16:53:11 +0300 Subject: [PATCH 02/64] Don't include the UnityPlayer.jar in the build It's only required for building and will be provided by Unity when building the Android apk from there. --- src/androidProj/nativeeditplugin/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/androidProj/nativeeditplugin/build.gradle b/src/androidProj/nativeeditplugin/build.gradle index bf1e273..b67b8b6 100644 --- a/src/androidProj/nativeeditplugin/build.gradle +++ b/src/androidProj/nativeeditplugin/build.gradle @@ -25,7 +25,7 @@ repositories { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + provided files('./libs/UnityPlayer.jar') compile 'com.android.support:appcompat-v7:25.1.0' } From 820dd7ab418d573aeda7b2f7e4047005b7ced4f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskari=20Lepp=C3=A4aho?= Date: Thu, 24 Aug 2017 17:12:12 +0300 Subject: [PATCH 03/64] Remove custom activity Not required anymore as Unity fixed the problem on their end. --- demo/Assets/Plugins.meta | 9 ------ demo/Assets/Plugins/Android.meta | 7 ----- .../Plugins/Android/AndroidManifest.xml | 30 ------------------- .../Plugins/Android/AndroidManifest.xml.meta | 6 ---- .../Plugins/Android/AndroidManifest.xml | 2 +- .../bkmin/android/UnityPlayerNotOnTop.java | 24 --------------- .../android/UnityPlayerNotOnTopActivity.java | 20 ------------- 7 files changed, 1 insertion(+), 97 deletions(-) delete mode 100644 demo/Assets/Plugins.meta delete mode 100644 demo/Assets/Plugins/Android.meta delete mode 100644 demo/Assets/Plugins/Android/AndroidManifest.xml delete mode 100644 demo/Assets/Plugins/Android/AndroidManifest.xml.meta delete mode 100644 src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/UnityPlayerNotOnTop.java delete mode 100644 src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/UnityPlayerNotOnTopActivity.java diff --git a/demo/Assets/Plugins.meta b/demo/Assets/Plugins.meta deleted file mode 100644 index b440888..0000000 --- a/demo/Assets/Plugins.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 43ed4bbb5a5d3413fbabfb45a14b2fc9 -folderAsset: yes -timeCreated: 1430960228 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/demo/Assets/Plugins/Android.meta b/demo/Assets/Plugins/Android.meta deleted file mode 100644 index 716eb2f..0000000 --- a/demo/Assets/Plugins/Android.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 72c849c8861e341128c79b4e08f88147 -folderAsset: yes -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/demo/Assets/Plugins/Android/AndroidManifest.xml b/demo/Assets/Plugins/Android/AndroidManifest.xml deleted file mode 100644 index a2a2049..0000000 --- a/demo/Assets/Plugins/Android/AndroidManifest.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/demo/Assets/Plugins/Android/AndroidManifest.xml.meta b/demo/Assets/Plugins/Android/AndroidManifest.xml.meta deleted file mode 100644 index f622964..0000000 --- a/demo/Assets/Plugins/Android/AndroidManifest.xml.meta +++ /dev/null @@ -1,6 +0,0 @@ -fileFormatVersion: 2 -guid: 0c193a17dd00d4eafb043a79cc8e1323 -TextScriptImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml b/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml index a2a2049..5d36a8c 100644 --- a/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml +++ b/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml @@ -17,7 +17,7 @@ android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true"> - diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/UnityPlayerNotOnTop.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/UnityPlayerNotOnTop.java deleted file mode 100644 index 7beea89..0000000 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/UnityPlayerNotOnTop.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.bkmin.android; - -import com.unity3d.player.*; -import android.content.ContextWrapper; -import android.view.SurfaceView; -import android.view.View; -import android.util.Log; - -public class UnityPlayerNotOnTop - extends UnityPlayer -{ - public UnityPlayerNotOnTop(ContextWrapper contextwrapper) - { - super(contextwrapper); - } - - public void addView(View child) - { - if (child instanceof SurfaceView) { - ((SurfaceView)child).setZOrderOnTop(false); - } - super.addView(child); - } -} \ No newline at end of file diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/UnityPlayerNotOnTopActivity.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/UnityPlayerNotOnTopActivity.java deleted file mode 100644 index a2570e9..0000000 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/UnityPlayerNotOnTopActivity.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.bkmin.android; - -import com.unity3d.player.*; -import android.os.Bundle; -import android.util.Log; - -public class UnityPlayerNotOnTopActivity - extends UnityPlayerActivity -{ - @Override - public void onCreate(Bundle bundle) - { - requestWindowFeature(1); - super.onCreate(bundle); - getWindow().setFormat(2); - mUnityPlayer = new UnityPlayerNotOnTop(this); - setContentView(mUnityPlayer); - mUnityPlayer.requestFocus(); - } -} \ No newline at end of file From 28741dafe7cf9ad6c78f7bd6fb2506001bcf70df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskari=20Lepp=C3=A4aho?= Date: Thu, 24 Aug 2017 17:15:37 +0300 Subject: [PATCH 04/64] Upgrade gradle Had an error for not finding JAVA_HOME even though the variable should've been set. Upgrading gradle seemed to fix the problem. --- src/androidProj/build.gradle | 2 +- src/androidProj/gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/androidProj/build.gradle b/src/androidProj/build.gradle index d3ff69d..b193299 100644 --- a/src/androidProj/build.gradle +++ b/src/androidProj/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.0' + classpath 'com.android.tools.build:gradle:2.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/src/androidProj/gradle/wrapper/gradle-wrapper.properties b/src/androidProj/gradle/wrapper/gradle-wrapper.properties index 0c71e76..3865021 100644 --- a/src/androidProj/gradle/wrapper/gradle-wrapper.properties +++ b/src/androidProj/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Apr 10 15:27:10 PDT 2013 +#Thu Aug 24 17:14:18 EEST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip From 0be0f395f583300418d7ab777fec7b85e02dab13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskari=20Lepp=C3=A4aho?= Date: Thu, 24 Aug 2017 17:24:47 +0300 Subject: [PATCH 05/64] Add instructions for building the android project --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 7e0977a..dae97fd 100644 --- a/README.md +++ b/README.md @@ -28,3 +28,10 @@ This means you don't need a separate 'Unity' Input box and you can use all nativ 1. NativeEditBox will work with delegate defined in your Unity UI InputField, `On Value Change` and `End Edit` 2. It's open source and free to use/redistribute! 3. Please refer to `demo` Unity project. + +## Building the Android plugin +1. Open the `src/androidProj` directory in AndroidStudio. +2. Select View -> Tool Windows -> Gradle in AndroidStudio. +3. In Gradle run the :nativeeditplugin -> other -> makeJar task. +4. It's a bit confusing but the task seems to generate .aar files (even though it was called makeJar, not sure what's up with that) in the `src/androidProj/nativeeditplugin/build/outputs/aar` directory. +5. To test in the demo Unity project copy the `nativeeditplugin-release.aar` file (from the output directory) to the `release\NativeEditPlugin\Plugins\Android` directory. This file is symlinked to the Unity demo project. \ No newline at end of file From 33d0e68e44a4ab4705de7d44efcec6743c9ae7a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskari=20Lepp=C3=A4aho?= Date: Thu, 24 Aug 2017 17:28:52 +0300 Subject: [PATCH 06/64] Explain when Android build is required --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index dae97fd..b5bba75 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ This means you don't need a separate 'Unity' Input box and you can use all nativ 3. Please refer to `demo` Unity project. ## Building the Android plugin +If you want to tinker with the project yourself you need to build the Android project again in AndroidStudio (for iOS you can just modify the Objective-C code and it will get built at the same time as the Unity project). + 1. Open the `src/androidProj` directory in AndroidStudio. 2. Select View -> Tool Windows -> Gradle in AndroidStudio. 3. In Gradle run the :nativeeditplugin -> other -> makeJar task. From 906eea80ad9069f188b57a2f1a48442655eacf0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskari=20Lepp=C3=A4aho?= Date: Thu, 24 Aug 2017 17:30:11 +0300 Subject: [PATCH 07/64] Remove Activity workaround instructions --- README.md | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index b5bba75..574ea5a 100644 --- a/README.md +++ b/README.md @@ -3,26 +3,10 @@ Unity Native Input Plugin for both iOS and Android (Unity UI InputField compatib This means you don't need a separate 'Unity' Input box and you can use all native text functions such as `Select`, `Copy` and `Paste` ## Usage -1. Simply copy the files in `release/NativeEditPlugin` into your existing unity project asset folder. -2. If using Unity >= 5.6 make sure that your Plugins/Android/AndroidManifest.xml defines - ``` - - ``` - instead of - ``` - - ``` - Note that there can be multiple Android manifests in a Unity project (if you have multiple Android plugins) and Unity merges them to a single manifest when building. The `activity` on the manifest closest to the root level of `Plugins/Android` directory seems to override definitions in other manifests so make sure to modify that manifest - - If another plugin you're using is overriding the `UnityPlayerActivity` and the input field appears invisible you need to modify the overriding `UnityPlayerActivity` so that it doesn't appear on top of native views, see https://github.com/YousicianGit/UnityNativeEdit/issues/34. - - You can refer to sample `AndroidManifest.xml` in `/Plugings/Android` folder. - -3. Make empty Gameobject and attach ```PluginMsgHandler``` to your new GameObject -4. Attach ```NativeEditBox``` script to your UnityUI ```InputField```object. -5. Build and run on your android or ios device! +1. Simply copy the files in `release/NativeEditPlugin` into your existing unity project asset folder. +2. Make empty Gameobject and attach ```PluginMsgHandler``` to your new GameObject +3. Attach ```NativeEditBox``` script to your UnityUI ```InputField```object. +4. Build and run on your android or ios device! ## Etc 1. NativeEditBox will work with delegate defined in your Unity UI InputField, `On Value Change` and `End Edit` From 80d26bba85b57b86a98c15b0e15f07317f3e8093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskari=20Lepp=C3=A4aho?= Date: Thu, 24 Aug 2017 17:34:56 +0300 Subject: [PATCH 08/64] Don't include UnityPlayer.jar in the jar It's provided by Unity anyway. --- src/androidProj/nativeeditplugin/build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/androidProj/nativeeditplugin/build.gradle b/src/androidProj/nativeeditplugin/build.gradle index b67b8b6..216520d 100644 --- a/src/androidProj/nativeeditplugin/build.gradle +++ b/src/androidProj/nativeeditplugin/build.gradle @@ -36,8 +36,6 @@ task clearJar(type: Delete) { task makeJar(type: Copy) { from('build/intermediates/bundles/release/') into('build/outputs/') - include('UnityPlayer.jar') - rename ('UnityPlayer.jar', 'nativeeditplugin.jar') } makeJar.dependsOn(clearJar, build) \ No newline at end of file From 58f7fda765f33079fe525a1bac9d6fd7dc824a66 Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Thu, 24 May 2018 17:22:56 +0300 Subject: [PATCH 09/64] Fixed keyboard hiding with Unity 2018.1 --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h | 2 +- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h index 6c0d3ce..7a68594 100644 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h @@ -39,6 +39,6 @@ +(JsonObject*) processRecvJsonMsg:(int)nSenderId msg:(JsonObject*) jsonMsg; +(void) finalizeEditBox; --(void) showKeyboard:(bool)isShow; +-(void) hideKeyboard; -(BOOL) IsFocused; @end diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 87b5ef0..a589a7c 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -37,7 +37,7 @@ -(void) tapAction:(id) sender { if ([eb IsFocused]) { - [eb showKeyboard:NO]; + [eb hideKeyboard]; } } } @@ -427,7 +427,7 @@ -(void) setText:(JsonObject*)json -(IBAction) doneClicked:(id)sender { - [self showKeyboard:false]; + [self hideKeyboard]; } -(int) getLineCount @@ -442,7 +442,6 @@ -(int) getLineCount return 0; } - -(void) remove { [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -482,13 +481,14 @@ -(bool) isFocused return editView.isFirstResponder; } --(void) showKeyboard:(bool)isShow +-(void) hideKeyboard { - [viewController.view endEditing:(isShow ? YES : NO)]; + [editView resignFirstResponder]; } + -(void) setVisible:(bool)isVisible { - editView.hidden = (isVisible ? NO : YES); + editView.hidden = !isVisible; } -(void) onTextChange:(NSString*) text From 1fb60b473c0bba4948ade58a649c16ca740d84bb Mon Sep 17 00:00:00 2001 From: Sakari Bergen Date: Thu, 7 Jun 2018 15:38:29 +0300 Subject: [PATCH 10/64] Fix warning about non-root objects not being able to use DontDestroyOnLoad --- release/NativeEditPlugin/scripts/PluginMsgHandler.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/release/NativeEditPlugin/scripts/PluginMsgHandler.cs b/release/NativeEditPlugin/scripts/PluginMsgHandler.cs index 46cdc79..44f36a5 100644 --- a/release/NativeEditPlugin/scripts/PluginMsgHandler.cs +++ b/release/NativeEditPlugin/scripts/PluginMsgHandler.cs @@ -81,7 +81,13 @@ void Awake() return; } instance = gameObject; - DontDestroyOnLoad(gameObject); + + // If instantiated in a non-root object (e.g. Zenject ProjectContext subcontainer), + // Don't use DontDestroyOnLoad + if (gameObject.transform.parent == null) + { + DontDestroyOnLoad(gameObject); + } int tempRandom = (int) UnityEngine.Random.Range(0, 10000.0f); this.name = DEFAULT_NAME + tempRandom.ToString(); From d5dad6a175b2757cdd2e88f41042affa85236540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Wed, 11 Jul 2018 17:51:17 +0300 Subject: [PATCH 11/64] Adds begin editing event to iOS --- .../Plugins/iOS/EditBox_iOS.h | 1 + .../Plugins/iOS/EditBox_iOS.m | 40 ++++++++++++++++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h index 7a68594..716ec30 100644 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h @@ -13,6 +13,7 @@ #define MSG_SET_FOCUS @"SetFocus" #define MSG_SET_VISIBLE @"SetVisible" #define MSG_TEXT_CHANGE @"TextChange" +#define MSG_TEXT_BEGIN_EDIT @"TextBeginEdit" #define MSG_TEXT_END_EDIT @"TextEndEdit" #define MSG_RETURN_PRESSED @"ReturnPressed" diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index a589a7c..df7f863 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -491,6 +491,8 @@ -(void) setVisible:(bool)isVisible editView.hidden = !isVisible; } +#pragma mark - Common callbacks + -(void) onTextChange:(NSString*) text { JsonObject* jsonToUnity = [[JsonObject alloc] init]; @@ -500,6 +502,14 @@ -(void) onTextChange:(NSString*) text [self sendJsonToUnity:jsonToUnity]; } +-(void) onTextEditBegin +{ + JsonObject* jsonToUnity = [[JsonObject alloc] init]; + + [jsonToUnity setString:@"msg" value:MSG_TEXT_BEGIN_EDIT]; + [self sendJsonToUnity:jsonToUnity]; +} + -(void) onTextEditEnd:(NSString*) text { JsonObject* jsonToUnity = [[JsonObject alloc] init]; @@ -509,9 +519,11 @@ -(void) onTextEditEnd:(NSString*) text [self sendJsonToUnity:jsonToUnity]; } --(void) textViewDidChange:(UITextView *)textView +#pragma mark - UITextViewDelegate + +- (void)textViewDidBeginEditing:(UITextView *)textView { - [self onTextChange:textView.text]; + [self onTextEditBegin]; } -(void) textViewDidEndEditing:(UITextView *)textView @@ -519,6 +531,23 @@ -(void) textViewDidEndEditing:(UITextView *)textView [self onTextEditEnd:textView.text]; } +-(void) textViewDidChange:(UITextView *)textView +{ + [self onTextChange:textView.text]; +} + +#pragma mark - UITextFieldDelegate + +- (void)textFieldDidBeginEditing:(UITextField *)textField +{ + [self onTextEditBegin]; +} + +- (void)textFieldDidEndEditing:(UITextField *)textField +{ + [self onTextEditEnd:textField.text]; +} + - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (![editView isFirstResponder]) return YES; @@ -543,6 +572,8 @@ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRang return YES; } +#pragma mark - Other targets + -(void) textFieldDidChange :(UITextField *)theTextField{ [self onTextChange:theTextField.text]; } @@ -554,13 +585,12 @@ -(void) keyboardWillShow:(NSNotification *)notification NSDictionary* keyboardInfo = [notification userInfo]; NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey]; rectKeyboardFrame = [keyboardFrameBegin CGRectValue]; - } -(void) keyboardWillHide:(NSNotification*)notification { - if (![editView isFirstResponder]) return; - + if (![editView isFirstResponder]) + return; } -(float) getKeyboardheight From 9905e5f8f3c32427f0d2f5e046b99c9afa644050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Wed, 11 Jul 2018 18:03:34 +0300 Subject: [PATCH 12/64] Adds event to trigger when the message begins editing --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 2ed4364..6800a62 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -69,6 +69,7 @@ public enum ReturnKeyType public bool updateRectEveryFrame; public bool useInputFieldFont; public UnityEngine.Events.UnityEvent OnReturnPressed; + public UnityEngine.Events.UnityEvent OnBeginEditing; private bool bNativeEditCreated = false; @@ -84,6 +85,7 @@ public enum ReturnKeyType private const string MSG_SET_FOCUS = "SetFocus"; private const string MSG_SET_VISIBLE = "SetVisible"; private const string MSG_TEXT_CHANGE = "TextChange"; + private const string MSG_TEXT_BEGIN_EDIT = "TextBeginEdit"; private const string MSG_TEXT_END_EDIT = "TextEndEdit"; // to fix bug Some keys 'back' & 'enter' are eaten by unity and never arrive at plugin private const string MSG_ANDROID_KEY_DOWN = "AndroidKeyDown"; @@ -269,6 +271,11 @@ private IEnumerator PluginsMessageRoutine(JsonObject jsonMsg) string text = jsonMsg.GetString("text"); this.onTextChange(text); } + else if (msg.Equals(MSG_TEXT_BEGIN_EDIT)) + { + if (this.OnBeginEditing != null) + this.OnBeginEditing.Invoke(); + } else if (msg.Equals(MSG_TEXT_END_EDIT)) { string text = jsonMsg.GetString("text"); From 3cd460da22810cfb7fc233d5d7526ed12282caa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Wed, 11 Jul 2018 18:08:20 +0300 Subject: [PATCH 13/64] Adds begin event --- .../main/java/com/bkmin/android/EditBox.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java index 99661ef..6de815d 100644 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java @@ -58,6 +58,7 @@ public void onWindowFocusChanged(boolean hasWindowFocus) private static final String MSG_SET_FOCUS = "SetFocus"; private static final String MSG_SET_VISIBLE = "SetVisible"; private static final String MSG_TEXT_CHANGE = "TextChange"; + private static final String MSG_TEXT_BEGIN_EDIT = "TextBeginEdit"; private static final String MSG_TEXT_END_EDIT = "TextEndEdit"; private static final String MSG_ANDROID_KEY_DOWN = "AndroidKeyDown"; private static final String MSG_RETURN_PRESSED = "ReturnPressed"; @@ -319,17 +320,16 @@ else if (returnKeyType.equals("Done")) { @Override public void onFocusChange(View v, boolean hasFocus) { - if (!hasFocus) { - // your action here - JSONObject msgTextEndJSON = new JSONObject(); - try - { - msgTextEndJSON.put("msg", MSG_TEXT_END_EDIT); - msgTextEndJSON.put("text", eb.GetText()); - } - catch(JSONException e) {} - eb.SendJsonToUnity(msgTextEndJSON); + // your action here + JSONObject msgTextEndJSON = new JSONObject(); + try + { + msgTextEndJSON.put("msg", hasFocus ? MSG_TEXT_BEGIN_EDIT : MSG_TEXT_END_EDIT); + msgTextEndJSON.put("text", eb.GetText()); } + catch(JSONException e) {} + eb.SendJsonToUnity(msgTextEndJSON); + SetFocus(hasFocus); } }); From 40c0d9670c1b0eed8e10daa31744ba99e608f9b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Wed, 11 Jul 2018 18:34:19 +0300 Subject: [PATCH 14/64] New compilation AAR --- .../Android/nativeeditplugin-release.aar | Bin 0 -> 29649 bytes .../Plugins/Android/nativeeditplugin.jar | Bin 18123 -> 0 bytes .../Plugins/Android/nativeeditplugin.jar.meta | 33 ------------------ 3 files changed, 33 deletions(-) create mode 100644 release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar delete mode 100644 release/NativeEditPlugin/Plugins/Android/nativeeditplugin.jar delete mode 100644 release/NativeEditPlugin/Plugins/Android/nativeeditplugin.jar.meta diff --git a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..a12706eb6e2e65f913d928c5b67824d2773dc412 GIT binary patch literal 29649 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 O@^9A8#BT=x!2bc$_}VD| literal 0 HcmV?d00001 diff --git a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin.jar b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin.jar deleted file mode 100644 index 561ff7d1fec3e87fdfd2186ef420df5a0a38f6ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18123 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 S{sDsc`SJbiovi;g%>F-9W(0@; diff --git a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin.jar.meta b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin.jar.meta deleted file mode 100644 index 090a9bf..0000000 --- a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin.jar.meta +++ /dev/null @@ -1,33 +0,0 @@ -fileFormatVersion: 2 -guid: ca56f230e8554c146818642d411d9183 -timeCreated: 1459854746 -licenseType: Free -PluginImporter: - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - data: - first: - Android: Android - second: - enabled: 1 - settings: {} - data: - first: - Any: - second: - enabled: 0 - settings: {} - data: - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: From f7735b8f571ce375ce1b0d2ea4e71be692769680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Thu, 2 Aug 2018 15:43:28 +0300 Subject: [PATCH 15/64] Stops using a global variable for the character limit --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h | 2 ++ release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h index 716ec30..611376f 100644 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h @@ -36,6 +36,8 @@ int tag; } +@property (nonatomic, assign) int maxLength; + +(void) initializeEditBox:(UIViewController*) _unityViewController unityName:(const char*) unityName; +(JsonObject*) processRecvJsonMsg:(int)nSenderId msg:(JsonObject*) jsonMsg; +(void) finalizeEditBox; diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index df7f863..e26bfda 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -10,7 +10,6 @@ EditBoxHoldView* viewPlugin = nil; char g_unityName[64]; -int characterLimit; bool approxEqualFloat(float x, float y) { @@ -203,7 +202,7 @@ -(void) create:(JsonObject*)json float width = [json getFloat:@"width"] * viewController.view.bounds.size.width; float height = [json getFloat:@"height"] * viewController.view.bounds.size.height; - characterLimit = [json getInt:@"characterLimit"]; + [self setMaxLength:[json getInt:@"characterLimit"]]; float textColor_r = [json getFloat:@"textColor_r"]; float textColor_g = [json getFloat:@"textColor_g"]; @@ -566,8 +565,8 @@ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRang } NSUInteger newLength = [textField.text length] + [string length] - range.length; - if(characterLimit > 0) - return newLength <= characterLimit; + if([self maxLength] > 0) + return newLength <= [self maxLength]; else return YES; } From d5b63b434839243ee8345d33b6e5c789cf019dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Thu, 2 Aug 2018 17:58:05 +0300 Subject: [PATCH 16/64] Uses correct text (from the text field --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 6800a62..185dbfe 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -194,7 +194,7 @@ private IEnumerator InitializeOnNextFrame() this.PrepareNativeEdit(); #if (UNITY_IPHONE || UNITY_ANDROID) && !UNITY_EDITOR this.CreateNativeEdit(); - this.SetTextNative(this.objUnityText.text); + this.SetTextNative(this.objUnityInput.text); objUnityInput.placeholder.gameObject.SetActive(false); objUnityText.enabled = false; From eee6eaca75d197678016e3af2fd52c17fbb9469a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Mon, 1 Oct 2018 13:16:35 +0300 Subject: [PATCH 17/64] Adds font size to Set Rect message --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 185dbfe..c5347ac 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -391,6 +391,10 @@ public void SetRectNative(RectTransform rectTrans) jsonMsg["width"] = rectScreen.width / Screen.width; jsonMsg["height"] = rectScreen.height / Screen.height; + var fontRectHeightRatio = rectScreen.height / this.objUnityText.rectTransform.rect.height; + var fontSize = this.objUnityText.fontSize * fontRectHeightRatio; + jsonMsg["fontSize"] = fontSize; + this.SendPluginMsg(jsonMsg); } From 1b2320490aba4d1a6ece2938546220532f34eed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Mon, 1 Oct 2018 13:33:37 +0300 Subject: [PATCH 18/64] Adds message to update the font size --- .../Plugins/iOS/EditBox_iOS.h | 1 + .../Plugins/iOS/EditBox_iOS.m | 19 +++++++++++++++++ .../NativeEditPlugin/scripts/NativeEditBox.cs | 11 +++++----- .../main/java/com/bkmin/android/EditBox.java | 21 +++++++++++++++++++ 4 files changed, 47 insertions(+), 5 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h index 611376f..77569b5 100644 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.h @@ -10,6 +10,7 @@ #define MSG_SET_TEXT @"SetText" #define MSG_GET_TEXT @"GetText" #define MSG_SET_RECT @"SetRect" +#define MSG_SET_TEXTSIZE @"SetTextSize" #define MSG_SET_FOCUS @"SetFocus" #define MSG_SET_VISIBLE @"SetVisible" #define MSG_TEXT_CHANGE @"TextChange" diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index e26bfda..3d0f26a 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -153,6 +153,10 @@ -(JsonObject*) processJsonMsg:(NSString*) msg json:(JsonObject*) jsonMsg { [self setRect:jsonMsg]; } + else if ([msg isEqualToString:MSG_SET_TEXTSIZE]) + { + [self setTextSize:jsonMsg]; + } else if ([msg isEqualToString:MSG_SET_FOCUS]) { BOOL isFocus = [jsonMsg getBool:@"isFocus"]; @@ -190,6 +194,21 @@ -(void) setRect:(JsonObject*)json editView.frame = CGRectMake(x, y, width, height); } +-(void) setTextSize:(JsonObject*)json +{ + float fontSize = [json getFloat:@"fontSize"]; + // Conversion for retina displays + fontSize = fontSize / [UIScreen mainScreen].scale; + + if([editView isKindOfClass:[UITextField class]]) { + UITextField *textField = ((UITextField*)editView); + UIFont *newFont = [[textField font] fontWithSize:fontSize]; + } else if([editView isKindOfClass:[UITextView class]]){ + UITextView *textView = ((UITextView*)editView); + UIFont *newFont = [[textView font] fontWithSize:fontSize]; + } +} + -(void) create:(JsonObject*)json { NSString* placeholder = [json getString:@"placeHolder"]; diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index c5347ac..0d9f513 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -82,6 +82,7 @@ public enum ReturnKeyType private const string MSG_REMOVE = "RemoveEdit"; private const string MSG_SET_TEXT = "SetText"; private const string MSG_SET_RECT = "SetRect"; + private const string MSG_SET_TEXTSIZE = "SetTextSize"; private const string MSG_SET_FOCUS = "SetFocus"; private const string MSG_SET_VISIBLE = "SetVisible"; private const string MSG_TEXT_CHANGE = "TextChange"; @@ -383,19 +384,19 @@ public void SetRectNative(RectTransform rectTrans) Rect rectScreen = GetScreenRectFromRectTransform(rectTrans); JsonObject jsonMsg = new JsonObject(); - jsonMsg["msg"] = MSG_SET_RECT; - jsonMsg["x"] = rectScreen.x / Screen.width; jsonMsg["y"] = rectScreen.y / Screen.height; jsonMsg["width"] = rectScreen.width / Screen.width; jsonMsg["height"] = rectScreen.height / Screen.height; + this.SendPluginMsg(jsonMsg); + JsonObject sizeMsg = new JsonObject(); + sizeMsg["msg"] = MSG_SET_TEXTSIZE; var fontRectHeightRatio = rectScreen.height / this.objUnityText.rectTransform.rect.height; var fontSize = this.objUnityText.fontSize * fontRectHeightRatio; - jsonMsg["fontSize"] = fontSize; - - this.SendPluginMsg(jsonMsg); + sizeMsg["fontSize"] = fontSize; + this.SendPluginMsg(sizeMsg); } public void SetFocus(bool bFocus) diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java index 6de815d..d250671 100644 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java @@ -55,6 +55,7 @@ public void onWindowFocusChanged(boolean hasWindowFocus) private static final String MSG_REMOVE = "RemoveEdit"; private static final String MSG_SET_TEXT = "SetText"; private static final String MSG_SET_RECT = "SetRect"; + private static final String MSG_SET_TEXTSIZE = "SetTextSize"; private static final String MSG_SET_FOCUS = "SetFocus"; private static final String MSG_SET_VISIBLE = "SetVisible"; private static final String MSG_TEXT_CHANGE = "TextChange"; @@ -142,6 +143,9 @@ private void processJsonMsg(JSONObject jsonMsg) case MSG_SET_RECT: this.SetRect(jsonMsg); break; + case MSG_SET_TEXTSIZE: + this.SetTextSize(jsonMsg); + break; case MSG_SET_FOCUS: boolean isFocus = jsonMsg.getBoolean("isFocus"); this.SetFocus(isFocus); @@ -452,6 +456,17 @@ private void SetFocus(boolean isFocus) this.showKeyboard(isFocus); } + private void SetTextSize(JSONObject jsonRect) + { + try + { + double fontSize = jsonRect.getDouble("fontSize"); + edit.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) fontSize); + } catch (JSONException e) + { + } + } + private void SetRect(JSONObject jsonRect) { try @@ -466,6 +481,12 @@ private void SetRect(JSONObject jsonRect) lp.setMargins(rect.left, rect.top, 0, 0); edit.setLayoutParams(lp); + if (jsonRect.has("fontSize")) + { + double fontSize = jsonRect.getDouble("fontSize"); + edit.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) fontSize); + } + } catch (JSONException e) { } From 489c0b876cdb57f1062e30e69b39d38c694e789b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Mon, 1 Oct 2018 13:38:46 +0300 Subject: [PATCH 19/64] Updates AAR --- .../Android/nativeeditplugin-release.aar | Bin 29649 -> 29802 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar index a12706eb6e2e65f913d928c5b67824d2773dc412..7b0f9f91f781fdc6599d4cacdebe357b397ba5fb 100644 GIT binary patch delta 15930 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 J{|P`q{|B~1!QcP@ delta 15757 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 From 8b96d22a1414853be803bd94c4703d68b9fbf384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Mon, 1 Oct 2018 16:49:16 +0300 Subject: [PATCH 20/64] Removes extra code --- .../src/main/java/com/bkmin/android/EditBox.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java index d250671..fb4e67a 100644 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java @@ -481,12 +481,6 @@ private void SetRect(JSONObject jsonRect) lp.setMargins(rect.left, rect.top, 0, 0); edit.setLayoutParams(lp); - if (jsonRect.has("fontSize")) - { - double fontSize = jsonRect.getDouble("fontSize"); - edit.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) fontSize); - } - } catch (JSONException e) { } From bf71330cdbba6755ec90722bfcae244a3edd7da4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Mon, 1 Oct 2018 16:50:05 +0300 Subject: [PATCH 21/64] Updates font only if required --- .../NativeEditPlugin/scripts/NativeEditBox.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 0d9f513..864953b 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -381,9 +381,9 @@ private void RemoveNative() public void SetRectNative(RectTransform rectTrans) { - Rect rectScreen = GetScreenRectFromRectTransform(rectTrans); + var rectScreen = GetScreenRectFromRectTransform(rectTrans); - JsonObject jsonMsg = new JsonObject(); + var jsonMsg = new JsonObject(); jsonMsg["msg"] = MSG_SET_RECT; jsonMsg["x"] = rectScreen.x / Screen.width; jsonMsg["y"] = rectScreen.y / Screen.height; @@ -391,12 +391,16 @@ public void SetRectNative(RectTransform rectTrans) jsonMsg["height"] = rectScreen.height / Screen.height; this.SendPluginMsg(jsonMsg); - JsonObject sizeMsg = new JsonObject(); - sizeMsg["msg"] = MSG_SET_TEXTSIZE; var fontRectHeightRatio = rectScreen.height / this.objUnityText.rectTransform.rect.height; var fontSize = this.objUnityText.fontSize * fontRectHeightRatio; - sizeMsg["fontSize"] = fontSize; - this.SendPluginMsg(sizeMsg); + if (Math.Abs(this.mConfig.fontSize - fontSize) > 0.1f) + { + var sizeMsg = new JsonObject(); + sizeMsg["msg"] = MSG_SET_TEXTSIZE; + sizeMsg["fontSize"] = fontSize; + this.SendPluginMsg(sizeMsg); + this.mConfig.fontSize = fontSize; + } } public void SetFocus(bool bFocus) From e74075b86e2cc731c0a2c34dfd73708744f766cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lupian=CC=83ez=20Casares?= Date: Mon, 1 Oct 2018 16:54:31 +0300 Subject: [PATCH 22/64] Updates .AAR --- .../Android/nativeeditplugin-release.aar | Bin 29802 -> 29761 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar index 7b0f9f91f781fdc6599d4cacdebe357b397ba5fb..b80d9923ce564352afa0480ba391f45c081cb3a0 100644 GIT binary patch delta 15835 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 delta 15874 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 p?p;y;cf@~b2q9g7fb6VI{ Date: Tue, 2 Oct 2018 11:01:35 +0300 Subject: [PATCH 23/64] Properly sets the font --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 3d0f26a..8510e68 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -200,12 +200,17 @@ -(void) setTextSize:(JsonObject*)json // Conversion for retina displays fontSize = fontSize / [UIScreen mainScreen].scale; - if([editView isKindOfClass:[UITextField class]]) { + if([editView isKindOfClass:[UITextField class]]) + { UITextField *textField = ((UITextField*)editView); UIFont *newFont = [[textField font] fontWithSize:fontSize]; - } else if([editView isKindOfClass:[UITextView class]]){ + [textField setFont:newFont]; + } + else if([editView isKindOfClass:[UITextView class]]) + { UITextView *textView = ((UITextView*)editView); UIFont *newFont = [[textView font] fontWithSize:fontSize]; + [textView setFont:newFont]; } } From 4bc4a85bb76f22e513246712e7702df24033b72f Mon Sep 17 00:00:00 2001 From: Sakari Bergen Date: Wed, 17 Oct 2018 10:16:54 +0300 Subject: [PATCH 24/64] Add .asmdef file --- release/NativeEditPlugin/scripts/NativeEdit.asmdef | 3 +++ release/NativeEditPlugin/scripts/NativeEdit.asmdef.meta | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 release/NativeEditPlugin/scripts/NativeEdit.asmdef create mode 100644 release/NativeEditPlugin/scripts/NativeEdit.asmdef.meta diff --git a/release/NativeEditPlugin/scripts/NativeEdit.asmdef b/release/NativeEditPlugin/scripts/NativeEdit.asmdef new file mode 100644 index 0000000..7b48b13 --- /dev/null +++ b/release/NativeEditPlugin/scripts/NativeEdit.asmdef @@ -0,0 +1,3 @@ +{ + "name": "NativeEdit" +} diff --git a/release/NativeEditPlugin/scripts/NativeEdit.asmdef.meta b/release/NativeEditPlugin/scripts/NativeEdit.asmdef.meta new file mode 100644 index 0000000..97fc544 --- /dev/null +++ b/release/NativeEditPlugin/scripts/NativeEdit.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 56ffed08b69974d02b19c1dcf7e3b995 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From feae3632ed9b68761d321b5efcf893c93a5556e1 Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Thu, 25 Apr 2019 12:10:38 +0300 Subject: [PATCH 25/64] Removed "Application closed" logging --- release/NativeEditPlugin/scripts/PluginMsgHandler.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/release/NativeEditPlugin/scripts/PluginMsgHandler.cs b/release/NativeEditPlugin/scripts/PluginMsgHandler.cs index 44f36a5..1ad6834 100644 --- a/release/NativeEditPlugin/scripts/PluginMsgHandler.cs +++ b/release/NativeEditPlugin/scripts/PluginMsgHandler.cs @@ -105,7 +105,6 @@ void Awake() void OnDestroy() { - FileLog("Application closed"); if (fileWriter != null) fileWriter.Close(); fileWriter = null; this.FinalizeHandler(); From d5203e87c6d2faffcdb01f29ab134a446ea47e70 Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Mon, 24 Jun 2019 14:45:43 +0300 Subject: [PATCH 26/64] Added new OnValueChanged event. --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 864953b..4efb1bc 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -70,6 +70,7 @@ public enum ReturnKeyType public bool useInputFieldFont; public UnityEngine.Events.UnityEvent OnReturnPressed; public UnityEngine.Events.UnityEvent OnBeginEditing; + public InputField.SubmitEvent OnValueChanged; private bool bNativeEditCreated = false; @@ -247,6 +248,8 @@ private void onTextChange(string newText) this.objUnityInput.text = newText; if (this.objUnityInput.onValueChanged != null) this.objUnityInput.onValueChanged.Invoke(newText); + + this.OnValueChanged?.Invoke(newText); } private void onTextEditEnd(string newText) From 2b2cff4cab81f8933b8fde124cae81aa76305ab2 Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Tue, 25 Jun 2019 11:37:06 +0300 Subject: [PATCH 27/64] Removed redundant onValueChanged event. --- .../NativeEditPlugin/scripts/NativeEditBox.cs | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 4efb1bc..65c47d9 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -70,7 +70,6 @@ public enum ReturnKeyType public bool useInputFieldFont; public UnityEngine.Events.UnityEvent OnReturnPressed; public UnityEngine.Events.UnityEvent OnBeginEditing; - public InputField.SubmitEvent OnValueChanged; private bool bNativeEditCreated = false; @@ -238,7 +237,7 @@ private void PrepareNativeEdit() mConfig.multiline = (objUnityInput.lineType == InputField.LineType.SingleLine) ? false : true; } - private void onTextChange(string newText) + private void updateUnityInputText(string newText) { // Avoid firing a delayed onValueChanged event if the text was changed from Unity with the text property in this // class. @@ -246,17 +245,6 @@ private void onTextChange(string newText) return; this.objUnityInput.text = newText; - if (this.objUnityInput.onValueChanged != null) - this.objUnityInput.onValueChanged.Invoke(newText); - - this.OnValueChanged?.Invoke(newText); - } - - private void onTextEditEnd(string newText) - { - this.objUnityInput.text = newText; - if (this.objUnityInput.onEndEdit != null) - this.objUnityInput.onEndEdit.Invoke(newText); } public override void OnPluginMsgDirect(JsonObject jsonMsg) @@ -273,7 +261,7 @@ private IEnumerator PluginsMessageRoutine(JsonObject jsonMsg) if (msg.Equals(MSG_TEXT_CHANGE)) { string text = jsonMsg.GetString("text"); - this.onTextChange(text); + this.updateUnityInputText(text); } else if (msg.Equals(MSG_TEXT_BEGIN_EDIT)) { @@ -283,7 +271,7 @@ private IEnumerator PluginsMessageRoutine(JsonObject jsonMsg) else if (msg.Equals(MSG_TEXT_END_EDIT)) { string text = jsonMsg.GetString("text"); - this.onTextEditEnd(text); + this.updateUnityInputText(text); } else if (msg.Equals(MSG_RETURN_PRESSED)) { From c602f2b9b9dc98c7206c82bfd22db5b47be14983 Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Tue, 25 Jun 2019 17:29:18 +0300 Subject: [PATCH 28/64] Removed string check, simplified expressions. --- .../NativeEditPlugin/scripts/NativeEditBox.cs | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 65c47d9..2af8c0f 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -237,16 +237,6 @@ private void PrepareNativeEdit() mConfig.multiline = (objUnityInput.lineType == InputField.LineType.SingleLine) ? false : true; } - private void updateUnityInputText(string newText) - { - // Avoid firing a delayed onValueChanged event if the text was changed from Unity with the text property in this - // class. - if (newText == this.objUnityInput.text) - return; - - this.objUnityInput.text = newText; - } - public override void OnPluginMsgDirect(JsonObject jsonMsg) { PluginMsgHandler.getInst().StartCoroutine(PluginsMessageRoutine(jsonMsg)); @@ -258,20 +248,14 @@ private IEnumerator PluginsMessageRoutine(JsonObject jsonMsg) yield return null; string msg = jsonMsg.GetString("msg"); - if (msg.Equals(MSG_TEXT_CHANGE)) - { - string text = jsonMsg.GetString("text"); - this.updateUnityInputText(text); - } - else if (msg.Equals(MSG_TEXT_BEGIN_EDIT)) + if (msg.Equals(MSG_TEXT_BEGIN_EDIT)) { if (this.OnBeginEditing != null) this.OnBeginEditing.Invoke(); } - else if (msg.Equals(MSG_TEXT_END_EDIT)) + else if (msg.Equals(MSG_TEXT_CHANGE) || msg.Equals(MSG_TEXT_END_EDIT)) { - string text = jsonMsg.GetString("text"); - this.updateUnityInputText(text); + this.objUnityInput.text = jsonMsg.GetString("text"); } else if (msg.Equals(MSG_RETURN_PRESSED)) { From 4143cb8cdb31d31a98597e921847ad830f0a80d7 Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Wed, 7 Aug 2019 14:34:33 +0300 Subject: [PATCH 29/64] Implemented MaskedNativeEditBox using input-mask-android plugin. --- .../scripts/MaskedNativeEditBox.cs | 35 +++++ .../scripts/MaskedNativeEditBox.cs.meta | 3 + .../NativeEditPlugin/scripts/NativeEditBox.cs | 3 + .../main/java/com/bkmin/android/EditBox.java | 140 +++++++++++++----- 4 files changed, 144 insertions(+), 37 deletions(-) create mode 100644 release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs create mode 100644 release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs.meta diff --git a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs new file mode 100644 index 0000000..f64f5e5 --- /dev/null +++ b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using JetBrains.Annotations; +using UnityEngine; + +///

+/// Please see for more information about +/// the masks. +/// +public class MaskedNativeEditBox : NativeEditBox +{ + private enum AffinityCalculationStrategy + { + [UsedImplicitly] Prefix = 0, + [UsedImplicitly] WholeString = 1, + [UsedImplicitly] Capacity = 2, + [UsedImplicitly] ExtractedValueCapacity = 3, + } + + [Header("Masked Text (Android Only)")] + [SerializeField] private string primaryMask; + [SerializeField] private List affineMasks; + [SerializeField] private AffinityCalculationStrategy affinityStrategy; + [SerializeField] private bool useCustomPlaceholder; + [SerializeField] private string customPlaceholder; + + protected override void AppendExtraFieldsForCreation(JsonObject jsonObject) + { + jsonObject["applyMask"] = true; + jsonObject["primaryMask"] = this.primaryMask; + jsonObject["affineMasks"] = this.affineMasks; + jsonObject["affinityStrategy"] = (int) this.affinityStrategy; + jsonObject["useCustomPlaceholder"] = this.useCustomPlaceholder; + jsonObject["customPlaceholder"] = this.customPlaceholder; + } +} \ No newline at end of file diff --git a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs.meta b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs.meta new file mode 100644 index 0000000..32dc1b8 --- /dev/null +++ b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e6e7a607a56e48af92ca597e1d8c068d +timeCreated: 1565162931 \ No newline at end of file diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 2af8c0f..530f2d4 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -96,6 +96,8 @@ public enum ReturnKeyType public InputField InputField { get { return objUnityInput; } } public bool Visible { get; private set; } + protected virtual void AppendExtraFieldsForCreation(JsonObject jsonObject) { } + public string text { get { return objUnityInput.text; } @@ -310,6 +312,7 @@ private void CreateNativeEdit() jsonMsg["placeHolderColor_b"] = mConfig.placeHolderColor.b; jsonMsg["placeHolderColor_a"] = mConfig.placeHolderColor.a; jsonMsg["multiline"] = mConfig.multiline; + this.AppendExtraFieldsForCreation(jsonMsg); switch (returnKeyType) { diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java index fb4e67a..fe130fb 100644 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java @@ -1,5 +1,6 @@ package com.bkmin.android; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -24,6 +25,12 @@ import android.widget.RelativeLayout; import android.widget.TextView; +import com.redmadrobot.inputmask.MaskedTextChangedListener; +import com.redmadrobot.inputmask.helper.AffinityCalculationStrategy; + +import java.util.ArrayList; +import java.util.List; + public class EditBox { // Simplest way to notify the EditBox about the application lifecycle. @@ -319,7 +326,6 @@ else if (returnKeyType.equals("Done")) { } final EditBox eb = this; - edit.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { @@ -338,42 +344,8 @@ public void onFocusChange(View v, boolean hasFocus) { } }); - edit.addTextChangedListener(new TextWatcher() { - - public void afterTextChanged(Editable s) - { - JSONObject jsonToUnity = new JSONObject(); - - if(characterLimit > 0 && s.length() >= characterLimit+1) - { - s.delete(s.length() - 1, - s.length()); - edit.setText(s); - edit.setSelection(s.length()); - } - - try - { - jsonToUnity.put("msg", MSG_TEXT_CHANGE); - jsonToUnity.put("text", s.toString()); - } - catch(JSONException e) {} - eb.SendJsonToUnity(jsonToUnity); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, - int count, int after) { - // TODO Auto-generated method stub - } - - @Override - public void onTextChanged(CharSequence s, int start, - int before, int count) { - // TODO Auto-generated method stub - - } - }); + TextWatcher editTextWatcher = getEditTextWatcher(jsonObj, eb); + edit.addTextChangedListener(editTextWatcher); edit.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override @@ -401,6 +373,84 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { } } + private TextWatcher getEditTextWatcher(JSONObject jsonObj, final EditBox editBox) throws JSONException { + + final String applyMaskKey = "applyMask"; + final String affineMasksKey = "affineMasks"; + + boolean applyMask = jsonObj.has(applyMaskKey) && jsonObj.getBoolean(applyMaskKey); + + if (applyMask) { + String primaryMask = jsonObj.getString("primaryMask"); + JSONArray affineMasks = jsonObj.isNull(affineMasksKey) ? new JSONArray() : jsonObj.getJSONArray(affineMasksKey); + int affinityStrategy = jsonObj.getInt("affinityStrategy"); + boolean useCustomPlaceholder = jsonObj.getBoolean("useCustomPlaceholder"); + String customPlaceholder = jsonObj.getString("customPlaceholder"); + + // Convert JSONArray to List + List affineMasksList = new ArrayList<>(); + for (int i = 0; i < affineMasks.length(); i++) { + try { + affineMasksList.add(affineMasks.getString(i)); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + final MaskedTextChangedListener maskedTextChangedListener = new MaskedTextChangedListener( + primaryMask, + affineMasksList, + GetAffinityCalculationStrategy(affinityStrategy), + true, + edit, + null, + new MaskedTextChangedListener.ValueListener() { + @Override + public void onTextChanged(boolean maskFilled, String extractedValue, String formattedValue) { + editBox.SendTextToUnity(formattedValue); + } + }); + + String placeholder = useCustomPlaceholder ? customPlaceholder : maskedTextChangedListener.placeholder(); + edit.setHint(placeholder); + + return maskedTextChangedListener; + } + + return defaultTextWatcher(); + } + + private TextWatcher defaultTextWatcher() { + return new TextWatcher() { + public void afterTextChanged(Editable s) { + if (characterLimit > 0 && s.length() >= characterLimit + 1) { + s.delete(s.length() - 1, + s.length()); + edit.setText(s); + edit.setSelection(s.length()); + } + SendTextToUnity(s.toString()); + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { } + }; + } + + private void SendTextToUnity(String text) + { + JSONObject jsonToUnity = new JSONObject(); + try + { + jsonToUnity.put("msg", MSG_TEXT_CHANGE); + jsonToUnity.put("text", text); + } + catch(JSONException e) {} + SendJsonToUnity(jsonToUnity); + } + private void Remove() { if (edit != null) { @@ -529,4 +579,20 @@ private void OnForceAndroidKeyDown(String strKey) { edit.onKeyDown(keyCode, ke); } } + + private static AffinityCalculationStrategy GetAffinityCalculationStrategy(int value) + { + switch (value) { + case 0: + return AffinityCalculationStrategy.PREFIX; + case 1: + return AffinityCalculationStrategy.WHOLE_STRING; + case 2: + return AffinityCalculationStrategy.CAPACITY; + case 3: + return AffinityCalculationStrategy.EXTRACTED_VALUE_CAPACITY; + default: + return AffinityCalculationStrategy.PREFIX; + } + } } From 67caf0595baa8564245cebdef570be5264dc2c6f Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Wed, 7 Aug 2019 15:53:19 +0300 Subject: [PATCH 30/64] Changes: * Extracted mask options. * Added support for setting & enabling/disabling mask programmatically. c modified: release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs --- .../NativeEditPlugin/scripts/MaskOptions.cs | 36 +++++++++++++ .../scripts/MaskOptions.cs.meta | 3 ++ .../scripts/MaskedNativeEditBox.cs | 53 +++++++++++-------- 3 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 release/NativeEditPlugin/scripts/MaskOptions.cs create mode 100644 release/NativeEditPlugin/scripts/MaskOptions.cs.meta diff --git a/release/NativeEditPlugin/scripts/MaskOptions.cs b/release/NativeEditPlugin/scripts/MaskOptions.cs new file mode 100644 index 0000000..af002b7 --- /dev/null +++ b/release/NativeEditPlugin/scripts/MaskOptions.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; + +/// +/// Please see for more information about +/// the masks. +/// +public class MaskOptions +{ + public enum AffinityCalculationStrategy + { + Prefix = 0, + WholeString = 1, + Capacity = 2, + ExtractedValueCapacity = 3, + } + + public string primaryMask { get; } + public IReadOnlyList affineMasks { get; } + public AffinityCalculationStrategy affinityStrategy { get; } + public bool useCustomPlaceholder { get; } + public string customPlaceholder { get; } + + public MaskOptions( + string primaryMask, + IReadOnlyList affineMasks = null, + AffinityCalculationStrategy affinityStrategy = AffinityCalculationStrategy.Prefix, + bool useCustomPlaceholder = false, + string customPlaceholder = null) + { + this.primaryMask = primaryMask; + this.affineMasks = affineMasks; + this.affinityStrategy = affinityStrategy; + this.useCustomPlaceholder = useCustomPlaceholder; + this.customPlaceholder = customPlaceholder; + } +} \ No newline at end of file diff --git a/release/NativeEditPlugin/scripts/MaskOptions.cs.meta b/release/NativeEditPlugin/scripts/MaskOptions.cs.meta new file mode 100644 index 0000000..3754a23 --- /dev/null +++ b/release/NativeEditPlugin/scripts/MaskOptions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5fb2f4de92464e218b1fedca464eb9c3 +timeCreated: 1565179309 \ No newline at end of file diff --git a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs index f64f5e5..f84d203 100644 --- a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs @@ -1,35 +1,42 @@ -using System.Collections.Generic; -using JetBrains.Annotations; -using UnityEngine; - /// -/// Please see for more information about -/// the masks. +/// Formats the value depending on the given mask options. /// +/// +/// Works only on Android, iOS is not _yet_ supported. +/// public class MaskedNativeEditBox : NativeEditBox { - private enum AffinityCalculationStrategy + private const string ApplyMaskKey = "applyMask"; + private const string PrimaryMaskKey = "primaryMask"; + private const string AffineMasksKey = "affineMasks"; + private const string AffinityStrategyKey = "affinityStrategy"; + private const string UseCustomPlaceholderKey = "useCustomPlaceholder"; + private const string CustomPlaceholderKey = "customPlaceholder"; + + public MaskOptions MaskOptions { get; private set; } + private bool shouldApplyMask = true; + + /// + /// Please see for more information about + /// the masks. + /// + public void SetMask(MaskOptions maskOptions) { - [UsedImplicitly] Prefix = 0, - [UsedImplicitly] WholeString = 1, - [UsedImplicitly] Capacity = 2, - [UsedImplicitly] ExtractedValueCapacity = 3, + this.MaskOptions = maskOptions; } - [Header("Masked Text (Android Only)")] - [SerializeField] private string primaryMask; - [SerializeField] private List affineMasks; - [SerializeField] private AffinityCalculationStrategy affinityStrategy; - [SerializeField] private bool useCustomPlaceholder; - [SerializeField] private string customPlaceholder; + public void ApplyMask(bool to) + { + this.shouldApplyMask = to; + } protected override void AppendExtraFieldsForCreation(JsonObject jsonObject) { - jsonObject["applyMask"] = true; - jsonObject["primaryMask"] = this.primaryMask; - jsonObject["affineMasks"] = this.affineMasks; - jsonObject["affinityStrategy"] = (int) this.affinityStrategy; - jsonObject["useCustomPlaceholder"] = this.useCustomPlaceholder; - jsonObject["customPlaceholder"] = this.customPlaceholder; + jsonObject[ApplyMaskKey] = this.shouldApplyMask; + jsonObject[PrimaryMaskKey] = this.MaskOptions.primaryMask; + jsonObject[AffineMasksKey] = this.MaskOptions.affineMasks; + jsonObject[AffinityStrategyKey] = (int)this.MaskOptions.affinityStrategy; + jsonObject[UseCustomPlaceholderKey] = this.MaskOptions.useCustomPlaceholder; + jsonObject[CustomPlaceholderKey] = this.MaskOptions.customPlaceholder; } } \ No newline at end of file From 1da7ce612b4afa36579657d07f304bcd602bd50d Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Wed, 7 Aug 2019 17:03:56 +0300 Subject: [PATCH 31/64] Defined keys as private class fields. --- .../src/main/java/com/bkmin/android/EditBox.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java index fe130fb..698f3d7 100644 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java @@ -71,6 +71,9 @@ public void onWindowFocusChanged(boolean hasWindowFocus) private static final String MSG_ANDROID_KEY_DOWN = "AndroidKeyDown"; private static final String MSG_RETURN_PRESSED = "ReturnPressed"; + private static final String APPLY_MASK_KEY = "applyMask"; + private static final String AFFINE_MASKS_KEY = "affineMasks"; + public static void processRecvJsonMsg(int nSenderId, final String strJson) { if (mapEditBox == null) mapEditBox = new SparseArray<>(); @@ -375,14 +378,11 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { private TextWatcher getEditTextWatcher(JSONObject jsonObj, final EditBox editBox) throws JSONException { - final String applyMaskKey = "applyMask"; - final String affineMasksKey = "affineMasks"; - - boolean applyMask = jsonObj.has(applyMaskKey) && jsonObj.getBoolean(applyMaskKey); + boolean applyMask = jsonObj.has(APPLY_MASK_KEY) && jsonObj.getBoolean(APPLY_MASK_KEY); if (applyMask) { String primaryMask = jsonObj.getString("primaryMask"); - JSONArray affineMasks = jsonObj.isNull(affineMasksKey) ? new JSONArray() : jsonObj.getJSONArray(affineMasksKey); + JSONArray affineMasks = jsonObj.isNull(AFFINE_MASKS_KEY) ? new JSONArray() : jsonObj.getJSONArray(AFFINE_MASKS_KEY); int affinityStrategy = jsonObj.getInt("affinityStrategy"); boolean useCustomPlaceholder = jsonObj.getBoolean("useCustomPlaceholder"); String customPlaceholder = jsonObj.getString("customPlaceholder"); From e91b97aea43a3d508c1c3d151fdd3aae3bae8274 Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Wed, 7 Aug 2019 17:07:27 +0300 Subject: [PATCH 32/64] Added Gradle dependencies. --- src/androidProj/nativeeditplugin/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/androidProj/nativeeditplugin/build.gradle b/src/androidProj/nativeeditplugin/build.gradle index 216520d..256af3d 100644 --- a/src/androidProj/nativeeditplugin/build.gradle +++ b/src/androidProj/nativeeditplugin/build.gradle @@ -27,6 +27,8 @@ repositories { dependencies { provided files('./libs/UnityPlayer.jar') compile 'com.android.support:appcompat-v7:25.1.0' + compile 'com.redmadrobot:input-mask-android:4.3.1' + compile 'org.jetbrains.kotlin:kotlin-stdlib:1.3.41' } task clearJar(type: Delete) { From 5f2228b67fda079b6e8c5fa4833d59f0f08ad811 Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Wed, 7 Aug 2019 18:07:56 +0300 Subject: [PATCH 33/64] Sending both extracted and formatted texts to Unity. --- .../scripts/MaskedNativeEditBox.cs | 35 +++++++++++++++++++ .../NativeEditPlugin/scripts/NativeEditBox.cs | 12 ++++--- .../main/java/com/bkmin/android/EditBox.java | 28 +++++++-------- 3 files changed, 56 insertions(+), 19 deletions(-) diff --git a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs index f84d203..d3ebb48 100644 --- a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs @@ -1,3 +1,6 @@ +using System; +using UnityEngine.UI; + /// /// Formats the value depending on the given mask options. /// @@ -14,6 +17,19 @@ public class MaskedNativeEditBox : NativeEditBox private const string CustomPlaceholderKey = "customPlaceholder"; public MaskOptions MaskOptions { get; private set; } + + /// + /// Event to call whenever the value changes. Will be called with the extracted value. + /// To get formatted values, listen event. + /// + public Action OnValueChanged; + + /// + /// Event to call when the editing has ended. Will be called with the extracted value. + /// To get formatted values, listen event. + /// + public Action OnEndEdit; + private bool shouldApplyMask = true; /// @@ -39,4 +55,23 @@ protected override void AppendExtraFieldsForCreation(JsonObject jsonObject) jsonObject[UseCustomPlaceholderKey] = this.MaskOptions.useCustomPlaceholder; jsonObject[CustomPlaceholderKey] = this.MaskOptions.customPlaceholder; } + + protected override void HandlePluginMessage(JsonObject jsonMsg) + { + base.HandlePluginMessage(jsonMsg); + + var msg = jsonMsg.GetString("msg"); + if (msg.Equals(MSG_TEXT_CHANGE)) + { + var extractedText = jsonMsg.GetString("extractedText"); + if (this.OnValueChanged != null) + this.OnValueChanged(extractedText); + } + else if (msg.Equals(MSG_TEXT_END_EDIT)) + { + var extractedText = jsonMsg.GetString("extractedText"); + if (this.OnEndEdit != null) + this.OnEndEdit(extractedText); + } + } } \ No newline at end of file diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 530f2d4..682f4bb 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -85,9 +85,9 @@ public enum ReturnKeyType private const string MSG_SET_TEXTSIZE = "SetTextSize"; private const string MSG_SET_FOCUS = "SetFocus"; private const string MSG_SET_VISIBLE = "SetVisible"; - private const string MSG_TEXT_CHANGE = "TextChange"; + protected const string MSG_TEXT_CHANGE = "TextChange"; private const string MSG_TEXT_BEGIN_EDIT = "TextBeginEdit"; - private const string MSG_TEXT_END_EDIT = "TextEndEdit"; + protected const string MSG_TEXT_END_EDIT = "TextEndEdit"; // to fix bug Some keys 'back' & 'enter' are eaten by unity and never arrive at plugin private const string MSG_ANDROID_KEY_DOWN = "AndroidKeyDown"; private const string MSG_RETURN_PRESSED = "ReturnPressed"; @@ -241,14 +241,18 @@ private void PrepareNativeEdit() public override void OnPluginMsgDirect(JsonObject jsonMsg) { - PluginMsgHandler.getInst().StartCoroutine(PluginsMessageRoutine(jsonMsg)); + PluginMsgHandler.getInst().StartCoroutine(this.HandlePluginMessageOnNextFrame(jsonMsg)); } - private IEnumerator PluginsMessageRoutine(JsonObject jsonMsg) + private IEnumerator HandlePluginMessageOnNextFrame(JsonObject jsonMsg) { // this is to avoid a deadlock for more info when trying to get data from two separate native plugins and handling them in Unity yield return null; + this.HandlePluginMessage(jsonMsg); + } + protected virtual void HandlePluginMessage(JsonObject jsonMsg) + { string msg = jsonMsg.GetString("msg"); if (msg.Equals(MSG_TEXT_BEGIN_EDIT)) { diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java index 698f3d7..7b1ee8a 100644 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java @@ -56,6 +56,8 @@ public void onWindowFocusChanged(boolean hasWindowFocus) private final RelativeLayout layout; private int tag; private int characterLimit; + private String extractedText = ""; + private String formattedText = ""; private static SparseArray mapEditBox = null; private static final String MSG_CREATE = "CreateEdit"; @@ -333,16 +335,7 @@ else if (returnKeyType.equals("Done")) { @Override public void onFocusChange(View v, boolean hasFocus) { - // your action here - JSONObject msgTextEndJSON = new JSONObject(); - try - { - msgTextEndJSON.put("msg", hasFocus ? MSG_TEXT_BEGIN_EDIT : MSG_TEXT_END_EDIT); - msgTextEndJSON.put("text", eb.GetText()); - } - catch(JSONException e) {} - eb.SendJsonToUnity(msgTextEndJSON); - + SendTextToUnity(hasFocus ? MSG_TEXT_BEGIN_EDIT : MSG_TEXT_END_EDIT); SetFocus(hasFocus); } }); @@ -407,7 +400,9 @@ private TextWatcher getEditTextWatcher(JSONObject jsonObj, final EditBox editBox new MaskedTextChangedListener.ValueListener() { @Override public void onTextChanged(boolean maskFilled, String extractedValue, String formattedValue) { - editBox.SendTextToUnity(formattedValue); + editBox.extractedText = extractedValue; + editBox.formattedText = formattedValue; + editBox.SendTextToUnity(MSG_TEXT_CHANGE); } }); @@ -429,7 +424,9 @@ public void afterTextChanged(Editable s) { edit.setText(s); edit.setSelection(s.length()); } - SendTextToUnity(s.toString()); + extractedText = s.toString(); + formattedText = extractedText; + SendTextToUnity(MSG_TEXT_CHANGE); } @Override @@ -439,13 +436,14 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { } }; } - private void SendTextToUnity(String text) + private void SendTextToUnity(String messageKey) { JSONObject jsonToUnity = new JSONObject(); try { - jsonToUnity.put("msg", MSG_TEXT_CHANGE); - jsonToUnity.put("text", text); + jsonToUnity.put("msg", messageKey); + jsonToUnity.put("text", formattedText); + jsonToUnity.put("extractedText", extractedText); } catch(JSONException e) {} SendJsonToUnity(jsonToUnity); From 42f5d68ff0cf7e9422594af20eca23d7f44579be Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Wed, 7 Aug 2019 18:45:26 +0300 Subject: [PATCH 34/64] Using events. Added ExtractedValue property. --- .../NativeEditPlugin/scripts/MaskedNativeEditBox.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs index d3ebb48..506d15f 100644 --- a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs @@ -17,18 +17,19 @@ public class MaskedNativeEditBox : NativeEditBox private const string CustomPlaceholderKey = "customPlaceholder"; public MaskOptions MaskOptions { get; private set; } + public string ExtractedText { get; private set; } /// /// Event to call whenever the value changes. Will be called with the extracted value. /// To get formatted values, listen event. /// - public Action OnValueChanged; + public event Action OnValueChanged; /// /// Event to call when the editing has ended. Will be called with the extracted value. /// To get formatted values, listen event. /// - public Action OnEndEdit; + public event Action OnEndEdit; private bool shouldApplyMask = true; @@ -63,15 +64,15 @@ protected override void HandlePluginMessage(JsonObject jsonMsg) var msg = jsonMsg.GetString("msg"); if (msg.Equals(MSG_TEXT_CHANGE)) { - var extractedText = jsonMsg.GetString("extractedText"); + this.ExtractedText = jsonMsg.GetString("extractedText"); if (this.OnValueChanged != null) - this.OnValueChanged(extractedText); + this.OnValueChanged(this.ExtractedText); } else if (msg.Equals(MSG_TEXT_END_EDIT)) { - var extractedText = jsonMsg.GetString("extractedText"); + this.ExtractedText = jsonMsg.GetString("extractedText"); if (this.OnEndEdit != null) - this.OnEndEdit(extractedText); + this.OnEndEdit(this.ExtractedText); } } } \ No newline at end of file From ad573b516982b61467e9e5deaf5816ce0b3fd946 Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Wed, 7 Aug 2019 19:14:33 +0300 Subject: [PATCH 35/64] Null check for MaskOptions. --- release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs index 506d15f..0fd99a3 100644 --- a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs @@ -49,6 +49,12 @@ public void ApplyMask(bool to) protected override void AppendExtraFieldsForCreation(JsonObject jsonObject) { + if (this.MaskOptions == null) + { + jsonObject[ApplyMaskKey] = false; + return; + } + jsonObject[ApplyMaskKey] = this.shouldApplyMask; jsonObject[PrimaryMaskKey] = this.MaskOptions.primaryMask; jsonObject[AffineMasksKey] = this.MaskOptions.affineMasks; From bdefe9448473aee28c9bacdc6466d6a99c2e9cbf Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Fri, 9 Aug 2019 13:06:41 +0300 Subject: [PATCH 36/64] Added meta files for Unity. --- .../java/com/bkmin/android/EditBox.java.meta | 29 +++++++++++++++++++ .../bkmin/android/NativeEditPlugin.java.meta | 29 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta create mode 100644 src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/NativeEditPlugin.java.meta diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta new file mode 100644 index 0000000..c056ff8 --- /dev/null +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta @@ -0,0 +1,29 @@ +fileFormatVersion: 2 +guid: 2315322cc46b5475ebacc557c43c7ccc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/NativeEditPlugin.java.meta b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/NativeEditPlugin.java.meta new file mode 100644 index 0000000..3d9b4f2 --- /dev/null +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/NativeEditPlugin.java.meta @@ -0,0 +1,29 @@ +fileFormatVersion: 2 +guid: 7ce221fdcf4e949bdb24c027829930c7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: From 0ddb59dae36084242c9390206f7ffdd9f592c5f2 Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Fri, 9 Aug 2019 13:12:58 +0300 Subject: [PATCH 37/64] Added comment for AffinityCalculationStrategy. --- release/NativeEditPlugin/scripts/MaskOptions.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/release/NativeEditPlugin/scripts/MaskOptions.cs b/release/NativeEditPlugin/scripts/MaskOptions.cs index af002b7..b96d4a3 100644 --- a/release/NativeEditPlugin/scripts/MaskOptions.cs +++ b/release/NativeEditPlugin/scripts/MaskOptions.cs @@ -6,6 +6,15 @@ /// public class MaskOptions { + /// + /// Strategy to calculate affinity value. For more information, + /// see + /// + /// + /// Integer value of this enum will be sent to the native side where it's + /// converted from int to related native enum value again. + /// On Android, EditBox.java does this conversion. + /// public enum AffinityCalculationStrategy { Prefix = 0, From 6f081048d1d4d8006c843bfaae3070d54bb042fa Mon Sep 17 00:00:00 2001 From: Gokhan Dogramaci Date: Tue, 13 Aug 2019 16:06:01 +0300 Subject: [PATCH 38/64] Added support for extra chars for number only keyboard. --- .../NativeEditPlugin/scripts/MaskOptions.cs | 40 ++++++++--- .../scripts/MaskedNativeEditBox.cs | 12 ++-- .../main/java/com/bkmin/android/EditBox.java | 33 ++++++--- .../java/com/bkmin/android/EditBox.java.meta | 72 ++++++++++++++++++- 4 files changed, 131 insertions(+), 26 deletions(-) diff --git a/release/NativeEditPlugin/scripts/MaskOptions.cs b/release/NativeEditPlugin/scripts/MaskOptions.cs index b96d4a3..1320e85 100644 --- a/release/NativeEditPlugin/scripts/MaskOptions.cs +++ b/release/NativeEditPlugin/scripts/MaskOptions.cs @@ -23,23 +23,41 @@ public enum AffinityCalculationStrategy ExtractedValueCapacity = 3, } - public string primaryMask { get; } - public IReadOnlyList affineMasks { get; } - public AffinityCalculationStrategy affinityStrategy { get; } - public bool useCustomPlaceholder { get; } - public string customPlaceholder { get; } + public string PrimaryMask { get; } + public IReadOnlyList AffineMasks { get; } + public AffinityCalculationStrategy AffinityStrategy { get; } + public bool UseCustomPlaceholder { get; } + public string CustomPlaceholder { get; } + public string ExtraCharactersForDigits { get; } + /// + /// Creates new mask options. + /// + /// Primary mask to use. + /// Affine masks to select depending on the given affinity strategy. + /// Strategy to follow while selecting an affine mask. + /// Will be used to overwrite the placeholder of given mask. + /// Placeholder to show instead of the default placeholder of given mask. + /// Can be used to set an extra accepted character set when + /// the content type is numbers only. + /// + /// If the content type is numbers only and there's a separation character in the mask (e.g space, dash etc.) + /// should be set to accept these characters. Otherwise an exception + /// will be thrown. + /// public MaskOptions( string primaryMask, IReadOnlyList affineMasks = null, AffinityCalculationStrategy affinityStrategy = AffinityCalculationStrategy.Prefix, bool useCustomPlaceholder = false, - string customPlaceholder = null) + string customPlaceholder = null, + string extraCharactersForDigits = null) { - this.primaryMask = primaryMask; - this.affineMasks = affineMasks; - this.affinityStrategy = affinityStrategy; - this.useCustomPlaceholder = useCustomPlaceholder; - this.customPlaceholder = customPlaceholder; + this.PrimaryMask = primaryMask; + this.AffineMasks = affineMasks; + this.AffinityStrategy = affinityStrategy; + this.UseCustomPlaceholder = useCustomPlaceholder; + this.CustomPlaceholder = customPlaceholder; + this.ExtraCharactersForDigits = extraCharactersForDigits; } } \ No newline at end of file diff --git a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs index 0fd99a3..f08f43d 100644 --- a/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/MaskedNativeEditBox.cs @@ -15,6 +15,7 @@ public class MaskedNativeEditBox : NativeEditBox private const string AffinityStrategyKey = "affinityStrategy"; private const string UseCustomPlaceholderKey = "useCustomPlaceholder"; private const string CustomPlaceholderKey = "customPlaceholder"; + private const string ExtraCharactersForDigitsKey = "extraCharactersForDigits"; public MaskOptions MaskOptions { get; private set; } public string ExtractedText { get; private set; } @@ -56,11 +57,12 @@ protected override void AppendExtraFieldsForCreation(JsonObject jsonObject) } jsonObject[ApplyMaskKey] = this.shouldApplyMask; - jsonObject[PrimaryMaskKey] = this.MaskOptions.primaryMask; - jsonObject[AffineMasksKey] = this.MaskOptions.affineMasks; - jsonObject[AffinityStrategyKey] = (int)this.MaskOptions.affinityStrategy; - jsonObject[UseCustomPlaceholderKey] = this.MaskOptions.useCustomPlaceholder; - jsonObject[CustomPlaceholderKey] = this.MaskOptions.customPlaceholder; + jsonObject[PrimaryMaskKey] = this.MaskOptions.PrimaryMask; + jsonObject[AffineMasksKey] = this.MaskOptions.AffineMasks; + jsonObject[AffinityStrategyKey] = (int)this.MaskOptions.AffinityStrategy; + jsonObject[UseCustomPlaceholderKey] = this.MaskOptions.UseCustomPlaceholder; + jsonObject[CustomPlaceholderKey] = this.MaskOptions.CustomPlaceholder; + jsonObject[ExtraCharactersForDigitsKey] = this.MaskOptions.ExtraCharactersForDigits; } protected override void HandlePluginMessage(JsonObject jsonMsg) diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java index 7b1ee8a..c258970 100644 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java @@ -13,6 +13,7 @@ import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; +import android.text.method.DigitsKeyListener; import android.util.Log; import android.util.SparseArray; import android.util.TypedValue; @@ -75,6 +76,7 @@ public void onWindowFocusChanged(boolean hasWindowFocus) private static final String APPLY_MASK_KEY = "applyMask"; private static final String AFFINE_MASKS_KEY = "affineMasks"; + private static final String EXTRA_CHARACTERS_FOR_DIGITS_KEY = "extraCharactersForDigits"; public static void processRecvJsonMsg(int nSenderId, final String strJson) { @@ -380,19 +382,20 @@ private TextWatcher getEditTextWatcher(JSONObject jsonObj, final EditBox editBox boolean useCustomPlaceholder = jsonObj.getBoolean("useCustomPlaceholder"); String customPlaceholder = jsonObj.getString("customPlaceholder"); - // Convert JSONArray to List - List affineMasksList = new ArrayList<>(); - for (int i = 0; i < affineMasks.length(); i++) { - try { - affineMasksList.add(affineMasks.getString(i)); - } catch (JSONException e) { - e.printStackTrace(); - } + boolean useExtraCharactersForDigits = + !jsonObj.isNull(EXTRA_CHARACTERS_FOR_DIGITS_KEY) && + (edit.getInputType() & InputType.TYPE_CLASS_NUMBER) == InputType.TYPE_CLASS_NUMBER; + + if (useExtraCharactersForDigits) + { + String extraCharactersForDigits = jsonObj.getString(EXTRA_CHARACTERS_FOR_DIGITS_KEY); + if (!extraCharactersForDigits.isEmpty()) + edit.setKeyListener(DigitsKeyListener.getInstance(extraCharactersForDigits)); } final MaskedTextChangedListener maskedTextChangedListener = new MaskedTextChangedListener( primaryMask, - affineMasksList, + JSONArrayToStringList(affineMasks), GetAffinityCalculationStrategy(affinityStrategy), true, edit, @@ -593,4 +596,16 @@ private static AffinityCalculationStrategy GetAffinityCalculationStrategy(int va return AffinityCalculationStrategy.PREFIX; } } + + private List JSONArrayToStringList(JSONArray jsonArray) { + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.length(); i++) { + try { + list.add(jsonArray.getString(i)); + } catch (JSONException e) { + e.printStackTrace(); + } + } + return list; + } } diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta index c056ff8..a5625a3 100644 --- a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta +++ b/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta @@ -5,14 +5,32 @@ PluginImporter: serializedVersion: 2 iconMap: {} executionOrder: {} + defineConstraints: [] isPreloaded: 0 isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 platformData: + - first: + '': Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 1 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 - first: Android: Android second: enabled: 1 - settings: {} + settings: + CPU: ARMv7 - first: Any: second: @@ -23,7 +41,59 @@ PluginImporter: second: enabled: 0 settings: + CPU: AnyCPU DefaultValueInitialized: true + OS: AnyOS + - first: + Facebook: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Facebook: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Linux + second: + enabled: 0 + settings: + CPU: x86 + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + iPhone: iOS + second: + enabled: 0 + settings: + AddToEmbeddedBinaries: false + CompileFlags: + FrameworkDependencies: userData: assetBundleName: assetBundleVariant: From 40fa97fb2ab979344c785c9b911496110589bf18 Mon Sep 17 00:00:00 2001 From: Jarmo Hiipakka Date: Wed, 11 Sep 2019 10:51:22 +0300 Subject: [PATCH 39/64] [YS-17440] Add support for custom keyboard type settings Unity InputField has a special "custom" ContentType that allows finer-grained control over the keyboard and validation settings. This content type wasn't properly supported by the plugin, as it never communicated the custom keyboard type to the native side. This has now been fixed. Android native implementation already had handling for the custom content type, so that was not modified. However, on iOS the keyboard type was always set based on the content type. This code has now been modified to take the Unity-determined keyboard type into use directly. There we can rely on the fact that Unity InputField class already determines the right keyboard to use in all cases. --- .../Plugins/iOS/EditBox_iOS.m | 41 +++++++++++++------ .../NativeEditPlugin/scripts/NativeEditBox.cs | 3 ++ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 8510e68..9f88e03 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -247,6 +247,7 @@ -(void) create:(JsonObject*)json UIColor* placeHolderColor = [UIColor colorWithRed:placeHolderColor_r green:placeHolderColor_g blue:placeHolderColor_b alpha:placeHolderColor_a]; NSString* contentType = [json getString:@"contentType"]; + NSString* keyboardType = [json getString:@"keyboardType"]; NSString* alignment = [json getString:@"align"]; BOOL withDoneButton = [json getBool:@"withDoneButton"]; BOOL multiline = [json getBool:@"multiline"]; @@ -259,35 +260,49 @@ -(void) create:(JsonObject*)json { autoCorr = YES; } - else if ([contentType isEqualToString:@"IntegerNumber"]) + else if ([contentType isEqualToString:@"Password"]) { - keyType = UIKeyboardTypeNumberPad; + password = YES; } - else if ([contentType isEqualToString:@"DecimalNumber"]) + + // We don't need to look at the content type to determine the keyboard type, as Unity InputField will fill in the right type. + if ([keyboardType isEqualToString:@"ASCIICapable"]) { - keyType = UIKeyboardTypeDecimalPad; + keyType = UIKeyboardTypeASCIICapable; } - else if ([contentType isEqualToString:@"Alphanumeric"]) + else if ([keyboardType isEqualToString:@"NumbersAndPunctuation"]) { - keyType = UIKeyboardTypeAlphabet; + keyType = UIKeyboardTypeNumbersAndPunctuation; + } + else if ([keyboardType isEqualToString:@"URL"]) + { + keyType = UIKeyboardTypeURL; + } + else if ([keyboardType isEqualToString:@"NumberPad"]) + { + keyType = UIKeyboardTypeNumberPad; } - else if ([contentType isEqualToString:@"Name"]) + else if ([keyboardType isEqualToString:@"PhonePad"]) + { + keyType = UIKeyboardTypePhonePad; + } + else if ([keyboardType isEqualToString:@"NamePhonePad"]) { keyType = UIKeyboardTypeNamePhonePad; } - else if ([contentType isEqualToString:@"EmailAddress"]) + else if ([keyboardType isEqualToString:@"EmailAddress"]) { keyType = UIKeyboardTypeEmailAddress; } - else if ([contentType isEqualToString:@"Password"]) + else if ([keyboardType isEqualToString:@"Social"]) { - password = YES; + keyType = UIKeyboardTypeTwitter; } - else if ([contentType isEqualToString:@"Pin"]) + else if ([keyboardType isEqualToString:@"Search"]) { - keyType = UIKeyboardTypePhonePad; + keyType = UIKeyboardTypeWebSearch; } - + UIControlContentHorizontalAlignment halign = UIControlContentHorizontalAlignmentLeft; UIControlContentVerticalAlignment valign = UIControlContentVerticalAlignmentCenter; diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 682f4bb..63cc7f3 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -46,6 +46,7 @@ private struct EditBoxConfig public Color textColor; public Color backColor; public string contentType; + public string keyboardType; public string font; public float fontSize; public string align; @@ -235,6 +236,7 @@ private void PrepareNativeEdit() mConfig.textColor = objUnityText.color; mConfig.align = objUnityText.alignment.ToString(); mConfig.contentType = objUnityInput.contentType.ToString(); + mConfig.keyboardType = objUnityInput.keyboardType.ToString(); mConfig.backColor = new Color(1.0f, 1.0f, 1.0f, 0.0f); mConfig.multiline = (objUnityInput.lineType == InputField.LineType.SingleLine) ? false : true; } @@ -308,6 +310,7 @@ private void CreateNativeEdit() jsonMsg["font"] = mConfig.font; jsonMsg["fontSize"] = mConfig.fontSize; jsonMsg["contentType"] = mConfig.contentType; + jsonMsg["keyboardType"] = mConfig.keyboardType; jsonMsg["align"] = mConfig.align; jsonMsg["withDoneButton"] = this.withDoneButton; jsonMsg["placeHolder"] = mConfig.placeHolder; From e5c6e0f3032439de62281da86fd9ce28f01efad8 Mon Sep 17 00:00:00 2001 From: Jarmo Hiipakka Date: Sat, 21 Sep 2019 11:32:42 +0300 Subject: [PATCH 40/64] [YS-18196] Fix numeric type serialization Fix the serialization of numeric types by specifying the invariant culture explicitly. Implemented with minimal changes to the UnityNativeEdit 3rd party plugin. --- release/NativeEditPlugin/scripts/MiniJSON.cs | 25 ++++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/release/NativeEditPlugin/scripts/MiniJSON.cs b/release/NativeEditPlugin/scripts/MiniJSON.cs index ec7720e..ae3fcd9 100644 --- a/release/NativeEditPlugin/scripts/MiniJSON.cs +++ b/release/NativeEditPlugin/scripts/MiniJSON.cs @@ -29,6 +29,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Text; @@ -527,18 +528,22 @@ void SerializeString(string str) { } void SerializeOther(object value) { - if (value is float - || value is int - || value is uint + if (value is int || value is long - || value is double || value is sbyte - || value is byte - || value is short - || value is ushort - || value is ulong - || value is decimal) { - builder.Append(value.ToString()); + || value is short) { + builder.Append(Convert.ToInt64(value).ToString(CultureInfo.InvariantCulture)); + } + else if (value is uint + || value is byte + || value is ushort + || value is ulong) { + builder.Append(Convert.ToUInt64(value).ToString(CultureInfo.InvariantCulture)); + } + else if (value is float + || value is double + || value is decimal) { + builder.Append(Convert.ToDecimal(value).ToString(CultureInfo.InvariantCulture)); } else { SerializeString(value.ToString()); From d41ee4211db4e903653e527c5636346506943f9f Mon Sep 17 00:00:00 2001 From: Sakari Bergen Date: Thu, 3 Oct 2019 18:02:32 +0300 Subject: [PATCH 41/64] Add CODEOWNERS to get notifications --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..5ec936b --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +/ @YousicianGit/coreapplication From f144a222fa49b9f136aab7fb4967acf5731e4055 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Thu, 24 Oct 2019 14:02:35 +0300 Subject: [PATCH 42/64] iosContentTypeOverride for NativeEditBox --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 63cc7f3..c4e9773 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -53,6 +53,7 @@ private struct EditBoxConfig public string placeHolder; public int characterLimit; public Color placeHolderColor; + public IosContentTypeOverride iosContentTypeOverride; } public enum ReturnKeyType @@ -61,9 +62,18 @@ public enum ReturnKeyType Next, Done } - + + private enum IosContentTypeOverride + { + None, + Username, + Password, + NewPassword, + } + public bool withDoneButton = true; public ReturnKeyType returnKeyType; + [SerializeField] private IosContentTypeOverride iosContentTypeOverride; public event Action returnPressed; @@ -239,6 +249,7 @@ private void PrepareNativeEdit() mConfig.keyboardType = objUnityInput.keyboardType.ToString(); mConfig.backColor = new Color(1.0f, 1.0f, 1.0f, 0.0f); mConfig.multiline = (objUnityInput.lineType == InputField.LineType.SingleLine) ? false : true; + this.mConfig.iosContentTypeOverride = this.iosContentTypeOverride; } public override void OnPluginMsgDirect(JsonObject jsonMsg) @@ -319,6 +330,7 @@ private void CreateNativeEdit() jsonMsg["placeHolderColor_b"] = mConfig.placeHolderColor.b; jsonMsg["placeHolderColor_a"] = mConfig.placeHolderColor.a; jsonMsg["multiline"] = mConfig.multiline; + jsonMsg["contentTypeOverride"] = this.mConfig.iosContentTypeOverride.ToString(); this.AppendExtraFieldsForCreation(jsonMsg); switch (returnKeyType) From 34ca78752326a589f1eeebd1d93b0811eae30560 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Fri, 25 Oct 2019 10:44:08 +0300 Subject: [PATCH 43/64] Read and use iOS content type override from the json --- .../Plugins/iOS/EditBox_iOS.m | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 9f88e03..8a65b6a 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -251,6 +251,7 @@ -(void) create:(JsonObject*)json NSString* alignment = [json getString:@"align"]; BOOL withDoneButton = [json getBool:@"withDoneButton"]; BOOL multiline = [json getBool:@"multiline"]; + NSString* contentTypeOverride = [json getString:@"contentTypeOverride"]; BOOL autoCorr = NO; BOOL password = NO; @@ -417,10 +418,22 @@ -(void) create:(JsonObject*)json [textView setSecureTextEntry:password]; if (keyboardDoneButtonView != nil) textView.inputAccessoryView = keyboardDoneButtonView; - - + /// Todo /// UITextView Alignment is not implemented + + if ([contentTypeOverride isEqualToString:@"Username"]) + { + textView.textContentType = UITextContentTypeUsername; + } + else if ([contentTypeOverride isEqualToString:@"Password"]) + { + textView.textContentType = UITextContentTypePassword; + } + else if ([contentTypeOverride isEqualToString:@"NewPassword"]) + { + textView.textContentType = UITextContentTypeNewPassword; + } editView = textView; } @@ -447,7 +460,20 @@ -(void) create:(JsonObject*)json [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; [textField setSecureTextEntry:password]; if (keyboardDoneButtonView != nil) textField.inputAccessoryView = keyboardDoneButtonView; - + + if ([contentTypeOverride isEqualToString:@"Username"]) + { + textField.textContentType = UITextContentTypeUsername; + } + else if ([contentTypeOverride isEqualToString:@"Password"]) + { + textField.textContentType = UITextContentTypePassword; + } + else if ([contentTypeOverride isEqualToString:@"NewPassword"]) + { + textField.textContentType = UITextContentTypeNewPassword; + } + editView = textField; } [viewPlugin addSubview:editView]; From 34609ccd1dee5bc774ec59fea8dfda225065bd38 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Fri, 25 Oct 2019 16:33:03 +0300 Subject: [PATCH 44/64] iOS 12 check for new content types --- .../Plugins/iOS/EditBox_iOS.m | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 8a65b6a..8256fef 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -422,17 +422,20 @@ -(void) create:(JsonObject*)json /// Todo /// UITextView Alignment is not implemented - if ([contentTypeOverride isEqualToString:@"Username"]) + if (@available(iOS 12.0, *)) { - textView.textContentType = UITextContentTypeUsername; - } - else if ([contentTypeOverride isEqualToString:@"Password"]) - { - textView.textContentType = UITextContentTypePassword; - } - else if ([contentTypeOverride isEqualToString:@"NewPassword"]) - { - textView.textContentType = UITextContentTypeNewPassword; + if ([contentTypeOverride isEqualToString:@"Username"]) + { + textView.textContentType = UITextContentTypeUsername; + } + else if ([contentTypeOverride isEqualToString:@"Password"]) + { + textView.textContentType = UITextContentTypePassword; + } + else if ([contentTypeOverride isEqualToString:@"NewPassword"]) + { + textView.textContentType = UITextContentTypeNewPassword; + } } editView = textView; @@ -461,17 +464,20 @@ -(void) create:(JsonObject*)json [textField setSecureTextEntry:password]; if (keyboardDoneButtonView != nil) textField.inputAccessoryView = keyboardDoneButtonView; - if ([contentTypeOverride isEqualToString:@"Username"]) - { - textField.textContentType = UITextContentTypeUsername; - } - else if ([contentTypeOverride isEqualToString:@"Password"]) - { - textField.textContentType = UITextContentTypePassword; - } - else if ([contentTypeOverride isEqualToString:@"NewPassword"]) + if (@available(iOS 12.0, *)) { - textField.textContentType = UITextContentTypeNewPassword; + if ([contentTypeOverride isEqualToString:@"Username"]) + { + textField.textContentType = UITextContentTypeUsername; + } + else if ([contentTypeOverride isEqualToString:@"Password"]) + { + textField.textContentType = UITextContentTypePassword; + } + else if ([contentTypeOverride isEqualToString:@"NewPassword"]) + { + textField.textContentType = UITextContentTypeNewPassword; + } } editView = textField; From a6a5c7701c9f79c29a5b603bc8980894ddeb5065 Mon Sep 17 00:00:00 2001 From: Sakari Bergen Date: Fri, 25 Oct 2019 16:46:09 +0300 Subject: [PATCH 45/64] Update CODEOWNERS --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 5ec936b..6a6bcde 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -/ @YousicianGit/coreapplication +* @YousicianGit/coreapplication From 4b4af57abd96a4ae6822b5501bd70c38b2b7ce0f Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Fri, 25 Oct 2019 17:23:01 +0300 Subject: [PATCH 46/64] PR suggestion based fixes --- .../Plugins/iOS/EditBox_iOS.m | 53 +++++++++---------- .../NativeEditPlugin/scripts/NativeEditBox.cs | 3 +- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 8256fef..1272375 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -251,7 +251,7 @@ -(void) create:(JsonObject*)json NSString* alignment = [json getString:@"align"]; BOOL withDoneButton = [json getBool:@"withDoneButton"]; BOOL multiline = [json getBool:@"multiline"]; - NSString* contentTypeOverride = [json getString:@"contentTypeOverride"]; + NSString* contentTypeOverride = [json getString:@"iosContentTypeOverride"]; BOOL autoCorr = NO; BOOL password = NO; @@ -390,8 +390,25 @@ -(void) create:(JsonObject*)json else { uiFont = [UIFont systemFontOfSize:fontSize]; - } - + } + + NSString* contentType; + if (@available(iOS 12.0, *)) + { + if ([contentTypeOverride isEqualToString:@"Username"]) + { + contentType = UITextContentTypeUsername; + } + else if ([contentTypeOverride isEqualToString:@"Password"]) + { + contentType = UITextContentTypePassword; + } + else if ([contentTypeOverride isEqualToString:@"NewPassword"]) + { + contentType = UITextContentTypeNewPassword; + } + } + if (multiline) { PlaceholderTextView* textView = [[PlaceholderTextView alloc] initWithFrame:CGRectMake(x, y, width, height)]; @@ -422,20 +439,9 @@ -(void) create:(JsonObject*)json /// Todo /// UITextView Alignment is not implemented - if (@available(iOS 12.0, *)) + if (contentType != nil) { - if ([contentTypeOverride isEqualToString:@"Username"]) - { - textView.textContentType = UITextContentTypeUsername; - } - else if ([contentTypeOverride isEqualToString:@"Password"]) - { - textView.textContentType = UITextContentTypePassword; - } - else if ([contentTypeOverride isEqualToString:@"NewPassword"]) - { - textView.textContentType = UITextContentTypeNewPassword; - } + textView.textContentType = contentType; } editView = textView; @@ -464,20 +470,9 @@ -(void) create:(JsonObject*)json [textField setSecureTextEntry:password]; if (keyboardDoneButtonView != nil) textField.inputAccessoryView = keyboardDoneButtonView; - if (@available(iOS 12.0, *)) + if (contentType != nil) { - if ([contentTypeOverride isEqualToString:@"Username"]) - { - textField.textContentType = UITextContentTypeUsername; - } - else if ([contentTypeOverride isEqualToString:@"Password"]) - { - textField.textContentType = UITextContentTypePassword; - } - else if ([contentTypeOverride isEqualToString:@"NewPassword"]) - { - textField.textContentType = UITextContentTypeNewPassword; - } + textField.textContentType = contentType; } editView = textField; diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index c4e9773..cccaf17 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -63,6 +63,7 @@ public enum ReturnKeyType Done } + // The name of these enum values has to exactly match the string check in iOS native code private enum IosContentTypeOverride { None, @@ -330,7 +331,7 @@ private void CreateNativeEdit() jsonMsg["placeHolderColor_b"] = mConfig.placeHolderColor.b; jsonMsg["placeHolderColor_a"] = mConfig.placeHolderColor.a; jsonMsg["multiline"] = mConfig.multiline; - jsonMsg["contentTypeOverride"] = this.mConfig.iosContentTypeOverride.ToString(); + jsonMsg["iosContentTypeOverride"] = this.mConfig.iosContentTypeOverride.ToString(); this.AppendExtraFieldsForCreation(jsonMsg); switch (returnKeyType) From 028443f88320622c96b7a6b5502d9f676672aa0c Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Mon, 28 Oct 2019 09:23:13 +0200 Subject: [PATCH 47/64] Switch from string to UITextContentType --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 1272375..16682ef 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -392,7 +392,7 @@ -(void) create:(JsonObject*)json uiFont = [UIFont systemFontOfSize:fontSize]; } - NSString* contentType; + UITextContentType* contentType = nil; if (@available(iOS 12.0, *)) { if ([contentTypeOverride isEqualToString:@"Username"]) From d13761d3392801c6c8a69974634f7c333d824b73 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Mon, 28 Oct 2019 09:38:47 +0200 Subject: [PATCH 48/64] Remove extra asterisk --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 16682ef..06e0bf9 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -392,7 +392,7 @@ -(void) create:(JsonObject*)json uiFont = [UIFont systemFontOfSize:fontSize]; } - UITextContentType* contentType = nil; + UITextContentType contentType = nil; if (@available(iOS 12.0, *)) { if ([contentTypeOverride isEqualToString:@"Username"]) From 62e37ecfb9f874f54e1461f3e2e50e1d3a041127 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Mon, 28 Oct 2019 09:58:18 +0200 Subject: [PATCH 49/64] Rename local variable because of collision --- .../NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 06e0bf9..9ff5ad6 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -392,20 +392,20 @@ -(void) create:(JsonObject*)json uiFont = [UIFont systemFontOfSize:fontSize]; } - UITextContentType contentType = nil; + UITextContentType overrideContentType = nil; if (@available(iOS 12.0, *)) { if ([contentTypeOverride isEqualToString:@"Username"]) { - contentType = UITextContentTypeUsername; + overrideContentType = UITextContentTypeUsername; } else if ([contentTypeOverride isEqualToString:@"Password"]) { - contentType = UITextContentTypePassword; + overrideContentType = UITextContentTypePassword; } else if ([contentTypeOverride isEqualToString:@"NewPassword"]) { - contentType = UITextContentTypeNewPassword; + overrideContentType = UITextContentTypeNewPassword; } } @@ -439,9 +439,9 @@ -(void) create:(JsonObject*)json /// Todo /// UITextView Alignment is not implemented - if (contentType != nil) + if (overrideContentType != nil) { - textView.textContentType = contentType; + textView.textContentType = overrideContentType; } editView = textView; @@ -470,9 +470,9 @@ -(void) create:(JsonObject*)json [textField setSecureTextEntry:password]; if (keyboardDoneButtonView != nil) textField.inputAccessoryView = keyboardDoneButtonView; - if (contentType != nil) + if (overrideContentType != nil) { - textField.textContentType = contentType; + textField.textContentType = overrideContentType; } editView = textField; From 52d5f0eb136435963bad39a1e843f80b2f0c498c Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Mon, 28 Oct 2019 14:29:08 +0200 Subject: [PATCH 50/64] Stop touching native field visibility when app gains/loses focus --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index cccaf17..b210a01 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -194,14 +194,6 @@ protected override void OnDestroy() base.OnDestroy(); } - private void OnApplicationFocus(bool hasFocus) - { - if (!bNativeEditCreated || !this.Visible) - return; - - this.SetVisible(hasFocus); - } - private IEnumerator InitializeOnNextFrame() { yield return null; From 8059a4a4e0b47cfdf2c73a463f84a52138c3b583 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Tue, 29 Oct 2019 17:03:21 +0200 Subject: [PATCH 51/64] Touch firstresponder when new EditBox is created to properly init it on os level --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 9ff5ad6..94c4f39 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -478,6 +478,8 @@ -(void) create:(JsonObject*)json editView = textField; } [viewPlugin addSubview:editView]; + [editView becomeFirstResponder]; + [editView resignFirstResponder]; } -(void) setText:(JsonObject*)json From bcf4235125ca9ec08dff933865c3fc61ef85ec66 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Wed, 30 Oct 2019 11:43:07 +0200 Subject: [PATCH 52/64] Only touch when one of possible autofilled types and not new password --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 94c4f39..858d2f9 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -478,8 +478,12 @@ -(void) create:(JsonObject*)json editView = textField; } [viewPlugin addSubview:editView]; - [editView becomeFirstResponder]; - [editView resignFirstResponder]; + + if (overrideContentType != nil && overrideContentType != UITextContentTypeNewPassword) + { + [editView becomeFirstResponder]; + [editView resignFirstResponder]; + } } -(void) setText:(JsonObject*)json From 3d073196d2e271eb58c46df236c64b89d5de747e Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Wed, 30 Oct 2019 11:43:55 +0200 Subject: [PATCH 53/64] Delay focusing more because of autofill fix --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index b210a01..035c045 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -347,8 +347,10 @@ private void CreateNativeEdit() if (!visibleOnCreate) SetVisible(false); - if (focusOnCreate) - SetFocus(true); + if (this.focusOnCreate) + { + this.StartCoroutine(this.DelayedFocus(true)); + } } private void SetTextNative(string newText) @@ -393,6 +395,13 @@ public void SetRectNative(RectTransform rectTrans) } } + private IEnumerator DelayedFocus(bool focus) + { + yield return null; + + this.SetFocus(focus); + } + public void SetFocus(bool bFocus) { #if (UNITY_IOS || UNITY_ANDROID) && !UNITY_EDITOR From 187733515bf3c7bd93649f62b5266dd7a517689c Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Wed, 30 Oct 2019 14:10:09 +0200 Subject: [PATCH 54/64] Revert "Only touch when one of possible autofilled types and not new password" This reverts commit bcf4235125ca9ec08dff933865c3fc61ef85ec66. --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 858d2f9..94c4f39 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -478,12 +478,8 @@ -(void) create:(JsonObject*)json editView = textField; } [viewPlugin addSubview:editView]; - - if (overrideContentType != nil && overrideContentType != UITextContentTypeNewPassword) - { - [editView becomeFirstResponder]; - [editView resignFirstResponder]; - } + [editView becomeFirstResponder]; + [editView resignFirstResponder]; } -(void) setText:(JsonObject*)json From 694f13f8c7136b9dac12ae70417fee0848d160d4 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Wed, 30 Oct 2019 14:10:22 +0200 Subject: [PATCH 55/64] Revert "Touch firstresponder when new EditBox is created to properly init it on os level" This reverts commit 8059a4a4e0b47cfdf2c73a463f84a52138c3b583. --- release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m index 94c4f39..9ff5ad6 100755 --- a/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m +++ b/release/NativeEditPlugin/Plugins/iOS/EditBox_iOS.m @@ -478,8 +478,6 @@ -(void) create:(JsonObject*)json editView = textField; } [viewPlugin addSubview:editView]; - [editView becomeFirstResponder]; - [editView resignFirstResponder]; } -(void) setText:(JsonObject*)json From 2e05493bfb7771fb33921cd345c7179912b9272e Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Wed, 30 Oct 2019 14:11:25 +0200 Subject: [PATCH 56/64] Do all native input delay inside one coroutine --- .../NativeEditPlugin/scripts/NativeEditBox.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 035c045..800c12a 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -206,6 +206,13 @@ private IEnumerator InitializeOnNextFrame() objUnityInput.placeholder.gameObject.SetActive(false); objUnityText.enabled = false; objUnityInput.enabled = false; + + yield return null; + + if (this.focusOnCreate) + { + this.SetFocus(true); + } #endif } @@ -346,11 +353,6 @@ private void CreateNativeEdit() if (!visibleOnCreate) SetVisible(false); - - if (this.focusOnCreate) - { - this.StartCoroutine(this.DelayedFocus(true)); - } } private void SetTextNative(string newText) @@ -395,13 +397,6 @@ public void SetRectNative(RectTransform rectTrans) } } - private IEnumerator DelayedFocus(bool focus) - { - yield return null; - - this.SetFocus(focus); - } - public void SetFocus(bool bFocus) { #if (UNITY_IOS || UNITY_ANDROID) && !UNITY_EDITOR From 30120f1d8b8705e0b717758b402518220535cec7 Mon Sep 17 00:00:00 2001 From: Juho Iso-Markku Date: Wed, 30 Oct 2019 15:19:40 +0200 Subject: [PATCH 57/64] Add comment for delayed focus --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 800c12a..31e01bf 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -207,6 +207,12 @@ private IEnumerator InitializeOnNextFrame() objUnityText.enabled = false; objUnityInput.enabled = false; + // For iOS autofill to work correctly, all input fields expected to be autofilled, need to exist before we set + // the native focus. Assuming all related input fields are created simultaneously, they will all be + // initialized after one frame (see above). In this case, waiting for one more frame should ensure they all + // exist before we set the focus. In more complex cases, the caller may need to further delay setting focus, + // until all related input fields are guaranteed to exist. + yield return null; if (this.focusOnCreate) From 206cdcd7070a77550a19e5a19dd63e52d3a53ae5 Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Thu, 19 Mar 2020 12:43:11 +0200 Subject: [PATCH 58/64] Basic support for TextMesh Pro --- .../NativeEditPlugin/scripts/NativeEdit.asmdef | 17 ++++++++++++++--- .../NativeEditPlugin/scripts/NativeEditBox.cs | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/release/NativeEditPlugin/scripts/NativeEdit.asmdef b/release/NativeEditPlugin/scripts/NativeEdit.asmdef index 7b48b13..fa2530f 100644 --- a/release/NativeEditPlugin/scripts/NativeEdit.asmdef +++ b/release/NativeEditPlugin/scripts/NativeEdit.asmdef @@ -1,3 +1,14 @@ -{ - "name": "NativeEdit" -} +{ + "name": "NativeEdit", + "references": [ + "Unity.TextMeshPro" + ], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 31e01bf..85ea570 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -35,6 +35,7 @@ using UnityEngine.Events; using System; using System.Collections; +using TMPro; using UnityEngine.UI; [RequireComponent(typeof(InputField))] @@ -236,13 +237,22 @@ private void Update() private void PrepareNativeEdit() { + var tmpPlaceholder = objUnityInput.placeholder.GetComponent(); var placeHolder = objUnityInput.placeholder.GetComponent(); if (useInputFieldFont) mConfig.font = objUnityText.font.fontNames.Length > 0 ? objUnityText.font.fontNames[0] : "Arial"; - mConfig.placeHolder = placeHolder.text; - mConfig.placeHolderColor = placeHolder.color; + if (tmpPlaceholder != null) + { + mConfig.placeHolder = tmpPlaceholder.text; + mConfig.placeHolderColor = tmpPlaceholder.color; + } + else + { + mConfig.placeHolder = placeHolder.text; + mConfig.placeHolderColor = placeHolder.color; + } mConfig.characterLimit = objUnityInput.characterLimit; Rect rectScreen = GetScreenRectFromRectTransform(this.objUnityText.rectTransform); From b86d2b5e4b0b9fe24b1331be3d94250c1242831c Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Tue, 29 Sep 2020 15:08:11 +0300 Subject: [PATCH 59/64] Fix for unassigned InputField when Awake is not called yet --- .../NativeEditPlugin/scripts/NativeEditBox.cs | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 85ea570..8206a4a 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -87,7 +87,7 @@ private enum IosContentTypeOverride private bool bNativeEditCreated = false; private InputField objUnityInput; - private Text objUnityText; + private Text objUnityText => objUnityInput.textComponent; private bool focusOnCreate; private bool visibleOnCreate = true; @@ -106,17 +106,36 @@ private enum IosContentTypeOverride private const string MSG_RETURN_PRESSED = "ReturnPressed"; private const string MSG_GET_TEXT = "GetText"; - public InputField InputField { get { return objUnityInput; } } + public InputField InputField + { + get + { + if (this.objUnityInput != null) + { + return this.objUnityInput; + } + + this.objUnityInput = this.GetComponent(); + if (this.objUnityInput == null) + { + Debug.LogErrorFormat("No InputField found {0} NativeEditBox Error", this.name); + throw new MissingComponentException(); + } + + return this.objUnityInput; + } + } + public bool Visible { get; private set; } protected virtual void AppendExtraFieldsForCreation(JsonObject jsonObject) { } public string text { - get { return objUnityInput.text; } + get { return InputField.text; } set { - objUnityInput.text = value; + InputField.text = value; SetTextNative(value); } } @@ -153,18 +172,6 @@ public static Rect GetScreenRectFromRectTransform(RectTransform rectTransform) private EditBoxConfig mConfig; - private void Awake() - { - objUnityInput = this.GetComponent(); - if (objUnityInput == null) - { - Debug.LogErrorFormat("No InputField found {0} NativeEditBox Error", this.name); - throw new MissingComponentException(); - } - - objUnityText = objUnityInput.textComponent; - } - // Use this for initialization protected override void Start() { @@ -202,11 +209,11 @@ private IEnumerator InitializeOnNextFrame() this.PrepareNativeEdit(); #if (UNITY_IPHONE || UNITY_ANDROID) && !UNITY_EDITOR this.CreateNativeEdit(); - this.SetTextNative(this.objUnityInput.text); + this.SetTextNative(this.InputField.text); - objUnityInput.placeholder.gameObject.SetActive(false); - objUnityText.enabled = false; - objUnityInput.enabled = false; + this.InputField.placeholder.gameObject.SetActive(false); + this.objUnityText.enabled = false; + this.InputField.enabled = false; // For iOS autofill to work correctly, all input fields expected to be autofilled, need to exist before we set // the native focus. Assuming all related input fields are created simultaneously, they will all be @@ -229,7 +236,7 @@ private void Update() this.UpdateForceKeyeventForAndroid(); #endif - if (updateRectEveryFrame && this.objUnityInput != null && bNativeEditCreated) + if (updateRectEveryFrame && this.InputField != null && bNativeEditCreated) { SetRectNative(this.objUnityText.rectTransform); } @@ -237,8 +244,8 @@ private void Update() private void PrepareNativeEdit() { - var tmpPlaceholder = objUnityInput.placeholder.GetComponent(); - var placeHolder = objUnityInput.placeholder.GetComponent(); + var tmpPlaceholder = this.InputField.placeholder.GetComponent(); + var placeHolder = this.InputField.placeholder.GetComponent(); if (useInputFieldFont) mConfig.font = objUnityText.font.fontNames.Length > 0 ? objUnityText.font.fontNames[0] : "Arial"; @@ -253,7 +260,7 @@ private void PrepareNativeEdit() mConfig.placeHolder = placeHolder.text; mConfig.placeHolderColor = placeHolder.color; } - mConfig.characterLimit = objUnityInput.characterLimit; + mConfig.characterLimit = this.InputField.characterLimit; Rect rectScreen = GetScreenRectFromRectTransform(this.objUnityText.rectTransform); float fHeightRatio = rectScreen.height / objUnityText.rectTransform.rect.height; @@ -261,10 +268,10 @@ private void PrepareNativeEdit() mConfig.textColor = objUnityText.color; mConfig.align = objUnityText.alignment.ToString(); - mConfig.contentType = objUnityInput.contentType.ToString(); - mConfig.keyboardType = objUnityInput.keyboardType.ToString(); + mConfig.contentType = this.InputField.contentType.ToString(); + mConfig.keyboardType = this.InputField.keyboardType.ToString(); mConfig.backColor = new Color(1.0f, 1.0f, 1.0f, 0.0f); - mConfig.multiline = (objUnityInput.lineType == InputField.LineType.SingleLine) ? false : true; + mConfig.multiline = this.InputField.lineType != InputField.LineType.SingleLine; this.mConfig.iosContentTypeOverride = this.iosContentTypeOverride; } @@ -290,7 +297,7 @@ protected virtual void HandlePluginMessage(JsonObject jsonMsg) } else if (msg.Equals(MSG_TEXT_CHANGE) || msg.Equals(MSG_TEXT_END_EDIT)) { - this.objUnityInput.text = jsonMsg.GetString("text"); + this.InputField.text = jsonMsg.GetString("text"); } else if (msg.Equals(MSG_RETURN_PRESSED)) { @@ -432,9 +439,9 @@ public void SetFocus(bool bFocus) if (gameObject.activeInHierarchy) { if (bFocus) - objUnityInput.ActivateInputField(); + this.InputField.ActivateInputField(); else - objUnityInput.DeactivateInputField(); + this.InputField.DeactivateInputField(); } else focusOnCreate = bFocus; From 12fbd87a87228cb6b6e113a7ce0caff54e29084b Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Tue, 6 Oct 2020 14:16:17 +0300 Subject: [PATCH 60/64] Fix for NullReferenceException when TextEndEdit is sent The HandlePluginMessage call is delayed by a single frame using PluginMsgHandler. By the time it's called, the component can be destroyed. --- release/NativeEditPlugin/scripts/NativeEditBox.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/release/NativeEditPlugin/scripts/NativeEditBox.cs b/release/NativeEditPlugin/scripts/NativeEditBox.cs index 8206a4a..6c89d7d 100644 --- a/release/NativeEditPlugin/scripts/NativeEditBox.cs +++ b/release/NativeEditPlugin/scripts/NativeEditBox.cs @@ -289,6 +289,10 @@ private IEnumerator HandlePluginMessageOnNextFrame(JsonObject jsonMsg) protected virtual void HandlePluginMessage(JsonObject jsonMsg) { + // By the time this is called the component might be destroyed + if (this == null) + return; + string msg = jsonMsg.GetString("msg"); if (msg.Equals(MSG_TEXT_BEGIN_EDIT)) { From 537dc1743a2e24f31ddcd0f0800f5a12d1c7e4df Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Mon, 2 Nov 2020 14:36:29 +0200 Subject: [PATCH 61/64] Added support for Unity Package Manager --- release.meta | 3 ++ .../Android/nativeeditplugin-release.aar.meta | 32 +++++++++++++++++++ release/NativeEditPlugin/README.md.meta | 7 ++++ .../{demo => Samples~}/demo.cs | 0 .../{demo => Samples~}/demo.cs.meta | 0 .../{demo => Samples~}/demo.unity | 0 .../{demo => Samples~}/demo.unity.meta | 0 release/NativeEditPlugin/demo.meta | 9 ------ release/NativeEditPlugin/package.json | 16 ++++++++++ release/NativeEditPlugin/package.json.meta | 7 ++++ 10 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 release.meta create mode 100644 release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar.meta create mode 100644 release/NativeEditPlugin/README.md.meta rename release/NativeEditPlugin/{demo => Samples~}/demo.cs (100%) rename release/NativeEditPlugin/{demo => Samples~}/demo.cs.meta (100%) rename release/NativeEditPlugin/{demo => Samples~}/demo.unity (100%) rename release/NativeEditPlugin/{demo => Samples~}/demo.unity.meta (100%) delete mode 100644 release/NativeEditPlugin/demo.meta create mode 100644 release/NativeEditPlugin/package.json create mode 100644 release/NativeEditPlugin/package.json.meta diff --git a/release.meta b/release.meta new file mode 100644 index 0000000..e6dc0b6 --- /dev/null +++ b/release.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cfac1d20dbc44821b8f76ba649183eda +timeCreated: 1604320105 \ No newline at end of file diff --git a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar.meta b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar.meta new file mode 100644 index 0000000..4129ef0 --- /dev/null +++ b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: fd276163f66234567bba725dd3ef5ca4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/release/NativeEditPlugin/README.md.meta b/release/NativeEditPlugin/README.md.meta new file mode 100644 index 0000000..bcc9d70 --- /dev/null +++ b/release/NativeEditPlugin/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 88c0a6a8da0ea4eb5841c115973dc132 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/release/NativeEditPlugin/demo/demo.cs b/release/NativeEditPlugin/Samples~/demo.cs similarity index 100% rename from release/NativeEditPlugin/demo/demo.cs rename to release/NativeEditPlugin/Samples~/demo.cs diff --git a/release/NativeEditPlugin/demo/demo.cs.meta b/release/NativeEditPlugin/Samples~/demo.cs.meta similarity index 100% rename from release/NativeEditPlugin/demo/demo.cs.meta rename to release/NativeEditPlugin/Samples~/demo.cs.meta diff --git a/release/NativeEditPlugin/demo/demo.unity b/release/NativeEditPlugin/Samples~/demo.unity similarity index 100% rename from release/NativeEditPlugin/demo/demo.unity rename to release/NativeEditPlugin/Samples~/demo.unity diff --git a/release/NativeEditPlugin/demo/demo.unity.meta b/release/NativeEditPlugin/Samples~/demo.unity.meta similarity index 100% rename from release/NativeEditPlugin/demo/demo.unity.meta rename to release/NativeEditPlugin/Samples~/demo.unity.meta diff --git a/release/NativeEditPlugin/demo.meta b/release/NativeEditPlugin/demo.meta deleted file mode 100644 index e0c6014..0000000 --- a/release/NativeEditPlugin/demo.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 9afd885945d234ee287edaf3288ca395 -folderAsset: yes -timeCreated: 1430955862 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/release/NativeEditPlugin/package.json b/release/NativeEditPlugin/package.json new file mode 100644 index 0000000..7c517df --- /dev/null +++ b/release/NativeEditPlugin/package.json @@ -0,0 +1,16 @@ +{ + "name": "com.yousician.nativeedit", + "displayName": "Native Edit", + "version": "1.0.0", + "unity": "2019.4", + "description": "Unity Native Input Plugin for both iOS and Android (Unity UI InputField compatible). This means you don't need a separate 'Unity' Input box and you can use all native text functions such as Select, Copy and Paste.", + "type": "library", + "samples": [ + { + + "displayName": "Sample", + "description": "", + "path": "Samples~" + } + ] +} \ No newline at end of file diff --git a/release/NativeEditPlugin/package.json.meta b/release/NativeEditPlugin/package.json.meta new file mode 100644 index 0000000..421748d --- /dev/null +++ b/release/NativeEditPlugin/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9e4e7cb3fb4064579a7d03b455e0016e +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 5f1320bf7dbce315321494780a4714b14282ca09 Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Fri, 6 Nov 2020 12:06:00 +0200 Subject: [PATCH 62/64] Moved Java code directly into the project No need to separately build an `aar` anymore --- .../Plugins/Android/AndroidManifest.xml | 30 ---- .../Plugins/Android/AndroidManifest.xml.meta | 8 - .../Plugins/Android}/EditBox.java | 0 .../Plugins/Android}/EditBox.java.meta | 0 .../Plugins/Android}/NativeEditPlugin.java | 0 .../Android}/NativeEditPlugin.java.meta | 0 .../Android/nativeeditplugin-release.aar | Bin 29761 -> 0 bytes .../Android/nativeeditplugin-release.aar.meta | 32 ---- src/androidProj/.gitignore | 45 ----- src/androidProj/.idea/compiler.xml | 22 --- .../.idea/copyright/profiles_settings.xml | 3 - src/androidProj/.idea/gradle.xml | 18 -- src/androidProj/.idea/misc.xml | 41 ----- src/androidProj/.idea/modules.xml | 9 - src/androidProj/build.gradle | 19 -- src/androidProj/gradle.properties | 18 -- .../gradle/wrapper/gradle-wrapper.jar | Bin 49896 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - src/androidProj/gradlew | 164 ------------------ src/androidProj/gradlew.bat | 90 ---------- src/androidProj/nativeeditplugin/.gitignore | 1 - src/androidProj/nativeeditplugin/build.gradle | 43 ----- .../nativeeditplugin/libs/UnityPlayer.jar | Bin 63418 -> 0 bytes .../nativeeditplugin/proguard-rules.pro | 17 -- .../com/bkmin/android/ApplicationTest.java | 13 -- .../src/main/AndroidManifest.xml | 7 - .../src/main/res/values/strings.xml | 3 - src/androidProj/settings.gradle | 1 - 28 files changed, 590 deletions(-) delete mode 100644 release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml delete mode 100644 release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml.meta rename {src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android => release/NativeEditPlugin/Plugins/Android}/EditBox.java (100%) rename {src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android => release/NativeEditPlugin/Plugins/Android}/EditBox.java.meta (100%) rename {src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android => release/NativeEditPlugin/Plugins/Android}/NativeEditPlugin.java (100%) rename {src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android => release/NativeEditPlugin/Plugins/Android}/NativeEditPlugin.java.meta (100%) delete mode 100644 release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar delete mode 100644 release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar.meta delete mode 100644 src/androidProj/.gitignore delete mode 100644 src/androidProj/.idea/compiler.xml delete mode 100644 src/androidProj/.idea/copyright/profiles_settings.xml delete mode 100644 src/androidProj/.idea/gradle.xml delete mode 100644 src/androidProj/.idea/misc.xml delete mode 100644 src/androidProj/.idea/modules.xml delete mode 100644 src/androidProj/build.gradle delete mode 100644 src/androidProj/gradle.properties delete mode 100644 src/androidProj/gradle/wrapper/gradle-wrapper.jar delete mode 100644 src/androidProj/gradle/wrapper/gradle-wrapper.properties delete mode 100755 src/androidProj/gradlew delete mode 100644 src/androidProj/gradlew.bat delete mode 100644 src/androidProj/nativeeditplugin/.gitignore delete mode 100644 src/androidProj/nativeeditplugin/build.gradle delete mode 100644 src/androidProj/nativeeditplugin/libs/UnityPlayer.jar delete mode 100644 src/androidProj/nativeeditplugin/proguard-rules.pro delete mode 100644 src/androidProj/nativeeditplugin/src/androidTest/java/com/bkmin/android/ApplicationTest.java delete mode 100644 src/androidProj/nativeeditplugin/src/main/AndroidManifest.xml delete mode 100644 src/androidProj/nativeeditplugin/src/main/res/values/strings.xml delete mode 100644 src/androidProj/settings.gradle diff --git a/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml b/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml deleted file mode 100644 index 5d36a8c..0000000 --- a/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml.meta b/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml.meta deleted file mode 100644 index 877490b..0000000 --- a/release/NativeEditPlugin/Plugins/Android/AndroidManifest.xml.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7bfe820b46571db4dbac71c4a5ffec61 -timeCreated: 1459854746 -licenseType: Free -TextScriptImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java b/release/NativeEditPlugin/Plugins/Android/EditBox.java similarity index 100% rename from src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java rename to release/NativeEditPlugin/Plugins/Android/EditBox.java diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta b/release/NativeEditPlugin/Plugins/Android/EditBox.java.meta similarity index 100% rename from src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/EditBox.java.meta rename to release/NativeEditPlugin/Plugins/Android/EditBox.java.meta diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/NativeEditPlugin.java b/release/NativeEditPlugin/Plugins/Android/NativeEditPlugin.java similarity index 100% rename from src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/NativeEditPlugin.java rename to release/NativeEditPlugin/Plugins/Android/NativeEditPlugin.java diff --git a/src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/NativeEditPlugin.java.meta b/release/NativeEditPlugin/Plugins/Android/NativeEditPlugin.java.meta similarity index 100% rename from src/androidProj/nativeeditplugin/src/main/java/com/bkmin/android/NativeEditPlugin.java.meta rename to release/NativeEditPlugin/Plugins/Android/NativeEditPlugin.java.meta diff --git a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar deleted file mode 100644 index b80d9923ce564352afa0480ba391f45c081cb3a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29761 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 S_SgL5`zHTp2?cie+xtH+;l_dh diff --git a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar.meta b/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar.meta deleted file mode 100644 index 4129ef0..0000000 --- a/release/NativeEditPlugin/Plugins/Android/nativeeditplugin-release.aar.meta +++ /dev/null @@ -1,32 +0,0 @@ -fileFormatVersion: 2 -guid: fd276163f66234567bba725dd3ef5ca4 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 1 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Android: Android - second: - enabled: 1 - settings: {} - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/androidProj/.gitignore b/src/androidProj/.gitignore deleted file mode 100644 index c858a88..0000000 --- a/src/androidProj/.gitignore +++ /dev/null @@ -1,45 +0,0 @@ -# Built application files -*.apk -*.ap_ - -# Files for the Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ - -# Gradle files -.gradle -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# Intellij -*.iml - -# Keystore files -*.jks - -# from android studio -/.idea/workspace.xml -/.idea/libraries -.DS_Store - diff --git a/src/androidProj/.idea/compiler.xml b/src/androidProj/.idea/compiler.xml deleted file mode 100644 index 96cc43e..0000000 --- a/src/androidProj/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/androidProj/.idea/copyright/profiles_settings.xml b/src/androidProj/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/src/androidProj/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/androidProj/.idea/gradle.xml b/src/androidProj/.idea/gradle.xml deleted file mode 100644 index e0c8136..0000000 --- a/src/androidProj/.idea/gradle.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/androidProj/.idea/misc.xml b/src/androidProj/.idea/misc.xml deleted file mode 100644 index 279cf59..0000000 --- a/src/androidProj/.idea/misc.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/androidProj/.idea/modules.xml b/src/androidProj/.idea/modules.xml deleted file mode 100644 index 1c57583..0000000 --- a/src/androidProj/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/androidProj/build.gradle b/src/androidProj/build.gradle deleted file mode 100644 index b193299..0000000 --- a/src/androidProj/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - jcenter() - } -} diff --git a/src/androidProj/gradle.properties b/src/androidProj/gradle.properties deleted file mode 100644 index 1d3591c..0000000 --- a/src/androidProj/gradle.properties +++ /dev/null @@ -1,18 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true \ No newline at end of file diff --git a/src/androidProj/gradle/wrapper/gradle-wrapper.jar b/src/androidProj/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 8c0fb64a8698b08ecc4158d828ca593c4928e9dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49896 zcmagFb986H(k`5d^NVfUwr$(C?M#x1ZQHiZiEVpg+jrjgoQrerx!>1o_ul)D>ebz~ zs=Mmxr&>W81QY-S1PKWQ%N-;H^tS;2*XwVA`dej1RRn1z<;3VgfE4~kaG`A%QSPsR z#ovnZe+tS9%1MfeDyz`RirvdjPRK~p(#^q2(^5@O&NM19EHdvN-A&StN>0g6QA^VN z0Gx%Gq#PD$QMRFzmK+utjS^Y1F0e8&u&^=w5K<;4Rz|i3A=o|IKLY+g`iK6vfr9?+ z-`>gmU&i?FGSL5&F?TXFu`&Js6h;15QFkXp2M1H9|Eq~bpov-GU(uz%mH0n55wUl- zv#~ccAz`F5wlQ>e_KlJS3@{)B?^v*EQM=IxLa&76^y51a((wq|2-`qON>+4dLc{Oo z51}}o^Zen(oAjxDK7b++9_Yg`67p$bPo3~BCpGM7uAWmvIhWc5Gi+gQZ|Pwa-Gll@<1xmcPy z|NZmu6m)g5Ftu~BG&Xdxclw7Cij{xbBMBn-LMII#Slp`AElb&2^Hw+w>(3crLH!;I zN+Vk$D+wP1#^!MDCiad@vM>H#6+`Ct#~6VHL4lzmy;lSdk>`z6)=>Wh15Q2)dQtGqvn0vJU@+(B5{MUc*qs4!T+V=q=wy)<6$~ z!G>e_4dN@lGeF_$q9`Ju6Ncb*x?O7=l{anm7Eahuj_6lA{*#Gv*TaJclevPVbbVYu z(NY?5q+xxbO6%g1xF0r@Ix8fJ~u)VRUp`S%&rN$&e!Od`~s+64J z5*)*WSi*i{k%JjMSIN#X;jC{HG$-^iX+5f5BGOIHWAl*%15Z#!xntpk($-EGKCzKa zT7{siZ9;4TICsWQ$pu&wKZQTCvpI$Xvzwxoi+XkkpeE&&kFb!B?h2hi%^YlXt|-@5 zHJ~%AN!g_^tmn1?HSm^|gCE#!GRtK2(L{9pL#hp0xh zME}|DB>(5)`iE7CM)&_+S}-Bslc#@B5W4_+k4Cp$l>iVyg$KP>CN?SVGZ(&02>iZK zB<^HP$g$Lq*L$BWd?2(F?-MUbNWTJVQdW7$#8a|k_30#vHAD1Z{c#p;bETk0VnU5A zBgLe2HFJ3032$G<`m*OB!KM$*sdM20jm)It5OSru@tXpK5LT>#8)N!*skNu1$TpIw zufjjdp#lyH5bZ%|Iuo|iu9vG1HrIVWLH>278xo>aVBkPN3V$~!=KnlXQ4eDqS7%E% zQ!z^$Q$b^6Q)g#cLpwur(|<0gWHo6A6jc;n`t(V9T;LzTAU{IAu*uEQ%Ort1k+Kn+f_N`9|bxYC+~Z1 zCC1UCWv*Orx$_@ydv9mIe(liLfOr7mhbV@tKw{6)q^1DH1nmvZ0cj215R<~&I<4S| zgnr;9Cdjqpz#o8i0CQjtl`}{c*P)aSdH|abxGdrR)-3z+02-eX(k*B)Uqv6~^nh** z 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/src/androidProj/gradlew.bat b/src/androidProj/gradlew.bat deleted file mode 100644 index aec9973..0000000 --- a/src/androidProj/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/src/androidProj/nativeeditplugin/.gitignore b/src/androidProj/nativeeditplugin/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/src/androidProj/nativeeditplugin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/src/androidProj/nativeeditplugin/build.gradle b/src/androidProj/nativeeditplugin/build.gradle deleted file mode 100644 index 256af3d..0000000 --- a/src/androidProj/nativeeditplugin/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" - - defaultConfig { - minSdkVersion 11 - targetSdkVersion 25 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -repositories { - maven { - url "https://maven.google.com" - } -} - -dependencies { - provided files('./libs/UnityPlayer.jar') - compile 'com.android.support:appcompat-v7:25.1.0' - compile 'com.redmadrobot:input-mask-android:4.3.1' - compile 'org.jetbrains.kotlin:kotlin-stdlib:1.3.41' -} - -task clearJar(type: Delete) { - delete 'build/outputs/nativeeditplugin.jar' -} - -task makeJar(type: Copy) { - from('build/intermediates/bundles/release/') - into('build/outputs/') -} - -makeJar.dependsOn(clearJar, build) \ No newline at end of file diff --git a/src/androidProj/nativeeditplugin/libs/UnityPlayer.jar b/src/androidProj/nativeeditplugin/libs/UnityPlayer.jar deleted file mode 100644 index bacd980ea704a660d0464e852b1f775f97c6aff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63418 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 b^V@&p{bO;`eLF9yfImqv{dIn~^WXmfkRQti diff --git a/src/androidProj/nativeeditplugin/proguard-rules.pro b/src/androidProj/nativeeditplugin/proguard-rules.pro deleted file mode 100644 index e82f354..0000000 --- a/src/androidProj/nativeeditplugin/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/kyungminbang/Library/Android/sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/src/androidProj/nativeeditplugin/src/androidTest/java/com/bkmin/android/ApplicationTest.java b/src/androidProj/nativeeditplugin/src/androidTest/java/com/bkmin/android/ApplicationTest.java deleted file mode 100644 index 336c6b6..0000000 --- a/src/androidProj/nativeeditplugin/src/androidTest/java/com/bkmin/android/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.bkmin.android; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/src/androidProj/nativeeditplugin/src/main/AndroidManifest.xml b/src/androidProj/nativeeditplugin/src/main/AndroidManifest.xml deleted file mode 100644 index 9889667..0000000 --- a/src/androidProj/nativeeditplugin/src/main/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/androidProj/nativeeditplugin/src/main/res/values/strings.xml b/src/androidProj/nativeeditplugin/src/main/res/values/strings.xml deleted file mode 100644 index 4da4064..0000000 --- a/src/androidProj/nativeeditplugin/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - nativeeditplugin - diff --git a/src/androidProj/settings.gradle b/src/androidProj/settings.gradle deleted file mode 100644 index fd94c52..0000000 --- a/src/androidProj/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':nativeeditplugin' From 553f2051d2e50f40d243a6c513fe72a3e7441b01 Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Tue, 17 Nov 2020 22:14:00 +0200 Subject: [PATCH 63/64] Disable obfuscation for function used by UnitySendMessage --- release/NativeEditPlugin/scripts/PluginMsgHandler.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/release/NativeEditPlugin/scripts/PluginMsgHandler.cs b/release/NativeEditPlugin/scripts/PluginMsgHandler.cs index 1ad6834..3544704 100644 --- a/release/NativeEditPlugin/scripts/PluginMsgHandler.cs +++ b/release/NativeEditPlugin/scripts/PluginMsgHandler.cs @@ -27,6 +27,7 @@ using System.Runtime.InteropServices; using System; using System.IO; +using System.Reflection; using AOT; public class PluginMsgHandler : MonoBehaviour { @@ -151,6 +152,7 @@ public PluginMsgReceiver GetReceiver(int nSenderId) return m_dictReceiver[nSenderId]; } + [Obfuscation(Exclude = true)] private void OnMsgFromPlugin(string jsonPluginMsg) { if (jsonPluginMsg == null) return; From 0c6dc0982e51cf658f3099055816a38d5f1e8024 Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Wed, 14 Apr 2021 13:03:08 +0300 Subject: [PATCH 64/64] Remove symlink pointing to nonexistent folder --- demo/Assets/NativeEditPlugin/demo | 1 - 1 file changed, 1 deletion(-) delete mode 120000 demo/Assets/NativeEditPlugin/demo diff --git a/demo/Assets/NativeEditPlugin/demo b/demo/Assets/NativeEditPlugin/demo deleted file mode 120000 index 6a83949..0000000 --- a/demo/Assets/NativeEditPlugin/demo +++ /dev/null @@ -1 +0,0 @@ -../../../release/NativeEditPlugin/demo/ \ No newline at end of file