普通文本  |  116行  |  4.04 KB

// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/instant/promo_counter.h"

#include "base/metrics/histogram.h"
#include "base/values.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"

// Pref keys. These are relative to pref_key_.
static const char* kShowKey = ".show";
static const char* kNumSessionsKey = ".num_sessions";
static const char* kInitialTimeKey = ".initial_time";

// Values used for histograms. These are relative to histogram_key_.
static const char* kHistogramHide = ".hide";
static const char* kHistogramMaxSessions = ".max_sessions";
static const char* kHistogramMaxTime = ".max_time";

PromoCounter::PromoCounter(Profile* profile,
                           const std::string& pref_key,
                           const std::string& histogram_key,
                           int max_sessions,
                           int max_days)
    : profile_(profile),
      pref_key_(pref_key),
      histogram_key_(histogram_key),
      max_sessions_(max_sessions),
      max_days_(max_days),
      did_init_(false),
      show_(false) {
}

PromoCounter::~PromoCounter() {
}

// static
void PromoCounter::RegisterUserPrefs(PrefService* prefs,
                                     const std::string& base_key) {
  prefs->RegisterBooleanPref((base_key + kShowKey).c_str(), true);
  prefs->RegisterIntegerPref((base_key + kNumSessionsKey).c_str(), 0);
  prefs->RegisterInt64Pref((base_key + kInitialTimeKey).c_str(), 0);
}

bool PromoCounter::ShouldShow(base::Time current_time) {
  if (!did_init_) {
    did_init_ = true;
    Init(current_time);
  }

  if (show_ && (current_time - initial_show_).InDays() >= max_days_)
    MaxTimeLapsed(current_time);

  return show_;
}

void PromoCounter::Hide() {
  show_ = false;
  did_init_ = true;
  UMA_HISTOGRAM_CUSTOM_COUNTS(histogram_key_ + kHistogramHide,
                              (base::Time::Now() - initial_show_).InHours(),
                              1, max_days_ * 24, 24);
  if (profile_->GetPrefs())
    profile_->GetPrefs()->SetBoolean((pref_key_ + kShowKey).c_str(), false);
}

void PromoCounter::Init(base::Time current_time) {
  PrefService* prefs = profile_->GetPrefs();
  if (!prefs)
    return;

  show_ = prefs->GetBoolean((pref_key_ + kShowKey).c_str());
  if (!show_)
    return;

  // The user hasn't chosen to opt in or out. Only show the opt-in if it's
  // less than max_days_ since we first showed the opt-in, or the user hasn't
  // launched the profile max_sessions_ times.
  int session_count = prefs->GetInteger((pref_key_ + kNumSessionsKey).c_str());
  int64 initial_show_int =
      prefs->GetInt64((pref_key_ + kInitialTimeKey).c_str());
  initial_show_ = base::Time(base::Time::FromInternalValue(initial_show_int));
  if (initial_show_int == 0 || initial_show_ > current_time) {
    initial_show_ = base::Time::Now();
    prefs->SetInt64((pref_key_ + kInitialTimeKey).c_str(),
                    initial_show_.ToInternalValue());
  }
  if (session_count >= max_sessions_) {
    // Time check is handled in ShouldShow.
    MaxSessionsEncountered(current_time);
  } else {
    // Up the session count.
    prefs->SetInteger((pref_key_ + kNumSessionsKey).c_str(), session_count + 1);
  }
}

void PromoCounter::MaxSessionsEncountered(base::Time current_time) {
  show_ = false;
  UMA_HISTOGRAM_CUSTOM_COUNTS(histogram_key_ + kHistogramMaxSessions,
                              (current_time - initial_show_).InHours(), 1,
                              max_days_ * 24, 24);
  if (profile_->GetPrefs())
    profile_->GetPrefs()->SetBoolean((pref_key_ + kShowKey).c_str(), false);
}

void PromoCounter::MaxTimeLapsed(base::Time current_time) {
  show_ = false;
  UMA_HISTOGRAM_CUSTOM_COUNTS(histogram_key_ + kHistogramMaxTime,
                              (current_time - initial_show_).InHours(),
                              1, max_days_ * 24, 24);
  if (profile_->GetPrefs())
    profile_->GetPrefs()->SetBoolean((pref_key_ + kShowKey).c_str(), false);
}