This repository has been archived on 2020-08-22. You can view files and clone it, but cannot push or open issues or pull requests.
flutter-unity-view-widget/android/src/main/java/com/rexraphael/flutterunitywidget/FlutterUnityView.java

143 lines
4.2 KiB
Java

package com.rexraphael.flutterunitywidget;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Debug;
import android.os.Handler;
import android.view.View;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.platform.PlatformView;
@SuppressLint("NewApi")
public class FlutterUnityView implements PlatformView, MethodChannel.MethodCallHandler, UnityEventListener {
private final Context context;
UnityView unityView;
MethodChannel channel;
public final PluginRegistry.Registrar registrar;
static final String LOG_TAG = "FlutterUnityView";
public final Activity activity;
FlutterUnityView(Context context, PluginRegistry.Registrar registrar, int id) {
this.context = context;
this.registrar = registrar;
this.activity = registrar.activity();
unityView = getUnityView(registrar);
channel = new MethodChannel(registrar.messenger(), "unity_view_" + id);
channel.setMethodCallHandler(this);
UnityUtils.addUnityEventListener(this);
}
@Override
public void onMethodCall(MethodCall methodCall, final MethodChannel.Result result) {
switch (methodCall.method) {
case "createUnity":
String isAR;
isAR = methodCall.argument("isAR");
if (isAR != null) {
UnityUtils.isAR = true;
}
UnityUtils.createPlayer(registrar.activity(), new UnityUtils.CreateCallback() {
@Override
public void onReady() {
result.success(true);
}
});
break;
case "isReady":
result.success(UnityUtils.isUnityReady());
break;
case "postMessage":
String gameObject, methodName, message;
gameObject = methodCall.argument("gameObject");
methodName = methodCall.argument("methodName");
message = methodCall.argument("message");
UnityUtils.postMessage(gameObject, methodName, message);
result.success(true);
break;
case "pause":
UnityUtils.pause();
result.success(true);
break;
case "resume":
UnityUtils.resume();
result.success(true);
break;
default:
result.notImplemented();
}
}
@Override
public View getView() {
return unityView;
}
@Override
public void dispose() {
if (UnityUtils.isUnityReady()) {
// UnityUtils.getPlayer().quit();
}
}
private UnityView getUnityView(PluginRegistry.Registrar registrar) {
final UnityView view = new UnityView(registrar.context());
// view.addOnAttachStateChangeListener(this);
if (UnityUtils.getPlayer() != null) {
view.setUnityPlayer(UnityUtils.getPlayer());
} else {
UnityUtils.createPlayer(this.activity, new UnityUtils.CreateCallback() {
@Override
public void onReady() {
view.setUnityPlayer(UnityUtils.getPlayer());
}
});
}
return view;
}
private void restoreUnityUserState() {
// restore the unity player state
if (UnityUtils.isUnityPaused()) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (UnityUtils.getPlayer() != null) {
UnityUtils.getPlayer().pause();
}
}
}, 300); //TODO: 300 is the right one?
}
}
@Override
public void onMessage(final String message) {
activity.runOnUiThread(new Runnable() {
public void run() {
getChannel().invokeMethod("onUnityMessage", message);
}
});
}
private MethodChannel getChannel() {
return channel;
}
}