Merge branch 'feature/slider' into 'master'

Feature/slider



See merge request !25
This commit is contained in:
pengfeizhou 2019-11-23 19:46:31 +08:00
commit f93e715db1
50 changed files with 1245 additions and 80 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -18,7 +18,6 @@ package pub.doric.demo;
import android.os.Bundle; import android.os.Bundle;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
@ -30,6 +29,7 @@ import org.greenrobot.eventbus.ThreadMode;
import pub.doric.DoricContext; import pub.doric.DoricContext;
import pub.doric.DoricContextManager; import pub.doric.DoricContextManager;
import pub.doric.DoricPanel;
import pub.doric.devkit.DoricContextDebuggable; import pub.doric.devkit.DoricContextDebuggable;
import pub.doric.devkit.event.EnterDebugEvent; import pub.doric.devkit.event.EnterDebugEvent;
import pub.doric.devkit.event.QuitDebugEvent; import pub.doric.devkit.event.QuitDebugEvent;
@ -52,14 +52,12 @@ public class DemoActivity extends AppCompatActivity {
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
String source = getIntent().getStringExtra("source"); String source = getIntent().getStringExtra("source");
FrameLayout frameLayout = new FrameLayout(this); DoricPanel doricPanel = new DoricPanel(this);
addContentView(frameLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, addContentView(doricPanel, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
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); doricContextDebuggable = new DoricContextDebuggable(doricContext);
doricContext.init(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
doricContext.getRootNode().setRootView(frameLayout);
sensorHelper = new SensorManagerHelper(this); sensorHelper = new SensorManagerHelper(this);
sensorHelper.setOnShakeListener(new SensorManagerHelper.OnShakeListener() { sensorHelper.setOnShakeListener(new SensorManagerHelper.OnShakeListener() {
@Override @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 @Override
public void onAttachedToWindow() { public void onAttachedToWindow() {
super.onAttachedToWindow(); super.onAttachedToWindow();
@ -95,7 +81,6 @@ public class DemoActivity extends AppCompatActivity {
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
doricContext.teardown();
EventBus.getDefault().unregister(this); EventBus.getDefault().unregister(this);
sensorHelper.stop(); sensorHelper.stop();
} }

View File

@ -32,6 +32,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import pub.doric.DoricActivity;
import pub.doric.utils.DoricUtils; import pub.doric.utils.DoricUtils;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
@ -89,6 +90,13 @@ public class MainActivity extends AppCompatActivity {
tv.setOnClickListener(new View.OnClickListener() { tv.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { 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 intent = new Intent(tv.getContext(), DemoActivity.class);
intent.putExtra("source", data[position]); intent.putExtra("source", data[position]);
tv.getContext().startActivity(intent); tv.getContext().startActivity(intent);

View File

@ -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>

View 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();
}
}
}

View File

@ -26,6 +26,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import pub.doric.async.AsyncResult; import pub.doric.async.AsyncResult;
import pub.doric.navigator.IDoricNavigator;
import pub.doric.plugin.DoricJavaPlugin; import pub.doric.plugin.DoricJavaPlugin;
import pub.doric.shader.RootNode; import pub.doric.shader.RootNode;
import pub.doric.utils.DoricConstant; import pub.doric.utils.DoricConstant;
@ -66,7 +67,7 @@ public class DoricContext {
return doricContext; return doricContext;
} }
public void init(int width, int height) { public void init(float width, float height) {
this.initParams = new JSONBuilder() this.initParams = new JSONBuilder()
.put("width", width) .put("width", width)
.put("height", height).toJSONObject(); .put("height", height).toJSONObject();
@ -148,4 +149,14 @@ public class DoricContext {
public void onHidden() { public void onHidden() {
callEntity(DoricConstant.DORIC_ENTITY_HIDDEN); callEntity(DoricConstant.DORIC_ENTITY_HIDDEN);
} }
private IDoricNavigator doricNavigator;
public void setDoricNavigator(IDoricNavigator doricNavigator) {
this.doricNavigator = doricNavigator;
}
public IDoricNavigator getDoricNavigator() {
return this.doricNavigator;
}
} }

View 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;
}
}

View File

@ -16,40 +16,43 @@
package pub.doric; package pub.doric;
import android.content.Context; import android.content.Context;
import android.os.Build;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; 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.util.AttributeSet;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import pub.doric.utils.DoricUtils;
/** /**
* @Description: Doric * @Description: Doric
* @Author: pengfei.zhou * @Author: pengfei.zhou
* @CreateDate: 2019-07-18 * @CreateDate: 2019-07-18
*/ */
public class DoricPanel extends FrameLayout { public class DoricPanel extends FrameLayout implements LifecycleObserver {
private DoricContext mDoricContext; private DoricContext mDoricContext;
public DoricPanel(@NonNull Context context) { public DoricPanel(@NonNull Context context) {
super(context); this(context, null);
} }
public DoricPanel(@NonNull Context context, @Nullable AttributeSet attrs) { 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) { public DoricPanel(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, 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) { public void config(String script, String alias) {
DoricContext doricContext = DoricContext.create(getContext(), script, alias); DoricContext doricContext = DoricContext.create(getContext(), script, alias);
@ -58,6 +61,14 @@ public class DoricPanel extends FrameLayout {
public void config(DoricContext doricContext) { public void config(DoricContext doricContext) {
mDoricContext = 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 @Override
@ -68,4 +79,35 @@ public class DoricPanel extends FrameLayout {
public DoricContext getDoricContext() { public DoricContext getDoricContext() {
return mDoricContext; 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();
}
}
} }

View File

@ -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() {
}
});
}
}

View File

@ -17,6 +17,10 @@ package pub.doric;
import android.text.TextUtils; 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.NetworkPlugin;
import pub.doric.plugin.ShaderPlugin; import pub.doric.plugin.ShaderPlugin;
import pub.doric.plugin.StoragePlugin; import pub.doric.plugin.StoragePlugin;
@ -36,6 +40,7 @@ import pub.doric.utils.DoricMetaInfo;
import pub.doric.plugin.DoricJavaPlugin; import pub.doric.plugin.DoricJavaPlugin;
import pub.doric.plugin.ModalPlugin; import pub.doric.plugin.ModalPlugin;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
@ -43,15 +48,22 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* @Description: com.github.penfeizhou.doric * @Description: pub.doric
* @Author: pengfei.zhou * @Author: pengfei.zhou
* @CreateDate: 2019-07-20 * @CreateDate: 2019-07-20
*/ */
public class DoricRegistry { public class DoricRegistry {
private static Map<String, String> bundles = new ConcurrentHashMap<>(); 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<DoricJavaPlugin>> pluginInfoMap = new HashMap<>();
private Map<String, DoricMetaInfo<ViewNode>> nodeInfoMap = new HashMap<>(); private Map<String, DoricMetaInfo<ViewNode>> nodeInfoMap = new HashMap<>();
private static Set<DoricLibrary> doricLibraries = new HashSet<>();
private static void initRegistry(DoricRegistry doricRegistry) { private static void initRegistry(DoricRegistry doricRegistry) {
for (DoricLibrary library : doricLibraries) { for (DoricLibrary library : doricLibraries) {
@ -69,6 +81,7 @@ public class DoricRegistry {
this.registerNativePlugin(ModalPlugin.class); this.registerNativePlugin(ModalPlugin.class);
this.registerNativePlugin(NetworkPlugin.class); this.registerNativePlugin(NetworkPlugin.class);
this.registerNativePlugin(StoragePlugin.class); this.registerNativePlugin(StoragePlugin.class);
this.registerNativePlugin(NavigatorPlugin.class);
this.registerViewNode(RootNode.class); this.registerViewNode(RootNode.class);
this.registerViewNode(TextNode.class); this.registerViewNode(TextNode.class);
this.registerViewNode(ImageNode.class); this.registerViewNode(ImageNode.class);
@ -112,4 +125,12 @@ public class DoricRegistry {
public String acquireJSBundle(String name) { public String acquireJSBundle(String name) {
return bundles.get(name); return bundles.get(name);
} }
public static void addJSLoader(IDoricJSLoader jsLoader) {
jsLoaders.add(jsLoader);
}
public static Collection<IDoricJSLoader> getJSLoaders() {
return jsLoaders;
}
} }

View File

@ -26,6 +26,13 @@ public class AsyncResult<R> {
private Callback<R> callback = null; private Callback<R> callback = null;
public AsyncResult() {
}
public AsyncResult(R r) {
this.result = r;
}
public void setResult(R result) { public void setResult(R result) {
this.result = result; this.result = result;
if (this.callback != null) { if (this.callback != null) {

View File

@ -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())));
}
}

View File

@ -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;
}
}

View File

@ -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<>("");
}
}

View 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.
*/
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);
}

View 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.
*/
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();
}

View File

@ -32,7 +32,6 @@ import pub.doric.extension.bridge.DoricPromise;
import pub.doric.utils.DoricUtils; import pub.doric.utils.DoricUtils;
import pub.doric.utils.ThreadMode; import pub.doric.utils.ThreadMode;
import com.github.pengfeizhou.jscore.ArchiveException;
import com.github.pengfeizhou.jscore.JSDecoder; import com.github.pengfeizhou.jscore.JSDecoder;
import com.github.pengfeizhou.jscore.JSObject; import com.github.pengfeizhou.jscore.JSObject;
import com.github.pengfeizhou.jscore.JSValue; import com.github.pengfeizhou.jscore.JSValue;
@ -51,7 +50,7 @@ public class ModalPlugin extends DoricJavaPlugin {
} }
@DoricMethod(thread = ThreadMode.UI) @DoricMethod(thread = ThreadMode.UI)
public void toast(JSDecoder decoder, DoricPromise promise) { public void toast(JSDecoder decoder) {
try { try {
JSObject jsObject = decoder.decode().asObject(); JSObject jsObject = decoder.decode().asObject();
String msg = jsObject.getProperty("msg").asString().value(); String msg = jsObject.getProperty("msg").asString().value();

View File

@ -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();
}
}
}

View 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" />

View 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>

View File

@ -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" />

View File

@ -10,4 +10,5 @@ export default [
'src/ModalDemo', 'src/ModalDemo',
'src/NetworkDemo', 'src/NetworkDemo',
'src/StorageDemo', 'src/StorageDemo',
'src/NavigatorDemo',
] ]

50
demo/src/NavigatorDemo.ts Normal file
View 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)
}
}

View File

@ -4,16 +4,10 @@
// //
#import "DemoVC.h" #import "DemoVC.h"
#import "DoricContext.h" #import "Doric.h"
#import "DoricLayouts.h"
#import "DoricExtensions.h"
#import "DoricRootNode.h"
#import "DoricLocalServer.h"
@interface DemoVC () @interface DemoVC ()
@property(nonatomic, copy) NSString *filePath; @property(nonatomic, copy) NSString *filePath;
@property(nonatomic, strong) DoricContext *doricContext;
//@property(nonatomic, strong) DoricLocalServer *localServer;
@end @end
@implementation DemoVC @implementation DemoVC
@ -31,21 +25,15 @@ - (void)viewDidLoad {
NSString *demoPath = [path stringByAppendingPathComponent:@"demo"]; NSString *demoPath = [path stringByAppendingPathComponent:@"demo"];
NSString *fullPath = [demoPath stringByAppendingPathComponent:self.filePath]; NSString *fullPath = [demoPath stringByAppendingPathComponent:self.filePath];
NSString *jsContent = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:nil]; NSString *jsContent = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:nil];
self.doricContext = [[DoricContext alloc] initWithScript:jsContent source:self.filePath]; DoricPanel *panel = [DoricPanel new];
[self.doricContext.rootNode setupRootView:[[DoricStackView new] also:^(DoricStackView *it) { [panel.view also:^(UIView *it) {
it.backgroundColor = [UIColor whiteColor]; it.width = self.view.width;
it.layoutConfig = [[DoricLayoutConfig alloc] it.height = self.view.height - 88;
initWithWidth:DoricLayoutAtMost
height:DoricLayoutAtMost
margin:DoricMarginMake(0, 88, 0, 0)
];
it.top = 88; it.top = 88;
[self.view addSubview:it]; [self.view addSubview:it];
}]]; }];
[self.doricContext initContextWithWidth:self.view.width height:self.view.height]; [self addChildViewController:panel];
// [self.doricContext.driver connectDevKit:@"ws://192.168.11.38:7777"]; [panel config:jsContent alias:self.filePath];
// self.localServer = [[DoricLocalServer alloc] init];
// [self.localServer startWithPort:8910];
} }
@end @end

View File

@ -58,8 +58,16 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath
[self.navigationController pushViewController:[QRScanViewController new] animated:NO]; [self.navigationController pushViewController:[QRScanViewController new] animated:NO];
return; return;
} }
DemoVC *demoVC = [[DemoVC alloc] initWithPath:self.demoFilePaths[(NSUInteger) indexPath.row]]; NSString *file = self.demoFilePaths[(NSUInteger) indexPath.row];
[self.navigationController pushViewController:demoVC animated:NO]; 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 @end

View File

@ -20,3 +20,7 @@
#import "DoricRootNode.h" #import "DoricRootNode.h"
#import "UIView+Doric.h" #import "UIView+Doric.h"
#import "DoricUtil.h" #import "DoricUtil.h"
#import "DoricPanel.h"
#import "DoricJSLoaderManager.h"
#import "DoricNavigatorProtocol.h"
#import "DoricViewController.h"

View File

@ -22,13 +22,14 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "DoricDriver.h" #import "DoricDriver.h"
#import "DoricNavigatorProtocol.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@class DoricRootNode; @class DoricRootNode;
@interface DoricContext : NSObject @interface DoricContext : NSObject
@property(nonatomic, weak) id <DoricNavigatorProtocol> navigator;
@property(nonatomic, strong) NSString *contextId; @property(nonatomic, strong) NSString *contextId;
@property(nonatomic, strong) DoricDriver *driver; @property(nonatomic, strong) DoricDriver *driver;
@property(nonatomic, strong) NSMutableDictionary *pluginInstanceMap; @property(nonatomic, strong) NSMutableDictionary *pluginInstanceMap;

View 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

View 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

View File

@ -35,6 +35,7 @@
#import "DoricSliderNode.h" #import "DoricSliderNode.h"
#import "DoricSlideItemNode.h" #import "DoricSlideItemNode.h"
#import "DoricStoragePlugin.h" #import "DoricStoragePlugin.h"
#import "DoricNavigatorPlugin.h"
@interface DoricRegistry () @interface DoricRegistry ()
@ -61,6 +62,7 @@ - (void)innerRegister {
[self registerNativePlugin:DoricModalPlugin.class withName:@"modal"]; [self registerNativePlugin:DoricModalPlugin.class withName:@"modal"];
[self registerNativePlugin:DoricNetworkPlugin.class withName:@"network"]; [self registerNativePlugin:DoricNetworkPlugin.class withName:@"network"];
[self registerNativePlugin:DoricStoragePlugin.class withName:@"storage"]; [self registerNativePlugin:DoricStoragePlugin.class withName:@"storage"];
[self registerNativePlugin:DoricNavigatorPlugin.class withName:@"navigator"];
[self registerViewNode:DoricStackNode.class withName:@"Stack"]; [self registerViewNode:DoricStackNode.class withName:@"Stack"];
[self registerViewNode:DoricVLayoutNode.class withName:@"VLayout"]; [self registerViewNode:DoricVLayoutNode.class withName:@"VLayout"];

View 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

View 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

View File

@ -21,11 +21,11 @@
// //
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "DoricJSExecutorProtocal.h" #import "DoricJSExecutorProtocol.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@interface DoricJSCoreExecutor : NSObject <DoricJSExecutorProtocal> @interface DoricJSCoreExecutor : NSObject <DoricJSExecutorProtocol>
@end @end

View File

@ -21,7 +21,7 @@
// //
#import "DoricJSEngine.h" #import "DoricJSEngine.h"
#import "DoricJSExecutorProtocal.h" #import "DoricJSExecutorProtocol.h"
#import "DoricJSCoreExecutor.h" #import "DoricJSCoreExecutor.h"
#import "DoricJSRemoteExecutor.h" #import "DoricJSRemoteExecutor.h"
#import "DoricConstant.h" #import "DoricConstant.h"
@ -29,7 +29,7 @@
#import "DoricBridgeExtension.h" #import "DoricBridgeExtension.h"
@interface DoricJSEngine () @interface DoricJSEngine ()
@property(nonatomic, strong) id <DoricJSExecutorProtocal> jsExecutor; @property(nonatomic, strong) id <DoricJSExecutorProtocol> jsExecutor;
@property(nonatomic, strong) NSMutableDictionary *timers; @property(nonatomic, strong) NSMutableDictionary *timers;
@property(nonatomic, strong) DoricBridgeExtension *bridgeExtension; @property(nonatomic, strong) DoricBridgeExtension *bridgeExtension;
@end @end

View File

@ -25,7 +25,7 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@protocol DoricJSExecutorProtocal <NSObject> @protocol DoricJSExecutorProtocol <NSObject>
- (NSString *)loadJSScript:(NSString *)script source:(NSString *)source; - (NSString *)loadJSScript:(NSString *)script source:(NSString *)source;

View File

@ -21,11 +21,11 @@
// //
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "DoricJSExecutorProtocal.h" #import "DoricJSExecutorProtocol.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@interface DoricJSRemoteExecutor : NSObject <DoricJSExecutorProtocal> @interface DoricJSRemoteExecutor : NSObject <DoricJSExecutorProtocol>
@property(nonatomic, strong) dispatch_semaphore_t semaphore; @property(nonatomic, strong) dispatch_semaphore_t semaphore;

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@ -26,15 +26,9 @@ NS_ASSUME_NONNULL_BEGIN
@interface DoricAsyncResult <R> : NSObject @interface DoricAsyncResult <R> : NSObject
typedef void(^DoricResultCallback)(R); @property(nonatomic, strong) void (^resultCallback)(R result);
@property(nonatomic, strong) void (^exceptionCallback)(NSException *e);
typedef void(^DoricExceptionCallback)(NSException *); @property(nonatomic, strong) void (^finishCallback)(void);
typedef void(^DoricFinishCallback)(void);
@property(nonatomic, strong) DoricResultCallback resultCallback;
@property(nonatomic, strong) DoricExceptionCallback exceptionCallback;
@property(nonatomic, strong) DoricFinishCallback finishCallback;
- (void)setupResult:(R)result; - (void)setupResult:(R)result;

View File

@ -56,24 +56,24 @@ - (id)getResult {
return self.result; return self.result;
} }
- (void)setResultCallback:(DoricResultCallback)callback { - (void)setResultCallback:(void (^)(id))callback {
_resultCallback = callback; _resultCallback = callback;
if (self.result && ![self.result isKindOfClass:[NSException class]]) { if (self.result && ![self.result isKindOfClass:[NSException class]]) {
callback(self.result); callback(self.result);
} }
} }
- (void)setExceptionCallback:(DoricExceptionCallback)exceptionCallback { - (void)setExceptionCallback:(void (^)(NSException *))exceptionCallback {
_exceptionCallback = exceptionCallback; _exceptionCallback = exceptionCallback;
if ([self.result isKindOfClass:[NSException class]]) { if ([self.result isKindOfClass:[NSException class]]) {
exceptionCallback(self.result); exceptionCallback(self.result);
} }
} }
- (void)setFinishCallback:(DoricFinishCallback)callback { - (void)setFinishCallback:(void (^)(void))finishCallback {
_finishCallback = callback; _finishCallback = finishCallback;
if (self.result) { if (self.result) {
callback(); finishCallback();
} }
} }

View File

@ -56,6 +56,7 @@ export abstract class Panel {
this.__data__ = data this.__data__ = data
this.__root__.width = frame.width this.__root__.width = frame.width
this.__root__.height = frame.height this.__root__.height = frame.height
this.__root__.children.length = 0
this.build(this.__root__) this.build(this.__root__)
} }

View File

@ -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()
},
}
}