| /* |
| * Copyright (C) 2011 The Android Open Source 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.gallery3d.common; |
| |
| import android.content.Context; |
| import android.content.pm.PackageInfo; |
| import android.content.pm.PackageManager.NameNotFoundException; |
| import android.os.Build; |
| |
| import org.apache.http.HttpVersion; |
| import org.apache.http.client.HttpClient; |
| import org.apache.http.conn.params.ConnManagerParams; |
| import org.apache.http.params.CoreProtocolPNames; |
| import org.apache.http.params.HttpParams; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| |
| /** |
| * Constructs {@link HttpClient} instances and isolates client code from API |
| * level differences. |
| */ |
| public final class HttpClientFactory { |
| // TODO: migrate GDataClient to use this util method instead of apache's |
| // DefaultHttpClient. |
| /** |
| * Creates an HttpClient with the userAgent string constructed from the |
| * package name contained in the context. |
| * @return the client |
| */ |
| public static HttpClient newHttpClient(Context context) { |
| return HttpClientFactory.newHttpClient(getUserAgent(context)); |
| } |
| |
| /** |
| * Creates an HttpClient with the specified userAgent string. |
| * @param userAgent the userAgent string |
| * @return the client |
| */ |
| public static HttpClient newHttpClient(String userAgent) { |
| // AndroidHttpClient is available on all platform releases, |
| // but is hidden until API Level 8 |
| try { |
| Class<?> clazz = Class.forName("android.net.http.AndroidHttpClient"); |
| Method newInstance = clazz.getMethod("newInstance", String.class); |
| Object instance = newInstance.invoke(null, userAgent); |
| |
| HttpClient client = (HttpClient) instance; |
| |
| // ensure we default to HTTP 1.1 |
| HttpParams params = client.getParams(); |
| params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); |
| |
| // AndroidHttpClient sets these two parameters thusly by default: |
| // HttpConnectionParams.setSoTimeout(params, 60 * 1000); |
| // HttpConnectionParams.setConnectionTimeout(params, 60 * 1000); |
| |
| // however it doesn't set this one... |
| ConnManagerParams.setTimeout(params, 60 * 1000); |
| |
| return client; |
| } catch (InvocationTargetException e) { |
| throw new RuntimeException(e); |
| } catch (ClassNotFoundException e) { |
| throw new RuntimeException(e); |
| } catch (NoSuchMethodException e) { |
| throw new RuntimeException(e); |
| } catch (IllegalAccessException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| /** |
| * Closes an HttpClient. |
| */ |
| public static void close(HttpClient client) { |
| // AndroidHttpClient is available on all platform releases, |
| // but is hidden until API Level 8 |
| try { |
| Class<?> clazz = client.getClass(); |
| Method method = clazz.getMethod("close", (Class<?>[]) null); |
| method.invoke(client, (Object[]) null); |
| } catch (InvocationTargetException e) { |
| throw new RuntimeException(e); |
| } catch (NoSuchMethodException e) { |
| throw new RuntimeException(e); |
| } catch (IllegalAccessException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| private static String sUserAgent = null; |
| |
| private static String getUserAgent(Context context) { |
| if (sUserAgent == null) { |
| PackageInfo pi; |
| try { |
| pi = context.getPackageManager().getPackageInfo( |
| context.getPackageName(), 0); |
| } catch (NameNotFoundException e) { |
| throw new IllegalStateException("getPackageInfo failed"); |
| } |
| sUserAgent = String.format("%s/%s; %s/%s/%s/%s; %s/%s/%s", |
| pi.packageName, |
| pi.versionName, |
| Build.BRAND, |
| Build.DEVICE, |
| Build.MODEL, |
| Build.ID, |
| Build.VERSION.SDK_INT, |
| Build.VERSION.RELEASE, |
| Build.VERSION.INCREMENTAL); |
| } |
| return sUserAgent; |
| } |
| |
| private HttpClientFactory() { |
| } |
| } |