mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
[infra_ui][keyboard] Impl android support for keyboard
This commit is contained in:
parent
b227a19c59
commit
915975d522
@ -28,8 +28,7 @@ android {
|
|||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
dependencies {
|
||||||
defaultConfig {
|
implementation "androidx.core:core:1.5.0-rc01"
|
||||||
minSdkVersion 16
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,38 +1,81 @@
|
|||||||
package com.example.flowy_infra_ui;
|
package com.example.flowy_infra_ui;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import com.example.flowy_infra_ui.event.KeyboardEventHandler;
|
||||||
|
|
||||||
import io.flutter.embedding.engine.plugins.FlutterPlugin;
|
import io.flutter.embedding.engine.plugins.FlutterPlugin;
|
||||||
|
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
|
||||||
|
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
|
||||||
|
import io.flutter.plugin.common.EventChannel;
|
||||||
import io.flutter.plugin.common.MethodCall;
|
import io.flutter.plugin.common.MethodCall;
|
||||||
import io.flutter.plugin.common.MethodChannel;
|
import io.flutter.plugin.common.MethodChannel;
|
||||||
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
|
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
|
||||||
import io.flutter.plugin.common.MethodChannel.Result;
|
import io.flutter.plugin.common.MethodChannel.Result;
|
||||||
|
|
||||||
/** FlowyInfraUiPlugin */
|
/** FlowyInfraUiPlugin */
|
||||||
public class FlowyInfraUiPlugin implements FlutterPlugin, MethodCallHandler {
|
public class FlowyInfraUiPlugin implements FlutterPlugin, ActivityAware, MethodCallHandler {
|
||||||
/// The MethodChannel that will the communication between Flutter and native Android
|
|
||||||
///
|
// MARK: - Constant
|
||||||
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
|
public static final String INFRA_UI_METHOD_CHANNEL_NAME = "flowy_infra_ui_method";
|
||||||
/// when the Flutter Engine is detached from the Activity
|
public static final String INFRA_UI_KEYBOARD_EVENT_CHANNEL_NAME = "flowy_infra_ui_event/keyboard";
|
||||||
private MethodChannel channel;
|
|
||||||
|
public static final String INFRA_UI_METHOD_GET_PLATFORM_VERSION = "getPlatformVersion";
|
||||||
|
|
||||||
|
// Method Channel
|
||||||
|
private MethodChannel methodChannel;
|
||||||
|
// Event Channel
|
||||||
|
private KeyboardEventHandler keyboardEventHandler = new KeyboardEventHandler();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
|
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
|
||||||
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "flowy_infra_ui");
|
methodChannel = new MethodChannel(
|
||||||
channel.setMethodCallHandler(this);
|
flutterPluginBinding.getBinaryMessenger(),
|
||||||
|
INFRA_UI_METHOD_CHANNEL_NAME);
|
||||||
|
methodChannel.setMethodCallHandler(this);
|
||||||
|
|
||||||
|
final EventChannel keyboardEventChannel = new EventChannel(
|
||||||
|
flutterPluginBinding.getBinaryMessenger(),
|
||||||
|
INFRA_UI_KEYBOARD_EVENT_CHANNEL_NAME);
|
||||||
|
keyboardEventChannel.setStreamHandler(keyboardEventHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
|
||||||
|
methodChannel.setMethodCallHandler(null);
|
||||||
|
keyboardEventHandler.cancelObserveKeyboardAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
|
||||||
|
keyboardEventHandler.observeKeyboardAction(binding.getActivity());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDetachedFromActivityForConfigChanges() {
|
||||||
|
keyboardEventHandler.cancelObserveKeyboardAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
|
||||||
|
keyboardEventHandler.observeKeyboardAction(binding.getActivity());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDetachedFromActivity() {
|
||||||
|
keyboardEventHandler.cancelObserveKeyboardAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Method Channel
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
|
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
|
||||||
if (call.method.equals("getPlatformVersion")) {
|
if (call.method.equals(INFRA_UI_METHOD_GET_PLATFORM_VERSION)) {
|
||||||
result.success("Android " + android.os.Build.VERSION.RELEASE);
|
result.success("Android " + android.os.Build.VERSION.RELEASE);
|
||||||
} else {
|
} else {
|
||||||
result.notImplemented();
|
result.notImplemented();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
|
|
||||||
channel.setMethodCallHandler(null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,53 @@
|
|||||||
|
package com.example.flowy_infra_ui.event;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
import androidx.core.view.OnApplyWindowInsetsListener;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
|
|
||||||
|
import io.flutter.plugin.common.EventChannel;
|
||||||
|
|
||||||
|
public class KeyboardEventHandler implements EventChannel.StreamHandler {
|
||||||
|
private EventChannel.EventSink eventSink;
|
||||||
|
private View rootView;
|
||||||
|
private boolean isKeyboardShow = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onListen(Object arguments, EventChannel.EventSink events) {
|
||||||
|
eventSink = events;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCancel(Object arguments) {
|
||||||
|
eventSink = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Helper
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
|
public void observeKeyboardAction(Activity activity) {
|
||||||
|
rootView = activity.findViewById(android.R.id.content);
|
||||||
|
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(rootView, new OnApplyWindowInsetsListener() {
|
||||||
|
@Override
|
||||||
|
public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
|
||||||
|
isKeyboardShow = insets.isVisible(WindowInsetsCompat.Type.ime());
|
||||||
|
if (eventSink != null) {
|
||||||
|
eventSink.success(isKeyboardShow);
|
||||||
|
}
|
||||||
|
return insets;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancelObserveKeyboardAction() {
|
||||||
|
if (rootView != null) {
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(rootView, null);
|
||||||
|
rootView = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -26,7 +26,6 @@ apply plugin: 'kotlin-android'
|
|||||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 30
|
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
@ -57,6 +56,7 @@ android {
|
|||||||
signingConfig signingConfigs.debug
|
signingConfig signingConfigs.debug
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
compileSdkVersion 30
|
||||||
}
|
}
|
||||||
|
|
||||||
flutter {
|
flutter {
|
||||||
|
@ -3,4 +3,5 @@ package com.example.flowy_infra_ui_example;
|
|||||||
import io.flutter.embedding.android.FlutterActivity;
|
import io.flutter.embedding.android.FlutterActivity;
|
||||||
|
|
||||||
public class MainActivity extends FlutterActivity {
|
public class MainActivity extends FlutterActivity {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
package com.example.flowy_infra_ui_example
|
|
||||||
|
|
||||||
import io.flutter.embedding.android.FlutterActivity
|
|
||||||
|
|
||||||
class MainActivity: FlutterActivity() {
|
|
||||||
}
|
|
@ -6,7 +6,7 @@ buildscript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:4.1.0'
|
classpath 'com.android.tools.build:gradle:4.1.1'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#Fri Jun 23 08:50:38 CEST 2017
|
#Sat Jul 17 23:27:26 CST 2021
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip
|
||||||
|
@ -6,6 +6,8 @@ public class SwiftFlowyInfraUiPlugin: NSObject, FlutterPlugin {
|
|||||||
enum Constant {
|
enum Constant {
|
||||||
static let infraUIMethodChannelName = "flowy_infra_ui_method"
|
static let infraUIMethodChannelName = "flowy_infra_ui_method"
|
||||||
static let infraUIKeyboardEventChannelName = "flowy_infra_ui_event/keyboard"
|
static let infraUIKeyboardEventChannelName = "flowy_infra_ui_event/keyboard"
|
||||||
|
|
||||||
|
static let infraUIMethodGetPlatformVersion = "getPlatformVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func register(with registrar: FlutterPluginRegistrar) {
|
public static func register(with registrar: FlutterPluginRegistrar) {
|
||||||
@ -26,8 +28,10 @@ public class SwiftFlowyInfraUiPlugin: NSObject, FlutterPlugin {
|
|||||||
|
|
||||||
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
||||||
switch call.method {
|
switch call.method {
|
||||||
|
case Constant.infraUIMethodGetPlatformVersion:
|
||||||
|
result("iOS " + UIDevice.current.systemVersion)
|
||||||
default:
|
default:
|
||||||
assertionFailure("Unsupported method \(call.method)")
|
result(FlutterMethodNotImplemented)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user