// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_ANDROID_BUILD_INFO_H_
#define BASE_ANDROID_BUILD_INFO_H_

#include <jni.h>

#include <string>
#include <vector>

#include "base/android/android_info.h"
#include "base/base_export.h"
#include "base/memory/singleton.h"

namespace base::android {

// DEPRECATED: Please use android_info::SdkVersion.
//
// This enumeration maps to the values returned by BuildInfo::sdk_int(),
// indicating the Android release associated with a given SDK version.
enum SdkVersion {
  SDK_VERSION_JELLY_BEAN = android_info::SDK_VERSION_JELLY_BEAN,
  SDK_VERSION_JELLY_BEAN_MR1 = android_info::SDK_VERSION_JELLY_BEAN_MR1,
  SDK_VERSION_JELLY_BEAN_MR2 = android_info::SDK_VERSION_JELLY_BEAN_MR2,
  SDK_VERSION_KITKAT = android_info::SDK_VERSION_KITKAT,
  SDK_VERSION_KITKAT_WEAR = android_info::SDK_VERSION_KITKAT_WEAR,
  SDK_VERSION_LOLLIPOP = android_info::SDK_VERSION_LOLLIPOP,
  SDK_VERSION_LOLLIPOP_MR1 = android_info::SDK_VERSION_LOLLIPOP_MR1,
  SDK_VERSION_MARSHMALLOW = android_info::SDK_VERSION_MARSHMALLOW,
  SDK_VERSION_NOUGAT = android_info::SDK_VERSION_NOUGAT,
  SDK_VERSION_NOUGAT_MR1 = android_info::SDK_VERSION_NOUGAT_MR1,
  SDK_VERSION_OREO = android_info::SDK_VERSION_OREO,
  SDK_VERSION_O_MR1 = android_info::SDK_VERSION_O_MR1,
  SDK_VERSION_P = android_info::SDK_VERSION_P,
  SDK_VERSION_Q = android_info::SDK_VERSION_Q,
  SDK_VERSION_R = android_info::SDK_VERSION_R,
  SDK_VERSION_S = android_info::SDK_VERSION_S,
  SDK_VERSION_Sv2 = android_info::SDK_VERSION_Sv2,
  SDK_VERSION_T = android_info::SDK_VERSION_T,
  SDK_VERSION_U = android_info::SDK_VERSION_U,
  SDK_VERSION_V = android_info::SDK_VERSION_V,
};

// DEPRECATED: Use AndroidInfo, DeviceInfo or ApkInfo instead.
// These are more efficient because they only retrieve the data being queried.
//
// BuildInfo is a singleton class that stores android build and device
// information. It will be called from Android specific code and gets used
// primarily in crash reporting.
class BASE_EXPORT BuildInfo {
 public:
  BuildInfo(const BuildInfo&) = delete;
  BuildInfo& operator=(const BuildInfo&) = delete;

  ~BuildInfo();

  // Static factory method for getting the singleton BuildInfo instance.
  // Note that ownership is not conferred on the caller and the BuildInfo in
  // question isn't actually freed until shutdown. This is ok because there
  // should only be one instance of BuildInfo ever created.
  static BuildInfo* GetInstance();

  const std::string& device() const { return device_; }

  const std::string& manufacturer() const { return manufacturer_; }

  const std::string& model() const { return model_; }

  const std::string& brand() const { return brand_; }

  const std::string& android_build_id() const { return android_build_id_; }

  const std::string& android_build_fp() const { return android_build_fp_; }

  const std::string& gms_version_code() const;

  void set_gms_version_code_for_test(const std::string& gms_version_code);

  // The package name of the host app which has loaded WebView, retrieved from
  // the application context. In the context of the SDK Runtime, the package
  // name of the app that owns this particular instance of the SDK Runtime will
  // also be included. e.g.
  // com.google.android.sdksandbox:com:com.example.myappwithads
  const std::string& host_package_name() const { return host_package_name_; }

  // The application name (e.g. "Chrome"). For WebView, this is name of the
  // embedding app. In the context of the SDK Runtime, this is the name of the
  // app that owns this particular instance of the SDK Runtime.
  const std::string& host_version_code() const { return host_version_code_; }

  // By default: same as versionCode. For WebView: versionCode of the embedding
  // app. In the context of the SDK Runtime, this is the versionCode of the app
  // that owns this particular instance of the SDK Runtime.
  const std::string& host_package_label() const { return host_package_label_; }

  // The SHA256 of the public certificate used to sign the host application.
  // This will default to an empty string if we were unable to retrieve it.
  const std::string host_signing_cert_sha256();

  const std::string& package_version_code() const {
    return package_version_code_;
  }

  const std::string& package_version_name() const {
    return package_version_name_;
  }

  const std::string& package_name() const { return package_name_; }

  const std::string& resources_version() const { return resources_version_; }

  const std::string& build_type() const { return build_type_; }

  const std::string& board() const { return board_; }

  const std::string& installer_package_name() const {
    return installer_package_name_;
  }

  const std::string& abi_name() const { return abi_name_; }

  int sdk_int() const { return sdk_int_; }

  // Returns the targetSdkVersion of the currently running app. If called from a
  // library, this returns the embedding app's targetSdkVersion.
  //
  // This can only be compared to finalized SDK versions, never against
  // pre-release Android versions. For pre-release Android versions, see the
  // targetsAtLeast*() methods in BuildInfo.java.
  int target_sdk_version() const { return target_sdk_version_; }

  bool is_debug_android() const { return is_debug_android_; }

  bool is_tv() const { return is_tv_; }

  const std::string& version_incremental() const {
    return version_incremental_;
  }

  const std::string& hardware() const { return hardware_; }

  bool is_automotive() const { return is_automotive_; }

  const std::string& codename() const { return codename_; }

  bool is_foldable() const { return is_foldable_; }

  bool is_desktop() const { return is_desktop_; }

  // Available only on Android T+.
  int32_t vulkan_deqp_level() const { return vulkan_deqp_level_; }

  // Available only on android S+. For S-, this method returns empty string.
  const std::string& soc_manufacturer() const { return soc_manufacturer_; }

  bool is_debug_app() const { return is_debug_app_; }

 private:
  friend struct BuildInfoSingletonTraits;

  BuildInfo();

  const std::string brand_;
  const std::string device_;
  const std::string android_build_id_;
  const std::string manufacturer_;
  const std::string model_;
  const int sdk_int_;
  const std::string build_type_;
  const std::string board_;
  const std::string host_package_name_;
  const std::string host_version_code_;
  const std::string host_package_label_;
  const std::string package_name_;
  const std::string package_version_code_;
  const std::string package_version_name_;
  const std::string android_build_fp_;
  const std::string installer_package_name_;
  const std::string abi_name_;
  const std::string resources_version_;
  const int target_sdk_version_;
  const bool is_debug_android_;
  const bool is_tv_;
  const std::string version_incremental_;
  const std::string hardware_;
  const bool is_automotive_;
  const std::string codename_;
  const int32_t vulkan_deqp_level_;
  const bool is_foldable_;
  const std::string soc_manufacturer_;
  const bool is_debug_app_;
  const bool is_desktop_;
};

}  // namespace base::android

#endif  // BASE_ANDROID_BUILD_INFO_H_
