blob: cb95e33290390992f413ea8eff4a840a86cc404d [file] [log] [blame]
Owen Lina2fba682011-08-17 22:07:43 +08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.gallery3d.common;
18
19import android.content.Context;
20import android.content.pm.PackageInfo;
21import android.content.pm.PackageManager.NameNotFoundException;
22import android.os.Build;
23import android.util.Log;
24
25import org.apache.http.HttpVersion;
26import org.apache.http.client.HttpClient;
27import org.apache.http.conn.params.ConnManagerParams;
28import org.apache.http.params.CoreProtocolPNames;
29import org.apache.http.params.HttpParams;
30
31import java.lang.reflect.InvocationTargetException;
32import java.lang.reflect.Method;
33
34/**
35 * Constructs {@link HttpClient} instances and isolates client code from API
36 * level differences.
37 */
38public final class HttpClientFactory {
39 // TODO: migrate GDataClient to use this util method instead of apache's
40 // DefaultHttpClient.
41 /**
42 * Creates an HttpClient with the userAgent string constructed from the
43 * package name contained in the context.
44 * @return the client
45 */
46 public static HttpClient newHttpClient(Context context) {
47 return HttpClientFactory.newHttpClient(getUserAgent(context));
48 }
49
50 /**
51 * Creates an HttpClient with the specified userAgent string.
52 * @param userAgent the userAgent string
53 * @return the client
54 */
55 public static HttpClient newHttpClient(String userAgent) {
56 // AndroidHttpClient is available on all platform releases,
57 // but is hidden until API Level 8
58 try {
59 Class<?> clazz = Class.forName("android.net.http.AndroidHttpClient");
60 Method newInstance = clazz.getMethod("newInstance", String.class);
61 Object instance = newInstance.invoke(null, userAgent);
62
63 HttpClient client = (HttpClient) instance;
64
65 // ensure we default to HTTP 1.1
66 HttpParams params = client.getParams();
67 params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
68
69 // AndroidHttpClient sets these two parameters thusly by default:
70 // HttpConnectionParams.setSoTimeout(params, 60 * 1000);
71 // HttpConnectionParams.setConnectionTimeout(params, 60 * 1000);
72
73 // however it doesn't set this one...
74 ConnManagerParams.setTimeout(params, 60 * 1000);
75
76 return client;
77 } catch (InvocationTargetException e) {
78 throw new RuntimeException(e);
79 } catch (ClassNotFoundException e) {
80 throw new RuntimeException(e);
81 } catch (NoSuchMethodException e) {
82 throw new RuntimeException(e);
83 } catch (IllegalAccessException e) {
84 throw new RuntimeException(e);
85 }
86 }
87
88 /**
89 * Closes an HttpClient.
90 */
91 public static void close(HttpClient client) {
92 // AndroidHttpClient is available on all platform releases,
93 // but is hidden until API Level 8
94 try {
95 Class<?> clazz = client.getClass();
96 Method method = clazz.getMethod("close", (Class<?>[]) null);
97 method.invoke(client, (Object[]) null);
98 } catch (InvocationTargetException e) {
99 throw new RuntimeException(e);
100 } catch (NoSuchMethodException e) {
101 throw new RuntimeException(e);
102 } catch (IllegalAccessException e) {
103 throw new RuntimeException(e);
104 }
105 }
106
107 private static String sUserAgent = null;
108
109 private static String getUserAgent(Context context) {
110 if (sUserAgent == null) {
111 PackageInfo pi;
112 try {
113 pi = context.getPackageManager().getPackageInfo(
114 context.getPackageName(), 0);
115 } catch (NameNotFoundException e) {
116 throw new IllegalStateException("getPackageInfo failed");
117 }
118 sUserAgent = String.format("%s/%s; %s/%s/%s/%s; %s/%s/%s",
119 pi.packageName,
120 pi.versionName,
121 Build.BRAND,
122 Build.DEVICE,
123 Build.MODEL,
124 Build.ID,
125 Build.VERSION.SDK,
126 Build.VERSION.RELEASE,
127 Build.VERSION.INCREMENTAL);
128 }
129 return sUserAgent;
130 }
131
132 private HttpClientFactory() {
133 }
134}