15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/build_info.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/scoped_java_ref.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/BuildInfo_jni.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The caller takes ownership of the returned const char*.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* StrDupJString(const base::android::JavaRef<jstring>& java_string) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string str = ConvertJavaStringToUTF8(java_string);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return strdup(str.c_str());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BuildInfoSingletonTraits {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static BuildInfo* New() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new BuildInfo(AttachCurrentThread());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Delete(BuildInfo* x) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We're leaking this type, see kRegisterAtExit.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const bool kRegisterAtExit = false;
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef NDEBUG
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const bool kAllowedToAccessOnNonjoinableThread = true;
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BuildInfo::BuildInfo(JNIEnv* env)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : device_(StrDupJString(Java_BuildInfo_getDevice(env))),
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      manufacturer_(StrDupJString(Java_BuildInfo_getDeviceManufacturer(env))),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      model_(StrDupJString(Java_BuildInfo_getDeviceModel(env))),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      brand_(StrDupJString(Java_BuildInfo_getBrand(env))),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      android_build_id_(StrDupJString(Java_BuildInfo_getAndroidBuildId(env))),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      android_build_fp_(StrDupJString(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Java_BuildInfo_getAndroidBuildFingerprint(env))),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      package_version_code_(StrDupJString(Java_BuildInfo_getPackageVersionCode(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          env, GetApplicationContext()))),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      package_version_name_(StrDupJString(Java_BuildInfo_getPackageVersionName(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          env, GetApplicationContext()))),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      package_label_(StrDupJString(Java_BuildInfo_getPackageLabel(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          env, GetApplicationContext()))),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      package_name_(StrDupJString(Java_BuildInfo_getPackageName(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          env, GetApplicationContext()))),
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      build_type_(StrDupJString(Java_BuildInfo_getBuildType(env))),
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sdk_int_(Java_BuildInfo_getSdkInt(env)),
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      java_exception_info_(NULL) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BuildInfo* BuildInfo::GetInstance() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Singleton<BuildInfo, BuildInfoSingletonTraits >::get();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BuildInfo::set_java_exception_info(const std::string& info) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!java_exception_info_) << "info should be set only once.";
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  java_exception_info_ = strndup(info.c_str(), 4096);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BuildInfo::RegisterBindings(JNIEnv* env) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace android
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
83