From 592fc501b68737eb7c6b7486d4bb1c11fa172909 Mon Sep 17 00:00:00 2001 From: Kosh Date: Mon, 27 Feb 2017 13:29:20 +0800 Subject: [PATCH] extra link parser to handle urls such as login/repo/path --- .../com/fastaccess/helper/ActivityHelper.java | 9 ++-- .../provider/scheme/SchemeParser.java | 54 ++++++++++++------- .../modules/parser/LinksParserActivity.java | 4 +- 3 files changed, 42 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/fastaccess/helper/ActivityHelper.java b/app/src/main/java/com/fastaccess/helper/ActivityHelper.java index 39eab584..9403ab72 100644 --- a/app/src/main/java/com/fastaccess/helper/ActivityHelper.java +++ b/app/src/main/java/com/fastaccess/helper/ActivityHelper.java @@ -46,20 +46,23 @@ public class ActivityHelper { startCustomTab(context, Uri.parse(url)); } - public static void forceOpenInBrowser(@NonNull Context context, @NonNull String url) { + public static void forceOpenInBrowser(@NonNull Context context, @NonNull Uri url) { try { Uri uri = Uri.parse("googlechrome://navigate?url=" + url); Intent i = new Intent(Intent.ACTION_VIEW, uri); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } catch (ActivityNotFoundException e) { - Uri uri = Uri.parse(url); - Intent i = new Intent(Intent.ACTION_VIEW, uri); + Intent i = new Intent(Intent.ACTION_VIEW, url); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } + public static void forceOpenInBrowser(@NonNull Context context, @NonNull String url) { + forceOpenInBrowser(context, Uri.parse(url)); + } + @SafeVarargs public static void start(Activity activity, Class cl, Pair... sharedElements) { Intent intent = new Intent(activity, cl); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements); diff --git a/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java b/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java index fdc96d47..1aec935c 100644 --- a/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java +++ b/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java @@ -1,6 +1,5 @@ package com.fastaccess.provider.scheme; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -23,7 +22,6 @@ import com.fastaccess.ui.modules.user.UserPagerView; import java.util.List; import static android.content.Intent.ACTION_VIEW; -import static android.content.Intent.CATEGORY_BROWSABLE; /** * Created by Kosh on 09 Dec 2016, 4:44 PM @@ -39,12 +37,7 @@ public class SchemeParser { if (intent != null) { context.startActivity(intent); } else { - Activity activity = ActivityHelper.getActivity(context); - if (activity == null) { - context.startActivity(new Intent(ACTION_VIEW, data.getData()).addCategory(CATEGORY_BROWSABLE)); - } else { - ActivityHelper.startCustomTab(activity, data.getData()); - } + ActivityHelper.forceOpenInBrowser(context, data.getData()); } } @@ -53,12 +46,7 @@ public class SchemeParser { if (intent != null) { context.startActivity(intent); } else { - Activity activity = ActivityHelper.getActivity(context); - if (activity == null) { - context.startActivity(new Intent(ACTION_VIEW, data).addCategory(CATEGORY_BROWSABLE)); - } else { - ActivityHelper.startCustomTab(activity, data); - } + ActivityHelper.forceOpenInBrowser(context, data); } } @@ -78,10 +66,15 @@ public class SchemeParser { if (InputHelper.isEmpty(scheme)) scheme = PROTOCOL_HTTPS; String prefix = scheme + "://" + host; String path = data.getPath(); - if (!InputHelper.isEmpty(path)) - if (path.charAt(0) == '/') data = Uri.parse(prefix + path); - else data = Uri.parse(prefix + '/' + path); - else data = Uri.parse(prefix); + if (!InputHelper.isEmpty(path)) { + if (path.charAt(0) == '/') { + data = Uri.parse(prefix + path); + } else { + data = Uri.parse(prefix + '/' + path); + } + } else { + data = Uri.parse(prefix); + } } return getIntentForURI(context, data); @@ -101,10 +94,14 @@ public class SchemeParser { Intent commit = getCommit(context, data); Intent commits = getCommits(context, data); Intent blob = getBlob(context, data); - Optional intentOptional = returnNonNull(userIntent, pullRequestIntent, commit, commits, issueIntent, repoIntent, blob); + Optional intentOptional = returnNonNull(userIntent, pullRequestIntent, commit, commits, + issueIntent, repoIntent, blob); Optional empty = Optional.empty(); - if (intentOptional != null && intentOptional.isPresent() && intentOptional != empty) + if (intentOptional != null && intentOptional.isPresent() && intentOptional != empty) { return intentOptional.get(); + } else { + return getGeneralRepo(context, data); + } } return null; } @@ -176,6 +173,23 @@ public class SchemeParser { return RepoPagerView.createIntent(context, repoName, owner); } + /** + * [[k0shk0sh, FastHub, issues], k0shk0sh/fastHub/(issues,pulls,commits, etc)] + */ + @Nullable private static Intent getGeneralRepo(@NonNull Context context, @NonNull Uri uri) { + //TODO parse deeper links to their associate views. meantime fallback to repoPage + List segments = uri.getPathSegments(); + if (segments == null || segments.isEmpty()) return null; + if (segments.size() == 1) { + return getUser(context, uri); + } else if (segments.size() > 1) { + String owner = segments.get(0); + String repoName = segments.get(1); + return RepoPagerView.createIntent(context, repoName, owner); + } + return null; + } + @Nullable private static Intent getCommits(@NonNull Context context, @NonNull Uri uri) { List segments = uri.getPathSegments(); if (segments == null || segments.isEmpty() || segments.size() < 4) return null; diff --git a/app/src/main/java/com/fastaccess/ui/modules/parser/LinksParserActivity.java b/app/src/main/java/com/fastaccess/ui/modules/parser/LinksParserActivity.java index ac4bdfae..9f0217c8 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/parser/LinksParserActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/parser/LinksParserActivity.java @@ -38,9 +38,9 @@ public class LinksParserActivity extends Activity { } if (intent.getAction().equals(Intent.ACTION_VIEW)) { onUriReceived(); - } else { - finish(); + return; } + finish(); } private void onUriReceived() {