1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.net;
7 import android.content.Context;
8 import android.content.pm.PackageInfo;
9 import android.content.pm.PackageManager;
10 import android.content.pm.PackageManager.NameNotFoundException;
11 import android.os.Build;
13 import java.util.Locale;
16 * Constructs a User-Agent string.
18 public final class UserAgent {
19 private static final Object sLock = new Object();
21 private static int sVersionCode;
26 public static String from(Context context) {
27 StringBuilder builder = new StringBuilder();
29 // Our package name and version.
30 builder.append(context.getPackageName());
32 builder.append(versionFromContext(context));
34 // The platform version.
35 builder.append(" (Linux; U; Android ");
36 builder.append(Build.VERSION.RELEASE);
38 builder.append(Locale.getDefault().toString());
40 String model = Build.MODEL;
41 if (model.length() > 0) {
43 builder.append(model);
47 if (id.length() > 0) {
48 builder.append("; Build/");
52 builder.append("; Cronet/");
53 builder.append(Version.CRONET_VERSION);
57 return builder.toString();
60 private static int versionFromContext(Context context) {
61 synchronized (sLock) {
62 if (sVersionCode == 0) {
63 PackageManager packageManager = context.getPackageManager();
64 String packageName = context.getPackageName();
66 PackageInfo packageInfo = packageManager.getPackageInfo(
68 sVersionCode = packageInfo.versionCode;
69 } catch (NameNotFoundException e) {
70 throw new IllegalStateException(
71 "Cannot determine package version");