1// Copyright (c) 2012 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.
4
5#ifndef BASE_ANDROID_BUILD_INFO_H_
6#define BASE_ANDROID_BUILD_INFO_H_
7
8#include <jni.h>
9
10#include <string>
11
12#include "base/base_export.h"
13#include "base/macros.h"
14#include "base/memory/singleton.h"
15
16namespace base {
17namespace android {
18
19// This enumeration maps to the values returned by BuildInfo::sdk_int(),
20// indicating the Android release associated with a given SDK version.
21enum SdkVersion {
22  SDK_VERSION_JELLY_BEAN = 16,
23  SDK_VERSION_JELLY_BEAN_MR1 = 17,
24  SDK_VERSION_JELLY_BEAN_MR2 = 18,
25  SDK_VERSION_KITKAT = 19,
26  SDK_VERSION_KITKAT_WEAR = 20,
27  SDK_VERSION_LOLLIPOP = 21,
28  SDK_VERSION_LOLLIPOP_MR1 = 22,
29  SDK_VERSION_MARSHMALLOW = 23,
30  SDK_VERSION_NOUGAT = 24
31};
32
33// BuildInfo is a singleton class that stores android build and device
34// information. It will be called from Android specific code and gets used
35// primarily in crash reporting.
36
37// It is also used to store the last java exception seen during JNI.
38// TODO(nileshagrawal): Find a better place to store this info.
39class BASE_EXPORT BuildInfo {
40 public:
41
42  ~BuildInfo() {}
43
44  // Static factory method for getting the singleton BuildInfo instance.
45  // Note that ownership is not conferred on the caller and the BuildInfo in
46  // question isn't actually freed until shutdown. This is ok because there
47  // should only be one instance of BuildInfo ever created.
48  static BuildInfo* GetInstance();
49
50  // Const char* is used instead of std::strings because these values must be
51  // available even if the process is in a crash state. Sadly
52  // std::string.c_str() doesn't guarantee that memory won't be allocated when
53  // it is called.
54  const char* device() const {
55    return device_;
56  }
57
58  const char* manufacturer() const {
59    return manufacturer_;
60  }
61
62  const char* model() const {
63    return model_;
64  }
65
66  const char* brand() const {
67    return brand_;
68  }
69
70  const char* android_build_id() const {
71    return android_build_id_;
72  }
73
74  const char* android_build_fp() const {
75    return android_build_fp_;
76  }
77
78  const char* gms_version_code() const {
79    return gms_version_code_;
80  }
81
82  const char* package_version_code() const {
83    return package_version_code_;
84  }
85
86  const char* package_version_name() const {
87    return package_version_name_;
88  }
89
90  const char* package_label() const {
91    return package_label_;
92  }
93
94  const char* package_name() const {
95    return package_name_;
96  }
97
98  const char* build_type() const {
99    return build_type_;
100  }
101
102  int sdk_int() const {
103    return sdk_int_;
104  }
105
106  const char* java_exception_info() const {
107    return java_exception_info_;
108  }
109
110  void SetJavaExceptionInfo(const std::string& info);
111
112  void ClearJavaExceptionInfo();
113
114 private:
115  friend struct BuildInfoSingletonTraits;
116
117  explicit BuildInfo(JNIEnv* env);
118
119  // Const char* is used instead of std::strings because these values must be
120  // available even if the process is in a crash state. Sadly
121  // std::string.c_str() doesn't guarantee that memory won't be allocated when
122  // it is called.
123  const char* const device_;
124  const char* const manufacturer_;
125  const char* const model_;
126  const char* const brand_;
127  const char* const android_build_id_;
128  const char* const android_build_fp_;
129  const char* const gms_version_code_;
130  const char* const package_version_code_;
131  const char* const package_version_name_;
132  const char* const package_label_;
133  const char* const package_name_;
134  const char* const build_type_;
135  const int sdk_int_;
136  // This is set via set_java_exception_info, not at constructor time.
137  const char* java_exception_info_;
138
139  DISALLOW_COPY_AND_ASSIGN(BuildInfo);
140};
141
142}  // namespace android
143}  // namespace base
144
145#endif  // BASE_ANDROID_BUILD_INFO_H_
146