package anywheresoftware.b4a.objects;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.text.method.NumberKeyListener;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.BALayout;
import anywheresoftware.b4a.BA.ActivityObject;
import anywheresoftware.b4a.BA.Events;
import anywheresoftware.b4a.BA.ShortName;
import anywheresoftware.b4a.BA.Version;
import anywheresoftware.b4a.BALayout.LayoutParams;
import anywheresoftware.b4a.keywords.Common;
/**
* IME includes several utilities that will you help you manage the soft keyboard.
*A tutorial with a working example is available <link>here|http://www.b4x.com/forum/basic4android-getting-started-tutorials/14832-handle-soft-keyboard-ime-library.html</link>.
*/
@ShortName("IME")
@Events(values={"HeightChanged (NewHeight As Int, OldHeight As Int)",
"HandleAction As Boolean"})
@Version(1.0f)
@ActivityObject
public class IME {
private String eventName;
/**
* Initializes the object and sets the subs that will handle the events.
*/
public void Initialize(String EventName) {
this.eventName = EventName.toLowerCase(BA.cul);
}
/**
* Hides the soft keyboard if it is visible.
*/
public void HideKeyboard(BA ba) {
InputMethodManager imm = (InputMethodManager)BA.applicationContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(ba.vg.getWindowToken(), 0);
}
/**
* Sets the focus to the given view and opens the soft keyboard.
*The keyboard will only show if the view has received the focus.
*/
public void ShowKeyboard(View View) {
View.requestFocus();
InputMethodManager imm = (InputMethodManager)BA.applicationContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(View, 0);
}
/**
* Adds the HandleAction event to the given EditText.
*/
public void AddHandleActionEvent(final EditText EditText, final BA ba) {
EditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
Boolean b = (Boolean)ba.raiseEvent(EditText, eventName + "_handleaction");
if (b != null && b == true)
return true;
else
return false;
}
});
}
/**
* Sets a custom filter.
*EditText - The target EditText.
*DefaultInputType - Sets the keyboard mode.
*AcceptedCharacters - The accepted characters.
*Example: Create a filter that will accept IP addresses (numbers with multiple dots)
*<code>
*IME.SetCustomFilter(EditText1, EditText1.INPUT_TYPE_NUMBERS, "0123456789.")</code>
*/
public void SetCustomFilter(EditText EditText, final int DefaultInputType, final String AcceptedCharacters) {
EditText.setKeyListener(new NumberKeyListener() {
@Override
protected char[] getAcceptedChars() {
return AcceptedCharacters.toCharArray();
}
@Override
public int getInputType() {
return DefaultInputType;
}
});
}
/**
* Enables the HeightChanged event. This event is raised when the soft keyboard state changes.
*You can use this event to resize other views to fit the new screen size.
*Note that this event will not be raised in full screen activities (an Android limitation).
*/
public void AddHeightChangedEvent(BA ba) {
if (ba.vg.getParent() instanceof BALayout)
return;
ExtendedBALayout e = new ExtendedBALayout(ba.context, eventName, ba);
ba.activity.setContentView(e);
BALayout.LayoutParams lp = new BALayout.LayoutParams();
lp.height = ba.vg.getLayoutParams().height;
lp.width = ba.vg.getLayoutParams().width;
ba.vg.setLayoutParams(lp);
e.addView(ba.vg);
ba.activity.getWindow().setSoftInputMode(ba.activity.getWindow().getAttributes().softInputMode | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
static class ExtendedBALayout extends BALayout {
private int lastHeight = -1;
private final String eventName;
private final BA ba;
public ExtendedBALayout(Context context, String EventName, BA ba) {
super(context);
this.eventName = EventName.toLowerCase(BA.cul);
this.ba = ba;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
if (height != lastHeight && lastHeight != -1) {
ba.raiseEvent(null, eventName + "_heightchanged", height, lastHeight);
}
lastHeight = height;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}