From bf78600b7790ad5ef129ba2383e72b99c0bc2929 Mon Sep 17 00:00:00 2001 From: mopsicus Date: Tue, 10 Sep 2024 13:26:36 +0300 Subject: [PATCH] feat: change keyboard language --- .../java/com/mopsicus/umi/MobileInput.java | 74 ++++++++++++++- CHANGELOG.md | 4 + Documentation~/index.md | 2 + Editor/MobileInputEditor.cs | 4 + Plugins/Android/Mobileinput.aar | Bin 22902 -> 23897 bytes Plugins/iOS/MobileInput.mm | 85 +++++++++++++++++- README.md | 2 + README.ru.md | 2 + Runtime/MobileInput.cs | 2 +- Runtime/MobileInputField.cs | 22 +++++ 10 files changed, 189 insertions(+), 8 deletions(-) diff --git a/Android~/plugin/src/main/java/com/mopsicus/umi/MobileInput.java b/Android~/plugin/src/main/java/com/mopsicus/umi/MobileInput.java index 2cf4ec6..840a882 100644 --- a/Android~/plugin/src/main/java/com/mopsicus/umi/MobileInput.java +++ b/Android~/plugin/src/main/java/com/mopsicus/umi/MobileInput.java @@ -1,6 +1,7 @@ package com.mopsicus.umi; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.PorterDuff; @@ -10,6 +11,7 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; import android.os.Build; +import android.os.LocaleList; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; @@ -30,6 +32,10 @@ import org.json.JSONObject; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; public class MobileInput { @@ -46,6 +52,7 @@ public class MobileInput { private static final String ON_FOCUS = "ON_FOCUS"; private static final String ON_UNFOCUS = "ON_UNFOCUS"; private static final String SET_VISIBLE = "SET_VISIBLE"; + private static final String SET_LANGUAGE = "SET_LANGUAGE"; private static final String TEXT_CHANGE = "TEXT_CHANGE"; private static final String TEXT_END_EDIT = "TEXT_END_EDIT"; private static final String ANDROID_KEY_DOWN = "ANDROID_KEY_DOWN"; @@ -198,6 +205,10 @@ private void processData(JSONObject data) { boolean isVisible = data.getBoolean("is_visible"); this.SetVisible(isVisible); break; + case SET_LANGUAGE: + String code = data.getString("value"); + setKeyboardLanguage(code); + break; case ANDROID_KEY_DOWN: String strKey = data.getString("key"); this.OnForceAndroidKeyDown(strKey); @@ -285,6 +296,7 @@ private void Create(int id, JSONObject data) { String contentType = data.getString("content_type"); String inputType = data.optString("input_type"); String keyboardType = data.optString("keyboard_type"); + String keyboardLanguage = data.optString("keyboard_language"); String returnKeyType = data.getString("return_key_type"); String alignment = data.getString("align"); String customFont = data.getString("font"); @@ -417,6 +429,9 @@ private void Create(int id, JSONObject data) { } else { edit.setTypeface(Typeface.SANS_SERIF); } + if (!keyboardLanguage.equals("default")) { + setKeyboardLanguage(keyboardLanguage); + } final MobileInput input = this; edit.setOnFocusChangeListener((v, isFocus) -> { if (!isFocus) { @@ -517,25 +532,33 @@ void setCaretColor(int color) { InsetDrawable insetDrawable = (InsetDrawable) edit.getTextCursorDrawable(); insetDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); edit.setTextCursorDrawable(insetDrawable); - Log.d("[UMI]", String.format("set caret cursor: %s", color)); + if (Plugin.bridge.isDebug) { + Log.d("[UMI]", String.format("set caret cursor: %s", color)); + } } if (edit.getTextSelectHandle() instanceof BitmapDrawable) { BitmapDrawable insetDrawable = (BitmapDrawable) edit.getTextSelectHandle(); insetDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); edit.setTextSelectHandle(insetDrawable); - Log.d("[UMI]", String.format("set caret handle: %s", color)); + if (Plugin.bridge.isDebug) { + Log.d("[UMI]", String.format("set caret handle: %s", color)); + } } if (edit.getTextSelectHandleRight() instanceof BitmapDrawable) { BitmapDrawable insetDrawable = (BitmapDrawable) edit.getTextSelectHandleRight(); insetDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); edit.setTextSelectHandleRight(insetDrawable); - Log.d("[UMI]", String.format("set caret handle right: %s", color)); + if (Plugin.bridge.isDebug) { + Log.d("[UMI]", String.format("set caret handle right: %s", color)); + } } if (edit.getTextSelectHandleLeft() instanceof BitmapDrawable) { BitmapDrawable insetDrawable = (BitmapDrawable) edit.getTextSelectHandleLeft(); insetDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); edit.setTextSelectHandleLeft(insetDrawable); - Log.d("[UMI]", String.format("set caret handle left: %s", color)); + if (Plugin.bridge.isDebug) { + Log.d("[UMI]", String.format("set caret handle left: %s", color)); + } } } else { try { @@ -574,6 +597,49 @@ void setCaretColor(int color) { } } + /** + * Update locale list + * + * @param languageCode New language code + * @return Updated LocaleList + */ + private LocaleList UpdateLocaleList(String languageCode) { + LocaleList locales = edit.getImeHintLocales(); + if (locales == null) { + return new LocaleList(new Locale(languageCode)); + } + ArrayList list = new ArrayList<>(Arrays.asList(locales.toLanguageTags().split(","))); + if (!list.contains(languageCode)) { + list.add(languageCode); + } + ArrayList updated = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + updated.add(new Locale(list.get(i))); + } + return new LocaleList(updated.toArray(new Locale[updated.size()])); + } + + /** + * Set keyboard language for input + * + * @param languageCode Language ISO code + */ + private void setKeyboardLanguage(String languageCode) { + if (Plugin.bridge.isDebug) { + Log.d("[UMI]", String.format("set keyboard language: %s", languageCode)); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + edit.setImeHintLocales(UpdateLocaleList(languageCode)); + } else { + Locale locale = new Locale(languageCode); + Configuration config = new Configuration(); + config.locale = locale; + Plugin.activity.getResources().updateConfiguration(config, null); + } + InputMethodManager imm = (InputMethodManager) Plugin.activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.restartInput(edit); + } + /** * Remove MobileInput */ diff --git a/CHANGELOG.md b/CHANGELOG.md index 9644f33..9fa559a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## [2.0.4] - 2024-09-10 +- ### Added +- Change keyboard language + ## [2.0.3] - 2024-08-28 - ### Added - Custom text selection color (Android) diff --git a/Documentation~/index.md b/Documentation~/index.md index 9e8e9c7..c72ad68 100644 --- a/Documentation~/index.md +++ b/Documentation~/index.md @@ -99,6 +99,8 @@ This is the basic script for using UMI. Add this script to a game object with `T `SetVisible(bool isVisible)` – switch field visibility +`SetLanguage(string value)` – change keyboard language + `SetRect(RectTransform inputRect)` – set new field size and position, this is useful if you want to move or resize the input field manually, at other times this is done automatically using the game object parameters `SetContentType(InputContentType type)` – set content type to field diff --git a/Editor/MobileInputEditor.cs b/Editor/MobileInputEditor.cs index f0bdd59..bd5b8ac 100644 --- a/Editor/MobileInputEditor.cs +++ b/Editor/MobileInputEditor.cs @@ -68,6 +68,10 @@ public override void OnInspectorGUI() { GUILayout.Label("Custom font name:", GUILayout.MaxWidth(LABEL_SIZE)); _target.CustomFont = GUILayout.TextField(_target.CustomFont); GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + GUILayout.Label("Keyboard language:", GUILayout.MaxWidth(LABEL_SIZE)); + _target.KeyboardLanguage = GUILayout.TextField(_target.KeyboardLanguage); + GUILayout.EndHorizontal(); GUILayout.Space(SPACE); _target.IsManualHideControl = GUILayout.Toggle(_target.IsManualHideControl, " Manual hide control"); GUILayout.Space(SPACE); diff --git a/Plugins/Android/Mobileinput.aar b/Plugins/Android/Mobileinput.aar index f2d7b8212f2976335379e4feb33613ec056f9680..4211e99bb2027752c399275fe8b512d86d1543b1 100644 GIT binary patch delta 22796 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 delta 21805 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 diff --git a/Plugins/iOS/MobileInput.mm b/Plugins/iOS/MobileInput.mm index 9624c2d..91633d9 100644 --- a/Plugins/iOS/MobileInput.mm +++ b/Plugins/iOS/MobileInput.mm @@ -13,6 +13,7 @@ #define SET_PTEXT_COLOR @"SET_PTEXT_COLOR" #define SET_BG_COLOR @"SET_BG_COLOR" #define SET_READ_ONLY @"SET_READ_ONLY" +#define SET_LANGUAGE @"SET_LANGUAGE" #define SET_RECT @"SET_RECT" #define ON_FOCUS @"ON_FOCUS" #define ON_UNFOCUS @"ON_UNFOCUS" @@ -31,6 +32,13 @@ /// Dict with inputs NSMutableDictionary *mobileInputList = nil; +/// Custom textfield with overridden input mode +@interface CustomTextField : UITextField + +/// Language code +@property (nonatomic, strong) NSString *languageCode; +@end + /// Interface for placeholder @interface PlaceholderTextView : UITextView @@ -42,6 +50,9 @@ @interface PlaceholderTextView : UITextView /// Placeholder text color @property(nonatomic, strong) UIColor *placeholderColor UI_APPEARANCE_SELECTOR; + +/// Language code +@property (nonatomic, strong) NSString *languageCode; @end /// MobileInput interface @@ -107,6 +118,35 @@ - (void)showKeyboard:(BOOL)value; - (BOOL)isFocused; @end +/// Custom textfield implemenation +@implementation CustomTextField + +/// Set language for keyboard +/// - Parameter languageCode: ISO code +- (void)setLanguageCode:(NSString *)languageCode { + _languageCode = languageCode; + if ([self isFirstResponder]) { + [self resignFirstResponder]; + [self becomeFirstResponder]; + } +} + +/// Overridden input +- (UITextInputMode *)textInputMode { + if (self.languageCode) { + for (UITextInputMode *keyboard in UITextInputMode.activeInputModes) { + if (keyboard.primaryLanguage) { + NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:keyboard.primaryLanguage]; + if ([locale.languageCode isEqualToString:self.languageCode]) { + return keyboard; + } + } + } + } + return [super textInputMode]; +} + +@end /// Placeholder interface @interface PlaceholderTextView () @@ -240,10 +280,35 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } +/// Set language for keyboard +/// - Parameter languageCode: ISO code +- (void)setLanguageCode:(NSString *)languageCode { + _languageCode = languageCode; + if ([self isFirstResponder]) { + [self resignFirstResponder]; + [self becomeFirstResponder]; + } +} + +/// Overidden input +- (UITextInputMode *)textInputMode { + if (self.languageCode) { + for (UITextInputMode *keyboard in UITextInputMode.activeInputModes) { + if (keyboard.primaryLanguage) { + NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:keyboard.primaryLanguage]; + if ([locale.languageCode isEqualToString:self.languageCode]) { + return keyboard; + } + } + } + } + return [super textInputMode]; +} + @end -/// MobileInput implimenation +/// MobileInput implemenation @implementation MobileInput /// Init MobileInput @@ -434,6 +499,13 @@ - (void)processData:(NSDictionary *)data { } else if ([msg isEqualToString:SET_VISIBLE]) { BOOL isVisible = [[data valueForKey:@"is_visible"] boolValue]; [self setVisible:isVisible]; + } else if ([msg isEqualToString:SET_LANGUAGE]) { + NSString *code = [data valueForKey:@"value"]; + if (isMultiline) { + [(PlaceholderTextView *)editView setLanguageCode:code]; + } else { + [(CustomTextField *)editView setLanguageCode:code]; + } } } @@ -512,7 +584,7 @@ - (void)create:(NSDictionary *)data { float caretColor_r = [[data valueForKey:@"caret_color_r"] floatValue]; float caretColor_g = [[data valueForKey:@"caret_color_g"] floatValue]; float caretColor_b = [[data valueForKey:@"caret_color_b"] floatValue]; - float caretColor_a = [[data valueForKey:@"caret_color_a"] floatValue]; + float caretColor_a = [[data valueForKey:@"caret_color_a"] floatValue]; UIColor *caretColor = [UIColor colorWithRed:caretColor_r green:caretColor_g blue:caretColor_b alpha:caretColor_a]; NSString *contentType = [data valueForKey:@"content_type"]; NSString *alignment = [data valueForKey:@"align"]; @@ -525,6 +597,7 @@ - (void)create:(NSDictionary *)data { BOOL password = NO; NSString *inputType = [data valueForKey:@"input_type"]; NSString *keyboardType = [data valueForKey:@"keyboard_type"]; + NSString *keyboardLanguage = [data valueForKey:@"keyboard_language"]; UIKeyboardType keyType = UIKeyboardTypeDefault; if ([contentType isEqualToString:@"Autocorrected"]) { autoCorrection = YES; @@ -665,6 +738,9 @@ - (void)create:(NSDictionary *)data { if (isChangeCaret) { textView.tintColor = caretColor; } + if (![keyboardLanguage isEqualToString:@"default"]) { + textView.languageCode = keyboardLanguage; + } textView.delegate = self; if (keyType == UIKeyboardTypeEmailAddress) { textView.autocapitalizationType = UITextAutocapitalizationTypeNone; @@ -675,7 +751,7 @@ - (void)create:(NSDictionary *)data { } editView = textView; } else { - UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(x, y, width, height)]; + CustomTextField *textField = [[CustomTextField alloc] initWithFrame:CGRectMake(x, y, width, height)]; textField.keyboardType = keyType; [textField setFont:uiFont]; textField.delegate = self; @@ -686,6 +762,9 @@ - (void)create:(NSDictionary *)data { if (isChangeCaret) { textField.tintColor = caretColor; } + if (![keyboardLanguage isEqualToString:@"default"]) { + textField.languageCode = keyboardLanguage; + } textField.returnKeyType = returnKeyType; textField.autocorrectionType = autoCorrection ? UITextAutocorrectionTypeYes : UITextAutocorrectionTypeNo; textField.contentVerticalAlignment = valign; diff --git a/README.md b/README.md index 1f35a4f..c0dcde0 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ From UMI, you can edit these additional options: - return button type - return button callback - custom font +- keyboard language on init - manual hide option - done & clear buttons option @@ -139,6 +140,7 @@ With `OnKeyboardAction` you can control UI elements, such as moving the input fi - `SetBackgroundColor` – change background color - `SetContentType` – change input field content type - `SetReadonly` – change readonly mode +- `SetLanguage` – change keyboard language ### How to use custom fonts diff --git a/README.ru.md b/README.ru.md index 8cd0d40..7802bf2 100644 --- a/README.ru.md +++ b/README.ru.md @@ -99,6 +99,7 @@ UMI также позволяет дополнительно настраива - тип кнопки - обработку кнопки - свой шрифт +- язык клавиатуры при инициализации - управление скрытием клавиатуры - кнопки "Готово" и "Очистить" @@ -138,6 +139,7 @@ public class Bootstrap : MonoBehaviour { - `SetBackgroundColor` – изменение цвета фона - `SetContentType` – изменение типа поля ввода - `SetReadonly` – изменение состояния "только для чтения" +- `SetLanguage` – изменение языка клавиатуры ### Как использовать свои шрифты diff --git a/Runtime/MobileInput.cs b/Runtime/MobileInput.cs index 76b2a2d..c120747 100644 --- a/Runtime/MobileInput.cs +++ b/Runtime/MobileInput.cs @@ -456,7 +456,7 @@ public static float GetScreenScale() { #else return 1f; #endif - } + } /// /// Update fonts diff --git a/Runtime/MobileInputField.cs b/Runtime/MobileInputField.cs index 2e9e402..e1ee1d6 100644 --- a/Runtime/MobileInputField.cs +++ b/Runtime/MobileInputField.cs @@ -133,6 +133,11 @@ public enum ReturnKeyType { /// const string SET_VISIBLE = "SET_VISIBLE"; + /// + /// Set language to keyboard + /// + const string SET_LANGUAGE = "SET_LANGUAGE"; + /// /// Event when text changing in InputField /// @@ -165,6 +170,11 @@ public enum ReturnKeyType { /// public string CustomFont = "default"; + /// + /// Custom keyboard language, ISO code + /// + public string KeyboardLanguage = "default"; + /// /// Background color /// @@ -593,6 +603,7 @@ void CreateNativeEdit() { data["multiline"] = _config.Multiline; data["input_type"] = _config.InputType; data["keyboard_type"] = _config.KeyboardType; + data["keyboard_language"] = KeyboardLanguage; data["return_key_type"] = ReturnKey switch { ReturnKeyType.Next => (JsonNode)"Next", ReturnKeyType.Done => (JsonNode)"Done", @@ -681,6 +692,17 @@ public void SetReadonly(bool value) { Execute(data); } + /// + /// Set language to keyboard + /// + /// ISO language code + public void SetLanguage(string value) { + var data = new JsonObject(); + data["msg"] = SET_LANGUAGE; + data["value"] = value; + Execute(data); + } + /// /// Set text to field ///