/*
 *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/modules/audio_device/android/build_info.h"

#include "webrtc/modules/utility/include/helpers_android.h"

namespace webrtc {

BuildInfo::BuildInfo()
    : j_environment_(JVM::GetInstance()->environment()),
      j_build_info_(JVM::GetInstance()->GetClass(
          "org/webrtc/voiceengine/BuildInfo")) {
}

std::string BuildInfo::GetStringFromJava(const char* name) {
  jmethodID id = j_build_info_.GetStaticMethodId(name, "()Ljava/lang/String;");
  jstring j_string = static_cast<jstring>(
      j_build_info_.CallStaticObjectMethod(id));
  return j_environment_->JavaToStdString(j_string);
}

std::string BuildInfo::GetDeviceModel() {
  return GetStringFromJava("getDeviceModel");
}

std::string BuildInfo::GetBrand() {
  return GetStringFromJava("getBrand");
}

std::string BuildInfo::GetDeviceManufacturer() {
  return GetStringFromJava("getDeviceManufacturer");
}

std::string BuildInfo::GetAndroidBuildId() {
  return GetStringFromJava("getAndroidBuildId");
}

std::string BuildInfo::GetBuildType() {
  return GetStringFromJava("getBuildType");
}

std::string BuildInfo::GetBuildRelease() {
  return GetStringFromJava("getBuildRelease");
}

std::string BuildInfo::GetSdkVersion() {
  return GetStringFromJava("getSdkVersion");
}

}  // namespace webrtc
