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