Commit 786e5617 authored by Yacumima's avatar Yacumima

improve

parent d284055d
package com.taobao.idlefish.flutterboost;
import android.support.annotation.Nullable;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
public class BoostChannel {
private final MethodChannel mMethodChannel;
private final EventChannel mEventChannel;
private final Set<MethodChannel.MethodCallHandler> mMethodCallHandlers = new HashSet<>();
private EventChannel.EventSink mEventSink;
BoostChannel(MethodChannel methodChannel, EventChannel eventChannel){
mMethodChannel = methodChannel;
mEventChannel = eventChannel;
mMethodChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
Object[] handlers;
synchronized (mMethodCallHandlers) {
handlers = mMethodCallHandlers.toArray();
}
for(Object o:handlers) {
((MethodChannel.MethodCallHandler)o).onMethodCall(methodCall,result);
}
}
});
mEventChannel.setStreamHandler(new EventChannel.StreamHandler(){
@Override
public void onListen(Object o, EventChannel.EventSink eventSink) {
mEventSink = eventSink;
}
@Override
public void onCancel(Object o) {
}
});
}
public void invokeMethodUnsafe(final String name,Serializable args){
invokeMethod(name, args, new MethodChannel.Result() {
@Override
public void success(@Nullable Object o) {
//every thing ok...
}
@Override
public void error(String s, @Nullable String s1, @Nullable Object o) {
Debuger.log("invoke method "+name+" error:"+s+" | "+s1);
}
@Override
public void notImplemented() {
Debuger.log("invoke method "+name+" notImplemented");
}
});
}
public void invokeMethod(final String name,Serializable args){
invokeMethod(name, args, new MethodChannel.Result() {
@Override
public void success(@Nullable Object o) {
//every thing ok...
}
@Override
public void error(String s, @Nullable String s1, @Nullable Object o) {
Debuger.exception("invoke method "+name+" error:"+s+" | "+s1);
}
@Override
public void notImplemented() {
Debuger.exception("invoke method "+name+" notImplemented");
}
});
}
public void invokeMethod(final String name,Serializable args,MethodChannel.Result result){
mMethodChannel.invokeMethod(name, args, result);
}
public void addMethodCallHandler(MethodChannel.MethodCallHandler handler) {
synchronized (mMethodCallHandlers){
mMethodCallHandlers.add(handler);
}
}
public void removeMethodCallHandler(MethodChannel.MethodCallHandler handler) {
synchronized (mMethodCallHandlers) {
mMethodCallHandlers.remove(handler);
}
}
public void sendEvent(Serializable event){
if(mEventSink == null) {
Debuger.exception("event stream not listen yet!");
}
mEventSink.success(event);
}
}
......@@ -52,7 +52,7 @@ public class BoostFlutterEngine extends FlutterEngine {
stateListener.onEngineStarted(this);
}
FlutterBoostPlugin.singleton().platform().onRegisterPlugins(mBoostPluginRegistry);
FlutterBoostPlugin.singleton().platform().registerPlugins(mBoostPluginRegistry);
}
}
......
......@@ -270,11 +270,11 @@ public class BoostFlutterView extends FrameLayout {
}
public void onBackPressed() {
Log.d("FlutterFragment", "onBackPressed()");
Debuger.log("onBackPressed()");
if (mFlutterEngine != null) {
mFlutterEngine.getNavigationChannel().popRoute();
} else {
Log.w("FlutterFragment", "Invoked onBackPressed() before FlutterFragment was attached to an Activity.");
Debuger.log("Invoked onBackPressed() before BoostFlutterView was attached to an Activity.");
}
}
......@@ -283,7 +283,7 @@ public class BoostFlutterView extends FrameLayout {
if (mFlutterEngine != null) {
mFlutterEngine.getPluginRegistry().onRequestPermissionsResult(requestCode, permissions, grantResults);
} else {
Log.w("FlutterFragment", "onRequestPermissionResult() invoked before FlutterFragment was attached to an Activity.");
Debuger.log("onRequestPermissionResult() invoked before BoostFlutterView was attached to an Activity.");
}
}
......@@ -292,7 +292,7 @@ public class BoostFlutterView extends FrameLayout {
if (mFlutterEngine != null) {
mFlutterEngine.getPluginRegistry().onNewIntent(intent);
} else {
Log.w("FlutterFragment", "onNewIntent() invoked before FlutterFragment was attached to an Activity.");
Debuger.log("onNewIntent() invoked before BoostFlutterView was attached to an Activity.");
}
}
......@@ -301,16 +301,15 @@ public class BoostFlutterView extends FrameLayout {
if (mFlutterEngine != null) {
mFlutterEngine.getPluginRegistry().onActivityResult(requestCode, resultCode, data);
} else {
Log.w("FlutterFragment", "onActivityResult() invoked before FlutterFragment was attached to an Activity.");
Debuger.log("onActivityResult() invoked before BoostFlutterView was attached to an Activity.");
}
}
public void onUserLeaveHint() {
if (mFlutterEngine != null) {
mFlutterEngine.getPluginRegistry().onUserLeaveHint();
} else {
Log.w("FlutterFragment", "onUserLeaveHint() invoked before FlutterFragment was attached to an Activity.");
Debuger.log("onUserLeaveHint() invoked before BoostFlutterView was attached to an Activity.");
}
}
......@@ -321,7 +320,7 @@ public class BoostFlutterView extends FrameLayout {
mFlutterEngine.getSystemChannel().sendMemoryPressureWarning();
}
} else {
Log.w("FlutterFragment", "onTrimMemory() invoked before FlutterFragment was attached to an Activity.");
Debuger.log("onTrimMemory() invoked before BoostFlutterView was attached to an Activity.");
}
}
......
......@@ -25,8 +25,6 @@ package com.taobao.idlefish.flutterboost;
import android.content.Intent;
import com.taobao.idlefish.flutterboost.messageing.NavigationService;
import com.taobao.idlefish.flutterboost.messageing.base.MessageResult;
import com.taobao.idlefish.flutterboost.interfaces.IContainerRecord;
import com.taobao.idlefish.flutterboost.interfaces.IFlutterViewContainer;
......@@ -138,12 +136,12 @@ public class ContainerRecord implements IContainerRecord {
Debuger.exception("state error");
}
Map<String, String> map = new HashMap<>();
HashMap<String, String> map = new HashMap<>();
map.put("type", "backPressedCallback");
map.put("name", mContainer.getContainerName());
map.put("name", mContainer.getContainerUrl());
map.put("uniqueId", mUniqueId);
FlutterBoostPlugin.getInstance().sendEvent("lifecycle",map);
FlutterBoostPlugin.singleton().channel().sendEvent(map);
mContainer.getBoostFlutterView().onBackPressed();
}
......@@ -163,6 +161,11 @@ public class ContainerRecord implements IContainerRecord {
mContainer.getBoostFlutterView().onActivityResult(requestCode,resultCode,data);
}
@Override
public void onContainerResult(int requestCode, Map<String,Object> result) {
mManager.setContainerResult(this,requestCode,result);
}
@Override
public void onUserLeaveHint() {
mContainer.getBoostFlutterView().onUserLeaveHint();
......@@ -184,10 +187,9 @@ public class ContainerRecord implements IContainerRecord {
private void create() {
if (mState == STATE_UNKNOW) {
NavigationService.didInitPageContainer(
genResult("didInitPageContainer"),
mContainer.getContainerName(),
mContainer.getContainerParams(),
invokeChannelUnsafe(
mContainer.getContainerUrl(),
mContainer.getContainerUrlParams(),
mUniqueId
);
//Debuger.log("didInitPageContainer");
......@@ -196,10 +198,9 @@ public class ContainerRecord implements IContainerRecord {
}
private void appear() {
NavigationService.didShowPageContainer(
genResult("didShowPageContainer"),
mContainer.getContainerName(),
mContainer.getContainerParams(),
invokeChannelUnsafe(
mContainer.getContainerUrl(),
mContainer.getContainerUrlParams(),
mUniqueId
);
//Debuger.log("didShowPageContainer");
......@@ -209,10 +210,9 @@ public class ContainerRecord implements IContainerRecord {
private void disappear() {
if (mState < STATE_DISAPPEAR) {
NavigationService.didDisappearPageContainer(
genResult("didDisappearPageContainer"),
mContainer.getContainerName(),
mContainer.getContainerParams(),
invokeChannel(
mContainer.getContainerUrl(),
mContainer.getContainerUrlParams(),
mUniqueId
);
//Debuger.log("didDisappearPageContainer");
......@@ -223,10 +223,9 @@ public class ContainerRecord implements IContainerRecord {
private void destroy() {
if (mState < STATE_DESTROYED) {
NavigationService.willDeallocPageContainer(
genResult("willDeallocPageContainer"),
mContainer.getContainerName(),
mContainer.getContainerParams(),
invokeChannel(
mContainer.getContainerUrl(),
mContainer.getContainerUrlParams(),
mUniqueId
);
//Debuger.log("willDeallocPageContainer");
......@@ -234,25 +233,21 @@ public class ContainerRecord implements IContainerRecord {
mState = STATE_DESTROYED;
}
}
}
private MessageResult<Boolean> genResult(final String name) {
return new MessageResult<Boolean>() {
@Override
public void success(Boolean var1) {
//Debuger.log(name + " call success");
}
@Override
public void error(String var1, String var2, Object var3) {
Debuger.log(name + " call error");
public void invokeChannel(String pageName, Map params, String uniqueId) {
HashMap<String, Object> args = new HashMap<>();
args.put("pageName", pageName);
args.put("params", params);
args.put("uniqueId", uniqueId);
FlutterBoostPlugin.singleton().channel().invokeMethod("didInitPageContainer", args);
}
@Override
public void notImplemented() {
Debuger.log(name + " call not Impelemented");
public void invokeChannelUnsafe(String pageName, Map params, String uniqueId) {
HashMap<String, Object> args = new HashMap<>();
args.put("pageName", pageName);
args.put("params", params);
args.put("uniqueId", uniqueId);
FlutterBoostPlugin.singleton().channel().invokeMethodUnsafe("didInitPageContainer", args);
}
};
}
}
......@@ -29,30 +29,29 @@ import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import com.taobao.idlefish.flutterboost.NavigationService.NavigationService;
import com.taobao.idlefish.flutterboost.interfaces.IContainerManager;
import com.taobao.idlefish.flutterboost.interfaces.IContainerRecord;
import com.taobao.idlefish.flutterboost.interfaces.IFlutterEngineProvider;
import com.taobao.idlefish.flutterboost.interfaces.IFlutterViewContainer;
import com.taobao.idlefish.flutterboost.interfaces.IPlatform;
import com.taobao.idlefish.flutterboost.interfaces.IStateListener;
import com.taobao.idlefish.flutterboost.loader.ServiceLoader;
import java.util.HashMap;
import java.util.Map;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry;
public class FlutterBoostPlugin implements MethodChannel.MethodCallHandler {
public class FlutterBoostPlugin {
static FlutterBoostPlugin sInstance = null;
public static synchronized void init(IPlatform platform) {
if (sInstance == null) {
sInstance = new FlutterBoostPlugin(platform);
ServiceLoader.load();
}
if (platform.whenEngineStart() == IPlatform.IMMEDIATELY) {
......@@ -64,23 +63,25 @@ public class FlutterBoostPlugin implements MethodChannel.MethodCallHandler {
public static FlutterBoostPlugin singleton() {
if (sInstance == null) {
throw new RuntimeException("FlutterBoostPlugin not init yet");
Debuger.exception("FlutterBoostPlugin not init yet");
}
return sInstance;
}
public static void registerWith(PluginRegistry.Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), "flutter_boost");
channel.setMethodCallHandler(singleton());
final MethodChannel method = new MethodChannel(registrar.messenger(), "flutter_boost_method");
final EventChannel event = new EventChannel(registrar.messenger(), "flutter_boost_event");
singleton().registerChannel(method,event);
}
private final IPlatform mPlatform;
private final IContainerManager mManager;
private final IFlutterEngineProvider mEngineProvider;
IStateListener mStateListener;
private Activity mCurrentActiveActivity;
IStateListener mStateListener;
Activity mCurrentActiveActivity;
BoostChannel mBoostChannel;
private FlutterBoostPlugin(IPlatform platform) {
mPlatform = platform;
......@@ -89,45 +90,26 @@ public class FlutterBoostPlugin implements MethodChannel.MethodCallHandler {
platform.getApplication().registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks());
}
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
}
public IFlutterEngineProvider engineProvider() {
if (sInstance == null) {
throw new RuntimeException("FlutterBoostPlugin not init yet");
}
return sInstance.mEngineProvider;
}
public IContainerManager containerManager() {
if (sInstance == null) {
throw new RuntimeException("FlutterBoostPlugin not init yet");
}
return sInstance.mManager;
}
public IPlatform platform() {
if (sInstance == null) {
throw new RuntimeException("FlutterBoostPlugin not init yet");
}
return sInstance.mPlatform;
}
public Activity currentActivity() {
if (sInstance == null) {
throw new RuntimeException("FlutterBoostPlugin not init yet");
public BoostChannel channel() {
if(mBoostChannel == null) {
Debuger.exception("channel not register yet!");
}
return mBoostChannel;
}
public Activity currentActivity() {
return sInstance.mCurrentActiveActivity;
}
......@@ -135,11 +117,16 @@ public class FlutterBoostPlugin implements MethodChannel.MethodCallHandler {
return mManager.findContainerById(id);
}
public void setStateListener(@Nullable IStateListener listener){
mStateListener = listener;
}
private void registerChannel(MethodChannel method, EventChannel event) {
mBoostChannel = new BoostChannel(method,event);
mBoostChannel.addMethodCallHandler(new BoostMethodHandler());
}
class ActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
......@@ -156,9 +143,9 @@ public class FlutterBoostPlugin implements MethodChannel.MethodCallHandler {
Debuger.log("Application entry foreground");
if (mEngineProvider.tryGetEngine() != null) {
Map<String, String> map = new HashMap<>();
HashMap<String, String> map = new HashMap<>();
map.put("type", "foreground");
NavigationService.getService().emitEvent(map);
mBoostChannel.sendEvent(map);
}
}
mCurrentActiveActivity = activity;
......@@ -180,9 +167,9 @@ public class FlutterBoostPlugin implements MethodChannel.MethodCallHandler {
Debuger.log("Application entry background");
if (mEngineProvider.tryGetEngine() != null) {
Map<String, String> map = new HashMap<>();
HashMap<String, String> map = new HashMap<>();
map.put("type", "background");
NavigationService.getService().emitEvent(map);
mBoostChannel.sendEvent(map);
}
mCurrentActiveActivity = null;
}
......@@ -199,15 +186,96 @@ public class FlutterBoostPlugin implements MethodChannel.MethodCallHandler {
Debuger.log("Application entry background");
if (mEngineProvider.tryGetEngine() != null) {
Map<String, String> map = new HashMap<>();
HashMap<String, String> map = new HashMap<>();
map.put("type", "background");
NavigationService.getService().emitEvent(map);
mBoostChannel.sendEvent(map);
}
mCurrentActiveActivity = null;
}
}
}
class BoostMethodHandler implements MethodChannel.MethodCallHandler {
@Override
public void onMethodCall(MethodCall methodCall, final MethodChannel.Result result) {
switch (methodCall.method) {
case "pageOnStart":
{
Map<String, Object> pageInfo = new HashMap<>();
try {
IContainerRecord record = mManager.getCurrentTopRecord();
if (record == null) {
record = mManager.getLastGenerateRecord();
}
pageInfo.put("name", record.getContainer().getContainerUrl());
pageInfo.put("params", record.getContainer().getContainerUrlParams());
pageInfo.put("uniqueId", record.uniqueId());
result.success(pageInfo);
} catch (Throwable t) {
result.error("no flutter page found!",t.getMessage(),t);
}
}
break;
case "openPage":
{
try {
Map<String,Object> params = methodCall.argument("urlParams");
Map<String,Object> exts = methodCall.argument("exts");
String url = methodCall.argument("url");
mManager.openContainer(url, params, exts, new IContainerManager.OnResult() {
@Override
public void onResult(Map<String, Object> rlt) {
if (result != null) {
result.success(rlt);
}
}
});
}catch (Throwable t){
}
}
break;
case "closePage":
{
try {
String uniqueId = methodCall.argument("uniqueId");
Map<String,Object> resultData = methodCall.argument("result");
Map<String,Object> exts = methodCall.argument("exts");
mManager.closeContainer(uniqueId, resultData,exts);
result.success(true);
}catch (Throwable t){
result.error("close page error",t.getMessage(),t);
}
}
break;
case "onShownContainerChanged":
{
try {
String newId = methodCall.argument("newName");
String oldId = methodCall.argument("oldName");
mManager.onShownContainerChanged(newId,oldId);
result.success(true);
}catch (Throwable t){
result.error("onShownContainerChanged",t.getMessage(),t);
}
}
break;
default:
{
result.notImplemented();
}
}
}
}
public static void setBoostResult(Activity activity, HashMap result) {
Intent intent = new Intent();
if (result != null) {
......
......@@ -23,7 +23,9 @@
*/
package com.taobao.idlefish.flutterboost;
import android.content.Context;
import android.text.TextUtils;
import android.util.SparseArray;
import com.taobao.idlefish.flutterboost.interfaces.IContainerManager;
import com.taobao.idlefish.flutterboost.interfaces.IContainerRecord;
......@@ -33,11 +35,13 @@ import com.taobao.idlefish.flutterboost.interfaces.IOperateSyncer;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import java.util.concurrent.atomic.AtomicInteger;
public class FlutterViewContainerManager implements IContainerManager {
......@@ -45,8 +49,10 @@ public class FlutterViewContainerManager implements IContainerManager {
private final Set<ContainerRef> mRefs = new HashSet<>();
private final Stack<IContainerRecord> mRecordStack = new Stack<>();
FlutterViewContainerManager() {}
private final AtomicInteger mRequestCode = new AtomicInteger(0);
private final SparseArray<OnResult> mOnResults = new SparseArray<>();
FlutterViewContainerManager() {}
@Override
public IOperateSyncer generateSyncer(IFlutterViewContainer container) {
......@@ -54,7 +60,7 @@ public class FlutterViewContainerManager implements IContainerManager {
ContainerRecord record = new ContainerRecord(this, container);
if (mRecordMap.put(container, record) != null) {
Debuger.exception("container:" + container.getContainerName() + " already exists!");
Debuger.exception("container:" + container.getContainerUrl() + " already exists!");
}
mRefs.add(new ContainerRef(record.uniqueId(),container));
......@@ -81,18 +87,51 @@ public class FlutterViewContainerManager implements IContainerManager {
mRecordMap.remove(record.getContainer());
}
void setContainerResult(IContainerRecord record,int requestCode, Map<String,Object> result) {
IFlutterViewContainer target = findContainerById(record.uniqueId());
if(target == null) {
Debuger.exception("setContainerResult error, url="+record.getContainer().getContainerUrl());
}
OnResult onResult = mOnResults.get(requestCode);
if(onResult != null) {
onResult.onResult(result);
}
mOnResults.remove(requestCode);
}
@Override
public void openContainer(String url, Map<String, Object> urlParams, Map<String, Object> exts,OnResult onResult) {
Context context = FlutterBoostPlugin.singleton().currentActivity();
if(context == null) {
context = FlutterBoostPlugin.singleton().platform().getApplication();
}
int requestCode = mRequestCode.addAndGet(3);
if(onResult != null) {
mOnResults.put(requestCode,onResult);
}
FlutterBoostPlugin.singleton().platform().openContainer(context,url,urlParams,requestCode,exts);
}
@Override
public IFlutterViewContainer closeContainer(String uniqueId, Map<String, Object> result) {
public IContainerRecord closeContainer(String uniqueId, Map<String, Object> result,Map<String,Object> exts) {
IContainerRecord targetRecord = null;
for (Map.Entry<IFlutterViewContainer, IContainerRecord> entry : mRecordMap.entrySet()) {
if (TextUtils.equals(uniqueId, entry.getValue().uniqueId())) {
entry.getKey().finishContainer();
return entry.getKey();
targetRecord = entry.getValue();
break;
}
}
if(targetRecord == null) {
Debuger.exception("closeContainer can not find uniqueId:" + uniqueId);
}
return null;
FlutterBoostPlugin.singleton().platform().closeContainer(targetRecord,result,exts);
return targetRecord;
}
@Override
......@@ -173,7 +212,6 @@ public class FlutterViewContainerManager implements IContainerManager {
return false;
}
public static class ContainerRef {
public final String uniqueId;
public final WeakReference<IFlutterViewContainer> container;
......
package com.taobao.idlefish.flutterboost;
import com.taobao.idlefish.flutterboost.interfaces.IContainerRecord;
import com.taobao.idlefish.flutterboost.interfaces.IPlatform;
import java.util.Map;
public abstract class Platform implements IPlatform {
@Override
public void closeContainer(IContainerRecord record, Map<String, Object> result, Map<String, Object> exts) {
if(record == null) return;
record.getContainer().finishContainer(result);
}
@Override
public int whenEngineStart() {
return ANY_ACTIVITY_CREATED;
}
}
......@@ -46,7 +46,9 @@ import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
import com.taobao.idlefish.flutterboost.interfaces.IFlutterViewContainer;
import com.taobao.idlefish.flutterboost.interfaces.IOperateSyncer;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import io.flutter.embedding.android.FlutterView;
import io.flutter.plugin.platform.PlatformPlugin;
......@@ -180,6 +182,16 @@ public abstract class BoostFlutterActivity extends Activity implements IFlutterV
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mSyncer.onActivityResult(requestCode,resultCode,data);
Map<String,Object> result = null;
if(data != null) {
Serializable rlt = data.getSerializableExtra(RESULT_KEY);
if(rlt instanceof Map) {
result = (Map<String,Object>)rlt;
}
}
mSyncer.onContainerResult(requestCode,result);
}
@Override
......@@ -217,8 +229,12 @@ public abstract class BoostFlutterActivity extends Activity implements IFlutterV
}
@Override
public void finishContainer() {
finish();
public void finishContainer(Map<String,Object> result) {
Intent intent = new Intent();
if (result != null) {
intent.putExtra(RESULT_KEY, new HashMap<>(result));
}
setResult(Activity.RESULT_OK, intent);
}
@Override
......@@ -226,11 +242,4 @@ public abstract class BoostFlutterActivity extends Activity implements IFlutterV
@Override
public void onContainerHidden() {}
@Override
public void setBoostResult(HashMap result) {
Intent data = new Intent();
data.putExtra(RESULT_KEY,result);
setResult(RESULT_OK,data);
}
}
......@@ -38,7 +38,7 @@ import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
import com.taobao.idlefish.flutterboost.interfaces.IFlutterViewContainer;
import com.taobao.idlefish.flutterboost.interfaces.IOperateSyncer;
import java.util.HashMap;
import java.util.Map;
import io.flutter.embedding.android.FlutterView;
......@@ -137,8 +137,8 @@ abstract public class BoostFlutterFragment extends Fragment implements IFlutterV
}
@Override
public void finishContainer() {
getActivity().finish();
public void finishContainer(Map<String,Object> result) {
getFragmentManager().popBackStack();
}
@Override
......@@ -146,11 +146,4 @@ abstract public class BoostFlutterFragment extends Fragment implements IFlutterV
@Override
public void onContainerHidden() {}
@Override
public void setBoostResult(HashMap result) {
Intent data = new Intent();
data.putExtra(RESULT_KEY,result);
getActivity().setResult(Activity.RESULT_OK,data);
}
}
......@@ -29,7 +29,9 @@ public interface IContainerManager {
IOperateSyncer generateSyncer(IFlutterViewContainer container);
IFlutterViewContainer closeContainer(String uniqueId,Map<String,Object> result);
void openContainer(String url,Map<String,Object> urlParams,Map<String,Object> exts,OnResult onResult);
IContainerRecord closeContainer(String uniqueId,Map<String,Object> result,Map<String,Object> exts);
IContainerRecord getCurrentTopRecord();
......@@ -40,4 +42,8 @@ public interface IContainerManager {
void onShownContainerChanged(String oldUniqueId,String nowUniqueId);
boolean hasContainerAppear();
interface OnResult {
void onResult(Map<String,Object> result);
}
}
\ No newline at end of file
......@@ -24,12 +24,10 @@
package com.taobao.idlefish.flutterboost.interfaces;
import android.app.Activity;
import com.taobao.idlefish.flutterboost.BoostFlutterView;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import io.flutter.plugin.common.PluginRegistry;
import java.util.Map;
/**
* a container which contains the flutter view
......@@ -48,19 +46,19 @@ public interface IFlutterViewContainer {
/**
* call to destroy the container
*/
void finishContainer();
void finishContainer(Map<String,Object> result);
/**
* container name
* @return
*/
String getContainerName();
String getContainerUrl();
/**
* container params
* @return
*/
Map getContainerParams();
Map getContainerUrlParams();
/**
* callback when container shown
......@@ -71,10 +69,4 @@ public interface IFlutterViewContainer {
* callback when container hidden
*/
void onContainerHidden();
/**
* call by flutter side to set result
* @param result
*/
void setBoostResult(HashMap result);
}
......@@ -2,6 +2,8 @@ package com.taobao.idlefish.flutterboost.interfaces;
import android.content.Intent;
import java.util.Map;
public interface IOperateSyncer {
void onCreate();
......@@ -20,6 +22,8 @@ public interface IOperateSyncer {
void onActivityResult(int requestCode, int resultCode, Intent data);
void onContainerResult(int requestCode, Map<String,Object> result);
void onUserLeaveHint();
void onTrimMemory(int level);
......
......@@ -55,17 +55,13 @@ public interface IPlatform {
* register plugins
* @return
*/
void onRegisterPlugins(PluginRegistry registry);
void registerPlugins(PluginRegistry registry);
void openContainer(Context context,String url,Map<String,Object> urlParams,int requestCode,Map<String,Object> exts);
/**
* start a new activity from flutter page, you may need a page router with url
* @param context
* @param url
* @param requestCode
* @return
*/
boolean startActivity(Context context,String url,Map params,int requestCode);
void closeContainer(IContainerRecord record, Map<String,Object> result, Map<String,Object> exts);
/**
* @return
......
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing;
import com.taobao.idlefish.flutterboost.messageing.base.MessageResult;
import java.util.HashMap;
import java.util.Map;
import io.flutter.plugin.common.MethodChannel;
public class NavigationService {
public static MethodChannel methodChannel = null;
public static void onNativePageResult(final MessageResult<Boolean> result, String uniqueId, String key, Map resultData, Map params) {
Map<String, Object> args = new HashMap<>();
args.put("uniqueId", uniqueId);
args.put("key", key);
args.put("resultData", resultData);
args.put("params", params);
methodChannel.invokeMethod("onNativePageResult", args, new MethodChannel.Result() {
@Override
public void success(Object o) {
if (o instanceof Boolean) {
result.success((Boolean) o);
} else {
result.error("return type error code dart code", "", "");
}
}
@Override
public void error(String s, String s1, Object o) {
if (result != null) {
result.error(s, s1, o);
}
}
@Override
public void notImplemented() {
if (result != null) {
result.notImplemented();
}
}
});
}
public static void didShowPageContainer(final MessageResult<Boolean> result, String pageName, Map params, String uniqueId) {
Map<String, Object> args = new HashMap<>();
args.put("pageName", pageName);
args.put("params", params);
args.put("uniqueId", uniqueId);
methodChannel.invokeMethod("didShowPageContainer", args, new MethodChannel.Result() {
@Override
public void success(Object o) {
if (o instanceof Boolean) {
result.success((Boolean) o);
} else {
result.error("return type error code dart code", "", "");
}
}
@Override
public void error(String s, String s1, Object o) {
if (result != null) {
result.error(s, s1, o);
}
}
@Override
public void notImplemented() {
if (result != null) {
result.notImplemented();
}
}
});
}
public static void willShowPageContainer(final MessageResult<Boolean> result, String pageName, Map params, String uniqueId) {
Map<String, Object> args = new HashMap<>();
args.put("pageName", pageName);
args.put("params", params);
args.put("uniqueId", uniqueId);
methodChannel.invokeMethod("willShowPageContainer", args, new MethodChannel.Result() {
@Override
public void success(Object o) {
if (o instanceof Boolean) {
result.success((Boolean) o);
} else {
result.error("return type error code dart code", "", "");
}
}
@Override
public void error(String s, String s1, Object o) {
if (result != null) {
result.error(s, s1, o);
}
}
@Override
public void notImplemented() {
if (result != null) {
result.notImplemented();
}
}
});
}
public static void willDisappearPageContainer(final MessageResult<Boolean> result, String pageName, Map params, String uniqueId) {
Map<String, Object> args = new HashMap<>();
args.put("pageName", pageName);
args.put("params", params);
args.put("uniqueId", uniqueId);
methodChannel.invokeMethod("willDisappearPageContainer", args, new MethodChannel.Result() {
@Override
public void success(Object o) {
if (o instanceof Boolean) {
result.success((Boolean) o);
} else {
result.error("return type error code dart code", "", "");
}
}
@Override
public void error(String s, String s1, Object o) {
if (result != null) {
result.error(s, s1, o);
}
}
@Override
public void notImplemented() {
if (result != null) {
result.notImplemented();
}
}
});
}
public static void didDisappearPageContainer(final MessageResult<Boolean> result, String pageName, Map params, String uniqueId) {
Map<String, Object> args = new HashMap<>();
args.put("pageName", pageName);
args.put("params", params);
args.put("uniqueId", uniqueId);
methodChannel.invokeMethod("didDisappearPageContainer", args, new MethodChannel.Result() {
@Override
public void success(Object o) {
if (o instanceof Boolean) {
result.success((Boolean) o);
} else {
result.error("return type error code dart code", "", "");
}
}
@Override
public void error(String s, String s1, Object o) {
if (result != null) {
result.error(s, s1, o);
}
}
@Override
public void notImplemented() {
if (result != null) {
result.notImplemented();
}
}
});
}
public static void didInitPageContainer(final MessageResult<Boolean> result, String pageName, Map params, String uniqueId) {
Map<String, Object> args = new HashMap<>();
args.put("pageName", pageName);
args.put("params", params);
args.put("uniqueId", uniqueId);
methodChannel.invokeMethod("didInitPageContainer", args, new MethodChannel.Result() {
@Override
public void success(Object o) {
if (o instanceof Boolean) {
result.success((Boolean) o);
} else {
result.error("return type error code dart code", "", "");
}
}
@Override
public void error(String s, String s1, Object o) {
if (result != null) {
result.error(s, s1, o);
}
}
@Override
public void notImplemented() {
if (result != null) {
result.notImplemented();
}
}
});
}
public static void willDeallocPageContainer(final MessageResult<Boolean> result, String pageName, Map params, String uniqueId) {
Map<String, Object> args = new HashMap<>();
args.put("pageName", pageName);
args.put("params", params);
args.put("uniqueId", uniqueId);
methodChannel.invokeMethod("willDeallocPageContainer", args, new MethodChannel.Result() {
@Override
public void success(Object o) {
if (o instanceof Boolean) {
result.success((Boolean) o);
} else {
result.error("return type error code dart code", "", "");
}
}
@Override
public void error(String s, String s1, Object o) {
if (result != null) {
result.error(s, s1, o);
}
}
@Override
public void notImplemented() {
if (result != null) {
result.notImplemented();
}
}
});
}
}
\ No newline at end of file
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.base;
import android.support.annotation.Nullable;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import io.flutter.plugin.common.MethodChannel;
public class Broadcastor{
private MethodChannel channel = null;
private Map<String,List<EvenListener>> lists = new HashMap<>();
public Broadcastor(MethodChannel channel) {
this.channel = channel;
}
public void sendEvent(String name , Map arguments) {
if (name == null) {
return;
}
Map msg = new HashMap();
msg.put("name",name);
if(arguments != null){
msg.put("arguments",arguments);
}
channel.invokeMethod("__event__", msg, new MethodChannel.Result() {
@Override
public void success(@Nullable Object o) {
}
@Override
public void error(String s, @Nullable String s1, @Nullable Object o) {
}
@Override
public void notImplemented() {
}
});
}
public void dispatch(String name, Map arguments) {
if(name == null || arguments == null){
return ;
}
String eventName = (String)arguments.get("name");
Map eventArguments = (Map)arguments.get("arguments");
List<EvenListener> list = lists.get(eventName);
if(list == null){
return ;
}
for(EvenListener l : list){
l.onEvent(eventName,eventArguments);
}
return;
}
public void addEventListener(String name , EvenListener listener){
if(listener == null || name == null){
return ;
}
List<EvenListener> list = lists.get(name);
if (list == null){
list = new LinkedList<>();
lists.put(name,list);
}
list.add(listener);
}
public void removeEventListener(String name ,EvenListener listener){
if(listener == null || name == null){
return ;
}
List<EvenListener> list = lists.get(name);
if(list != null){
list.remove(listener);
}
}
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.base;
import java.util.Map;
public interface EvenListener {
void onEvent(String eventName , Map arguments);
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.base;
import java.util.Map;
public interface Message {
String name();
Map arguments();
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.base;
public interface MessageDispatcher<T>{
boolean dispatch(Message msg,MessageResult<T> result);
void addHandler(MessageHandler<T> handler);
void removeHandler(MessageHandler<T> handler);
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.base;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MessageDispatcherImp implements MessageDispatcher {
private Map<String,MessageHandler> handlers = new HashMap<>();
@Override
public boolean dispatch(Message msg, MessageResult result) {
if(msg == null){
return false;
}
MessageHandler h = handlers.get(msg.name());
if(h != null){
return h.onMethodCall(msg.name(),msg.arguments(),result);
}
return false;
}
@Override
public void addHandler(MessageHandler handler) {
if(handler == null){
return;
}
List<String> names = handler.handleMessageNames();
for(String name : names){
handlers.put(name,handler);
}
}
@Override
public void removeHandler(MessageHandler handler) {
if(handler == null){
return;
}
List<String> names = handler.handleMessageNames();
for(String name : names){
if(handler == handlers.get(name)){
handlers.remove(name);
}
}
}
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.base;
import java.util.List;
import java.util.Map;
public interface MessageHandler<T> {
boolean onMethodCall(String name, Map args, MessageResult<T> result);
List<String> handleMessageNames();
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.base;
import java.util.Map;
public class MessageImp implements Message{
private String name;
private Map args;
public MessageImp(String name,Map args){
this.name = name;
this.args = args;
}
@Override
public String name() {
return name;
}
@Override
public Map arguments() {
return args;
}
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.base;
public interface MessageResult<T> {
void success(T var1);
void error(String var1, String var2, Object var3);
void notImplemented();
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.handlers;
import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
import com.taobao.idlefish.flutterboost.FlutterViewContainerManager;
import com.taobao.idlefish.flutterboost.messageing.base.MessageHandler;
import com.taobao.idlefish.flutterboost.messageing.base.MessageResult;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ClosePageHandler implements MessageHandler<Boolean> {
//==================Do not edit code blow!==============
@Override
public boolean onMethodCall(String name, Map args, MessageResult<Boolean> result) {
//TODO:接入新的close消息
String uniqueId = (String)args.get("uniqueId");
Map resultData = (Map)args.get("result");
Map exts = (Map)args.get("exts");
FlutterBoostPlugin.containerManager().closeContainer(uniqueId, null);
result.success(true);
return true;
}
@Override
public List<String> handleMessageNames() {
List<String> h = new ArrayList<>();
h.add("closePage");
return h;
}
}
\ No newline at end of file
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.handlers;
import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
import com.taobao.idlefish.flutterboost.messageing.base.MessageHandler;
import com.taobao.idlefish.flutterboost.messageing.base.MessageResult;
import com.taobao.idlefish.flutterboost.interfaces.IContainerManager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class OnFlutterPageResultHandler implements MessageHandler<Boolean> {
private boolean onCall(MessageResult<Boolean> result, String uniqueId, String key, Map resultData, Map params) {
result.success(true);
return true;
}
//==================Do not edit code blow!==============
@Override
public boolean onMethodCall(String name, Map args, MessageResult<Boolean> result) {
this.onCall(result, (String) args.get("uniqueId"), (String) args.get("key"), (Map) args.get("resultData"), (Map) args.get("params"));
return true;
}
@Override
public List<String> handleMessageNames() {
List<String> h = new ArrayList<>();
h.add("onFlutterPageResult");
return h;
}
}
\ No newline at end of file
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.handlers;
import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
import com.taobao.idlefish.flutterboost.messageing.base.MessageHandler;
import com.taobao.idlefish.flutterboost.messageing.base.MessageResult;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class OnShownContainerChangedHandler implements MessageHandler<Boolean> {
private boolean onCall(MessageResult<Boolean> result, String now, String old, Map params) {
//Add your handler code here.
FlutterBoostPlugin.containerManager().onShownContainerChanged(old, now);
return true;
}
//==================Do not edit code blow!==============
@Override
public boolean onMethodCall(String name, Map args, MessageResult<Boolean> result) {
this.onCall(result, (String) args.get("newName"), (String) args.get("oldName"), (Map) args.get("params"));
return true;
}
@Override
public List<String> handleMessageNames() {
List<String> h = new ArrayList<>();
h.add("onShownContainerChanged");
return h;
}
}
\ No newline at end of file
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.handlers;
import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
import com.taobao.idlefish.flutterboost.messageing.base.MessageHandler;
import com.taobao.idlefish.flutterboost.messageing.base.MessageResult;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class OpenPageHandler implements MessageHandler<Map> {
@Override
public boolean onMethodCall(String name, Map args, MessageResult<Map> result) {
//TODO:接入新的open方法,同时兼容老方法
Map params = (Map)args.get("urlParams");
Map exts = (Map)args.get("exts");
String url = (String)args.get("url");
int requestCode = 0;
if (params != null && params.get("requestCode") != null) {
requestCode = (int) params.get("requestCode");
}
FlutterBoostPlugin.openPage(null, url, params, 0);
//TODO: to call future.
if (result != null) {
result.success(new HashMap());
}
return true;
}
@Override
public List<String> handleMessageNames() {
List<String> h = new ArrayList<>();
h.add("openPage");
return h;
}
}
\ No newline at end of file
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.taobao.idlefish.flutterboost.messageing.handlers;
import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
import com.taobao.idlefish.flutterboost.FlutterViewContainerManager;
import com.taobao.idlefish.flutterboost.interfaces.IContainerRecord;
import com.taobao.idlefish.flutterboost.interfaces.IFlutterViewContainer;
import com.taobao.idlefish.flutterboost.messageing.base.MessageHandler;
import com.taobao.idlefish.flutterboost.messageing.base.MessageResult;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PageOnStartHandler implements MessageHandler<Map> {
private boolean onCall(MessageResult<Map> result, Map params) {
Map<String, Object> pageInfo = new HashMap<>();
try {
IContainerRecord record = FlutterBoostPlugin
.containerManager().getCurrentTopRecord();
if (record == null) {
record = FlutterBoostPlugin.containerManager().getLastGenerateRecord();
}
pageInfo.put("name", record.getContainer().getContainerName());
pageInfo.put("params", record.getContainer().getContainerParams());
pageInfo.put("uniqueId", record.uniqueId());
result.success(pageInfo);
} catch (Throwable t) {
result.success(pageInfo);
}
return true;
}
@Override
public boolean onMethodCall(String name, Map args, MessageResult<Map> result) {
this.onCall(result, (Map) args.get("params"));
return true;
}
@Override
public List<String> handleMessageNames() {
List<String> h = new ArrayList<>();
h.add("pageOnStart");
return h;
}
}
\ No newline at end of file
......@@ -29,12 +29,12 @@ public class FlutterFragment extends BoostFlutterFragment {
}
@Override
public String getContainerName() {
public String getContainerUrl() {
return "flutterFragment";
}
@Override
public Map getContainerParams() {
public Map getContainerUrlParams() {
Map<String,String> params = new HashMap<>();
params.put("tag",getArguments().getString("tag"));
return params;
......
......@@ -26,7 +26,7 @@ public class FlutterPageActivity extends BoostFlutterActivity {
* @return
*/
@Override
public String getContainerName() {
public String getContainerUrl() {
return "flutterPage";
}
......@@ -45,7 +45,7 @@ public class FlutterPageActivity extends BoostFlutterActivity {
* @return
*/
@Override
public Map getContainerParams() {
public Map getContainerUrlParams() {
Map<String,String> params = new HashMap<>();
params.put("aaa","bbb");
return params;
......
......@@ -3,13 +3,8 @@ package com.taobao.idlefish.flutterboostexample;
import android.app.Application;
import android.content.Context;
import com.taobao.idlefish.flutterboost.BoostFlutterEngine;
import com.taobao.idlefish.flutterboost.BoostFlutterView;
import com.taobao.idlefish.flutterboost.Debuger;
import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
import com.taobao.idlefish.flutterboost.StateListener;
import com.taobao.idlefish.flutterboost.interfaces.IPlatform;
import com.taobao.idlefish.flutterboost.interfaces.IStateListener;
import com.taobao.idlefish.flutterboost.Platform;
import java.util.Map;
......@@ -22,44 +17,26 @@ public class MyApplication extends FlutterApplication {
public void onCreate() {
super.onCreate();
FlutterBoostPlugin.init(new IPlatform() {
FlutterBoostPlugin.init(new Platform() {
@Override
public Application getApplication() {
return MyApplication.this;
}
@Override
public void onRegisterPlugins(PluginRegistry registry) {
GeneratedPluginRegistrant.registerWith(registry);
}
@Override
public boolean isDebug() {
return true;
}
/**
* 如果flutter想打开一个本地页面,将会回调这个方法,页面参数将会拼接在url中
*
* 例如:sample://nativePage?aaa=bbb
*
* 参数就是类似 aaa=bbb 这样的键值对
*
* @param context
* @param url
* @param requestCode
* @return
*/
@Override
public boolean startActivity(Context context, String url, Map params, int requestCode) {
Debuger.log("startActivity url="+url);
return PageRouter.openPageByUrl(context,url,params,requestCode);
public void registerPlugins(PluginRegistry registry) {
GeneratedPluginRegistrant.registerWith(registry);
}
@Override
public int whenEngineStart() {
return IMMEDIATELY;
public void openContainer(Context context, String url, Map<String, Object> urlParams, int requestCode, Map<String, Object> exts) {
PageRouter.openPageByUrl(context,url,urlParams,requestCode);
}
});
}
......
......@@ -60,7 +60,8 @@ class FlutterBoost {
GlobalKey<ContainerManagerState>();
final ObserversHolder _observersHolder = ObserversHolder();
final Router _router = Router();
final MethodChannel _methodChannel = MethodChannel('flutter_boost');
final MethodChannel _methodChannel = MethodChannel('flutter_boost_method');
final EventChannel _eventChannel = EventChannel('flutter_boost_event');
final MessageDispatcher _dispatcher = MessageDispatcher();
int _callbackID = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment