// 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);
}