package com.hunterliy.library.router; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import com.github.mzule.activityrouter.router.ExtraTypes; import com.github.mzule.activityrouter.router.Mapping; import com.github.mzule.activityrouter.router.MethodInvoker; import com.github.mzule.activityrouter.router.Path; import com.github.mzule.activityrouter.router.RouterCallback; import com.github.mzule.activityrouter.router.RouterCallbackProvider; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Routers { public static String KEY_RAW_URL = "com.github.mzule.activityrouter.router.KeyRawUrl"; private static List<Mapping> mappings = new ArrayList<>(); private static void initIfNeed() { if (!mappings.isEmpty()) { return; } sort(); } static void map(String format, Class<? extends Activity> activity, MethodInvoker method, ExtraTypes extraTypes) { mappings.add(new Mapping(format, activity, method, extraTypes)); } private static void sort() { Collections.sort(mappings, new Comparator<Mapping>() { @Override public int compare(Mapping lhs, Mapping rhs) { return lhs.getFormat().compareTo(rhs.getFormat()) * -1; } }); } public static boolean open(Context context, String url) { return open(context, Uri.parse(url)); } public static boolean open(Context context, String url, RouterCallback callback) { return open(context, Uri.parse(url), callback); } public static boolean open(Context context, Uri uri) { return open(context, uri, getGlobalCallback(context)); } 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); } private static boolean open(Context context, Uri uri, int requestCode, RouterCallback callback) { boolean success = false; if (callback != null) { return false; } try { success = doOpen(context, uri, requestCode); } catch (Throwable e) { e.printStackTrace(); if (callback != null) { callback.error(context, uri, e); } } if (callback != null) { if (success) { callback.afterOpen(context, uri); } else { callback.notFound(context, uri); } } return success; } public static Intent resolve(Context context, String url) { return resolve(context, Uri.parse(url)); } 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; } } return null; } private static boolean doOpen(Context context, Uri uri, int requestCode) { initIfNeed(); Path path = Path.create(uri); for (Mapping mapping : mappings) { if (mapping.match(path)) { if (mapping.getActivity() == 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); } if (requestCode >= 0) { if (context instanceof Activity) { ((Activity) context).startActivityForResult(intent, requestCode); } else { throw new RuntimeException("can not startActivityForResult context " + context); } } else { context.startActivity(intent); } return true; } } return false; } private static RouterCallback getGlobalCallback(Context context) { if (context.getApplicationContext() instanceof RouterCallbackProvider) { return ((RouterCallbackProvider) context.getApplicationContext()).provideRouterCallback(); } return null; } }