names = UriCompact.getQueryParameterNames(uri);
+
+ IntentParams intentParams = new IntentParams();
for (String name : names) {
- String value = uri.getQueryParameter(name);
+ String value = uri.getFirstQueryParamByKey(name);
+ intentParams.setParam(name,bundle);
put(bundle, name, value);
}
return bundle;
}
- private void put(Bundle bundle, String name, String value) {
+ private void put(IntentParams bundle, String name, String value) {
int type = extraTypes.getType(name);
name = extraTypes.transfer(name);
if (type == ExtraTypes.STRING) {
@@ -108,31 +129,31 @@ public class Mapping {
}
switch (type) {
case ExtraTypes.INT:
- bundle.putInt(name, Integer.parseInt(value));
+ bundle.setParam(name, Integer.parseInt(value));
break;
case ExtraTypes.LONG:
- bundle.putLong(name, Long.parseLong(value));
+ bundle.setParam(name, Long.parseLong(value));
break;
case ExtraTypes.BOOL:
- bundle.putBoolean(name, Boolean.parseBoolean(value));
+ bundle.setParam(name, Boolean.parseBoolean(value));
break;
case ExtraTypes.SHORT:
- bundle.putShort(name, Short.parseShort(value));
+ bundle.setParam(name, Short.parseShort(value));
break;
case ExtraTypes.FLOAT:
- bundle.putFloat(name, Float.parseFloat(value));
+ bundle.setParam(name, Float.parseFloat(value));
break;
case ExtraTypes.DOUBLE:
- bundle.putDouble(name, Double.parseDouble(value));
+ bundle.setParam(name, Double.parseDouble(value));
break;
case ExtraTypes.BYTE:
- bundle.putByte(name, Byte.parseByte(value));
+ bundle.setParam(name, Byte.parseByte(value));
break;
case ExtraTypes.CHAR:
- bundle.putChar(name, value.charAt(0));
+ bundle.setParam(name, value.charAt(0));
break;
default:
- bundle.putString(name, value);
+ bundle.setParam(name, value);
break;
}
}
diff --git a/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/MethodInvoker.java b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/MethodInvoker.java
new file mode 100644
index 0000000..c7ef313
--- /dev/null
+++ b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/MethodInvoker.java
@@ -0,0 +1,16 @@
+package com.github.mzule.abilityrouter.router;
+
+import ohos.aafwk.content.IntentParams;
+import ohos.app.Context;
+/**
+ * Created by CaoDongping on 04/11/2016.
+ */
+public interface MethodInvoker {
+ /**
+ * 调用
+ *
+ * @param context 上下文
+ * @param bundle 存取内容
+ */
+ void invoke(Context context, IntentParams bundle);
+}
diff --git a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/Path.java b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/Path.java
similarity index 63%
rename from activityrouter/src/main/java/com/github/mzule/activityrouter/router/Path.java
rename to activityrouter/src/main/java/com/github/mzule/abilityrouter/router/Path.java
index 43502a6..28ec454 100644
--- a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/Path.java
+++ b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/Path.java
@@ -1,7 +1,6 @@
-package com.github.mzule.activityrouter.router;
-
-import android.net.Uri;
+package com.github.mzule.abilityrouter.router;
+import ohos.utils.net.Uri;
/**
* Created by CaoDongping on 4/7/16.
*/
@@ -12,7 +11,13 @@ public class Path {
private Path(String value) {
this.value = value;
}
-
+ /**
+ * 路径匹配方法
+ *
+ * @param format 格式
+ * @param link 链接
+ * @return match 匹配
+ */
public static boolean match(final Path format, final Path link) {
if (format == null || link == null) {
return false;
@@ -20,28 +25,33 @@ public class Path {
if (format.length() != link.length()) {
return false;
}
- Path x = format;
- Path y = link;
- while (x != null) {
- if (!x.match(y)) {
+ Path xt = format;
+ Path ya = link;
+ while (xt != null) {
+ if (!xt.match(ya)) {
return false;
}
- x = x.next;
- y = y.next;
+ xt = xt.next;
+ ya = ya.next;
}
return true;
}
-
+ /**
+ * 创建
+ *
+ * @param uri URI地址
+ * @return create 创建
+ */
public static Path create(Uri uri) {
Path path = new Path(uri.getScheme().concat("://"));
- String urlPath = uri.getPath();
+ String urlPath = uri.getDecodedPath();
if (urlPath == null) {
urlPath = "";
}
if (urlPath.endsWith("/")) {
urlPath = urlPath.substring(0, urlPath.length() - 1);
}
- parse(path, uri.getHost() + urlPath);
+ parse(path, uri.getDecodedHost() + urlPath);
return path;
}
@@ -54,11 +64,19 @@ public class Path {
curPath = temp;
}
}
-
+ /**
+ * 定义一个获取下一个内容的方法
+ *
+ * @return next 下一个
+ */
public Path next() {
return next;
}
-
+ /**
+ * 定义一个长度的方法
+ *
+ * @return length 长度
+ **/
public int length() {
Path path = this;
int len = 1;
@@ -76,17 +94,30 @@ public class Path {
public boolean isArgument() {
return value.startsWith(":");
}
-
+ /**
+ * 论据的方法
+ *
+ * @return argument 论据
+ */
public String argument() {
return value.substring(1);
}
-
+ /**
+ * 定义一个获取value的方法
+ *
+ * @return value 类型
+ */
public String value() {
return value;
}
-
+ /**
+ * 定义一个判断是否是http的方法
+ *
+ * @return isHttp 是http
+ */
public boolean isHttp() {
String low = value.toLowerCase();
return low.startsWith("http://") || low.startsWith("https://");
}
+
}
diff --git a/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterAbility.java b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterAbility.java
new file mode 100644
index 0000000..01a1f3c
--- /dev/null
+++ b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterAbility.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.router;
+
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+import ohos.utils.net.Uri;
+/**
+ * Created by CaoDongping on 4/6/16.
+ */
+public class RouterAbility extends Ability {
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ RouterCallback callback = getRouterCallback();
+ Uri uri = getIntent().getUri();
+ if (uri != null) {
+ Routers.open(this, uri, callback);
+ }
+
+ terminateAbility();
+ }
+
+ private RouterCallback getRouterCallback() {
+ if (getAbilityPackage() instanceof RouterCallbackProvider) {
+ return ((RouterCallbackProvider) getAbilityPackage()).provideRouterCallback();
+ }
+ return null;
+ }
+}
diff --git a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterCallback.java b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterCallback.java
similarity index 30%
rename from activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterCallback.java
rename to activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterCallback.java
index e7981f9..d046a95 100644
--- a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterCallback.java
+++ b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterCallback.java
@@ -1,17 +1,39 @@
-package com.github.mzule.activityrouter.router;
-
-import android.content.Context;
-import android.net.Uri;
+package com.github.mzule.abilityrouter.router;
+import ohos.app.Context;
+import ohos.utils.net.Uri;
/**
* Created by CaoDongping on 4/8/16.
*/
public interface RouterCallback {
+ /**
+ * 定义一个未找到的方法
+ *
+ * @param context 上下文
+ * @param uri URI地址
+ */
void notFound(Context context, Uri uri);
-
+ /**
+ * 定义一个打开前的方法
+ *
+ * @param context 上下文
+ * @param uri URI地址
+ * @return beforOpen 打开前
+ */
boolean beforeOpen(Context context, Uri uri);
-
+ /**
+ * 定义一个打开后的方法
+ *
+ * @param context 上下文
+ * @param uri URI地址
+ */
void afterOpen(Context context, Uri uri);
-
+ /**
+ * 定义一个错误的方法
+ *
+ * @param context 上下文
+ * @param uri URI地址
+ * @param e 错误
+ */
void error(Context context, Uri uri, Throwable e);
}
diff --git a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterCallbackProvider.java b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterCallbackProvider.java
similarity index 49%
rename from activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterCallbackProvider.java
rename to activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterCallbackProvider.java
index 1cbb0ef..ba7614d 100644
--- a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterCallbackProvider.java
+++ b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/RouterCallbackProvider.java
@@ -1,8 +1,13 @@
-package com.github.mzule.activityrouter.router;
+package com.github.mzule.abilityrouter.router;
/**
* Created by CaoDongping on 4/8/16.
*/
public interface RouterCallbackProvider {
+ /**
+ * 提供路由器回调
+ *
+ * @return RouterCallback 回调
+ * */
RouterCallback provideRouterCallback();
}
diff --git a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/Routers.java b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/Routers.java
similarity index 38%
rename from activityrouter/src/main/java/com/github/mzule/activityrouter/router/Routers.java
rename to activityrouter/src/main/java/com/github/mzule/abilityrouter/router/Routers.java
index 114e409..95a2bff 100644
--- a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/Routers.java
+++ b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/Routers.java
@@ -1,24 +1,22 @@
-package com.github.mzule.activityrouter.router;
+package com.github.mzule.abilityrouter.router;
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+import ohos.aafwk.content.Operation;
+import ohos.app.Context;
+import ohos.utils.net.Uri;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-
/**
* Created by CaoDongping on 4/6/16.
*/
public class Routers {
-
- public static String KEY_RAW_URL = "com.github.mzule.activityrouter.router.KeyRawUrl";
-
- private static List mappings = new ArrayList<>();
-
+ private static final String KEY_RAW_URL = "com.github.mzule.abilityrouter.router.KeyRawUrl";
+ private static final List mappings = new ArrayList<>();
+ private static final int MARK = 15;
private static void initIfNeed() {
if (!mappings.isEmpty()) {
return;
@@ -26,9 +24,17 @@ public class Routers {
RouterInit.init();
sort();
}
-
- static void map(String format, Class extends Activity> activity, MethodInvoker method, ExtraTypes extraTypes) {
- mappings.add(new Mapping(format, activity, method, extraTypes));
+ /**
+ * 调用
+ *
+ * @param format 格式
+ * @param ability 目标ability类
+ * @param method 方法
+ * @param extraTypes 额外类型
+ * */
+ public static void map(String format,Class extends Ability> ability,
+ MethodInvoker method,ExtraTypes extraTypes) {
+ mappings.add(new Mapping(format, ability, method, extraTypes));
}
private static void sort() {
@@ -41,41 +47,101 @@ public class Routers {
}
});
}
-
+ /**
+ * 通过url打开匹配页面
+ *
+ * @param context 上下文
+ * @param url string类型的地址
+ * @return open 通过url打开匹配页面
+ * */
public static boolean open(Context context, String url) {
return open(context, Uri.parse(url));
}
-
+ /**
+ * 通过路由器回调的方法进行打开匹配页面
+ *
+ * @param context 上下文
+ * @param url string类型的地址
+ * @param callback 回调
+ * @return open 通过路由器回调的方法进行打开匹配页面
+ * */
public static boolean open(Context context, String url, RouterCallback callback) {
return open(context, Uri.parse(url), callback);
}
-
+ /**
+ * 打开匹配的uri页面
+ *
+ * @param context 上下文
+ * @param uri 地址
+ * @return open 打开匹配的uri页面
+ * */
public static boolean open(Context context, Uri uri) {
return open(context, uri, getGlobalCallback(context));
}
-
+ /**
+ * 打开匹配Uri的页面并回调
+ *
+ * @param context 上下文
+ * @param uri 地址
+ * @param callback 回调
+ * @return open 打开匹配Uri的页面并回调
+ * */
public static boolean open(Context context, Uri uri, RouterCallback callback) {
return open(context, uri, -1, callback);
}
-
- public static boolean openForResult(Activity activity, String url, int requestCode) {
- return openForResult(activity, Uri.parse(url), requestCode);
- }
-
- public static boolean openForResult(Activity activity, String url, int requestCode, RouterCallback callback) {
- return openForResult(activity, Uri.parse(url), requestCode, callback);
- }
-
- public static boolean openForResult(Activity activity, Uri uri, int requestCode) {
- return openForResult(activity, uri, requestCode, getGlobalCallback(activity));
- }
-
- public static boolean openForResult(Activity activity, Uri uri, int requestCode, RouterCallback callback) {
- return open(activity, uri, requestCode, callback);
+ /**
+ * 通过目标url打开指定ability并回调
+ *
+ * @param ability 目标ability
+ * @param url 地址
+ * @param requestCode 请求代码的参数
+ * @return openForResult 通过目标url打开指定ability并回调
+ * */
+ public static boolean openForResult(Ability ability, String url, int requestCode) {
+ return openForResult(ability, Uri.parse(url), requestCode);
+ }
+ /**
+ * 通过url打开匹配的页面并回调
+ *
+ * @param ability 目标ability
+ * @param url string类型的url
+ * @param requestCode 请求代码的参数
+ * @param callback 路由器回调
+ * @return openForResult 通过url打开匹配的页面并回调
+ * */
+ public static boolean openForResult(Ability ability, String url, int requestCode, RouterCallback callback) {
+ return openForResult(ability, Uri.parse(url), requestCode, callback);
+ }
+ /**
+ * 打开匹配uri页面并回调结果
+ *
+ * @param ability 目标ability
+ * @param uri 地址
+ * @param requestCode 请求代码的参数
+ * @return openForResult 打开匹配uri页面并回调结果
+ * */
+ public static boolean openForResult(Ability ability, Uri uri, int requestCode) {
+
+ return openForResult(ability, uri, requestCode, getGlobalCallback(ability));
+
+ }
+ /**
+ * 打开匹配的url页面并回调结果
+ *
+ * @param ability 目标ability
+ * @param requestCode 请求代码的参数
+ * @param uri 地址
+ * @param callback 路由器回调
+ * @return openForResult 打开匹配的url页面并回调结果
+ * */
+ public static boolean openForResult(Ability ability, Uri uri, int requestCode, RouterCallback callback) {
+
+ return open(ability, uri, requestCode, callback);
}
private static boolean open(Context context, Uri uri, int requestCode, RouterCallback callback) {
boolean success = false;
+
if (callback != null) {
if (callback.beforeOpen(context, uri)) {
return false;
@@ -100,20 +166,37 @@ public class Routers {
}
return success;
}
-
+ /**
+ * resolve
+ *
+ * @param context 上下文
+ * @param url 地址
+ * @return intent 返回解决的方法
+ * */
public static Intent resolve(Context context, String url) {
return resolve(context, Uri.parse(url));
}
-
+ /**
+ * resolve
+ *
+ * @param context 上下文
+ * @param uri 地址
+ * @return intent 返回null的方法
+ * */
public static Intent resolve(Context context, Uri uri) {
initIfNeed();
Path path = Path.create(uri);
for (Mapping mapping : mappings) {
if (mapping.match(path)) {
- Intent intent = new Intent(context, mapping.getActivity());
- intent.putExtras(mapping.parseExtras(uri));
- intent.putExtra(KEY_RAW_URL, uri.toString());
- return intent;
+ Intent intent2 = new Intent();
+ Operation operation = new Intent.OperationBuilder()
+ .withBundleName(context.getBundleName())
+ .withAbilityName(mapping.getAbility())
+ .build();
+ intent2.setParams(mapping.parseExtras(uri));
+ intent2.setParam(KEY_RAW_URL,uri.toString());
+ intent2.setOperation(operation);
+ return intent2;
}
}
return null;
@@ -124,24 +207,30 @@ public class Routers {
Path path = Path.create(uri);
for (Mapping mapping : mappings) {
if (mapping.match(path)) {
- if (mapping.getActivity() == null) {
+ if (mapping.getAbility() == null) {
mapping.getMethod().invoke(context, mapping.parseExtras(uri));
return true;
}
- Intent intent = new Intent(context, mapping.getActivity());
- intent.putExtras(mapping.parseExtras(uri));
- intent.putExtra(KEY_RAW_URL, uri.toString());
- if (!(context instanceof Activity)) {
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ Intent intent1 = new Intent();
+ Operation operation = new Intent.OperationBuilder()
+ .withBundleName(context.getBundleName())
+ .withAbilityName(mapping.getAbility())
+ .build();
+ intent1.setParams(mapping.parseExtras(uri));
+ intent1.setParam(KEY_RAW_URL,uri.toString());
+ intent1.setOperation(operation);
+
+ if (!(context instanceof Ability)) {
+ intent1.addFlags(Intent.FLAG_ABILITY_NEW_MISSION);
}
if (requestCode >= 0) {
- if (context instanceof Activity) {
- ((Activity) context).startActivityForResult(intent, requestCode);
+ if (context instanceof Ability) {
+ ((Ability)context).startAbilityForResult(intent1,requestCode);
} else {
- throw new RuntimeException("can not startActivityForResult context " + context);
+ throw new RuntimeException("can not startAbilityForResult context " + context);
}
} else {
- context.startActivity(intent);
+ context.startAbility(intent1,MARK);
}
return true;
}
@@ -150,8 +239,8 @@ public class Routers {
}
private static RouterCallback getGlobalCallback(Context context) {
- if (context.getApplicationContext() instanceof RouterCallbackProvider) {
- return ((RouterCallbackProvider) context.getApplicationContext()).provideRouterCallback();
+ if (((Ability)context).getAbilityPackage() instanceof RouterCallbackProvider) {
+ return ((RouterCallbackProvider) ((Ability)context).getAbilityPackage()).provideRouterCallback();
}
return null;
}
diff --git a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/SimpleRouterCallback.java b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/SimpleRouterCallback.java
similarity index 80%
rename from activityrouter/src/main/java/com/github/mzule/activityrouter/router/SimpleRouterCallback.java
rename to activityrouter/src/main/java/com/github/mzule/abilityrouter/router/SimpleRouterCallback.java
index 29d44dc..2613126 100644
--- a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/SimpleRouterCallback.java
+++ b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/SimpleRouterCallback.java
@@ -1,8 +1,7 @@
-package com.github.mzule.activityrouter.router;
-
-import android.content.Context;
-import android.net.Uri;
+package com.github.mzule.abilityrouter.router;
+import ohos.app.Context;
+import ohos.utils.net.Uri;
/**
* Created by CaoDongping on 4/8/16.
*/
diff --git a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/UriCompact.java b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/UriCompact.java
similarity index 93%
rename from activityrouter/src/main/java/com/github/mzule/activityrouter/router/UriCompact.java
rename to activityrouter/src/main/java/com/github/mzule/abilityrouter/router/UriCompact.java
index 9030736..b39d793 100644
--- a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/UriCompact.java
+++ b/activityrouter/src/main/java/com/github/mzule/abilityrouter/router/UriCompact.java
@@ -1,11 +1,9 @@
-package com.github.mzule.activityrouter.router;
-
-import android.net.Uri;
+package com.github.mzule.abilityrouter.router;
+import ohos.utils.net.Uri;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
-
/**
* Created by CaoDongping on 6/1/16.
*/
@@ -36,6 +34,7 @@ public class UriCompact {
String name = query.substring(start, separator);
names.add(Uri.decode(name));
+
// Move start to end of name.
start = end + 1;
} while (start < query.length());
diff --git a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/MethodInvoker.java b/activityrouter/src/main/java/com/github/mzule/activityrouter/router/MethodInvoker.java
deleted file mode 100644
index 6516713..0000000
--- a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/MethodInvoker.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.github.mzule.activityrouter.router;
-
-import android.content.Context;
-import android.os.Bundle;
-
-/**
- * Created by CaoDongping on 04/11/2016.
- */
-
-public interface MethodInvoker {
- void invoke(Context context, Bundle bundle);
-}
diff --git a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterActivity.java b/activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterActivity.java
deleted file mode 100644
index 0e10e92..0000000
--- a/activityrouter/src/main/java/com/github/mzule/activityrouter/router/RouterActivity.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.github.mzule.activityrouter.router;
-
-import android.app.Activity;
-import android.net.Uri;
-import android.os.Bundle;
-
-/**
- * Created by CaoDongping on 4/6/16.
- */
-public class RouterActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- RouterCallback callback = getRouterCallback();
-
- Uri uri = getIntent().getData();
- if (uri != null) {
- Routers.open(this, uri, callback);
- }
- finish();
- }
-
- private RouterCallback getRouterCallback() {
- if (getApplication() instanceof RouterCallbackProvider) {
- return ((RouterCallbackProvider) getApplication()).provideRouterCallback();
- }
- return null;
- }
-}
diff --git a/activityrouter/src/main/res/values/strings.xml b/activityrouter/src/main/res/values/strings.xml
deleted file mode 100644
index f9d172d..0000000
--- a/activityrouter/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
- ActivityRouter
-
diff --git a/activityrouter/src/main/resources/base/element/string.json b/activityrouter/src/main/resources/base/element/string.json
new file mode 100644
index 0000000..977dd6b
--- /dev/null
+++ b/activityrouter/src/main/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "abilityrouter"
+ }
+ ]
+}
diff --git a/annotation/build.gradle b/annotation/build.gradle
index ab1b7b8..cd1aba7 100644
--- a/annotation/build.gradle
+++ b/annotation/build.gradle
@@ -1,35 +1,9 @@
-apply plugin: 'java'
+apply plugin: 'java-library'
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
-
-ext {
- bintrayRepo = 'maven'
- bintrayName = 'activity-router-annotation'
-
- publishedGroupId = 'com.github.mzule.activityrouter'
- libraryName = 'Annotation'
- artifact = 'annotation'
-
- libraryDescription = 'Router activities'
-
- siteUrl = 'https://github.com/mzule/ActivityRouter/'
- gitUrl = 'https://github.com/mzule/ActivityRouter.git'
-
- libraryVersion = '1.1.5'
-
- developerId = 'mzule'
- developerName = 'Cao Dongping'
- developerEmail = 'mzule4j@gmail.com'
-
- licenseName = 'The Apache Software License, Version 2.0'
- licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
- allLicenses = ["Apache-2.0"]
-}
+sourceCompatibility = "1.8"
+targetCompatibility = "1.8"
dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ testCompile 'junit:junit:4.12'
}
-
-apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
-apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
diff --git a/annotation/src/main/config.json b/annotation/src/main/config.json
new file mode 100644
index 0000000..025ded6
--- /dev/null
+++ b/annotation/src/main/config.json
@@ -0,0 +1,27 @@
+{
+ "app": {
+ "bundleName": "com.github.mzule.abilityrouter",
+ "vendor": "github",
+ "version": {
+ "code": 1,
+ "name": "1.0"
+ },
+ "apiVersion": {
+ "compatible": 4,
+ "target": 5,
+ "releaseType": "Beta1"
+ }
+ },
+ "deviceConfig": {},
+ "module": {
+ "package": "com.github.mzule.abilityrouter.annotation",
+ "deviceType": [
+ "phone"
+ ],
+ "distro": {
+ "deliveryWithInstall": true,
+ "moduleName": "annotation",
+ "moduleType": "har"
+ }
+ }
+}
\ No newline at end of file
diff --git a/annotation/src/main/java/com/github/mzule/activityrouter/annotation/Module.java b/annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Module.java
similarity index 64%
rename from annotation/src/main/java/com/github/mzule/activityrouter/annotation/Module.java
rename to annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Module.java
index da39df9..559a205 100644
--- a/annotation/src/main/java/com/github/mzule/activityrouter/annotation/Module.java
+++ b/annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Module.java
@@ -1,4 +1,4 @@
-package com.github.mzule.activityrouter.annotation;
+package com.github.mzule.abilityrouter.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -8,5 +8,10 @@ import java.lang.annotation.RetentionPolicy;
*/
@Retention(RetentionPolicy.CLASS)
public @interface Module {
+ /**
+ * 类型
+ *
+ * @return value 类型
+ * */
String value();
}
diff --git a/annotation/src/main/java/com/github/mzule/activityrouter/annotation/Modules.java b/annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Modules.java
similarity index 65%
rename from annotation/src/main/java/com/github/mzule/activityrouter/annotation/Modules.java
rename to annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Modules.java
index 84aa153..59f302c 100644
--- a/annotation/src/main/java/com/github/mzule/activityrouter/annotation/Modules.java
+++ b/annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Modules.java
@@ -1,4 +1,4 @@
-package com.github.mzule.activityrouter.annotation;
+package com.github.mzule.abilityrouter.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -8,5 +8,10 @@ import java.lang.annotation.RetentionPolicy;
*/
@Retention(RetentionPolicy.CLASS)
public @interface Modules {
+ /**
+ * 类型
+ *
+ * @return value 类型
+ * */
String[] value();
}
diff --git a/annotation/src/main/java/com/github/mzule/activityrouter/annotation/Router.java b/annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Router.java
similarity index 40%
rename from annotation/src/main/java/com/github/mzule/activityrouter/annotation/Router.java
rename to annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Router.java
index f78fdea..c8437b3 100644
--- a/annotation/src/main/java/com/github/mzule/activityrouter/annotation/Router.java
+++ b/annotation/src/main/java/com/github/mzule/abilityrouter/annotation/Router.java
@@ -1,33 +1,82 @@
-package com.github.mzule.activityrouter.annotation;
+package com.github.mzule.abilityrouter.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+/**
+ * Router
+ *
+ * @since 2021-04-16
+ * */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.CLASS)
public @interface Router {
-
+ /**
+ * 类型
+ *
+ * @return value 类型
+ * */
String[] value();
-
+ /**
+ * 字符串参数
+ *
+ * @return stringParams 字符串
+ * */
String[] stringParams() default "";
-
+ /**
+ * 整形参数
+ *
+ * @return intParams 整形
+ * */
String[] intParams() default "";
-
+ /**
+ * 长参数
+ *
+ * @return longParams long类型
+ * */
String[] longParams() default "";
-
+ /**
+ * boolean类型参数
+ *
+ * @return booleanParams 布尔
+ * */
String[] booleanParams() default "";
-
+ /**
+ * short类型参数
+ *
+ * @return shortParams short类型
+ * */
String[] shortParams() default "";
-
+ /**
+ * float类型参数
+ *
+ * @return floatParams float类型
+ * */
String[] floatParams() default "";
-
+ /**
+ * double类型参数
+ *
+ * @return doubleParams double类型
+ * */
String[] doubleParams() default "";
-
+ /**
+ * byte类型参数
+ *
+ * @return byteParams byte类型
+ * */
String[] byteParams() default "";
-
+ /**
+ * char类型参数
+ *
+ * @return charParams char类型
+ * */
String[] charParams() default "";
-
+ /**
+ * 转移
+ *
+ * @return transfer 转移
+ * */
String[] transfer() default "";
}
diff --git a/annotation/src/main/resources/base/element/string.json b/annotation/src/main/resources/base/element/string.json
new file mode 100644
index 0000000..d1b3f2d
--- /dev/null
+++ b/annotation/src/main/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "annotation"
+ }
+ ]
+}
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index 725d235..0000000
--- a/app/build.gradle
+++ /dev/null
@@ -1,35 +0,0 @@
-apply plugin: 'com.android.application'
-
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
-
-android {
- compileSdkVersion 23
- buildToolsVersion "23.0.2"
-
- defaultConfig {
- applicationId "com.github.mzule.activityrouter"
- minSdkVersion 15
- targetSdkVersion 23
- versionCode 1
- versionName "1.0"
- }
- buildTypes {
- debug {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- release {
- minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-}
-
-dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:23.2.1'
- compile project(':app_module')
- annotationProcessor project(':compiler')
-}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
deleted file mode 100644
index c17b6d1..0000000
--- a/app/proguard-rules.pro
+++ /dev/null
@@ -1,18 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /Users/baidu/Library/Android/sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
--keep class com.github.mzule.activityrouter.router.** { *; }
diff --git a/app/src/androidTest/java/com/github/mzule/activityrouter/ApplicationTest.java b/app/src/androidTest/java/com/github/mzule/activityrouter/ApplicationTest.java
deleted file mode 100644
index bef2dd1..0000000
--- a/app/src/androidTest/java/com/github/mzule/activityrouter/ApplicationTest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import android.app.Application;
-import android.test.ApplicationTestCase;
-
-/**
- * Testing Fundamentals
- */
-public class ApplicationTest extends ApplicationTestCase {
- public ApplicationTest() {
- super(Application.class);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
deleted file mode 100644
index c6a24d5..0000000
--- a/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/java/com/github/mzule/activityrouter/App.java b/app/src/main/java/com/github/mzule/activityrouter/App.java
deleted file mode 100644
index 9707981..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/App.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import com.github.mzule.activityrouter.annotation.Modules;
-import com.github.mzule.activityrouter.router.RouterCallback;
-import com.github.mzule.activityrouter.router.RouterCallbackProvider;
-import com.github.mzule.activityrouter.router.SimpleRouterCallback;
-
-import android.app.Application;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-
-/**
- * Created by CaoDongping on 4/6/16.
- */
-@Modules({"app", "sdk"})
-public class App extends Application implements RouterCallbackProvider {
- @Override
- public RouterCallback provideRouterCallback() {
- return new SimpleRouterCallback() {
- @Override
- public boolean beforeOpen(Context context, Uri uri) {
- if (uri.toString().startsWith("mzule://")) {
- context.startActivity(new Intent(context, LaunchActivity.class));
- return true;
- }
- return false;
- }
-
- @Override
- public void notFound(Context context, Uri uri) {
- context.startActivity(new Intent(context, NotFoundActivity.class));
- }
-
- @Override
- public void error(Context context, Uri uri, Throwable e) {
- context.startActivity(ErrorStackActivity.makeIntent(context, uri, e));
- }
- };
- }
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/DumpExtrasActivity.java b/app/src/main/java/com/github/mzule/activityrouter/DumpExtrasActivity.java
deleted file mode 100644
index 4621e02..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/DumpExtrasActivity.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import java.util.Set;
-
-/**
- * Created by CaoDongping on 4/7/16.
- */
-public abstract class DumpExtrasActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Bundle extras = getIntent().getExtras();
- if (extras != null) {
- Set keys = extras.keySet();
-
- TextView textView = new TextView(this);
- int padding = getResources().getDimensionPixelSize(R.dimen.activity_horizontal_margin);
- textView.setPadding(padding, padding, padding, padding);
- textView.setText(getClass().getSimpleName());
- textView.append("\n\n");
-
- for (String key : keys) {
- textView.append(key + "=>");
- Object v = extras.get(key);
- if (v != null) {
- textView.append(v + "=>" + v.getClass().getSimpleName());
- } else {
- textView.append("null");
- }
- textView.append("\n\n");
- }
-
- setContentView(textView);
- }
- }
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/ErrorStackActivity.java b/app/src/main/java/com/github/mzule/activityrouter/ErrorStackActivity.java
deleted file mode 100644
index de33f32..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/ErrorStackActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-/**
- * Created by CaoDongping on 8/9/16.
- */
-public class ErrorStackActivity extends Activity {
- public static Intent makeIntent(Context context, Uri uri, Throwable e) {
- Intent intent = new Intent(context, ErrorStackActivity.class);
- intent.putExtra("uri", uri);
- intent.putExtra("error", e);
- return intent;
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Throwable e = (Throwable) getIntent().getSerializableExtra("error");
- Uri uri = getIntent().getParcelableExtra("uri");
-
- TextView textView = new TextView(this);
- textView.setText(String.format("Error on open uri %s\n", uri));
- textView.append(Log.getStackTraceString(e));
- textView.setGravity(Gravity.START);
- setContentView(textView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
- }
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/HomeActivity.java b/app/src/main/java/com/github/mzule/activityrouter/HomeActivity.java
deleted file mode 100644
index f74c0fd..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/HomeActivity.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import com.github.mzule.activityrouter.annotation.Router;
-
-import android.content.Intent;
-
-/**
- * Created by CaoDongping on 4/7/16.
- */
-@Router(value = "home/:homeName", stringParams = "o")
-public class HomeActivity extends DumpExtrasActivity {
-
- @Override
- public void finish() {
- Intent intent = new Intent();
- intent.putExtra("msg", "goodbye");
- setResult(RESULT_OK, intent);
- super.finish();
- }
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/HostActivity.java b/app/src/main/java/com/github/mzule/activityrouter/HostActivity.java
deleted file mode 100644
index f408fac..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/HostActivity.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import com.github.mzule.activityrouter.annotation.Router;
-
-/**
- * @author Kale
- * @date 2016/8/9
- */
-@Router("with_host")
-public class HostActivity extends DumpExtrasActivity{
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/mzule/activityrouter/LaunchActivity.java b/app/src/main/java/com/github/mzule/activityrouter/LaunchActivity.java
deleted file mode 100644
index 6dc8d4d..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/LaunchActivity.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import com.github.mzule.activityrouter.router.Routers;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-import android.widget.Toast;
-
-/**
- * Created by CaoDongping on 4/7/16.
- */
-public class LaunchActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_launch);
- ViewGroup container = (ViewGroup) findViewById(R.id.container);
- for (int i = 0; i < container.getChildCount(); i++) {
- final View view = container.getChildAt(i);
- if (view instanceof TextView) {
- view.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- /*
- // 第三方app通过url打开本app的activity时,通过ACTION_VIEW的方式
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse(((TextView) view).getText().toString()));
- startActivity(intent);
- */
- // app内打开页面可以使用Routers.open(Context, Uri)
- // Routers.open(LaunchActivity.this, Uri.parse(((TextView) view).getText().toString()), ((RouterCallbackProvider) getApplication()).provideRouterCallback());
- Routers.openForResult(LaunchActivity.this, ((TextView) view).getText().toString(), Constant.REQUEST_CODE_DEMO);
- }
- });
- }
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (resultCode == RESULT_OK && requestCode == Constant.REQUEST_CODE_DEMO) {
- String msg;
- if (data == null) {
- msg = "success";
- } else {
- msg = data.getStringExtra("msg");
- msg = TextUtils.isEmpty(msg) ? "success" : msg;
- }
- Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
- }
- }
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/MainActivity.java b/app/src/main/java/com/github/mzule/activityrouter/MainActivity.java
deleted file mode 100644
index a13d5a2..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/MainActivity.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import com.github.mzule.activityrouter.annotation.Router;
-
-@Router(value = {"http://mzule.com/main", "main", "home"},
- longParams = {"id", "updateTime"},
- booleanParams = "web",
- transfer = "web=>fromWeb")
-public class MainActivity extends DumpExtrasActivity {
-
- @Override
- public void finish() {
- setResult(RESULT_OK);
- super.finish();
- }
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/NonUIActions.java b/app/src/main/java/com/github/mzule/activityrouter/NonUIActions.java
deleted file mode 100644
index f778a88..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/NonUIActions.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import com.github.mzule.activityrouter.annotation.Router;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.widget.Toast;
-
-/**
- * Created by CaoDongping on 04/11/2016.
- */
-
-public class NonUIActions {
-
- @Router("logout")
- public static void logout(Context context, Bundle bundle) {
- Toast.makeText(context, "logout", Toast.LENGTH_SHORT).show();
- }
-
- @Router("upload")
- public static void uploadLog(Context context, Bundle bundle) {
- Toast.makeText(context, "upload", Toast.LENGTH_SHORT).show();
- }
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/NotFoundActivity.java b/app/src/main/java/com/github/mzule/activityrouter/NotFoundActivity.java
deleted file mode 100644
index 984ae19..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/NotFoundActivity.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.Gravity;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-/**
- * Created by CaoDongping on 4/8/16.
- */
-public class NotFoundActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView textView = new TextView(this);
- textView.setText("404");
- textView.setGravity(Gravity.CENTER);
- setContentView(textView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
- }
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/UserActivity.java b/app/src/main/java/com/github/mzule/activityrouter/UserActivity.java
deleted file mode 100644
index f260f08..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/UserActivity.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import com.github.mzule.activityrouter.annotation.Router;
-
-/**
- * Created by CaoDongping on 4/7/16.
- */
-@Router({"user/:userId", "user/:nickname/city/:city/gender/:gender/age/:age"})
-public class UserActivity extends DumpExtrasActivity {
-}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/UserCollectionActivity.java b/app/src/main/java/com/github/mzule/activityrouter/UserCollectionActivity.java
deleted file mode 100644
index fb6e89f..0000000
--- a/app/src/main/java/com/github/mzule/activityrouter/UserCollectionActivity.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import com.github.mzule.activityrouter.annotation.Router;
-
-/**
- * Created by CaoDongping on 4/7/16.
- */
-@Router("user/collection")
-public class UserCollectionActivity extends DumpExtrasActivity {
-}
diff --git a/app/src/main/res/layout/activity_launch.xml b/app/src/main/res/layout/activity_launch.xml
deleted file mode 100644
index a1e75e0..0000000
--- a/app/src/main/res/layout/activity_launch.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bcccec65160d92116f20ffce4fce0b5245c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3418
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
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0e7b91d006d22352c9ff2f134e504e3c1d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 4842
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
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72cdd7480cb983fa1bcc7ce686e51ef87fe7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 7718
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
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e138434630332d88b1680f33c4b24c70ab3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 10486
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
-
- 64dp
-
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
deleted file mode 100644
index 3ab3e9c..0000000
--- a/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- #3F51B5
- #303F9F
- #FF4081
-
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
deleted file mode 100644
index 47c8224..0000000
--- a/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- 16dp
- 16dp
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
deleted file mode 100644
index f9d172d..0000000
--- a/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
- ActivityRouter
-
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
deleted file mode 100644
index 48e48a6..0000000
--- a/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/test/java/com/github/mzule/activityrouter/ExampleUnitTest.java b/app/src/test/java/com/github/mzule/activityrouter/ExampleUnitTest.java
deleted file mode 100644
index a4fd99d..0000000
--- a/app/src/test/java/com/github/mzule/activityrouter/ExampleUnitTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.github.mzule.activityrouter;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * To work on unit tests, switch the Test Artifact in the Build Variants view.
- */
-public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() throws Exception {
- assertEquals(4, 2 + 2);
- }
-}
\ No newline at end of file
diff --git a/app_module/build.gradle b/app_module/build.gradle
index 2c2ce05..7634627 100644
--- a/app_module/build.gradle
+++ b/app_module/build.gradle
@@ -1,32 +1,15 @@
-apply plugin: 'com.android.library'
-
-android {
- compileSdkVersion 24
- buildToolsVersion "24.0.2"
+apply plugin: 'com.huawei.ohos.library'
+ohos {
+ compileSdkVersion 5
defaultConfig {
- minSdkVersion 15
- targetSdkVersion 24
- versionCode 1
- versionName "1.0"
-
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
+ compatibleSdkVersion 4
}
+
}
dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- compile 'com.android.support:appcompat-v7:24.2.1'
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile project(':activityrouter')
annotationProcessor project(':compiler')
diff --git a/app_module/proguard-rules.pro b/app_module/proguard-rules.pro
deleted file mode 100644
index 8e15537..0000000
--- a/app_module/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /Users/baidu/Library/Android/sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
diff --git a/app_module/src/androidTest/java/com/github/mzule/activityrouter/module/ExampleInstrumentedTest.java b/app_module/src/androidTest/java/com/github/mzule/activityrouter/module/ExampleInstrumentedTest.java
deleted file mode 100644
index 4b2fdd4..0000000
--- a/app_module/src/androidTest/java/com/github/mzule/activityrouter/module/ExampleInstrumentedTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.github.mzule.activityrouter.module;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Instrumentation test, which will execute on an Android device.
- *
- * @see Testing documentation
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
- @Test
- public void useAppContext() throws Exception {
- // Context of the app under test.
- Context appContext = InstrumentationRegistry.getTargetContext();
-
- assertEquals("com.github.mzule.activityrouter.module.test", appContext.getPackageName());
- }
-}
diff --git a/app_module/src/main/AndroidManifest.xml b/app_module/src/main/AndroidManifest.xml
deleted file mode 100644
index 69686e4..0000000
--- a/app_module/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app_module/src/main/config.json b/app_module/src/main/config.json
new file mode 100644
index 0000000..e61cee2
--- /dev/null
+++ b/app_module/src/main/config.json
@@ -0,0 +1,36 @@
+{
+ "app": {
+ "bundleName": "com.github.mzule.abilityrouter",
+ "vendor": "github",
+ "version": {
+ "code": 1000000,
+ "name": "1.0"
+ },
+ "apiVersion": {
+ "compatible": 4,
+ "target": 5,
+ "releaseType": "Beta1"
+ }
+ },
+ "deviceConfig": {},
+ "module": {
+ "package": "com.github.mzule.abilityrouter.module",
+ "deviceType": [
+ "phone"
+ ],
+ "distro": {
+ "deliveryWithInstall": true,
+ "moduleName": "app_module",
+ "moduleType": "har"
+ },
+ "abilities": [
+ {
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.module.ModuleAbility",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app_module/src/main/java/com/github/mzule/abilityrouter/module/ModuleAbility.java b/app_module/src/main/java/com/github/mzule/abilityrouter/module/ModuleAbility.java
new file mode 100644
index 0000000..2396efc
--- /dev/null
+++ b/app_module/src/main/java/com/github/mzule/abilityrouter/module/ModuleAbility.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.module;
+
+import com.github.mzule.abilityrouter.annotation.Router;
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.Text;
+
+/**
+ * Created by CaoDongping on 30/10/2016.
+ */
+@Router(value = "module")
+public class ModuleAbility extends Ability {
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setUIContent(ResourceTable.Layout_module_layout);
+ Text text = (Text) findComponentById(ResourceTable.Id_module);
+ text.setText("this is ModuleAbility");
+ }
+}
diff --git a/app_module/src/main/java/com/github/mzule/activityrouter/module/SdkModule.java b/app_module/src/main/java/com/github/mzule/abilityrouter/module/SdkModule.java
similarity index 46%
rename from app_module/src/main/java/com/github/mzule/activityrouter/module/SdkModule.java
rename to app_module/src/main/java/com/github/mzule/abilityrouter/module/SdkModule.java
index b326272..f2cdba4 100644
--- a/app_module/src/main/java/com/github/mzule/activityrouter/module/SdkModule.java
+++ b/app_module/src/main/java/com/github/mzule/abilityrouter/module/SdkModule.java
@@ -1,6 +1,6 @@
-package com.github.mzule.activityrouter.module;
+package com.github.mzule.abilityrouter.module;
-import com.github.mzule.activityrouter.annotation.Module;
+import com.github.mzule.abilityrouter.annotation.Module;
/**
* Created by CaoDongping on 30/10/2016.
diff --git a/app_module/src/main/java/com/github/mzule/activityrouter/module/ModuleActivity.java b/app_module/src/main/java/com/github/mzule/activityrouter/module/ModuleActivity.java
deleted file mode 100644
index 3ae347e..0000000
--- a/app_module/src/main/java/com/github/mzule/activityrouter/module/ModuleActivity.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.github.mzule.activityrouter.module;
-
-import com.github.mzule.activityrouter.annotation.Router;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TextView;
-
-/**
- * Created by CaoDongping on 30/10/2016.
- */
-
-@Router("module")
-public class ModuleActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView textView = new TextView(this);
- textView.setText("this is ModuleActivity");
- setContentView(textView);
- }
-}
diff --git a/app_module/src/main/res/values/strings.xml b/app_module/src/main/res/values/strings.xml
deleted file mode 100644
index d165187..0000000
--- a/app_module/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Module
-
diff --git a/app_module/src/main/resources/base/element/string.json b/app_module/src/main/resources/base/element/string.json
new file mode 100644
index 0000000..3a31105
--- /dev/null
+++ b/app_module/src/main/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "app_module"
+ }
+ ]
+}
diff --git a/app_module/src/main/resources/base/layout/module_layout.xml b/app_module/src/main/resources/base/layout/module_layout.xml
new file mode 100644
index 0000000..3fc3121
--- /dev/null
+++ b/app_module/src/main/resources/base/layout/module_layout.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app_module/src/test/java/com/github/mzule/activityrouter/module/ExampleUnitTest.java b/app_module/src/test/java/com/github/mzule/activityrouter/module/ExampleUnitTest.java
deleted file mode 100644
index 75c8686..0000000
--- a/app_module/src/test/java/com/github/mzule/activityrouter/module/ExampleUnitTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.github.mzule.activityrouter.module;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see Testing documentation
- */
-public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() throws Exception {
- assertEquals(4, 2 + 2);
- }
-}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 03aec8e..8cdd760 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,25 +1,51 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
+apply plugin: 'com.huawei.ohos.app'
+
+ohos {
+ compileSdkVersion 5
+ defaultConfig {
+ compatibleSdkVersion 4
+ }
+}
buildscript {
repositories {
+ maven {
+ url 'https://mirrors.huaweicloud.com/repository/maven/'
+ }
+ maven {
+ url 'https://developer.huawei.com/repo/'
+ }
+ maven {
+ url 'https://maven.aliyun.com/nexus/content/groups/public/'
+ }
+ maven {
+ url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
+ }
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.2.3'
+ classpath 'com.huawei.ohos:hap:2.4.4.2'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
- classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
+ classpath 'com.huawei.ohos:decctest:1.0.0.6'
}
}
allprojects {
repositories {
+ maven {
+ url 'https://mirrors.huaweicloud.com/repository/maven/'
+ }
+ maven {
+ url 'https://developer.huawei.com/repo/'
+ }
+ maven {
+ url 'https://maven.aliyun.com/nexus/content/groups/public/'
+ }
+ maven {
+ url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
+ }
jcenter()
}
}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
diff --git a/compiler/build.gradle b/compiler/build.gradle
index 2e9ed2d..ef4633b 100644
--- a/compiler/build.gradle
+++ b/compiler/build.gradle
@@ -1,38 +1,13 @@
-apply plugin: 'java'
-
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
-
-ext {
- bintrayRepo = 'maven'
- bintrayName = 'activity-router-compiler'
-
- publishedGroupId = 'com.github.mzule.activityrouter'
- libraryName = 'Compiler'
- artifact = 'compiler'
-
- libraryDescription = 'Router activities'
-
- siteUrl = 'https://github.com/mzule/ActivityRouter/'
- gitUrl = 'https://github.com/mzule/ActivityRouter.git'
-
- libraryVersion = '1.1.7'
-
- developerId = 'mzule'
- developerName = 'Cao Dongping'
- developerEmail = 'mzule4j@gmail.com'
-
- licenseName = 'The Apache Software License, Version 2.0'
- licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
- allLicenses = ["Apache-2.0"]
-}
+apply plugin: 'java-library'
dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+ compile project(':annotation')
compile 'com.squareup:javapoet:1.8.0'
compile 'com.google.auto.service:auto-service:1.0-rc3'
- compile 'com.github.mzule.activityrouter:annotation:1.1.5'
+ annotationProcessor 'com.google.auto.service:auto-service:1.0-rc3'
}
-apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
-apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
-
+sourceCompatibility = "1.8"
+targetCompatibility = "1.8"
diff --git a/compiler/src/main/java/com/github/mzule/activityrouter/compiler/RouterProcessor.java b/compiler/src/main/java/com/github/mzule/abilityrouter/compiler/RouterProcessor.java
similarity index 80%
rename from compiler/src/main/java/com/github/mzule/activityrouter/compiler/RouterProcessor.java
rename to compiler/src/main/java/com/github/mzule/abilityrouter/compiler/RouterProcessor.java
index d16a66f..815d953 100644
--- a/compiler/src/main/java/com/github/mzule/activityrouter/compiler/RouterProcessor.java
+++ b/compiler/src/main/java/com/github/mzule/abilityrouter/compiler/RouterProcessor.java
@@ -1,29 +1,25 @@
-package com.github.mzule.activityrouter.compiler;
+package com.github.mzule.abilityrouter.compiler;
-import java.util.HashSet;
-import java.util.Set;
-import javax.annotation.processing.AbstractProcessor;
-import javax.annotation.processing.Filer;
-import javax.annotation.processing.Messager;
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.annotation.processing.Processor;
-import javax.annotation.processing.RoundEnvironment;
-import javax.lang.model.SourceVersion;
-import javax.lang.model.element.Element;
-import javax.lang.model.element.ElementKind;
-import javax.lang.model.element.Modifier;
-import javax.lang.model.element.Name;
-import javax.lang.model.element.TypeElement;
-import javax.tools.Diagnostic;
-import com.github.mzule.activityrouter.annotation.Module;
-import com.github.mzule.activityrouter.annotation.Modules;
-import com.github.mzule.activityrouter.annotation.Router;
+import com.github.mzule.abilityrouter.annotation.Module;
+import com.github.mzule.abilityrouter.annotation.Modules;
+import com.github.mzule.abilityrouter.annotation.Router;
import com.google.auto.service.AutoService;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
+import javax.annotation.processing.*;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.*;
+import javax.tools.Diagnostic;
+import java.util.HashSet;
+import java.util.Set;
+/**
+ * RouterProcessor
+ *
+ * @since 2021-04-16
+ * */
@AutoService(Processor.class)
public class RouterProcessor extends AbstractProcessor {
private static final boolean DEBUG = false;
@@ -59,6 +55,7 @@ public class RouterProcessor extends AbstractProcessor {
}
boolean hasModule = false;
boolean hasModules = false;
+
// module
String moduleName = "RouterMapping";
Set extends Element> moduleList = roundEnv.getElementsAnnotatedWith(Module.class);
@@ -67,6 +64,7 @@ public class RouterProcessor extends AbstractProcessor {
moduleName = moduleName + "_" + annotation.value();
hasModule = true;
}
+
// modules
String[] moduleNames = null;
Set extends Element> modulesList = roundEnv.getElementsAnnotatedWith(Modules.class);
@@ -75,6 +73,7 @@ public class RouterProcessor extends AbstractProcessor {
moduleNames = modules.getAnnotation(Modules.class).value();
hasModules = true;
}
+
// RouterInit
if (hasModules) {
debug("generate modules RouterInit");
@@ -83,6 +82,7 @@ public class RouterProcessor extends AbstractProcessor {
debug("generate default RouterInit");
generateDefaultRouterInit();
}
+
// RouterMapping
return handleRouter(moduleName, roundEnv);
}
@@ -96,10 +96,11 @@ public class RouterProcessor extends AbstractProcessor {
.addMethod(initMethod.build())
.build();
try {
- JavaFile.builder("com.github.mzule.activityrouter.router", routerInit)
+ JavaFile.builder("com.github.mzule.abilityrouter.router", routerInit)
.build()
.writeTo(filer);
} catch (Exception e) {
+
e.printStackTrace();
}
}
@@ -115,7 +116,7 @@ public class RouterProcessor extends AbstractProcessor {
.addMethod(initMethod.build())
.build();
try {
- JavaFile.builder("com.github.mzule.activityrouter.router", routerInit)
+ JavaFile.builder("com.github.mzule.abilityrouter.router", routerInit)
.build()
.writeTo(filer);
} catch (Exception e) {
@@ -129,7 +130,7 @@ public class RouterProcessor extends AbstractProcessor {
MethodSpec.Builder mapMethod = MethodSpec.methodBuilder("map")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC)
.addStatement("java.util.Map transfer = null")
- .addStatement("com.github.mzule.activityrouter.router.ExtraTypes extraTypes")
+ .addStatement("com.github.mzule.abilityrouter.router.ExtraTypes extraTypes")
.addCode("\n");
for (Element element : elements) {
@@ -137,10 +138,10 @@ public class RouterProcessor extends AbstractProcessor {
String[] transfer = router.transfer();
if (transfer.length > 0 && !"".equals(transfer[0])) {
mapMethod.addStatement("transfer = new java.util.HashMap()");
- for (String s : transfer) {
- String[] components = s.split("=>");
+ for (String s1 : transfer) {
+ String[] components = s1.split("=>");
if (components.length != 2) {
- error("transfer `" + s + "` not match a=>b format");
+ error("transfer `" + s1 + "` not match a=>b format");
break;
}
mapMethod.addStatement("transfer.put($S, $S)", components[0], components[1]);
@@ -149,7 +150,7 @@ public class RouterProcessor extends AbstractProcessor {
mapMethod.addStatement("transfer = null");
}
- mapMethod.addStatement("extraTypes = new com.github.mzule.activityrouter.router.ExtraTypes()");
+ mapMethod.addStatement("extraTypes = new com.github.mzule.abilityrouter.router.ExtraTypes()");
mapMethod.addStatement("extraTypes.setTransfer(transfer)");
addStatement(mapMethod, int.class, router.intParams());
@@ -181,14 +182,20 @@ public class RouterProcessor extends AbstractProcessor {
return false;
}
if (element.getKind() == ElementKind.CLASS) {
- mapMethod.addStatement("com.github.mzule.activityrouter.router.Routers.map($S, $T.class, null, extraTypes)", format, className);
+ mapMethod.addStatement("com.github.mzule.abilityrouter.router.Routers.map($S, $T.class, null, extraTypes)", format, className);
} else {
- mapMethod.addStatement("com.github.mzule.activityrouter.router.Routers.map($S, null, " +
- "new MethodInvoker() {\n" +
- " public void invoke(android.content.Context context, android.os.Bundle bundle) {\n" +
- " $T.$N(context, bundle);\n" +
- " }\n" +
- "}, " +
+ mapMethod.addStatement("com.github.mzule.abilityrouter.router.Routers.map($S, null, "
+ +
+ "new MethodInvoker() {\n"
+ +
+ " public void invoke(ohos.app.Context context, ohos.aafwk.content.IntentParams bundle) {\n"
+ +
+ " $T.$N(context, bundle);\n"
+ +
+ " }\n"
+ +
+ "}, "
+ +
"extraTypes)", format, className, methodName);
}
}
@@ -199,7 +206,7 @@ public class RouterProcessor extends AbstractProcessor {
.addMethod(mapMethod.build())
.build();
try {
- JavaFile.builder("com.github.mzule.activityrouter.router", routerMapping)
+ JavaFile.builder("com.github.mzule.abilityrouter.router", routerMapping)
.build()
.writeTo(filer);
} catch (Throwable e) {
@@ -212,9 +219,9 @@ public class RouterProcessor extends AbstractProcessor {
String extras = join(args);
if (extras.length() > 0) {
String typeName = typeClz.getSimpleName();
- String s = typeName.substring(0, 1).toUpperCase() + typeName.replaceFirst("\\w", "");
+ String s1 = typeName.substring(0, 1).toUpperCase() + typeName.replaceFirst("\\w", "");
- mapMethod.addStatement("extraTypes.set" + s + "Extra($S.split(\",\"))", extras);
+ mapMethod.addStatement("extraTypes.set" + s1 + "Extra($S.split(\",\"))", extras);
}
}
diff --git a/app/.gitignore b/entry/.gitignore
similarity index 100%
rename from app/.gitignore
rename to entry/.gitignore
diff --git a/entry/build.gradle b/entry/build.gradle
new file mode 100644
index 0000000..47d07c5
--- /dev/null
+++ b/entry/build.gradle
@@ -0,0 +1,30 @@
+apply plugin: 'com.huawei.ohos.hap'
+apply plugin: 'com.huawei.ohos.decctest'
+ohos {
+ compileSdkVersion 5
+ defaultConfig {
+ compatibleSdkVersion 4
+ }
+ compileOptions {
+ annotationEnabled true
+ }
+ buildTypes {
+ release {
+ proguardOpt {
+ proguardEnabled false
+ rulesFiles 'proguard-rules.pro'
+ }
+ }
+ }
+}
+
+dependencies {
+ ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.100'
+ implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
+ testCompile 'junit:junit:4.12'
+ compile project(':app_module')
+ annotationProcessor project(':compiler')
+}
+decc {
+ supportType = ['html', 'xml']
+}
\ No newline at end of file
diff --git a/entry/src/main/config.json b/entry/src/main/config.json
new file mode 100644
index 0000000..01d38a2
--- /dev/null
+++ b/entry/src/main/config.json
@@ -0,0 +1,126 @@
+{
+ "app": {
+ "bundleName": "com.github.mzule.abilityrouter",
+ "vendor": "github",
+ "version": {
+ "code": 1000000,
+ "name": "1.0"
+ },
+ "apiVersion": {
+ "compatible": 4,
+ "target": 5
+ }
+ },
+ "deviceConfig": {},
+ "module": {
+ "package": "com.github.mzule.abilityrouter",
+ "name": ".MyApplication",
+ "deviceType": [
+ "phone"
+ ],
+ "distro": {
+ "deliveryWithInstall": true,
+ "moduleName": "entry",
+ "moduleType": "entry"
+ },
+ "abilities": [
+ {
+ "skills": [
+ {
+ "entities": [
+ "entity.system.home"
+ ],
+ "actions": [
+ "action.system.home"
+ ]
+ }
+ ],
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.slice.LaunchAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.slice.ErrorStackAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.slice.HomeAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.slice.HostAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.slice.NotFoundAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.slice.UserAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.slice.UserCollectionAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "name": "com.github.mzule.abilityrouter.router.RouterAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "orientation": "unspecified",
+ "name": ".MainAbility",
+ "icon": "$media:icon",
+ "description": "$string:mainability_description",
+ "label": "$string:app_name",
+ "type": "page",
+ "launchType": "standard"
+ },
+ {
+ "icon": "$media:icon",
+ "name": "com.github.mzule.abilityrouter.slice.DumpExtrasAbility",
+ "description": "",
+ "type": "page"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/mzule/activityrouter/AppModule.java b/entry/src/main/java/com/github/mzule/abilityrouter/AppModule.java
similarity index 48%
rename from app/src/main/java/com/github/mzule/activityrouter/AppModule.java
rename to entry/src/main/java/com/github/mzule/abilityrouter/AppModule.java
index 9aee9bb..f48dab3 100644
--- a/app/src/main/java/com/github/mzule/activityrouter/AppModule.java
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/AppModule.java
@@ -1,11 +1,10 @@
-package com.github.mzule.activityrouter;
+package com.github.mzule.abilityrouter;
-import com.github.mzule.activityrouter.annotation.Module;
+import com.github.mzule.abilityrouter.annotation.Module;
/**
* Created by CaoDongping on 30/10/2016.
*/
-
@Module("app")
public class AppModule {
}
diff --git a/app/src/main/java/com/github/mzule/activityrouter/Constant.java b/entry/src/main/java/com/github/mzule/abilityrouter/Constant.java
similarity index 54%
rename from app/src/main/java/com/github/mzule/activityrouter/Constant.java
rename to entry/src/main/java/com/github/mzule/abilityrouter/Constant.java
index 73aa3e4..d764bf0 100644
--- a/app/src/main/java/com/github/mzule/activityrouter/Constant.java
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/Constant.java
@@ -1,9 +1,11 @@
-package com.github.mzule.activityrouter;
+package com.github.mzule.abilityrouter;
/**
* Created by CaoDongping on 14/10/2016.
*/
-
public interface Constant {
+ /**
+ * 定义一个用于请求的变量
+ */
int REQUEST_CODE_DEMO = 1001;
}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/MainAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/MainAbility.java
new file mode 100644
index 0000000..37bd24a
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/MainAbility.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter;
+
+import com.github.mzule.abilityrouter.annotation.Router;
+import com.github.mzule.abilityrouter.slice.DumpExtrasAbility;
+import ohos.aafwk.content.Intent;
+/**
+ * MainAbility
+ *
+ * @since 2021-04-26
+ **/
+@Router(value = {"http://mzule.com/main", "main", "home"},
+ longParams = {"id", "updateTime"},
+ booleanParams = "web",
+ transfer = "web=>fromWeb")
+public class MainAbility extends DumpExtrasAbility {
+ /**
+ * 定义一个 用于接收的变量
+ */
+ public static final int RESULT_OK = -1;
+
+ @Override
+ protected void onActive() {
+ super.onActive();
+ Intent resultIntent = new Intent();
+ setResult(RESULT_OK,resultIntent);
+ }
+
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/MyApplication.java b/entry/src/main/java/com/github/mzule/abilityrouter/MyApplication.java
new file mode 100644
index 0000000..c0fa545
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/MyApplication.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter;
+
+import com.github.mzule.abilityrouter.annotation.Modules;
+import com.github.mzule.abilityrouter.router.RouterCallback;
+import com.github.mzule.abilityrouter.router.RouterCallbackProvider;
+import com.github.mzule.abilityrouter.router.SimpleRouterCallback;
+import com.github.mzule.abilityrouter.slice.ErrorStackAbility;
+import com.github.mzule.abilityrouter.slice.LaunchAbility;
+import com.github.mzule.abilityrouter.slice.NotFoundAbility;
+import ohos.aafwk.ability.AbilityPackage;
+import ohos.aafwk.content.Intent;
+import ohos.aafwk.content.Operation;
+import ohos.app.Context;
+import ohos.utils.net.Uri;
+/**
+ * MyApplication
+ *
+ * @since 2021-04-26
+ **/
+@Modules({"app", "sdk"})
+public class MyApplication extends AbilityPackage implements RouterCallbackProvider {
+ private final int beforopenmark = 11;
+ private final int notFound = 2;
+ @Override
+ public void onInitialize() {
+ super.onInitialize();
+ }
+
+ @Override
+ public RouterCallback provideRouterCallback() {
+ return new SimpleRouterCallback() {
+
+ @Override
+ public boolean beforeOpen(Context context, Uri uri) {
+ if (uri.toString().startsWith("mzule://")) {
+ Intent intent = new Intent();
+ Operation operationBuilder = new Intent.OperationBuilder()
+ .withBundleName(context.getBundleName())
+ .withAbilityName(LaunchAbility.class.getName())
+ .build();
+ intent.setOperation(operationBuilder);
+ context.startAbility(intent,beforopenmark);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void notFound(Context context, Uri uri) {
+ Intent intent = new Intent();
+ Operation operation = new Intent.OperationBuilder()
+ .withBundleName(context.getBundleName())
+ .withFlags(Intent.FLAG_ABILITY_NEW_MISSION)
+ .withAbilityName(NotFoundAbility.class.getName())
+ .build();
+ intent.setOperation(operation);
+ context.startAbility(intent,notFound);
+ }
+
+ @Override
+ public void error(Context context, Uri uri, Throwable e) {
+ context.startAbility(ErrorStackAbility.makeIntent(context,uri,e),1);
+ }
+ };
+ }
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/DumpExtrasAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/DumpExtrasAbility.java
new file mode 100644
index 0000000..c492922
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/DumpExtrasAbility.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.ResourceTable;
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+import ohos.aafwk.content.IntentParams;
+import ohos.agp.components.Text;
+import java.util.Set;
+
+/**
+ * Created by CaoDongping on 4/7/16.
+ */
+public abstract class DumpExtrasAbility extends Ability {
+ private static final int PADDINGS = 16;
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setUIContent(ResourceTable.Layout_ability_dump);
+
+ Text text = (Text) findComponentById(ResourceTable.Id_dump);
+ Intent bundle = getIntent();
+ IntentParams params = bundle.getParams();
+
+ if (params != null) {
+
+ Set strings = params.keySet();
+
+ int padding = PADDINGS;
+ text.setPadding(padding,padding,padding,padding);
+ text.setText(getClass().getSimpleName());
+ text.append("\n\n");
+
+ for (String key : strings) {
+ if ("callerBundleName".equals(key)) {
+ continue;
+ }
+ text.append(key + "=>");
+
+ Object v1 = params.getParam(key);
+
+ if (null != v1) {
+ text.append(v1 + "=>" + v1.getClass().getSimpleName());
+ } else {
+ text.append("null");
+ }
+
+ text.append("\n\n");
+ }
+
+ }
+ }
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/ErrorStackAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/ErrorStackAbility.java
new file mode 100644
index 0000000..21bd045
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/ErrorStackAbility.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.ResourceTable;
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+import ohos.aafwk.content.Operation;
+import ohos.agp.components.Text;
+import ohos.agp.utils.TextAlignment;
+import ohos.app.Context;
+import ohos.hiviewdfx.HiLog;
+import ohos.utils.net.Uri;
+/**
+ * Created by CaoDongping on 8/9/16.
+ */
+public class ErrorStackAbility extends Ability {
+ /**
+ * 跳转
+ *
+ * @param context 上下文
+ * @param uri 地址
+ * @param e1 错误日志
+ * @return makeIntent 跳转的方法
+ */
+ public static Intent makeIntent(Context context, Uri uri, Throwable e1) {
+ Intent intent1 = new Intent();
+ Operation operation = new Intent.OperationBuilder()
+ .withBundleName(context.getBundleName())
+ .withFlags(Intent.FLAG_ABILITY_NEW_MISSION)
+ .withAbilityName(ErrorStackAbility.class.getName())
+ .build();
+ intent1.setParam("uri",uri);
+ intent1.setParam("error",e1);
+ intent1.setOperation(operation);
+ return intent1;
+ }
+
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setUIContent(ResourceTable.Layout_ability_error);
+ Text error = (Text) findComponentById(ResourceTable.Id_error_text);
+ Throwable e1 = (Throwable)getIntent().getSerializableParam("error");
+ Uri uri = getIntent().getParcelableParam("uri");
+ error.setText(String.format("Error on open uri %s\n", uri));
+ error.append(HiLog.getStackTrace(e1));
+ error.setTextAlignment(TextAlignment.START);
+ }
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/HomeAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/HomeAbility.java
new file mode 100644
index 0000000..e599b5f
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/HomeAbility.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.annotation.Router;
+import ohos.aafwk.content.Intent;
+/**
+ * Created by CaoDongping on 4/7/16.
+ */
+@Router(value = "home/:homeName", stringParams = "o")
+public class HomeAbility extends DumpExtrasAbility {
+ /**
+ * 定义一个 用于接收的变量
+ */
+ public static final int RESULT_OK = -1;
+
+ @Override
+ protected void onActive() {
+ super.onActive();
+ Intent intent = new Intent();
+ intent.setParam("msg","goodbye");
+ setResult(RESULT_OK, intent);
+ }
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/HostAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/HostAbility.java
new file mode 100644
index 0000000..7def4c8
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/HostAbility.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.annotation.Router;
+
+/**
+ * @author Kale
+ * @date 2016/8/9
+ */
+@Router("with_host")
+public class HostAbility extends DumpExtrasAbility {
+
+}
\ No newline at end of file
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/LaunchAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/LaunchAbility.java
new file mode 100644
index 0000000..9421bc5
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/LaunchAbility.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.Constant;
+import com.github.mzule.abilityrouter.ResourceTable;
+import com.github.mzule.abilityrouter.router.Routers;
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.Component;
+import ohos.agp.components.ComponentContainer;
+import ohos.agp.components.ScrollView;
+import ohos.agp.components.Text;
+import ohos.agp.utils.Color;
+import ohos.agp.utils.TextTool;
+import ohos.agp.window.dialog.ToastDialog;
+/**
+ * Created by CaoDongping on 4/7/16.
+ */
+public class LaunchAbility extends Ability {
+ /**
+ * 定义一个 用于接收的变量
+ */
+ public static final int RESULT_OK = -1;
+ private final int direction = 1;
+ private final int scrollbarthickness = 12;
+ private static final int MIN_DELAY_TIME = 1000;
+ private static long lastClickTime;
+ /**
+ * 限制按钮多次点击一秒之内不能重复点击
+ *
+ * @return 是否快速点击
+ **/
+ public static boolean isFastClick() {
+ boolean flag = true;
+ long currentClickTime = System.currentTimeMillis();
+ if ((currentClickTime - lastClickTime) >= MIN_DELAY_TIME) {
+ flag = false;
+ }
+ lastClickTime = currentClickTime;
+ return flag;
+ }
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setUIContent(ResourceTable.Layout_ability_launch);
+
+ ComponentContainer container = (ComponentContainer) findComponentById(ResourceTable.Id_container);
+ ScrollView scrollView = (ScrollView) findComponentById(ResourceTable.Id_scroll);
+ scrollView.enableScrollBar(direction,true);
+ scrollView.setScrollbarColor(Color.GRAY);
+ scrollView.setScrollbarThickness(scrollbarthickness);
+ for (int i = 0; i < container.getChildCount(); i++) {
+ final Component view = container.getComponentAt(i);
+ if (view instanceof Text) {
+ view.setClickedListener(new Component.ClickedListener() {
+ @Override
+ public void onClick(Component component) {
+ if (isFastClick()) {
+ return;
+ }
+ Routers.openForResult(LaunchAbility.this,((Text)view).getText(), Constant.REQUEST_CODE_DEMO);
+ }
+ });
+ }
+ }
+ }
+
+
+ @Override
+ protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
+ super.onAbilityResult(requestCode, resultCode, resultData);
+ if (resultCode == RESULT_OK && requestCode == Constant.REQUEST_CODE_DEMO) {
+ String msg;
+ if (resultData == null) {
+ msg = "success";
+ } else {
+ msg = resultData.getStringParam("msg");
+ msg = TextTool.isNullOrEmpty(msg) ? "success" : msg;
+ }
+ ToastDialog toastDialog = new ToastDialog(this);
+ toastDialog.setText(msg).show();
+ }
+ }
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/MainAbilitySlice.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/MainAbilitySlice.java
new file mode 100644
index 0000000..ff4181e
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/MainAbilitySlice.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.ResourceTable;
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.content.Intent;
+/**
+ * MainAbilitySlice
+ *
+ * @since 2021-04-16
+ * */
+public class MainAbilitySlice extends AbilitySlice {
+ @Override
+ public void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setUIContent(ResourceTable.Layout_ability_main);
+ }
+
+ @Override
+ public void onActive() {
+ super.onActive();
+ }
+
+ @Override
+ public void onForeground(Intent intent) {
+ super.onForeground(intent);
+ }
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/NonUIActions.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/NonUIActions.java
new file mode 100644
index 0000000..ac7a314
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/NonUIActions.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.annotation.Router;
+import ohos.aafwk.content.IntentParams;
+import ohos.agp.window.dialog.ToastDialog;
+import ohos.app.Context;
+/**
+ * Created by CaoDongping on 04/11/2016.
+ */
+public class NonUIActions {
+ /**
+ * 定义一个登出的方法
+ *
+ * @param context 上下文
+ * @param bundle 接收的值
+ */
+ @Router("logout")
+ public static void logout(Context context, IntentParams bundle) {
+ ToastDialog toastDialog = new ToastDialog(context);
+ toastDialog.setText("logout").show();
+ }
+ /**
+ * 定义一个上传的方法
+ *
+ * @param context 上下文
+ * @param bundle 接收的值
+ */
+ @Router("upload")
+ public static void uploadLog(Context context, IntentParams bundle) {
+ ToastDialog toastDialog = new ToastDialog(context);
+ toastDialog.setText("upload").show();
+ }
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/NotFoundAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/NotFoundAbility.java
new file mode 100644
index 0000000..572e26a
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/NotFoundAbility.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.ResourceTable;
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.Text;
+import ohos.agp.utils.TextAlignment;
+/**
+ * Created by CaoDongping on 4/8/16.
+ */
+public class NotFoundAbility extends Ability {
+ @Override
+ protected void onStart(Intent intent) {
+ super.onStart(intent);
+ super.setUIContent(ResourceTable.Layout_ability_main);
+ Text componentById = (Text) findComponentById(ResourceTable.Id_text_helloworld);
+ componentById.setText("404");
+ componentById.setTextAlignment(TextAlignment.CENTER);
+ }
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/UserAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/UserAbility.java
new file mode 100644
index 0000000..7fb5967
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/UserAbility.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.annotation.Router;
+/**
+ * Created by CaoDongping on 4/7/16.
+ */
+@Router({"user/:userId", "user/:nickname/city/:city/gender/:gender/age/:age"})
+public class UserAbility extends DumpExtrasAbility {
+}
diff --git a/entry/src/main/java/com/github/mzule/abilityrouter/slice/UserCollectionAbility.java b/entry/src/main/java/com/github/mzule/abilityrouter/slice/UserCollectionAbility.java
new file mode 100644
index 0000000..b74ee85
--- /dev/null
+++ b/entry/src/main/java/com/github/mzule/abilityrouter/slice/UserCollectionAbility.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
+ *
+ * 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 com.github.mzule.abilityrouter.slice;
+
+import com.github.mzule.abilityrouter.annotation.Router;
+/**
+ * Created by CaoDongping on 4/7/16.
+ */
+@Router("user/collection")
+public class UserCollectionAbility extends DumpExtrasAbility {
+}
diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json
new file mode 100644
index 0000000..5d501a6
--- /dev/null
+++ b/entry/src/main/resources/base/element/string.json
@@ -0,0 +1,16 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "AbilityRouter"
+ },
+ {
+ "name": "mainability_description",
+ "value": "Java_Phone_Empty Feature Ability"
+ },
+ {
+ "name": "HelloWorld",
+ "value": "Hello World"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/entry/src/main/resources/base/graphic/background_ability_button.xml b/entry/src/main/resources/base/graphic/background_ability_button.xml
new file mode 100644
index 0000000..23647ce
--- /dev/null
+++ b/entry/src/main/resources/base/graphic/background_ability_button.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/entry/src/main/resources/base/graphic/background_ability_main.xml b/entry/src/main/resources/base/graphic/background_ability_main.xml
new file mode 100644
index 0000000..c0c0a3d
--- /dev/null
+++ b/entry/src/main/resources/base/graphic/background_ability_main.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/entry/src/main/resources/base/layout/ability_dump.xml b/entry/src/main/resources/base/layout/ability_dump.xml
new file mode 100644
index 0000000..a8cb32d
--- /dev/null
+++ b/entry/src/main/resources/base/layout/ability_dump.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/entry/src/main/resources/base/layout/ability_error.xml b/entry/src/main/resources/base/layout/ability_error.xml
new file mode 100644
index 0000000..9a9dfed
--- /dev/null
+++ b/entry/src/main/resources/base/layout/ability_error.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/entry/src/main/resources/base/layout/ability_launch.xml b/entry/src/main/resources/base/layout/ability_launch.xml
new file mode 100644
index 0000000..13f27ee
--- /dev/null
+++ b/entry/src/main/resources/base/layout/ability_launch.xml
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/entry/src/main/resources/base/layout/ability_main.xml b/entry/src/main/resources/base/layout/ability_main.xml
new file mode 100644
index 0000000..e80802e
--- /dev/null
+++ b/entry/src/main/resources/base/layout/ability_main.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/entry/src/main/resources/base/media/icon.png b/entry/src/main/resources/base/media/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c
GIT binary patch
literal 6790
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