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