Android: implement keyboard plugin
This commit is contained in:
parent
a21cdcd874
commit
a56f1164e9
@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
import pub.doric.plugin.AnimatePlugin;
|
import pub.doric.plugin.AnimatePlugin;
|
||||||
import pub.doric.plugin.CoordinatorPlugin;
|
import pub.doric.plugin.CoordinatorPlugin;
|
||||||
import pub.doric.plugin.DoricJavaPlugin;
|
import pub.doric.plugin.DoricJavaPlugin;
|
||||||
|
import pub.doric.plugin.KeyboardPlugin;
|
||||||
import pub.doric.plugin.ModalPlugin;
|
import pub.doric.plugin.ModalPlugin;
|
||||||
import pub.doric.plugin.NavBarPlugin;
|
import pub.doric.plugin.NavBarPlugin;
|
||||||
import pub.doric.plugin.NavigatorPlugin;
|
import pub.doric.plugin.NavigatorPlugin;
|
||||||
@ -102,6 +103,7 @@ public class DoricRegistry {
|
|||||||
this.registerNativePlugin(StatusBarPlugin.class);
|
this.registerNativePlugin(StatusBarPlugin.class);
|
||||||
this.registerNativePlugin(CoordinatorPlugin.class);
|
this.registerNativePlugin(CoordinatorPlugin.class);
|
||||||
this.registerNativePlugin(NotchPlugin.class);
|
this.registerNativePlugin(NotchPlugin.class);
|
||||||
|
this.registerNativePlugin(KeyboardPlugin.class);
|
||||||
|
|
||||||
this.registerViewNode(RootNode.class);
|
this.registerViewNode(RootNode.class);
|
||||||
this.registerViewNode(TextNode.class);
|
this.registerViewNode(TextNode.class);
|
||||||
|
@ -0,0 +1,95 @@
|
|||||||
|
package pub.doric.plugin;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
|
import com.github.pengfeizhou.jscore.JSString;
|
||||||
|
import com.github.pengfeizhou.jscore.JavaValue;
|
||||||
|
import com.qmuiteam.qmui.util.QMUIKeyboardHelper;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import pub.doric.DoricContext;
|
||||||
|
import pub.doric.extension.bridge.DoricMethod;
|
||||||
|
import pub.doric.extension.bridge.DoricPlugin;
|
||||||
|
import pub.doric.extension.bridge.DoricPromise;
|
||||||
|
import pub.doric.utils.DoricUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: pub.doric.plugin
|
||||||
|
* @Author: jingpeng.wang
|
||||||
|
* @CreateDate: 2021-03-18
|
||||||
|
*/
|
||||||
|
|
||||||
|
@DoricPlugin(name = "keyboard")
|
||||||
|
public class KeyboardPlugin extends DoricJavaPlugin {
|
||||||
|
|
||||||
|
private final Set<String> callbackIds = new HashSet<>();
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
|
||||||
|
public KeyboardPlugin(DoricContext doricContext) {
|
||||||
|
super(doricContext);
|
||||||
|
|
||||||
|
if (getDoricContext().getContext() instanceof Activity) {
|
||||||
|
Activity activity = (Activity) getDoricContext().getContext();
|
||||||
|
|
||||||
|
DisplayMetrics metrics = new DisplayMetrics();
|
||||||
|
activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
|
||||||
|
int realHeight = metrics.heightPixels;
|
||||||
|
|
||||||
|
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||||
|
int usableHeight = metrics.heightPixels;
|
||||||
|
|
||||||
|
final int virtualNavigationHeight = realHeight - usableHeight;
|
||||||
|
|
||||||
|
QMUIKeyboardHelper.setVisibilityEventListener(activity, new QMUIKeyboardHelper.KeyboardVisibilityEventListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onVisibilityChanged(boolean isOpen, int heightDiff) {
|
||||||
|
Iterator<String> it = callbackIds.iterator();
|
||||||
|
if (it.hasNext()) {
|
||||||
|
do {
|
||||||
|
String callbackId = it.next();
|
||||||
|
DoricPromise callback = new DoricPromise(getDoricContext(), callbackId);
|
||||||
|
|
||||||
|
JSONObject data = new JSONObject();
|
||||||
|
try {
|
||||||
|
data.put("height", DoricUtils.px2dp(heightDiff - virtualNavigationHeight));
|
||||||
|
callback.resolve(new JavaValue(data));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
callback.reject();
|
||||||
|
}
|
||||||
|
} while (it.hasNext());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@DoricMethod
|
||||||
|
public void subscribe(JSString args, DoricPromise promise) {
|
||||||
|
final String callbackId = args.asString().value();
|
||||||
|
callbackIds.add(callbackId);
|
||||||
|
promise.resolve(new JavaValue(callbackId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@DoricMethod
|
||||||
|
public void unsubscribe(String subscribeId, DoricPromise promise) {
|
||||||
|
if (callbackIds.contains(subscribeId)) {
|
||||||
|
callbackIds.remove(subscribeId);
|
||||||
|
|
||||||
|
promise.resolve(new JavaValue(subscribeId));
|
||||||
|
} else {
|
||||||
|
promise.reject(new JavaValue("subscribeId does not exist"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user