Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Unified Diff: chrome/browser/chromeos/first_run/goodies_displayer.cc

Issue 1308833004: Show Goodies page to new Chromebook users (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change delegate from interface to implementation Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/first_run/goodies_displayer.cc
diff --git a/chrome/browser/chromeos/first_run/goodies_displayer.cc b/chrome/browser/chromeos/first_run/goodies_displayer.cc
new file mode 100644
index 0000000000000000000000000000000000000000..afa5dbb2a0c69d12f026ca037501fed486fa7204
--- /dev/null
+++ b/chrome/browser/chromeos/first_run/goodies_displayer.cc
@@ -0,0 +1,116 @@
+// Copyright 2015 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/chromeos/first_run/goodies_displayer.h"
+
+#include "base/files/file_util.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/login/session/user_session_manager.h"
+#include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/prefs/pref_service_syncable.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
+#include "chrome/common/pref_names.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace chromeos {
+namespace first_run {
+
+namespace {
+
+// ChromeOS Goodies page for device's first New Window.
+const char kGoodiesURL[] = "https://www.google.com/chrome/devices/goodies.html";
+
+// Max days after initial login that we're willing to show Goodies.
+static const int kMaxDaysAfterOobeForGoodies = 14;
+
+// Checks timestamp on OOBE Complete flag file. kCanShowOobeGoodiesPage
+// defaults to |true|; we set it to |false| (return |false|) for any device over
+// kMaxDaysAfterOobeForGoodies days old, to avoid showing it after update on
+// older devices.
+bool CheckGoodiesPrefAgainstOobeTimestamp(
achuithb 2015/09/18 19:05:52 Make this a private method of Delegate
+ GoodiesDisplayer::Delegate* delegate) {
+ DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
+ return delegate->GetTimeSinceOobe() <=
+ base::TimeDelta::FromDays(kMaxDaysAfterOobeForGoodies);
+}
+
+// Callback into main thread to set pref to |false| if too long since oobe, or
+// to create GoodiesDisplayer otherwise.
+void UpdateGoodiesPrefCantShow(GoodiesDisplayer::Delegate* delegate,
achuithb 2015/09/18 19:05:51 Make this a private method of Delegate
+ bool can_show_goodies) {
+ if (can_show_goodies) {
+ delegate->CreateGoodiesDisplayer();
achuithb 2015/09/18 19:05:52 Inline the implementation of CreateGoodiesDisplaye
+ } else {
+ g_browser_process->local_state()->SetBoolean(prefs::kCanShowOobeGoodiesPage,
+ false);
+ }
+}
+
+} // namespace
+
+GoodiesDisplayer::Delegate::Delegate() {}
+
+GoodiesDisplayer::Delegate::~Delegate() {}
+
+void GoodiesDisplayer::Delegate::CreateGoodiesDisplayer() {
+ if (!goodies_displayer_)
+ goodies_displayer_.reset(new first_run::GoodiesDisplayer(this));
+}
+
+void GoodiesDisplayer::Delegate::DestroyGoodiesDisplayer() {
+ goodies_displayer_.reset();
+}
+
+base::TimeDelta GoodiesDisplayer::Delegate::GetTimeSinceOobe() {
+ DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
+ return StartupUtils::GetTimeSinceOobeFlagFileCreation();
+}
+
+GoodiesDisplayer::GoodiesDisplayer(Delegate* delegate) : delegate_(delegate) {
+ BrowserList::AddObserver(this);
+}
+
+GoodiesDisplayer::~GoodiesDisplayer() {}
+
+// If Goodies page hasn't been shown yet, and Chromebook isn't too old, create
+// GoodiesDisplayer to observe BrowserList.
+void GoodiesDisplayer::Init(Delegate* delegate) {
achuithb 2015/09/18 19:05:52 Make this a non-static method
+ if (g_browser_process->local_state()->GetBoolean(
+ prefs::kCanShowOobeGoodiesPage))
+ base::PostTaskAndReplyWithResult(
+ content::BrowserThread::GetBlockingPool(), FROM_HERE,
+ base::Bind(&CheckGoodiesPrefAgainstOobeTimestamp, delegate),
achuithb 2015/09/18 19:05:52 use WeakFactory
+ base::Bind(&UpdateGoodiesPrefCantShow, delegate));
+}
+
+// If conditions enumerated below are met, this loads the Oobe Goodies page for
+// new Chromebooks; when appropriate, it uses pref to mark page as shown,
+// removes itself from BrowserListObservers, and deletes itself.
+void GoodiesDisplayer::OnBrowserSetLastActive(Browser* browser) {
+ // 1. Not guest or incognito session (keep observing).
+ if (browser->profile()->IsOffTheRecord())
+ return;
+
+ PrefService* local_state = g_browser_process->local_state();
+ // 2. Not previously shown, or otherwise marked as unavailable.
+ if (local_state->GetBoolean(prefs::kCanShowOobeGoodiesPage)) {
+ // 3. Device not enterprise enrolled.
+ if (!g_browser_process->platform_part()
+ ->browser_policy_connector_chromeos()
+ ->IsEnterpriseManaged())
+ chrome::AddTabAt(browser, GURL(kGoodiesURL), 2, false);
+
+ // Set to |false| whether enterprise enrolled or Goodies shown.
+ local_state->SetBoolean(prefs::kCanShowOobeGoodiesPage, false);
+ }
+
+ // Regardless of how we got here, we don't henceforth need to show Goodies.
+ BrowserList::RemoveObserver(this);
+ delegate_->DestroyGoodiesDisplayer();
+}
+
+} // namespace first_run
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698