diff --git a/.gitignore b/.gitignore index cc97ef2..acde6ad 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ local.properties /local.properties /.idea/workspace.xml .ds_store +MobileDeepLinking-Android-SDK/mobiledeeplinking_lib.iml diff --git a/MobileDeepLinking-Android-SDK/build.gradle b/MobileDeepLinking-Android-SDK/build.gradle index 8a5b123..58de644 100644 --- a/MobileDeepLinking-Android-SDK/build.gradle +++ b/MobileDeepLinking-Android-SDK/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'android-library' android { compileSdkVersion 19 - buildToolsVersion "19.0.1" + buildToolsVersion "19.1" defaultConfig { minSdkVersion 8 @@ -10,12 +10,4 @@ android { versionCode 1 versionName "1.0" } - release { - runProguard false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' - } -} - -dependencies { - compile 'com.android.support:appcompat-v7:+' } diff --git a/MobileDeepLinking-Android-SDK/src/main/java/org/mobiledeeplinking/android/MobileDeepLinking.java b/MobileDeepLinking-Android-SDK/src/main/java/org/mobiledeeplinking/android/MobileDeepLinking.java index cf0508a..7196b9d 100644 --- a/MobileDeepLinking-Android-SDK/src/main/java/org/mobiledeeplinking/android/MobileDeepLinking.java +++ b/MobileDeepLinking-Android-SDK/src/main/java/org/mobiledeeplinking/android/MobileDeepLinking.java @@ -38,11 +38,14 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; public class MobileDeepLinking extends Activity { @@ -102,6 +105,15 @@ private void routeUsingUrl(Uri deeplink) throws JSONException try { Map routeParameters = new HashMap(); + Set queryParameterNames = getQueryParameterNames(deeplink); + if ( !queryParameterNames.isEmpty() ) + { + for (String paramName : queryParameterNames) + { + routeParameters.put(paramName, deeplink.getQueryParameter(paramName)); + } + } + routeParameters.put("route", deeplink.getHost()); routeParameters = DeeplinkMatcher.match(route, routeOptions, routeParameters, deeplink); if (routeParameters != null) { @@ -214,4 +226,43 @@ private String readConfigFile() throws IOException } return sb.toString(); } + + /** + * Returns a set of the unique names of all query parameters. Iterating + * over the set will return the names in order of their first occurrence. + * + * @throws UnsupportedOperationException if this isn't a hierarchical URI + * + * @return a set of decoded names + */ + private Set getQueryParameterNames(Uri uri) { + if (uri.isOpaque()) { + throw new UnsupportedOperationException("This isn't a hierarchical URI."); + } + + String query = uri.getEncodedQuery(); + if (query == null) { + return Collections.emptySet(); + } + + Set names = new LinkedHashSet(); + int start = 0; + do { + int next = query.indexOf('&', start); + int end = (next == -1) ? query.length() : next; + + int separator = query.indexOf('=', start); + if (separator > end || separator == -1) { + separator = end; + } + + String name = query.substring(start, separator); + names.add(Uri.decode(name)); + + // Move start to end of name. + start = end + 1; + } while (start < query.length()); + + return Collections.unmodifiableSet(names); + } }