1 /*
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 
17 package com.android.gallery3d.common;
18 
19 import android.content.Context;
20 import android.content.pm.PackageInfo;
21 import android.content.pm.PackageManager.NameNotFoundException;
22 import android.os.Build;
23 
24 import org.apache.http.HttpVersion;
25 import org.apache.http.client.HttpClient;
26 import org.apache.http.conn.params.ConnManagerParams;
27 import org.apache.http.params.CoreProtocolPNames;
28 import org.apache.http.params.HttpParams;
29 
30 import java.lang.reflect.InvocationTargetException;
31 import java.lang.reflect.Method;
32 
33 /**
34  * Constructs {@link HttpClient} instances and isolates client code from API
35  * level differences.
36  */
37 public final class HttpClientFactory {
38     // TODO: migrate GDataClient to use this util method instead of apache's
39     // DefaultHttpClient.
40     /**
41      * Creates an HttpClient with the userAgent string constructed from the
42      * package name contained in the context.
43      * @return the client
44      */
newHttpClient(Context context)45     public static HttpClient newHttpClient(Context context) {
46         return HttpClientFactory.newHttpClient(getUserAgent(context));
47     }
48 
49     /**
50      * Creates an HttpClient with the specified userAgent string.
51      * @param userAgent the userAgent string
52      * @return the client
53      */
newHttpClient(String userAgent)54     public static HttpClient newHttpClient(String userAgent) {
55         // AndroidHttpClient is available on all platform releases,
56         // but is hidden until API Level 8
57         try {
58             Class<?> clazz = Class.forName("android.net.http.AndroidHttpClient");
59             Method newInstance = clazz.getMethod("newInstance", String.class);
60             Object instance = newInstance.invoke(null, userAgent);
61 
62             HttpClient client = (HttpClient) instance;
63 
64             // ensure we default to HTTP 1.1
65             HttpParams params = client.getParams();
66             params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
67 
68             // AndroidHttpClient sets these two parameters thusly by default:
69             // HttpConnectionParams.setSoTimeout(params, 60 * 1000);
70             // HttpConnectionParams.setConnectionTimeout(params, 60 * 1000);
71 
72             // however it doesn't set this one...
73             ConnManagerParams.setTimeout(params, 60 * 1000);
74 
75             return client;
76         } catch (InvocationTargetException e) {
77             throw new RuntimeException(e);
78         } catch (ClassNotFoundException e) {
79             throw new RuntimeException(e);
80         } catch (NoSuchMethodException e) {
81             throw new RuntimeException(e);
82         } catch (IllegalAccessException e) {
83             throw new RuntimeException(e);
84         }
85     }
86 
87     /**
88      * Closes an HttpClient.
89      */
close(HttpClient client)90     public static void close(HttpClient client) {
91         // AndroidHttpClient is available on all platform releases,
92         // but is hidden until API Level 8
93         try {
94             Class<?> clazz = client.getClass();
95             Method method = clazz.getMethod("close", (Class<?>[]) null);
96             method.invoke(client, (Object[]) null);
97         } catch (InvocationTargetException e) {
98             throw new RuntimeException(e);
99         } catch (NoSuchMethodException e) {
100             throw new RuntimeException(e);
101         } catch (IllegalAccessException e) {
102             throw new RuntimeException(e);
103         }
104     }
105 
106     private static String sUserAgent = null;
107 
getUserAgent(Context context)108     private static String getUserAgent(Context context) {
109         if (sUserAgent == null) {
110             PackageInfo pi;
111             try {
112                 pi = context.getPackageManager().getPackageInfo(
113                         context.getPackageName(), 0);
114             } catch (NameNotFoundException e) {
115                 throw new IllegalStateException("getPackageInfo failed");
116             }
117             sUserAgent = String.format("%s/%s; %s/%s/%s/%s; %s/%s/%s",
118                     pi.packageName,
119                     pi.versionName,
120                     Build.BRAND,
121                     Build.DEVICE,
122                     Build.MODEL,
123                     Build.ID,
124                     Build.VERSION.SDK_INT,
125                     Build.VERSION.RELEASE,
126                     Build.VERSION.INCREMENTAL);
127         }
128         return sUserAgent;
129     }
130 
HttpClientFactory()131     private HttpClientFactory() {
132     }
133 }
134