package ee.ioc.phon.android.speak.utils;
import android.content.Intent;
import android.os.Bundle;
import android.util.Pair;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import ee.ioc.phon.android.speak.ChunkedWebRecSessionBuilder;
import ee.ioc.phon.android.speak.Log;
import ee.ioc.phon.android.speechutils.Extras;
public final class QueryUtils {
private static final String PARAMETER_SEPARATOR = "&";
private static final String NAME_VALUE_SEPARATOR = "=";
private QueryUtils() {
}
/**
* Extracts the editor info, and uses
* ChunkedWebRecSessionBuilder to extract some additional extras.
* TODO: unify this better
*/
public static String getQueryParams(Intent intent, ChunkedWebRecSessionBuilder builder, String encoding) throws UnsupportedEncodingException {
if (Log.DEBUG) Log.i(builder.toStringArrayList());
List<Pair<String, String>> list = new ArrayList<>();
flattenBundle("editorInfo_", list, intent.getBundleExtra(Extras.EXTRA_EDITOR_INFO));
listAdd(list, "lang", builder.getLang());
listAdd(list, "lm", toString(builder.getGrammarUrl()));
listAdd(list, "output-lang", builder.getGrammarTargetLang());
listAdd(list, "user-agent", builder.getUserAgentComment());
listAdd(list, "calling-package", builder.getCaller());
listAdd(list, "user-id", builder.getDeviceId());
listAdd(list, "partial", "" + builder.isPartialResults());
if (list.size() == 0) {
return "";
}
return PARAMETER_SEPARATOR + encodeKeyValuePairs(list, encoding);
}
private static boolean listAdd(List<Pair<String, String>> list, String key, String value) {
if (value == null || value.length() == 0) {
return false;
}
return list.add(new Pair<>(key, value));
}
private static void flattenBundle(String prefix, List<Pair<String, String>> list, Bundle bundle) {
if (bundle != null) {
for (String key : bundle.keySet()) {
Object value = bundle.get(key);
if (value != null) {
if (value instanceof Bundle) {
flattenBundle(prefix + key + "_", list, (Bundle) value);
} else {
listAdd(list, prefix + key, toString(value));
}
}
}
}
}
// TODO: replace by a built-in
private static String toString(Object obj) {
if (obj == null) {
return null;
}
return obj.toString();
}
/**
* Returns a String that is suitable for use as an <code>application/x-www-form-urlencoded</code>
* list of parameters in an HTTP PUT or HTTP POST.
* <p/>
* Modification of org.apache.http.client.utils.URLEncodedUtils#format
*
* @param parameters The parameters to include.
* @param encoding The encoding to use.
*/
public static String encodeKeyValuePairs(
final List<Pair<String, String>> parameters,
final String encoding) throws UnsupportedEncodingException {
final StringBuilder result = new StringBuilder();
for (final Pair<String, String> parameter : parameters) {
final String encodedName = URLEncoder.encode(parameter.first, encoding);
final String value = parameter.second;
final String encodedValue = value != null ? URLEncoder.encode(value, encoding) : "";
if (result.length() > 0)
result.append(PARAMETER_SEPARATOR);
result.append(encodedName);
result.append(NAME_VALUE_SEPARATOR);
result.append(encodedValue);
}
return result.toString();
}
}