152e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET/*
252e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Copyright (C) 2015 The Android Open Source Project
352e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET *
452e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Licensed under the Apache License, Version 2.0 (the "License");
552e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * you may not use this file except in compliance with the License.
652e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * You may obtain a copy of the License at
752e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET *
852e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET *      http://www.apache.org/licenses/LICENSE-2.0
952e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET *
1052e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Unless required by applicable law or agreed to in writing, software
1152e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * distributed under the License is distributed on an "AS IS" BASIS,
1252e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * See the License for the specific language governing permissions and
1452e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * limitations under the License.
1552e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET */
1665b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov
17d83ca801ad65ae389d20e5dd3e30aed6f285ebf4Bertrand SIMONNET#include "metrics/metrics_library.h"
1865b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov
1941c54505234bf8baee7d5b1bab54758bd7893877Luigi Semenzato#include <base/logging.h>
2041c54505234bf8baee7d5b1bab54758bd7893877Luigi Semenzato#include <base/strings/stringprintf.h>
216b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET#include <binder/IServiceManager.h>
2265b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov#include <errno.h>
2365b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov#include <sys/file.h>
244c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter#include <sys/stat.h>
256b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET#include <utils/String16.h>
264fcb2ac28fe7c7010c72844b911f869baaf798d9Darin Petkov
274fcb2ac28fe7c7010c72844b911f869baaf798d9Darin Petkov#include <cstdio>
284fcb2ac28fe7c7010c72844b911f869baaf798d9Darin Petkov#include <cstring>
2965b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov
306b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET#include "android/brillo/metrics/IMetricsd.h"
31bd3505e634cf8f6a8cb95f2b352670a0890c06f2Bertrand SIMONNET#include "constants.h"
32e10b548cf5e0f51f0de08e0c984b23b38640e0f9Chris Masone
33326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzatostatic const char kCrosEventHistogramName[] = "Platform.CrOSEvent";
34326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzatostatic const int kCrosEventHistogramMax = 100;
356b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETstatic const char kMetricsServiceName[] = "android.brillo.metrics.IMetricsd";
3665b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov
376844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang/* Add new cros events here.
386844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang *
396844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang * The index of the event is sent in the message, so please do not
406844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang * reorder the names.
416844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang */
426844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Changstatic const char *kCrosEventNames[] = {
436844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang  "ModemManagerCommandSendFailure",  // 0
446844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang  "HwWatchdogReboot",  // 1
456844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang  "Cras.NoCodecsFoundAtBoot",  // 2
466e55c11537d0625e6d6a024db4b80ab942081022Darren Krahn  "Chaps.DatabaseCorrupted",  // 3
476e55c11537d0625e6d6a024db4b80ab942081022Darren Krahn  "Chaps.DatabaseRepairFailure",  // 4
486e55c11537d0625e6d6a024db4b80ab942081022Darren Krahn  "Chaps.DatabaseCreateFailure",  // 5
4986830baa179ee66b2551122dc587057dfd1cdd05Darren Krahn  "Attestation.OriginSpecificExhausted",  // 6
50e57398a6ee0afc0185aabedc66d14c91c09d33deLuigi Semenzato  "SpringPowerSupply.Original.High",  // 7
51e57398a6ee0afc0185aabedc66d14c91c09d33deLuigi Semenzato  "SpringPowerSupply.Other.High",  // 8
52e8fd968af0f72e9d80f34081a75048d5fdfb14b0Luigi Semenzato  "SpringPowerSupply.Original.Low",  // 9
53e8fd968af0f72e9d80f34081a75048d5fdfb14b0Luigi Semenzato  "SpringPowerSupply.ChargerIdle",  // 10
5409a15fa95486f7b6a3197366241827a23392918bDarren Krahn  "TPM.NonZeroDictionaryAttackCounter",  // 11
55538e2090cdac67acfa725a87ac94a75042bbdd61Luigi Semenzato  "TPM.EarlyResetDuringCommand",  // 12
566844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang};
576844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang
586b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETusing android::binder::Status;
596b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETusing android::brillo::metrics::IMetricsd;
606b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETusing android::String16;
616b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET
622765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNETMetricsLibrary::MetricsLibrary() {}
63fd158294daa6061037ca564e21818a49ee56fc94Daniel EratMetricsLibrary::~MetricsLibrary() {}
64fd158294daa6061037ca564e21818a49ee56fc94Daniel Erat
65eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter// We take buffer and buffer_size as parameters in order to simplify testing
66eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter// of various alignments of the |device_name| with |buffer_size|.
67eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixterbool MetricsLibrary::IsDeviceMounted(const char* device_name,
68eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter                                     const char* mounts_file,
69eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter                                     char* buffer,
70eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter                                     int buffer_size,
71eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter                                     bool* result) {
7214595032aa4781d430caff2eed02b9ce74132749Alex Vakulenko  if (buffer == nullptr || buffer_size < 1)
73eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter    return false;
74eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  int mounts_fd = open(mounts_file, O_RDONLY);
75eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  if (mounts_fd < 0)
76eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter    return false;
77eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  // match_offset describes:
78eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  //   -1 -- not beginning of line
79eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  //   0..strlen(device_name)-1 -- this offset in device_name is next to match
80eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  //   strlen(device_name) -- matched full name, just need a space.
81eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  int match_offset = 0;
82eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  bool match = false;
83eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  while (!match) {
84eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter    int read_size = read(mounts_fd, buffer, buffer_size);
85eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter    if (read_size <= 0) {
86eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      if (errno == -EINTR)
87eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        continue;
88eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      break;
89eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter    }
90eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter    for (int i = 0; i < read_size; ++i) {
91eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      if (buffer[i] == '\n') {
92eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        match_offset = 0;
93eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        continue;
94eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      }
95eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      if (match_offset < 0) {
96eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        continue;
97eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      }
98eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      if (device_name[match_offset] == '\0') {
99eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        if (buffer[i] == ' ') {
100eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter          match = true;
101eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter          break;
102eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        }
103eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        match_offset = -1;
104eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        continue;
105eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      }
106eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter
107eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      if (buffer[i] == device_name[match_offset]) {
108eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        ++match_offset;
109eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      } else {
110eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter        match_offset = -1;
111eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter      }
112eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter    }
113eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  }
114eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  close(mounts_fd);
115eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  *result = match;
116eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  return true;
117eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter}
118eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter
119eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixterbool MetricsLibrary::IsGuestMode() {
120eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  char buffer[256];
121eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  bool result = false;
122eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  if (!IsDeviceMounted("guestfs",
123eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter                       "/proc/mounts",
124eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter                       buffer,
125eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter                       sizeof(buffer),
126eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter                       &result)) {
127eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter    return false;
128eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter  }
1299f1a774c671a03c1849c9bf1b7c31f9fe7995f73Arkaitz Ruiz Alvarez  return result && (access("/var/run/state/logged-in", F_OK) == 0);
130eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter}
131eafbbdf3df81cdbdb50b4c676e7d55dbdd9b30a3Ken Mixter
1326b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETbool MetricsLibrary::CheckService() {
1336b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  if (metricsd_proxy_.get() &&
1346b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET      android::IInterface::asBinder(metricsd_proxy_)->isBinderAlive())
1356b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET    return true;
1366b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET
1376b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  const String16 name(kMetricsServiceName);
1386b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  metricsd_proxy_ = android::interface_cast<IMetricsd>(
1396b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET      android::defaultServiceManager()->checkService(name));
1406b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  return metricsd_proxy_.get();
1416b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET}
1426b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET
1434c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixterbool MetricsLibrary::AreMetricsEnabled() {
14470b7abd84fc7b101d46a3f01d543b3fb3a9c268aJulian Pastarmov  static struct stat stat_buffer;
14514595032aa4781d430caff2eed02b9ce74132749Alex Vakulenko  time_t this_check_time = time(nullptr);
146a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET  if (!use_caching_ || this_check_time != cached_enabled_time_) {
1474c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter    cached_enabled_time_ = this_check_time;
1482765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET    cached_enabled_ = stat(consent_file_.value().data(), &stat_buffer) >= 0;
1494c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter  }
1504c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter  return cached_enabled_;
1514c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter}
15211b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov
153fc91b42a5e9b2813f9614fbcd3b5fe97a6a01781Darin Petkovvoid MetricsLibrary::Init() {
1549d3a4aeae2bd59ebe72fca44c4fa508c1e9f1333Bertrand SIMONNET  base::FilePath dir = base::FilePath(metrics::kSharedMetricsDirectory);
1552765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET  consent_file_ = dir.Append(metrics::kConsentFileName);
1563598d951a6c7fade22b50c0af8b51e28c62fc1eaBertrand SIMONNET  cached_enabled_ = false;
1573598d951a6c7fade22b50c0af8b51e28c62fc1eaBertrand SIMONNET  cached_enabled_time_ = 0;
158a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET  use_caching_ = true;
159a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET}
160a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET
161a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNETvoid MetricsLibrary::InitWithNoCaching() {
162a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET  Init();
163a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET  use_caching_ = false;
164fc91b42a5e9b2813f9614fbcd3b5fe97a6a01781Darin Petkov}
165fc91b42a5e9b2813f9614fbcd3b5fe97a6a01781Darin Petkov
1662765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNETvoid MetricsLibrary::InitForTest(const base::FilePath& metrics_directory) {
1672765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET  consent_file_ = metrics_directory.Append(metrics::kConsentFileName);
1683598d951a6c7fade22b50c0af8b51e28c62fc1eaBertrand SIMONNET  cached_enabled_ = false;
1693598d951a6c7fade22b50c0af8b51e28c62fc1eaBertrand SIMONNET  cached_enabled_time_ = 0;
170a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET  use_caching_ = true;
1711253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET}
1721253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET
1736b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETbool MetricsLibrary::SendToUMA(
1746b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET    const std::string& name, int sample, int min, int max, int nbuckets) {
1756b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  return CheckService() &&
1766b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET         metricsd_proxy_->recordHistogram(String16(name.c_str()), sample, min,
1776b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET                                          max, nbuckets)
1786b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET             .isOk();
17965b014683927aca25d5d7e62b4bdd46e19d46bfDarin Petkov}
1805b7dce1f609ca2a56928f88bedb31142c4b2d896Darin Petkov
1816b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETbool MetricsLibrary::SendEnumToUMA(const std::string& name,
1826b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET                                   int sample,
18321cd2c5a9fdbeec3cc312943cc373f8c2dce3b1fDarin Petkov                                   int max) {
1846b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  return CheckService() &&
1856b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET         metricsd_proxy_->recordLinearHistogram(String16(name.c_str()), sample,
1866b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET                                                max)
1876b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET             .isOk();
188ed82485c3be8fcab94cfb312c771b28896c4f30eDarin Petkov}
189ed82485c3be8fcab94cfb312c771b28896c4f30eDarin Petkov
190adc1c235378f6d80a5c11d5a1197524d5cd0bf51Nathan Bullockbool MetricsLibrary::SendBoolToUMA(const std::string& name, bool sample) {
1916b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  return CheckService() &&
1926b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET         metricsd_proxy_->recordLinearHistogram(String16(name.c_str()),
1936b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET                                                sample ? 1 : 0, 2)
1946b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET             .isOk();
195adc1c235378f6d80a5c11d5a1197524d5cd0bf51Nathan Bullock}
196adc1c235378f6d80a5c11d5a1197524d5cd0bf51Nathan Bullock
197a7ebeb3e8b2659e616b77989e4c8964d5188a8ecLuigi Semenzatobool MetricsLibrary::SendSparseToUMA(const std::string& name, int sample) {
1986b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  return CheckService() &&
1996b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET         metricsd_proxy_->recordSparseHistogram(String16(name.c_str()), sample)
2006b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET             .isOk();
201a7ebeb3e8b2659e616b77989e4c8964d5188a8ecLuigi Semenzato}
202a7ebeb3e8b2659e616b77989e4c8964d5188a8ecLuigi Semenzato
2036b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETbool MetricsLibrary::SendCrashToUMA(const char* crash_kind) {
2046b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET  return CheckService() &&
2056b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET         metricsd_proxy_->recordCrash(String16(crash_kind)).isOk();
206be2e13b32b9d079bed76019a63ff89bfb7a94f35Ken Mixter}
207b2f170970ebea7d7b6200761a5243224af536874Ken Mixter
208326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzatobool MetricsLibrary::SendCrosEventToUMA(const std::string& event) {
209788d3b63656d26938c9ea005e1bc82f230aa9b38Alex Vakulenko  for (size_t i = 0; i < arraysize(kCrosEventNames); i++) {
2106844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang    if (strcmp(event.c_str(), kCrosEventNames[i]) == 0) {
2116844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang      return SendEnumToUMA(kCrosEventHistogramName, i, kCrosEventHistogramMax);
2126844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang    }
213326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzato  }
2146844c06107726d45c76456c5e8fefe59a123fe79Chih-Chung Chang  return false;
215326842224051fd332b60c8039b7a43aa95f52120Luigi Semenzato}
216b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET
217b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNETbool MetricsLibrary::GetHistogramsDump(std::string* dump) {
218b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET  android::String16 temp_dump;
219b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET  if (!CheckService() ||
220b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET      !metricsd_proxy_->getHistogramsDump(&temp_dump).isOk()) {
221b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET    return false;
222b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET  }
223b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET
224b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET  *dump = android::String8(temp_dump).string();
225b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET  return true;
226b13527d14eacf6fbed4e5f7be8245755279c203eBertrand SIMONNET}
227