package in.srain.cube.uri;
import android.content.Intent;
import android.net.Uri;
import android.text.TextUtils;
import in.srain.cube.request.JsonData;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Iterator;
public class CustomizedUri {
private static final String KEY = "CUBE_URL";
private static final String[] PUB_SCHEMA_LIST = new String[]{"http://", "https://"};
private JsonData mQueryData = JsonData.newMap();
private String mSchemaPre = null;
private String mPath = null;
private String mQuery = null;
private String mOriginUrl = null;
private boolean mIsCustomized;
public String getPath() {
return mPath;
}
public boolean isCustomized() {
return mIsCustomized;
}
public String getQueryString() {
return mQuery;
}
public JsonData getQueryData() {
return mQueryData;
}
public String getOriginUrl() {
return mOriginUrl;
}
public static CustomizedUri parse(String url, String customizedSchema) {
if (TextUtils.isEmpty(url)) {
throw new RuntimeException("url is null");
}
url = url.trim();
if (url.startsWith(customizedSchema)) {
CustomizedUri uri = new CustomizedUri(url, customizedSchema);
uri.mIsCustomized = true;
return uri;
} else {
for (int i = 0; i < PUB_SCHEMA_LIST.length; i++) {
String schema = PUB_SCHEMA_LIST[i];
if (url.startsWith(schema)) {
return new CustomizedUri(url, schema);
}
}
}
return null;
}
public void writeToBundle(Intent intent) {
intent.putExtra(KEY, buildUrl());
}
private static String decode(String content, String encoding) {
try {
return URLDecoder.decode(content, encoding != null ? encoding : "ISO-8859-1");
} catch (UnsupportedEncodingException var3) {
throw new IllegalArgumentException(var3);
}
}
private String buildUrl() {
StringBuilder sb = new StringBuilder();
sb.append(mSchemaPre).append(mPath);
if (mQueryData != null && mQueryData.length() > 0) {
sb.append("?");
Iterator<String> names = mQueryData.keys();
boolean first = true;
while (names.hasNext()) {
String name = names.next();
String encodedName = Uri.encode(name);
String value = mQueryData.optString(name);
String encodedValue = value != null ? Uri.encode(value) : "";
if (first) {
first = false;
} else {
sb.append("&");
}
sb.append(encodedName);
sb.append("=");
sb.append(encodedValue);
}
}
return sb.toString();
}
public static CustomizedUri fromIntent(Intent intent, String schema) {
if (intent == null) {
return null;
}
String url = intent.getStringExtra(KEY);
if (TextUtils.isEmpty(url)) {
return null;
}
return parse(url, schema);
}
private CustomizedUri(String url, String schemaPre) {
mSchemaPre = schemaPre;
mOriginUrl = url;
// process segment
int pos_seg = url.indexOf('#');
if (pos_seg > 0) {
url = url.substring(0, pos_seg);
}
// process query
int pos_sp = url.indexOf('?');
if (pos_sp > 0) {
mQuery = url.substring(pos_sp + 1);
url = url.substring(0, pos_sp);
}
mPath = url.substring(schemaPre.length());
if (!TextUtils.isEmpty(mQuery)) {
parseQuery();
}
}
private void parseQuery() {
mQueryData = JsonData.newMap();
String query = mQuery;
int start = 0;
do {
int nextAmpersand = query.indexOf('&', start);
// to next & or to the end of String
int end = nextAmpersand != -1 ? nextAmpersand : query.length();
// no more key-value
int separator = query.indexOf('=', start);
if (separator > end || separator == -1) {
break;
}
// make sure key is no empty
if (separator != start) {
mQueryData.put(Uri.decode(query.substring(start, separator)),
Uri.decode(query.substring(separator + 1, end)));
}
// Move start to end of name.
if (nextAmpersand != -1) {
start = nextAmpersand + 1;
} else {
break;
}
} while (true);
}
}