123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file. 423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)package org.chromium.net; 623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import android.content.Context; 823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import android.content.pm.PackageInfo; 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import android.content.pm.PackageManager; 1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import android.content.pm.PackageManager.NameNotFoundException; 1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import android.os.Build; 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import java.util.Locale; 1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/** 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * Constructs a User-Agent string. 1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) */ 1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)public final class UserAgent { 1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private static final Object sLock = new Object(); 2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private static int sVersionCode; 2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private UserAgent() { 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public static String from(Context context) { 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) StringBuilder builder = new StringBuilder(); 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Our package name and version. 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append(context.getPackageName()); 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append('/'); 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append(versionFromContext(context)); 3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The platform version. 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append(" (Linux; U; Android "); 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append(Build.VERSION.RELEASE); 3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append("; "); 3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append(Locale.getDefault().toString()); 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) String model = Build.MODEL; 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (model.length() > 0) { 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append("; "); 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append(model); 4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) String id = Build.ID; 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (id.length() > 0) { 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append("; Build/"); 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append(id); 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch builder.append("; Cronet/"); 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch builder.append(Version.CRONET_VERSION); 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) builder.append(')'); 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return builder.toString(); 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private static int versionFromContext(Context context) { 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) synchronized (sLock) { 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (sVersionCode == 0) { 6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PackageManager packageManager = context.getPackageManager(); 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) String packageName = context.getPackageName(); 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) try { 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PackageInfo packageInfo = packageManager.getPackageInfo( 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) packageName, 0); 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) sVersionCode = packageInfo.versionCode; 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } catch (NameNotFoundException e) { 7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) throw new IllegalStateException( 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) "Cannot determine package version"); 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return sVersionCode; 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 78