Allow showing different soft keyboard in android
This commit is contained in:
parent
420c51955e
commit
336300b997
@ -40,6 +40,7 @@ public class STKEditText extends EditText
|
|||||||
public STKEditText(Context context)
|
public STKEditText(Context context)
|
||||||
{
|
{
|
||||||
super(context);
|
super(context);
|
||||||
|
setInputType(InputType.TYPE_CLASS_TEXT);
|
||||||
setFocusableInTouchMode(true);
|
setFocusableInTouchMode(true);
|
||||||
m_composing_start = 0;
|
m_composing_start = 0;
|
||||||
m_composing_end = 0;
|
m_composing_end = 0;
|
||||||
@ -72,7 +73,7 @@ public class STKEditText extends EditText
|
|||||||
super.onCreateInputConnection(out_attrs), this);
|
super.onCreateInputConnection(out_attrs), this);
|
||||||
}
|
}
|
||||||
out_attrs.actionLabel = null;
|
out_attrs.actionLabel = null;
|
||||||
out_attrs.inputType = InputType.TYPE_CLASS_TEXT;
|
out_attrs.inputType = getInputType();
|
||||||
out_attrs.imeOptions = EditorInfo.IME_ACTION_NEXT |
|
out_attrs.imeOptions = EditorInfo.IME_ACTION_NEXT |
|
||||||
EditorInfo.IME_FLAG_NO_FULLSCREEN |
|
EditorInfo.IME_FLAG_NO_FULLSCREEN |
|
||||||
EditorInfo.IME_FLAG_NO_EXTRACT_UI;
|
EditorInfo.IME_FLAG_NO_EXTRACT_UI;
|
||||||
@ -178,4 +179,26 @@ public class STKEditText extends EditText
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
public STKInputConnection getSTKInputConnection()
|
public STKInputConnection getSTKInputConnection()
|
||||||
{ return m_stk_input_connection; }
|
{ return m_stk_input_connection; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
public void configType(final int type)
|
||||||
|
{
|
||||||
|
// Check text_box_widget.hpp for definition
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
setInputType(InputType.TYPE_CLASS_TEXT);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ public class SuperTuxKartActivity extends NativeActivity
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
public void showKeyboard()
|
public void showKeyboard(final int type)
|
||||||
{
|
{
|
||||||
final Context context = this;
|
final Context context = this;
|
||||||
// Need to run in ui thread as it access the view m_stk_edittext
|
// Need to run in ui thread as it access the view m_stk_edittext
|
||||||
@ -157,6 +157,7 @@ public class SuperTuxKartActivity extends NativeActivity
|
|||||||
if (m_stk_edittext == null)
|
if (m_stk_edittext == null)
|
||||||
createSTKEditText();
|
createSTKEditText();
|
||||||
|
|
||||||
|
m_stk_edittext.configType(type);
|
||||||
m_stk_edittext.setVisibility(View.VISIBLE);
|
m_stk_edittext.setVisibility(View.VISIBLE);
|
||||||
m_stk_edittext.requestFocus();
|
m_stk_edittext.requestFocus();
|
||||||
|
|
||||||
@ -182,7 +183,7 @@ public class SuperTuxKartActivity extends NativeActivity
|
|||||||
/* Called by STK in JNI. */
|
/* Called by STK in JNI. */
|
||||||
public void fromSTKEditBox(final int widget_id, final String text,
|
public void fromSTKEditBox(final int widget_id, final String text,
|
||||||
final int selection_start,
|
final int selection_start,
|
||||||
final int selection_end)
|
final int selection_end, final int type)
|
||||||
{
|
{
|
||||||
runOnUiThread(new Runnable()
|
runOnUiThread(new Runnable()
|
||||||
{
|
{
|
||||||
@ -191,6 +192,7 @@ public class SuperTuxKartActivity extends NativeActivity
|
|||||||
{
|
{
|
||||||
if (m_stk_edittext == null)
|
if (m_stk_edittext == null)
|
||||||
createSTKEditText();
|
createSTKEditText();
|
||||||
|
m_stk_edittext.configType(type);
|
||||||
m_stk_edittext.setTextFromSTK(widget_id, text, selection_start,
|
m_stk_edittext.setTextFromSTK(widget_id, text, selection_start,
|
||||||
selection_end);
|
selection_end);
|
||||||
}
|
}
|
||||||
|
@ -299,7 +299,7 @@ namespace irr
|
|||||||
virtual u32 getScreenHeight() const = 0;
|
virtual u32 getScreenHeight() const = 0;
|
||||||
virtual u32 getOnScreenKeyboardHeight() const = 0;
|
virtual u32 getOnScreenKeyboardHeight() const = 0;
|
||||||
virtual s32 getMovedHeight() const = 0;
|
virtual s32 getMovedHeight() const = 0;
|
||||||
virtual void toggleOnScreenKeyboard(bool show) = 0;
|
virtual void toggleOnScreenKeyboard(bool show, s32 type = 0) = 0;
|
||||||
virtual void registerGetMovedHeightFunction(HeightFunc) = 0;
|
virtual void registerGetMovedHeightFunction(HeightFunc) = 0;
|
||||||
|
|
||||||
//! Check if a driver type is supported by the engine.
|
//! Check if a driver type is supported by the engine.
|
||||||
|
@ -1196,7 +1196,7 @@ wchar_t CIrrDeviceAndroid::getKeyChar(SEvent& event)
|
|||||||
return key_char;
|
return key_char;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CIrrDeviceAndroid::toggleOnScreenKeyboard(bool show)
|
void CIrrDeviceAndroid::toggleOnScreenKeyboard(bool show, s32 type)
|
||||||
{
|
{
|
||||||
if (!Android)
|
if (!Android)
|
||||||
return;
|
return;
|
||||||
@ -1234,7 +1234,12 @@ void CIrrDeviceAndroid::toggleOnScreenKeyboard(bool show)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
jmethodID method_id = env->GetMethodID(class_native_activity, show ? "showKeyboard" : "hideKeyboard", "()V");
|
jmethodID method_id = NULL;
|
||||||
|
if (show)
|
||||||
|
method_id = env->GetMethodID(class_native_activity, "showKeyboard", "(I)V");
|
||||||
|
else
|
||||||
|
method_id = env->GetMethodID(class_native_activity, "hideKeyboard", "()V");
|
||||||
|
|
||||||
if (method_id == NULL)
|
if (method_id == NULL)
|
||||||
{
|
{
|
||||||
os::Printer::log("showKeyboard unable to find method id.", ELL_ERROR);
|
os::Printer::log("showKeyboard unable to find method id.", ELL_ERROR);
|
||||||
@ -1245,14 +1250,17 @@ void CIrrDeviceAndroid::toggleOnScreenKeyboard(bool show)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
env->CallVoidMethod(native_activity, method_id);
|
if (show)
|
||||||
|
env->CallVoidMethod(native_activity, method_id, (jint)type);
|
||||||
|
else
|
||||||
|
env->CallVoidMethod(native_activity, method_id);
|
||||||
if (was_detached)
|
if (was_detached)
|
||||||
{
|
{
|
||||||
Android->activity->vm->DetachCurrentThread();
|
Android->activity->vm->DetachCurrentThread();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CIrrDeviceAndroid::fromSTKEditBox(int widget_id, const core::stringw& text, int selection_start, int selection_end)
|
void CIrrDeviceAndroid::fromSTKEditBox(int widget_id, const core::stringw& text, int selection_start, int selection_end, int type)
|
||||||
{
|
{
|
||||||
if (!Android)
|
if (!Android)
|
||||||
return;
|
return;
|
||||||
@ -1290,7 +1298,7 @@ void CIrrDeviceAndroid::fromSTKEditBox(int widget_id, const core::stringw& text,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
jmethodID method_id = env->GetMethodID(class_native_activity, "fromSTKEditBox", "(ILjava/lang/String;II)V");
|
jmethodID method_id = env->GetMethodID(class_native_activity, "fromSTKEditBox", "(ILjava/lang/String;III)V");
|
||||||
if (method_id == NULL)
|
if (method_id == NULL)
|
||||||
{
|
{
|
||||||
os::Printer::log("fromSTKEditBox unable to find method id.", ELL_ERROR);
|
os::Printer::log("fromSTKEditBox unable to find method id.", ELL_ERROR);
|
||||||
@ -1309,7 +1317,7 @@ void CIrrDeviceAndroid::fromSTKEditBox(int widget_id, const core::stringw& text,
|
|||||||
utf8.push_back(0);
|
utf8.push_back(0);
|
||||||
jstring jstring_text = env->NewStringUTF(utf8.data());
|
jstring jstring_text = env->NewStringUTF(utf8.data());
|
||||||
|
|
||||||
env->CallVoidMethod(native_activity, method_id, (jint)widget_id, jstring_text, (jint)selection_start, (jint)selection_end);
|
env->CallVoidMethod(native_activity, method_id, (jint)widget_id, jstring_text, (jint)selection_start, (jint)selection_end, (jint)type);
|
||||||
if (was_detached)
|
if (was_detached)
|
||||||
{
|
{
|
||||||
Android->activity->vm->DetachCurrentThread();
|
Android->activity->vm->DetachCurrentThread();
|
||||||
|
@ -73,8 +73,8 @@ namespace irr
|
|||||||
virtual bool deactivateGyroscope();
|
virtual bool deactivateGyroscope();
|
||||||
virtual bool isGyroscopeActive();
|
virtual bool isGyroscopeActive();
|
||||||
virtual bool isGyroscopeAvailable();
|
virtual bool isGyroscopeAvailable();
|
||||||
void fromSTKEditBox(int widget_id, const core::stringw& text, int selection_start, int selection_end);
|
void fromSTKEditBox(int widget_id, const core::stringw& text, int selection_start, int selection_end, int type);
|
||||||
virtual void toggleOnScreenKeyboard(bool show);
|
virtual void toggleOnScreenKeyboard(bool show, s32 type = 0);
|
||||||
virtual bool supportsTouchDevice() const { return HasTouchDevice; }
|
virtual bool supportsTouchDevice() const { return HasTouchDevice; }
|
||||||
virtual bool hasHardwareKeyboard() const;
|
virtual bool hasHardwareKeyboard() const;
|
||||||
// ATM if there is touch device we assume native screen keyboard is
|
// ATM if there is touch device we assume native screen keyboard is
|
||||||
|
@ -123,7 +123,7 @@ namespace irr
|
|||||||
virtual u32 getScreenHeight() const { return 0; }
|
virtual u32 getScreenHeight() const { return 0; }
|
||||||
virtual u32 getOnScreenKeyboardHeight() const { return 0; }
|
virtual u32 getOnScreenKeyboardHeight() const { return 0; }
|
||||||
virtual s32 getMovedHeight() const { return 0; }
|
virtual s32 getMovedHeight() const { return 0; }
|
||||||
virtual void toggleOnScreenKeyboard(bool show) {}
|
virtual void toggleOnScreenKeyboard(bool show, s32 type = 0) {}
|
||||||
virtual void registerGetMovedHeightFunction(HeightFunc) {}
|
virtual void registerGetMovedHeightFunction(HeightFunc) {}
|
||||||
|
|
||||||
//! Returns true if system has touch device
|
//! Returns true if system has touch device
|
||||||
|
@ -74,6 +74,7 @@ CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border,
|
|||||||
m_from_android_edittext = false;
|
m_from_android_edittext = false;
|
||||||
m_composing_start = 0;
|
m_composing_start = 0;
|
||||||
m_composing_end = 0;
|
m_composing_end = 0;
|
||||||
|
m_type = (GUIEngine::TextBoxType)0;
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
setDebugName("CGUIEditBox");
|
setDebugName("CGUIEditBox");
|
||||||
@ -299,7 +300,7 @@ bool CGUIEditBox::OnEvent(const SEvent& event)
|
|||||||
{
|
{
|
||||||
CIrrDeviceAndroid* dl = dynamic_cast<CIrrDeviceAndroid*>(
|
CIrrDeviceAndroid* dl = dynamic_cast<CIrrDeviceAndroid*>(
|
||||||
irr_driver->getDevice());
|
irr_driver->getDevice());
|
||||||
dl->fromSTKEditBox(getID(), Text, MarkBegin, MarkEnd);
|
dl->fromSTKEditBox(getID(), Text, MarkBegin, MarkEnd, m_type);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1185,7 +1186,7 @@ void CGUIEditBox::setText(const wchar_t* text)
|
|||||||
{
|
{
|
||||||
CIrrDeviceAndroid* dl = dynamic_cast<CIrrDeviceAndroid*>(
|
CIrrDeviceAndroid* dl = dynamic_cast<CIrrDeviceAndroid*>(
|
||||||
irr_driver->getDevice());
|
irr_driver->getDevice());
|
||||||
dl->fromSTKEditBox(getID(), Text, MarkBegin, MarkEnd);
|
dl->fromSTKEditBox(getID(), Text, MarkBegin, MarkEnd, m_type);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1322,7 +1323,7 @@ bool CGUIEditBox::processMouse(const SEvent& event)
|
|||||||
if (GUIEngine::ScreenKeyboard::shouldUseScreenKeyboard())
|
if (GUIEngine::ScreenKeyboard::shouldUseScreenKeyboard())
|
||||||
{
|
{
|
||||||
if (irr_driver->getDevice()->hasOnScreenKeyboard())
|
if (irr_driver->getDevice()->hasOnScreenKeyboard())
|
||||||
irr_driver->getDevice()->toggleOnScreenKeyboard(true);
|
irr_driver->getDevice()->toggleOnScreenKeyboard(true, m_type);
|
||||||
else
|
else
|
||||||
openScreenKeyboard();
|
openScreenKeyboard();
|
||||||
}
|
}
|
||||||
@ -1726,7 +1727,7 @@ void CGUIEditBox::setTextMarkers(s32 begin, s32 end)
|
|||||||
{
|
{
|
||||||
CIrrDeviceAndroid* dl = dynamic_cast<CIrrDeviceAndroid*>(
|
CIrrDeviceAndroid* dl = dynamic_cast<CIrrDeviceAndroid*>(
|
||||||
irr_driver->getDevice());
|
irr_driver->getDevice());
|
||||||
dl->fromSTKEditBox(getID(), Text, MarkBegin, MarkEnd);
|
dl->fromSTKEditBox(getID(), Text, MarkBegin, MarkEnd, m_type);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
|
|
||||||
using namespace irr;
|
using namespace irr;
|
||||||
using namespace gui;
|
using namespace gui;
|
||||||
|
namespace GUIEngine
|
||||||
|
{
|
||||||
|
enum TextBoxType: int;
|
||||||
|
}
|
||||||
|
|
||||||
class CGUIEditBox : public IGUIEditBox
|
class CGUIEditBox : public IGUIEditBox
|
||||||
{
|
{
|
||||||
@ -124,6 +128,7 @@ using namespace gui;
|
|||||||
void openScreenKeyboard();
|
void openScreenKeyboard();
|
||||||
s32 getCursorPosInBox() const { return CursorPos; }
|
s32 getCursorPosInBox() const { return CursorPos; }
|
||||||
s32 getTextCount() const { return (s32)Text.size(); }
|
s32 getTextCount() const { return (s32)Text.size(); }
|
||||||
|
void setTextBoxType(GUIEngine::TextBoxType t) { m_type = t; }
|
||||||
protected:
|
protected:
|
||||||
//! Breaks the single text line.
|
//! Breaks the single text line.
|
||||||
void breakText();
|
void breakText();
|
||||||
@ -157,6 +162,8 @@ using namespace gui;
|
|||||||
s32 MarkBegin;
|
s32 MarkBegin;
|
||||||
s32 MarkEnd;
|
s32 MarkEnd;
|
||||||
|
|
||||||
|
GUIEngine::TextBoxType m_type;
|
||||||
|
|
||||||
video::SColor OverrideColor;
|
video::SColor OverrideColor;
|
||||||
gui::IGUIFont *OverrideFont, *LastBreakFont;
|
gui::IGUIFont *OverrideFont, *LastBreakFont;
|
||||||
IOSOperator* Operator;
|
IOSOperator* Operator;
|
||||||
|
@ -158,6 +158,13 @@ void TextBoxWidget::setPasswordBox(bool passwordBox, wchar_t passwordChar)
|
|||||||
IGUIEditBox* textCtrl = Widget::getIrrlichtElement<IGUIEditBox>();
|
IGUIEditBox* textCtrl = Widget::getIrrlichtElement<IGUIEditBox>();
|
||||||
assert(textCtrl != NULL);
|
assert(textCtrl != NULL);
|
||||||
textCtrl->setPasswordBox(passwordBox, passwordChar);
|
textCtrl->setPasswordBox(passwordBox, passwordChar);
|
||||||
|
setTextBoxType(TBT_PASSWORD);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
void TextBoxWidget::setTextBoxType(TextBoxType t)
|
||||||
|
{
|
||||||
|
((MyCGUIEditBox*)m_element)->setTextBoxType(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -28,6 +28,15 @@
|
|||||||
|
|
||||||
namespace GUIEngine
|
namespace GUIEngine
|
||||||
{
|
{
|
||||||
|
// This enum can allow showing different soft keyboard in android
|
||||||
|
enum TextBoxType: int
|
||||||
|
{
|
||||||
|
TBT_TEXT = 0,
|
||||||
|
TBT_PASSWORD = 1,
|
||||||
|
TBT_NUMBER = 2,
|
||||||
|
TBT_EMAIL = 3,
|
||||||
|
};
|
||||||
|
|
||||||
class ITextBoxWidgetListener
|
class ITextBoxWidgetListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -70,7 +79,7 @@ namespace GUIEngine
|
|||||||
|
|
||||||
irr::core::stringw getText() const;
|
irr::core::stringw getText() const;
|
||||||
void setPasswordBox(bool passwordBox, wchar_t passwordChar = L'*');
|
void setPasswordBox(bool passwordBox, wchar_t passwordChar = L'*');
|
||||||
|
void setTextBoxType(TextBoxType t);
|
||||||
virtual void elementRemoved();
|
virtual void elementRemoved();
|
||||||
|
|
||||||
/** Override method from base class Widget */
|
/** Override method from base class Widget */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user