diff options
Diffstat (limited to 'java/com/android/dialer/lookup/LookupUtils.java')
-rw-r--r-- | java/com/android/dialer/lookup/LookupUtils.java | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/java/com/android/dialer/lookup/LookupUtils.java b/java/com/android/dialer/lookup/LookupUtils.java new file mode 100644 index 000000000..f13a33e54 --- /dev/null +++ b/java/com/android/dialer/lookup/LookupUtils.java @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.lookup; + +import android.text.Html; + +import java.io.BufferedInputStream; +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.UnsupportedCharsetException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class LookupUtils { + private static final String USER_AGENT = + "Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"; + + private static HttpURLConnection prepareHttpConnection(String url, Map<String, String> headers) + throws IOException { + // open connection + HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection(); + // set user agent (default value is null) + urlConnection.setRequestProperty("User-Agent", USER_AGENT); + // set all other headers if not null + if (headers != null) { + for (Map.Entry<String, String> header : headers.entrySet()) { + urlConnection.setRequestProperty(header.getKey(), header.getValue()); + } + } + + return urlConnection; + } + + private static byte[] httpFetch(HttpURLConnection urlConnection) throws IOException { + // query url, read and return buffered response body + // we want to make sure that the connection gets closed here + InputStream is = new BufferedInputStream(urlConnection.getInputStream()); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] result = null; + try { + byte[] partial = new byte[4096]; + int read; + while ((read = is.read(partial, 0, 4096)) != -1) { + baos.write(partial, 0, read); + } + result = baos.toByteArray(); + } finally { + is.close(); + baos.close(); + } + return result; + } + + private static Charset determineCharset(HttpURLConnection connection) { + String contentType = connection.getContentType(); + if (contentType != null) { + String[] split = contentType.split(";"); + for (int i = 0; i < split.length; i++) { + String trimmed = split[i].trim(); + if (trimmed.startsWith("charset=")) { + try { + return Charset.forName(trimmed.substring(8)); + } catch (IllegalCharsetNameException | UnsupportedCharsetException e) { + // we don't know about this charset -> ignore + } + } + } + } + return Charset.defaultCharset(); + } + + public static String httpGet(String url, Map<String, String> headers) throws IOException { + HttpURLConnection connection = prepareHttpConnection(url, headers); + try { + byte[] response = httpFetch(connection); + return new String(response, determineCharset(connection)); + } finally { + connection.disconnect(); + } + } + + public static byte[] httpGetBytes(String url, Map<String, String> headers) throws IOException { + HttpURLConnection connection = prepareHttpConnection(url, headers); + try { + return httpFetch(connection); + } finally { + connection.disconnect(); + } + } + + public static String httpPost(String url, Map<String, String> headers, String postData) + throws IOException { + HttpURLConnection connection = prepareHttpConnection(url, headers); + + try { + // write postData to buffered output stream + if (postData != null) { + connection.setDoOutput(true); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( + connection.getOutputStream())); + try { + bw.write(postData, 0, postData.length()); + // close connection and re-throw exception + } finally { + bw.close(); + } + } + byte[] response = httpFetch(connection); + return new String(response, determineCharset(connection)); + } finally { + connection.disconnect(); + } + } + + public static List<String> allRegexResults(String input, String regex, boolean dotall) { + if (input == null) { + return null; + } + Pattern pattern = Pattern.compile(regex, dotall ? Pattern.DOTALL : 0); + Matcher matcher = pattern.matcher(input); + + List<String> regexResults = new ArrayList<String>(); + while (matcher.find()) { + regexResults.add(matcher.group(1).trim()); + } + return regexResults; + } + + public static String firstRegexResult(String input, String regex, boolean dotall) { + if (input == null) { + return null; + } + Pattern pattern = Pattern.compile(regex, dotall ? Pattern.DOTALL : 0); + Matcher m = pattern.matcher(input); + return m.find() ? m.group(1).trim() : null; + } + + public static String fromHtml(String input) { + if (input == null) { + return null; + } + return Html.fromHtml(input).toString().trim(); + } +} |