Merge branch 'feature/slider' into 'master'
Feature/slider See merge request !25
This commit is contained in:
commit
f93e715db1
@ -18,7 +18,6 @@ package pub.doric.demo;
|
||||
import android.os.Bundle;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
@ -30,6 +29,7 @@ import org.greenrobot.eventbus.ThreadMode;
|
||||
|
||||
import pub.doric.DoricContext;
|
||||
import pub.doric.DoricContextManager;
|
||||
import pub.doric.DoricPanel;
|
||||
import pub.doric.devkit.DoricContextDebuggable;
|
||||
import pub.doric.devkit.event.EnterDebugEvent;
|
||||
import pub.doric.devkit.event.QuitDebugEvent;
|
||||
@ -52,14 +52,12 @@ public class DemoActivity extends AppCompatActivity {
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
String source = getIntent().getStringExtra("source");
|
||||
FrameLayout frameLayout = new FrameLayout(this);
|
||||
addContentView(frameLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
DoricPanel doricPanel = new DoricPanel(this);
|
||||
addContentView(doricPanel, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
doricContext = DoricContext.create(this, DoricUtils.readAssetFile("demo/" + source), source);
|
||||
doricPanel.config(DoricUtils.readAssetFile("demo/" + source), source);
|
||||
doricContext = doricPanel.getDoricContext();
|
||||
doricContextDebuggable = new DoricContextDebuggable(doricContext);
|
||||
doricContext.init(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
doricContext.getRootNode().setRootView(frameLayout);
|
||||
|
||||
sensorHelper = new SensorManagerHelper(this);
|
||||
sensorHelper.setOnShakeListener(new SensorManagerHelper.OnShakeListener() {
|
||||
@Override
|
||||
@ -73,18 +71,6 @@ public class DemoActivity extends AppCompatActivity {
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
doricContext.onShow();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
doricContext.onHidden();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
@ -95,7 +81,6 @@ public class DemoActivity extends AppCompatActivity {
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
doricContext.teardown();
|
||||
EventBus.getDefault().unregister(this);
|
||||
sensorHelper.stop();
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import pub.doric.DoricActivity;
|
||||
import pub.doric.utils.DoricUtils;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
@ -89,6 +90,13 @@ public class MainActivity extends AppCompatActivity {
|
||||
tv.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (data[position].contains("NavigatorDemo")) {
|
||||
Intent intent = new Intent(tv.getContext(), DoricActivity.class);
|
||||
intent.putExtra("scheme", "assets://demo/" + data[position]);
|
||||
intent.putExtra("alias", data[position]);
|
||||
tv.getContext().startActivity(intent);
|
||||
return;
|
||||
}
|
||||
Intent intent = new Intent(tv.getContext(), DemoActivity.class);
|
||||
intent.putExtra("source", data[position]);
|
||||
tv.getContext().startActivity(intent);
|
||||
|
@ -1 +1,16 @@
|
||||
<manifest package="pub.doric" />
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="pub.doric">
|
||||
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
|
||||
<application>
|
||||
<activity android:name="pub.doric.DoricActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
</manifest>
|
||||
|
53
Android/doric/src/main/java/pub/doric/DoricActivity.java
Normal file
53
Android/doric/src/main/java/pub/doric/DoricActivity.java
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
/**
|
||||
* @Description: pub.doric.demo
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-19
|
||||
*/
|
||||
public class DoricActivity extends AppCompatActivity {
|
||||
private DoricFragment doricFragment;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.doric_activity);
|
||||
if (savedInstanceState == null) {
|
||||
String scheme = getIntent().getStringExtra("scheme");
|
||||
String alias = getIntent().getStringExtra("alias");
|
||||
doricFragment = DoricFragment.newInstance(scheme, alias);
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
.add(R.id.container, doricFragment)
|
||||
.commit();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (doricFragment.canPop()) {
|
||||
doricFragment.pop();
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
}
|
@ -26,6 +26,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import pub.doric.async.AsyncResult;
|
||||
import pub.doric.navigator.IDoricNavigator;
|
||||
import pub.doric.plugin.DoricJavaPlugin;
|
||||
import pub.doric.shader.RootNode;
|
||||
import pub.doric.utils.DoricConstant;
|
||||
@ -66,7 +67,7 @@ public class DoricContext {
|
||||
return doricContext;
|
||||
}
|
||||
|
||||
public void init(int width, int height) {
|
||||
public void init(float width, float height) {
|
||||
this.initParams = new JSONBuilder()
|
||||
.put("width", width)
|
||||
.put("height", height).toJSONObject();
|
||||
@ -148,4 +149,14 @@ public class DoricContext {
|
||||
public void onHidden() {
|
||||
callEntity(DoricConstant.DORIC_ENTITY_HIDDEN);
|
||||
}
|
||||
|
||||
private IDoricNavigator doricNavigator;
|
||||
|
||||
public void setDoricNavigator(IDoricNavigator doricNavigator) {
|
||||
this.doricNavigator = doricNavigator;
|
||||
}
|
||||
|
||||
public IDoricNavigator getDoricNavigator() {
|
||||
return this.doricNavigator;
|
||||
}
|
||||
}
|
||||
|
84
Android/doric/src/main/java/pub/doric/DoricFragment.java
Normal file
84
Android/doric/src/main/java/pub/doric/DoricFragment.java
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import pub.doric.navigator.IDoricNavigator;
|
||||
|
||||
/**
|
||||
* @Description: pub.doric
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-23
|
||||
*/
|
||||
public class DoricFragment extends Fragment implements IDoricNavigator {
|
||||
|
||||
public static DoricFragment newInstance(String scheme, String alias) {
|
||||
Bundle args = new Bundle();
|
||||
args.putString("scheme", scheme);
|
||||
args.putString("alias", alias);
|
||||
DoricFragment fragment = new DoricFragment();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.doric_fragment, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
Bundle argument = getArguments();
|
||||
if (argument != null) {
|
||||
String alias = argument.getString("alias");
|
||||
String scheme = argument.getString("scheme");
|
||||
push(scheme, alias);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void push(String scheme, String alias) {
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.add(R.id.root, DoricPanelFragment.newInstance(scheme, alias))
|
||||
.addToBackStack(scheme)
|
||||
.commit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pop() {
|
||||
if (canPop()) {
|
||||
getChildFragmentManager().popBackStack();
|
||||
} else {
|
||||
if (getActivity() != null) {
|
||||
getActivity().finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canPop() {
|
||||
return getChildFragmentManager().getBackStackEntryCount() > 1;
|
||||
}
|
||||
}
|
@ -16,40 +16,43 @@
|
||||
package pub.doric;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.lifecycle.LifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.OnLifecycleEvent;
|
||||
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import pub.doric.utils.DoricUtils;
|
||||
|
||||
/**
|
||||
* @Description: Doric
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-07-18
|
||||
*/
|
||||
public class DoricPanel extends FrameLayout {
|
||||
public class DoricPanel extends FrameLayout implements LifecycleObserver {
|
||||
|
||||
private DoricContext mDoricContext;
|
||||
|
||||
public DoricPanel(@NonNull Context context) {
|
||||
super(context);
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
public DoricPanel(@NonNull Context context, @Nullable AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public DoricPanel(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
if (getContext() instanceof LifecycleOwner) {
|
||||
((LifecycleOwner) getContext()).getLifecycle().addObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
public DoricPanel(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
}
|
||||
|
||||
public void config(String script, String alias) {
|
||||
DoricContext doricContext = DoricContext.create(getContext(), script, alias);
|
||||
@ -58,6 +61,14 @@ public class DoricPanel extends FrameLayout {
|
||||
|
||||
public void config(DoricContext doricContext) {
|
||||
mDoricContext = doricContext;
|
||||
mDoricContext.getRootNode().setRootView(this);
|
||||
if (getMeasuredState() != 0) {
|
||||
mDoricContext.init(DoricUtils.px2dp(getMeasuredWidth()), DoricUtils.px2dp(getMeasuredHeight()));
|
||||
}
|
||||
if (getContext() instanceof LifecycleOwner
|
||||
&& ((LifecycleOwner) getContext()).getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
|
||||
mDoricContext.onShow();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -68,4 +79,35 @@ public class DoricPanel extends FrameLayout {
|
||||
public DoricContext getDoricContext() {
|
||||
return mDoricContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
if (oldw != w || oldh != h) {
|
||||
if (mDoricContext != null) {
|
||||
mDoricContext.init(DoricUtils.px2dp(w), DoricUtils.px2dp(h));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
|
||||
public void onActivityResume() {
|
||||
if (mDoricContext != null) {
|
||||
mDoricContext.onShow();
|
||||
}
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
|
||||
public void onActivityPause() {
|
||||
if (mDoricContext != null) {
|
||||
mDoricContext.onHidden();
|
||||
}
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
|
||||
public void onActivityDestroy() {
|
||||
if (mDoricContext != null) {
|
||||
mDoricContext.teardown();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import pub.doric.async.AsyncResult;
|
||||
import pub.doric.loader.DoricJSLoaderManager;
|
||||
import pub.doric.navigator.IDoricNavigator;
|
||||
import pub.doric.utils.DoricLog;
|
||||
|
||||
/**
|
||||
* @Description: pub.doric
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-23
|
||||
*/
|
||||
public class DoricPanelFragment extends Fragment {
|
||||
private DoricPanel doricPanel;
|
||||
|
||||
public static DoricPanelFragment newInstance(String scheme, String alias) {
|
||||
Bundle args = new Bundle();
|
||||
args.putString("scheme", scheme);
|
||||
args.putString("alias", alias);
|
||||
DoricPanelFragment fragment = new DoricPanelFragment();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
doricPanel = (DoricPanel) inflater.inflate(R.layout.doric_framgent_panel, container, false);
|
||||
return doricPanel;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
Bundle argument = getArguments();
|
||||
if (argument == null) {
|
||||
DoricLog.e("DoricPanelFragment argument is null");
|
||||
return;
|
||||
}
|
||||
final String alias = argument.getString("alias");
|
||||
String scheme = argument.getString("scheme");
|
||||
DoricJSLoaderManager.getInstance().loadJSBundle(scheme).setCallback(new AsyncResult.Callback<String>() {
|
||||
@Override
|
||||
public void onResult(String result) {
|
||||
doricPanel.config(result, alias);
|
||||
DoricContext context = doricPanel.getDoricContext();
|
||||
Fragment fragment = getParentFragment();
|
||||
if (fragment instanceof IDoricNavigator) {
|
||||
context.setDoricNavigator((IDoricNavigator) fragment);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable t) {
|
||||
DoricLog.e("DoricPanelFragment load JS error:" + t.getLocalizedMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -17,6 +17,10 @@ package pub.doric;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import pub.doric.loader.DoricAssetJSLoader;
|
||||
import pub.doric.loader.DoricHttpJSLoader;
|
||||
import pub.doric.loader.IDoricJSLoader;
|
||||
import pub.doric.plugin.NavigatorPlugin;
|
||||
import pub.doric.plugin.NetworkPlugin;
|
||||
import pub.doric.plugin.ShaderPlugin;
|
||||
import pub.doric.plugin.StoragePlugin;
|
||||
@ -36,6 +40,7 @@ import pub.doric.utils.DoricMetaInfo;
|
||||
import pub.doric.plugin.DoricJavaPlugin;
|
||||
import pub.doric.plugin.ModalPlugin;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
@ -43,15 +48,22 @@ import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* @Description: com.github.penfeizhou.doric
|
||||
* @Description: pub.doric
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-07-20
|
||||
*/
|
||||
public class DoricRegistry {
|
||||
private static Map<String, String> bundles = new ConcurrentHashMap<>();
|
||||
private static Set<DoricLibrary> doricLibraries = new HashSet<>();
|
||||
private static Set<IDoricJSLoader> jsLoaders = new HashSet<>();
|
||||
|
||||
static {
|
||||
addJSLoader(new DoricAssetJSLoader());
|
||||
addJSLoader(new DoricHttpJSLoader());
|
||||
}
|
||||
|
||||
private Map<String, DoricMetaInfo<DoricJavaPlugin>> pluginInfoMap = new HashMap<>();
|
||||
private Map<String, DoricMetaInfo<ViewNode>> nodeInfoMap = new HashMap<>();
|
||||
private static Set<DoricLibrary> doricLibraries = new HashSet<>();
|
||||
|
||||
private static void initRegistry(DoricRegistry doricRegistry) {
|
||||
for (DoricLibrary library : doricLibraries) {
|
||||
@ -69,6 +81,7 @@ public class DoricRegistry {
|
||||
this.registerNativePlugin(ModalPlugin.class);
|
||||
this.registerNativePlugin(NetworkPlugin.class);
|
||||
this.registerNativePlugin(StoragePlugin.class);
|
||||
this.registerNativePlugin(NavigatorPlugin.class);
|
||||
this.registerViewNode(RootNode.class);
|
||||
this.registerViewNode(TextNode.class);
|
||||
this.registerViewNode(ImageNode.class);
|
||||
@ -112,4 +125,12 @@ public class DoricRegistry {
|
||||
public String acquireJSBundle(String name) {
|
||||
return bundles.get(name);
|
||||
}
|
||||
|
||||
public static void addJSLoader(IDoricJSLoader jsLoader) {
|
||||
jsLoaders.add(jsLoader);
|
||||
}
|
||||
|
||||
public static Collection<IDoricJSLoader> getJSLoaders() {
|
||||
return jsLoaders;
|
||||
}
|
||||
}
|
||||
|
@ -26,6 +26,13 @@ public class AsyncResult<R> {
|
||||
|
||||
private Callback<R> callback = null;
|
||||
|
||||
public AsyncResult() {
|
||||
}
|
||||
|
||||
public AsyncResult(R r) {
|
||||
this.result = r;
|
||||
}
|
||||
|
||||
public void setResult(R result) {
|
||||
this.result = result;
|
||||
if (this.callback != null) {
|
||||
|
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric.loader;
|
||||
|
||||
import pub.doric.async.AsyncResult;
|
||||
import pub.doric.utils.DoricUtils;
|
||||
|
||||
/**
|
||||
* @Description: handle "assets://asset-file-path"
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-23
|
||||
*/
|
||||
public class DoricAssetJSLoader implements IDoricJSLoader {
|
||||
@Override
|
||||
public boolean filter(String scheme) {
|
||||
return scheme.startsWith("assets");
|
||||
}
|
||||
|
||||
@Override
|
||||
public AsyncResult<String> request(String scheme) {
|
||||
return new AsyncResult<>(DoricUtils.readAssetFile(scheme.substring("assets://".length())));
|
||||
}
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric.loader;
|
||||
|
||||
import com.bumptech.glide.RequestBuilder;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import okhttp3.Call;
|
||||
import okhttp3.Callback;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import pub.doric.async.AsyncResult;
|
||||
|
||||
/**
|
||||
* @Description: handle like "https://xxxx.js"
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-23
|
||||
*/
|
||||
public class DoricHttpJSLoader implements IDoricJSLoader {
|
||||
private OkHttpClient okHttpClient = new OkHttpClient();
|
||||
|
||||
@Override
|
||||
public boolean filter(String scheme) {
|
||||
return scheme.startsWith("http");
|
||||
}
|
||||
|
||||
@Override
|
||||
public AsyncResult<String> request(String scheme) {
|
||||
final AsyncResult<String> ret = new AsyncResult<>();
|
||||
okHttpClient.newCall(new Request.Builder().url(scheme).build()).enqueue(new Callback() {
|
||||
@Override
|
||||
public void onFailure(@NotNull Call call, @NotNull IOException e) {
|
||||
ret.setError(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResponse(@NotNull Call call, @NotNull Response response) {
|
||||
try {
|
||||
ret.setResult(response.body().string());
|
||||
} catch (Exception e) {
|
||||
ret.setError(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
return ret;
|
||||
}
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric.loader;
|
||||
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import pub.doric.DoricRegistry;
|
||||
import pub.doric.async.AsyncResult;
|
||||
|
||||
/**
|
||||
* @Description: pub.doric
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-23
|
||||
*/
|
||||
public class DoricJSLoaderManager {
|
||||
private DoricJSLoaderManager() {
|
||||
}
|
||||
|
||||
private static class Inner {
|
||||
private static final DoricJSLoaderManager sInstance = new DoricJSLoaderManager();
|
||||
}
|
||||
|
||||
public static DoricJSLoaderManager getInstance() {
|
||||
return Inner.sInstance;
|
||||
}
|
||||
|
||||
public AsyncResult<String> loadJSBundle(String scheme) {
|
||||
Collection<IDoricJSLoader> jsLoaders = DoricRegistry.getJSLoaders();
|
||||
for (IDoricJSLoader jsLoader : jsLoaders) {
|
||||
if (jsLoader.filter(scheme)) {
|
||||
return jsLoader.request(scheme);
|
||||
}
|
||||
}
|
||||
return new AsyncResult<>("");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric.loader;
|
||||
|
||||
import pub.doric.async.AsyncResult;
|
||||
|
||||
/**
|
||||
* @Description: pub.doric
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-23
|
||||
*/
|
||||
public interface IDoricJSLoader {
|
||||
boolean filter(String scheme);
|
||||
|
||||
AsyncResult<String> request(String scheme);
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric.navigator;
|
||||
|
||||
/**
|
||||
* @Description: pub.doric.navigator
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-23
|
||||
*/
|
||||
public interface IDoricNavigator {
|
||||
void push(String scheme, String alias);
|
||||
|
||||
void pop();
|
||||
}
|
@ -32,7 +32,6 @@ import pub.doric.extension.bridge.DoricPromise;
|
||||
import pub.doric.utils.DoricUtils;
|
||||
import pub.doric.utils.ThreadMode;
|
||||
|
||||
import com.github.pengfeizhou.jscore.ArchiveException;
|
||||
import com.github.pengfeizhou.jscore.JSDecoder;
|
||||
import com.github.pengfeizhou.jscore.JSObject;
|
||||
import com.github.pengfeizhou.jscore.JSValue;
|
||||
@ -51,7 +50,7 @@ public class ModalPlugin extends DoricJavaPlugin {
|
||||
}
|
||||
|
||||
@DoricMethod(thread = ThreadMode.UI)
|
||||
public void toast(JSDecoder decoder, DoricPromise promise) {
|
||||
public void toast(JSDecoder decoder) {
|
||||
try {
|
||||
JSObject jsObject = decoder.decode().asObject();
|
||||
String msg = jsObject.getProperty("msg").asString().value();
|
||||
|
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package pub.doric.plugin;
|
||||
|
||||
import com.github.pengfeizhou.jscore.ArchiveException;
|
||||
import com.github.pengfeizhou.jscore.JSDecoder;
|
||||
import com.github.pengfeizhou.jscore.JSObject;
|
||||
|
||||
import pub.doric.DoricContext;
|
||||
import pub.doric.extension.bridge.DoricMethod;
|
||||
import pub.doric.extension.bridge.DoricPlugin;
|
||||
import pub.doric.navigator.IDoricNavigator;
|
||||
import pub.doric.utils.ThreadMode;
|
||||
|
||||
/**
|
||||
* @Description: pub.doric.plugin
|
||||
* @Author: pengfei.zhou
|
||||
* @CreateDate: 2019-11-23
|
||||
*/
|
||||
@DoricPlugin(name = "navigator")
|
||||
public class NavigatorPlugin extends DoricJavaPlugin {
|
||||
public NavigatorPlugin(DoricContext doricContext) {
|
||||
super(doricContext);
|
||||
}
|
||||
|
||||
@DoricMethod(thread = ThreadMode.UI)
|
||||
public void push(JSDecoder jsDecoder) {
|
||||
IDoricNavigator navigator = getDoricContext().getDoricNavigator();
|
||||
if (navigator != null) {
|
||||
try {
|
||||
JSObject jsObject = jsDecoder.decode().asObject();
|
||||
navigator.push(jsObject.getProperty("scheme").asString().value(),
|
||||
jsObject.getProperty("alias").asString().value()
|
||||
);
|
||||
} catch (ArchiveException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@DoricMethod(thread = ThreadMode.UI)
|
||||
public void pop() {
|
||||
IDoricNavigator navigator = getDoricContext().getDoricNavigator();
|
||||
if (navigator != null) {
|
||||
navigator.pop();
|
||||
}
|
||||
}
|
||||
}
|
5
Android/doric/src/main/res/layout/doric_activity.xml
Normal file
5
Android/doric/src/main/res/layout/doric_activity.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
7
Android/doric/src/main/res/layout/doric_fragment.xml
Normal file
7
Android/doric/src/main/res/layout/doric_fragment.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/root"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
</FrameLayout>
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<pub.doric.DoricPanel xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffffff" />
|
@ -10,4 +10,5 @@ export default [
|
||||
'src/ModalDemo',
|
||||
'src/NetworkDemo',
|
||||
'src/StorageDemo',
|
||||
'src/NavigatorDemo',
|
||||
]
|
50
demo/src/NavigatorDemo.ts
Normal file
50
demo/src/NavigatorDemo.ts
Normal file
@ -0,0 +1,50 @@
|
||||
import { Panel, scroller, vlayout, text, layoutConfig, LayoutSpec, Color, gravity, IVLayout, Group, IText, navigator } from "doric";
|
||||
import { colors, label } from "./utils";
|
||||
@Entry
|
||||
class NaivgatorDemo extends Panel {
|
||||
build(root: Group) {
|
||||
scroller(vlayout([
|
||||
text({
|
||||
text: "Navigator Demo",
|
||||
layoutConfig: layoutConfig().w(LayoutSpec.AT_MOST),
|
||||
textSize: 30,
|
||||
textColor: Color.WHITE,
|
||||
bgColor: colors[1],
|
||||
textAlignment: gravity().center(),
|
||||
height: 50,
|
||||
}),
|
||||
...['Counter', 'EffectsDemo', 'ImageDemo', 'LayoutDemo',
|
||||
'ListDemo', 'ModalDemo', 'NavigatorDemo',
|
||||
'NetworkDemo', 'ScrollerDemo', 'SliderDemo', 'Snake', 'StorageDemo'].map(e =>
|
||||
label(e).apply({
|
||||
height: 50,
|
||||
bgColor: colors[0],
|
||||
textSize: 30,
|
||||
textColor: Color.WHITE,
|
||||
layoutConfig: layoutConfig().exactly().w(LayoutSpec.AT_MOST),
|
||||
onClick: () => {
|
||||
navigator(context).push(`assets://demo/${e}.js`, `${e}.js`)
|
||||
},
|
||||
} as IText)
|
||||
),
|
||||
label('POP').apply({
|
||||
width: 200,
|
||||
height: 50,
|
||||
bgColor: colors[0],
|
||||
textSize: 30,
|
||||
textColor: Color.WHITE,
|
||||
layoutConfig: layoutConfig().exactly(),
|
||||
onClick: () => {
|
||||
navigator(context).pop()
|
||||
},
|
||||
} as IText),
|
||||
]).apply({
|
||||
layoutConfig: layoutConfig().atmost().h(LayoutSpec.WRAP_CONTENT),
|
||||
gravity: gravity().center(),
|
||||
space: 10,
|
||||
} as IVLayout)).apply({
|
||||
layoutConfig: layoutConfig().atmost(),
|
||||
}).in(root)
|
||||
}
|
||||
|
||||
}
|
@ -4,16 +4,10 @@
|
||||
//
|
||||
|
||||
#import "DemoVC.h"
|
||||
#import "DoricContext.h"
|
||||
#import "DoricLayouts.h"
|
||||
#import "DoricExtensions.h"
|
||||
#import "DoricRootNode.h"
|
||||
#import "DoricLocalServer.h"
|
||||
#import "Doric.h"
|
||||
|
||||
@interface DemoVC ()
|
||||
@property(nonatomic, copy) NSString *filePath;
|
||||
@property(nonatomic, strong) DoricContext *doricContext;
|
||||
//@property(nonatomic, strong) DoricLocalServer *localServer;
|
||||
@end
|
||||
|
||||
@implementation DemoVC
|
||||
@ -31,21 +25,15 @@ - (void)viewDidLoad {
|
||||
NSString *demoPath = [path stringByAppendingPathComponent:@"demo"];
|
||||
NSString *fullPath = [demoPath stringByAppendingPathComponent:self.filePath];
|
||||
NSString *jsContent = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:nil];
|
||||
self.doricContext = [[DoricContext alloc] initWithScript:jsContent source:self.filePath];
|
||||
[self.doricContext.rootNode setupRootView:[[DoricStackView new] also:^(DoricStackView *it) {
|
||||
it.backgroundColor = [UIColor whiteColor];
|
||||
it.layoutConfig = [[DoricLayoutConfig alloc]
|
||||
initWithWidth:DoricLayoutAtMost
|
||||
height:DoricLayoutAtMost
|
||||
margin:DoricMarginMake(0, 88, 0, 0)
|
||||
];
|
||||
DoricPanel *panel = [DoricPanel new];
|
||||
[panel.view also:^(UIView *it) {
|
||||
it.width = self.view.width;
|
||||
it.height = self.view.height - 88;
|
||||
it.top = 88;
|
||||
[self.view addSubview:it];
|
||||
}]];
|
||||
[self.doricContext initContextWithWidth:self.view.width height:self.view.height];
|
||||
// [self.doricContext.driver connectDevKit:@"ws://192.168.11.38:7777"];
|
||||
// self.localServer = [[DoricLocalServer alloc] init];
|
||||
// [self.localServer startWithPort:8910];
|
||||
}];
|
||||
[self addChildViewController:panel];
|
||||
[panel config:jsContent alias:self.filePath];
|
||||
}
|
||||
|
||||
@end
|
@ -58,8 +58,16 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath
|
||||
[self.navigationController pushViewController:[QRScanViewController new] animated:NO];
|
||||
return;
|
||||
}
|
||||
DemoVC *demoVC = [[DemoVC alloc] initWithPath:self.demoFilePaths[(NSUInteger) indexPath.row]];
|
||||
[self.navigationController pushViewController:demoVC animated:NO];
|
||||
NSString *file = self.demoFilePaths[(NSUInteger) indexPath.row];
|
||||
if ([file containsString:@"NavigatorDemo"]) {
|
||||
DoricViewController *doricViewController = [[DoricViewController alloc]
|
||||
initWithScheme:[NSString stringWithFormat:@"assets://demo/%@", file]
|
||||
alias:self.demoFilePaths[(NSUInteger) indexPath.row]];
|
||||
[self.navigationController pushViewController:doricViewController animated:NO];
|
||||
} else {
|
||||
DemoVC *demoVC = [[DemoVC alloc] initWithPath:file];
|
||||
[self.navigationController pushViewController:demoVC animated:NO];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -20,3 +20,7 @@
|
||||
#import "DoricRootNode.h"
|
||||
#import "UIView+Doric.h"
|
||||
#import "DoricUtil.h"
|
||||
#import "DoricPanel.h"
|
||||
#import "DoricJSLoaderManager.h"
|
||||
#import "DoricNavigatorProtocol.h"
|
||||
#import "DoricViewController.h"
|
@ -22,13 +22,14 @@
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "DoricDriver.h"
|
||||
#import "DoricNavigatorProtocol.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class DoricRootNode;
|
||||
|
||||
@interface DoricContext : NSObject
|
||||
|
||||
@property(nonatomic, weak) id <DoricNavigatorProtocol> navigator;
|
||||
@property(nonatomic, strong) NSString *contextId;
|
||||
@property(nonatomic, strong) DoricDriver *driver;
|
||||
@property(nonatomic, strong) NSMutableDictionary *pluginInstanceMap;
|
||||
|
29
iOS/Pod/Classes/DoricPanel.h
Normal file
29
iOS/Pod/Classes/DoricPanel.h
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "DoricContext.h"
|
||||
#import "DoricNavigatorProtocol.h"
|
||||
|
||||
@interface DoricPanel : UIViewController
|
||||
@property(nonatomic, strong) DoricContext *doricContext;
|
||||
|
||||
- (void)config:(NSString *)script alias:(NSString *)alias;
|
||||
@end
|
49
iOS/Pod/Classes/DoricPanel.m
Normal file
49
iOS/Pod/Classes/DoricPanel.m
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import "DoricPanel.h"
|
||||
#import "Doric.h"
|
||||
|
||||
@implementation DoricPanel
|
||||
|
||||
- (void)config:(NSString *)script alias:(NSString *)alias {
|
||||
self.doricContext = [[[DoricContext alloc] initWithScript:script source:alias] also:^(DoricContext *it) {
|
||||
if ([self.parentViewController conformsToProtocol:@protocol(DoricNavigatorProtocol)]) {
|
||||
it.navigator = (id <DoricNavigatorProtocol>) self.parentViewController;
|
||||
}
|
||||
[it.rootNode setupRootView:[[DoricStackView new] also:^(DoricStackView *it) {
|
||||
it.width = self.view.width;
|
||||
it.height = self.view.height;
|
||||
[self.view addSubview:it];
|
||||
}]];
|
||||
[it initContextWithWidth:self.view.width height:self.view.height];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)viewDidAppear:(BOOL)animated {
|
||||
[super viewDidAppear:animated];
|
||||
[self.doricContext onShow];
|
||||
}
|
||||
|
||||
- (void)viewDidDisappear:(BOOL)animated {
|
||||
[super viewDidDisappear:animated];
|
||||
[self.doricContext onHidden];
|
||||
}
|
||||
|
||||
@end
|
@ -35,6 +35,7 @@
|
||||
#import "DoricSliderNode.h"
|
||||
#import "DoricSlideItemNode.h"
|
||||
#import "DoricStoragePlugin.h"
|
||||
#import "DoricNavigatorPlugin.h"
|
||||
|
||||
@interface DoricRegistry ()
|
||||
|
||||
@ -61,6 +62,7 @@ - (void)innerRegister {
|
||||
[self registerNativePlugin:DoricModalPlugin.class withName:@"modal"];
|
||||
[self registerNativePlugin:DoricNetworkPlugin.class withName:@"network"];
|
||||
[self registerNativePlugin:DoricStoragePlugin.class withName:@"storage"];
|
||||
[self registerNativePlugin:DoricNavigatorPlugin.class withName:@"navigator"];
|
||||
|
||||
[self registerViewNode:DoricStackNode.class withName:@"Stack"];
|
||||
[self registerViewNode:DoricVLayoutNode.class withName:@"VLayout"];
|
||||
|
25
iOS/Pod/Classes/DoricViewController.h
Normal file
25
iOS/Pod/Classes/DoricViewController.h
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "DoricNavigatorProtocol.h"
|
||||
|
||||
@interface DoricViewController : UIViewController <DoricNavigatorProtocol>
|
||||
- (instancetype)initWithScheme:(NSString *)scheme alias:(NSString *)alias;
|
||||
@end
|
71
iOS/Pod/Classes/DoricViewController.m
Normal file
71
iOS/Pod/Classes/DoricViewController.m
Normal file
@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import "DoricViewController.h"
|
||||
#import "DoricAsyncResult.h"
|
||||
#import "DoricJSLoaderManager.h"
|
||||
#import "DoricPanel.h"
|
||||
#import "UIView+Doric.h"
|
||||
#import "DoricExtensions.h"
|
||||
|
||||
@implementation DoricViewController
|
||||
- (instancetype)initWithScheme:(NSString *)scheme alias:(NSString *)alias {
|
||||
if (self = [super init]) {
|
||||
[self push:scheme alias:alias];
|
||||
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回"
|
||||
style:UIBarButtonItemStylePlain
|
||||
target:self
|
||||
action:@selector(pop)];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)push:(NSString *)scheme alias:(NSString *)alias {
|
||||
DoricAsyncResult <NSString *> *result = [DoricJSLoaderManager.instance request:scheme];
|
||||
result.resultCallback = ^(NSString *result) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
DoricPanel *panel = [DoricPanel new];
|
||||
[panel.view also:^(UIView *it) {
|
||||
it.backgroundColor = [UIColor whiteColor];
|
||||
it.width = self.view.width;
|
||||
it.height = self.view.height - 88;
|
||||
it.top = 88;
|
||||
}];
|
||||
[self.view addSubview:panel.view];
|
||||
[self addChildViewController:panel];
|
||||
[panel config:result alias:alias];
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
- (void)pop {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if (self.childViewControllers.count > 1) {
|
||||
[self.childViewControllers.lastObject also:^(UIViewController *it) {
|
||||
[it removeFromParentViewController];
|
||||
[it.view removeFromSuperview];
|
||||
}];
|
||||
} else {
|
||||
[self.navigationController popViewControllerAnimated:NO];
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@end
|
@ -21,11 +21,11 @@
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "DoricJSExecutorProtocal.h"
|
||||
#import "DoricJSExecutorProtocol.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface DoricJSCoreExecutor : NSObject <DoricJSExecutorProtocal>
|
||||
@interface DoricJSCoreExecutor : NSObject <DoricJSExecutorProtocol>
|
||||
|
||||
@end
|
||||
|
||||
|
@ -21,7 +21,7 @@
|
||||
//
|
||||
|
||||
#import "DoricJSEngine.h"
|
||||
#import "DoricJSExecutorProtocal.h"
|
||||
#import "DoricJSExecutorProtocol.h"
|
||||
#import "DoricJSCoreExecutor.h"
|
||||
#import "DoricJSRemoteExecutor.h"
|
||||
#import "DoricConstant.h"
|
||||
@ -29,7 +29,7 @@
|
||||
#import "DoricBridgeExtension.h"
|
||||
|
||||
@interface DoricJSEngine ()
|
||||
@property(nonatomic, strong) id <DoricJSExecutorProtocal> jsExecutor;
|
||||
@property(nonatomic, strong) id <DoricJSExecutorProtocol> jsExecutor;
|
||||
@property(nonatomic, strong) NSMutableDictionary *timers;
|
||||
@property(nonatomic, strong) DoricBridgeExtension *bridgeExtension;
|
||||
@end
|
||||
|
@ -25,7 +25,7 @@
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@protocol DoricJSExecutorProtocal <NSObject>
|
||||
@protocol DoricJSExecutorProtocol <NSObject>
|
||||
|
||||
- (NSString *)loadJSScript:(NSString *)script source:(NSString *)source;
|
||||
|
@ -21,11 +21,11 @@
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "DoricJSExecutorProtocal.h"
|
||||
#import "DoricJSExecutorProtocol.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface DoricJSRemoteExecutor : NSObject <DoricJSExecutorProtocal>
|
||||
@interface DoricJSRemoteExecutor : NSObject <DoricJSExecutorProtocol>
|
||||
|
||||
@property(nonatomic, strong) dispatch_semaphore_t semaphore;
|
||||
|
||||
|
25
iOS/Pod/Classes/Loader/DoricHttpJSLoader.h
Normal file
25
iOS/Pod/Classes/Loader/DoricHttpJSLoader.h
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "DoricLoaderProtocol.h"
|
||||
|
||||
@interface DoricHttpJSLoader : NSObject <DoricLoaderProtocol>
|
||||
@end
|
45
iOS/Pod/Classes/Loader/DoricHttpJSLoader.m
Normal file
45
iOS/Pod/Classes/Loader/DoricHttpJSLoader.m
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import "DoricHttpJSLoader.h"
|
||||
|
||||
|
||||
@implementation DoricHttpJSLoader
|
||||
|
||||
- (BOOL)filter:(NSString *)scheme {
|
||||
return [scheme hasPrefix:@"http"];
|
||||
}
|
||||
|
||||
- (DoricAsyncResult <NSString *> *)request:(NSString *)scheme {
|
||||
DoricAsyncResult *ret = [DoricAsyncResult new];
|
||||
NSURL *URL = [NSURL URLWithString:scheme];
|
||||
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
|
||||
[[[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]
|
||||
dataTaskWithRequest:request
|
||||
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||
if (!error) {
|
||||
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
||||
[ret setupResult:dataStr];
|
||||
} else {
|
||||
[ret setupError:[[NSException alloc] initWithName:@"DoricJSLoaderManager Exception" reason:error.description userInfo:nil]];
|
||||
}
|
||||
}] resume];
|
||||
return ret;
|
||||
}
|
||||
@end
|
33
iOS/Pod/Classes/Loader/DoricJSLoaderManager.h
Normal file
33
iOS/Pod/Classes/Loader/DoricJSLoaderManager.h
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// DoricJSLoaderManager.h
|
||||
// Doric
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "DoricLoaderProtocol.h"
|
||||
#import "DoricAsyncResult.h"
|
||||
|
||||
@interface DoricJSLoaderManager : NSObject
|
||||
+ (instancetype)instance;
|
||||
|
||||
- (void)addJSLoader:(id <DoricLoaderProtocol>)loader;
|
||||
|
||||
- (DoricAsyncResult <NSString *> *)request:(NSString *)scheme;
|
||||
@end
|
68
iOS/Pod/Classes/Loader/DoricJSLoaderManager.m
Normal file
68
iOS/Pod/Classes/Loader/DoricJSLoaderManager.m
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// DoricJSLoaderManager.m
|
||||
// Doric
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import "DoricJSLoaderManager.h"
|
||||
#import "DoricMainBundleJSLoader.h"
|
||||
#import "DoricHttpJSLoader.h"
|
||||
#import "Doric.h"
|
||||
|
||||
@interface DoricJSLoaderManager ()
|
||||
@property(nonatomic, copy) NSSet <id <DoricLoaderProtocol>> *loaders;
|
||||
@end
|
||||
|
||||
@implementation DoricJSLoaderManager
|
||||
+ (instancetype)instance {
|
||||
static DoricJSLoaderManager *_instance;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
_instance = [DoricJSLoaderManager new];
|
||||
});
|
||||
return _instance;
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
if (self = [super init]) {
|
||||
_loaders = [[NSSet alloc] initWithArray:@[
|
||||
[DoricMainBundleJSLoader new],
|
||||
[DoricHttpJSLoader new],
|
||||
]];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)addJSLoader:(id <DoricLoaderProtocol>)loader {
|
||||
self.loaders = [[self.loaders mutableCopy] also:^(NSMutableSet *it) {
|
||||
[it addObject:loader];
|
||||
}];
|
||||
}
|
||||
|
||||
- (DoricAsyncResult <NSString *> *)request:(NSString *)scheme {
|
||||
__block DoricAsyncResult *ret;
|
||||
[self.loaders enumerateObjectsUsingBlock:^(id <DoricLoaderProtocol> obj, BOOL *stop) {
|
||||
if ([obj filter:scheme]) {
|
||||
ret = [obj request:scheme];
|
||||
*stop = YES;
|
||||
}
|
||||
}];
|
||||
return ret;
|
||||
}
|
||||
@end
|
27
iOS/Pod/Classes/Loader/DoricLoaderProtocol.h
Normal file
27
iOS/Pod/Classes/Loader/DoricLoaderProtocol.h
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "DoricAsyncResult.h"
|
||||
|
||||
@protocol DoricLoaderProtocol <NSObject>
|
||||
- (BOOL)filter:(NSString *)scheme;
|
||||
|
||||
- (DoricAsyncResult <NSString *> *)request:(NSString *)scheme;
|
||||
@end
|
25
iOS/Pod/Classes/Loader/DoricMainBundleJSLoader.h
Normal file
25
iOS/Pod/Classes/Loader/DoricMainBundleJSLoader.h
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "DoricLoaderProtocol.h"
|
||||
|
||||
@interface DoricMainBundleJSLoader : NSObject <DoricLoaderProtocol>
|
||||
@end
|
42
iOS/Pod/Classes/Loader/DoricMainBundleJSLoader.m
Normal file
42
iOS/Pod/Classes/Loader/DoricMainBundleJSLoader.m
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import "DoricMainBundleJSLoader.h"
|
||||
|
||||
|
||||
@implementation DoricMainBundleJSLoader
|
||||
- (BOOL)filter:(NSString *)scheme {
|
||||
return [scheme hasPrefix:@"assets"];
|
||||
}
|
||||
|
||||
- (DoricAsyncResult <NSString *> *)request:(NSString *)scheme {
|
||||
DoricAsyncResult <NSString *> *ret = [DoricAsyncResult new];
|
||||
NSString *path = [[NSBundle mainBundle] bundlePath];
|
||||
NSString *fullPath = [path stringByAppendingPathComponent:[scheme substringFromIndex:@"assets://".length]];
|
||||
NSError *error;
|
||||
NSString *jsContent = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:&error];
|
||||
if (error) {
|
||||
[ret setupError:[NSException new]];
|
||||
} else {
|
||||
[ret setupResult:jsContent];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@end
|
11
iOS/Pod/Classes/Navigator/DoricNavigatorProtocol.h
Normal file
11
iOS/Pod/Classes/Navigator/DoricNavigatorProtocol.h
Normal file
@ -0,0 +1,11 @@
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@protocol DoricNavigatorProtocol <NSObject>
|
||||
- (void)push:(NSString *)scheme alias:(NSString *)alias;
|
||||
|
||||
- (void)pop;
|
||||
@end
|
24
iOS/Pod/Classes/Plugin/DoricNavigatorPlugin.h
Normal file
24
iOS/Pod/Classes/Plugin/DoricNavigatorPlugin.h
Normal file
@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "DoricNativePlugin.h"
|
||||
|
||||
@interface DoricNavigatorPlugin : DoricNativePlugin
|
||||
@end
|
31
iOS/Pod/Classes/Plugin/DoricNavigatorPlugin.m
Normal file
31
iOS/Pod/Classes/Plugin/DoricNavigatorPlugin.m
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright [2019] [Doric.Pub]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
//
|
||||
// Created by pengfei.zhou on 2019/11/23.
|
||||
//
|
||||
|
||||
#import "DoricNavigatorPlugin.h"
|
||||
|
||||
|
||||
@implementation DoricNavigatorPlugin
|
||||
- (void)push:(NSDictionary *)params {
|
||||
[self.doricContext.navigator push:params[@"scheme"] alias:params[@"alias"]];
|
||||
}
|
||||
|
||||
- (void)pop {
|
||||
[self.doricContext.navigator pop];
|
||||
}
|
||||
@end
|
@ -26,15 +26,9 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
|
||||
@interface DoricAsyncResult <R> : NSObject
|
||||
typedef void(^DoricResultCallback)(R);
|
||||
|
||||
typedef void(^DoricExceptionCallback)(NSException *);
|
||||
|
||||
typedef void(^DoricFinishCallback)(void);
|
||||
|
||||
@property(nonatomic, strong) DoricResultCallback resultCallback;
|
||||
@property(nonatomic, strong) DoricExceptionCallback exceptionCallback;
|
||||
@property(nonatomic, strong) DoricFinishCallback finishCallback;
|
||||
@property(nonatomic, strong) void (^resultCallback)(R result);
|
||||
@property(nonatomic, strong) void (^exceptionCallback)(NSException *e);
|
||||
@property(nonatomic, strong) void (^finishCallback)(void);
|
||||
|
||||
- (void)setupResult:(R)result;
|
||||
|
||||
|
@ -56,24 +56,24 @@ - (id)getResult {
|
||||
return self.result;
|
||||
}
|
||||
|
||||
- (void)setResultCallback:(DoricResultCallback)callback {
|
||||
- (void)setResultCallback:(void (^)(id))callback {
|
||||
_resultCallback = callback;
|
||||
if (self.result && ![self.result isKindOfClass:[NSException class]]) {
|
||||
callback(self.result);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setExceptionCallback:(DoricExceptionCallback)exceptionCallback {
|
||||
- (void)setExceptionCallback:(void (^)(NSException *))exceptionCallback {
|
||||
_exceptionCallback = exceptionCallback;
|
||||
if ([self.result isKindOfClass:[NSException class]]) {
|
||||
exceptionCallback(self.result);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setFinishCallback:(DoricFinishCallback)callback {
|
||||
_finishCallback = callback;
|
||||
- (void)setFinishCallback:(void (^)(void))finishCallback {
|
||||
_finishCallback = finishCallback;
|
||||
if (self.result) {
|
||||
callback();
|
||||
finishCallback();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -56,6 +56,7 @@ export abstract class Panel {
|
||||
this.__data__ = data
|
||||
this.__root__.width = frame.width
|
||||
this.__root__.height = frame.height
|
||||
this.__root__.children.length = 0
|
||||
this.build(this.__root__)
|
||||
}
|
||||
|
||||
|
@ -167,3 +167,16 @@ export function storage(context: BridgeContext) {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export function navigator(context: BridgeContext) {
|
||||
return {
|
||||
push: (scheme: string, alias: string) => {
|
||||
return context.navigator.push({
|
||||
scheme, alias
|
||||
})
|
||||
},
|
||||
pop: () => {
|
||||
return context.navigator.pop()
|
||||
},
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user