1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/feedback/feedback_profile_observer.h"
6
7#include "base/callback.h"
8#include "chrome/browser/chrome_notification_types.h"
9#include "chrome/browser/profiles/profile.h"
10#include "components/feedback/feedback_report.h"
11#include "components/feedback/feedback_uploader.h"
12#include "components/feedback/feedback_uploader_factory.h"
13#include "content/public/browser/browser_context.h"
14#include "content/public/browser/browser_thread.h"
15#include "content/public/browser/notification_service.h"
16
17using content::BrowserThread;
18
19static base::LazyInstance<feedback::FeedbackProfileObserver>::Leaky
20    g_feedback_profile_observer = LAZY_INSTANCE_INITIALIZER;
21
22namespace feedback {
23
24// static
25void FeedbackProfileObserver::Initialize() {
26  g_feedback_profile_observer.Get();
27}
28
29FeedbackProfileObserver::FeedbackProfileObserver() {
30  prefs_registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CREATED,
31                       content::NotificationService::AllSources());
32}
33
34FeedbackProfileObserver::~FeedbackProfileObserver() {
35  prefs_registrar_.RemoveAll();
36}
37
38void FeedbackProfileObserver::Observe(
39    int type,
40    const content::NotificationSource& source,
41    const content::NotificationDetails& details) {
42  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
43  DCHECK_EQ(chrome::NOTIFICATION_PROFILE_CREATED, type);
44
45  Profile* profile = content::Source<Profile>(source).ptr();
46  if (profile && !profile->IsOffTheRecord())
47    QueueUnsentReports(profile);
48}
49
50void FeedbackProfileObserver::QueueSingleReport(
51    feedback::FeedbackUploader* uploader,
52    const std::string& data) {
53  BrowserThread::PostTask(
54      BrowserThread::UI, FROM_HERE, base::Bind(&FeedbackUploader::QueueReport,
55                                               uploader->AsWeakPtr(), data));
56}
57
58void FeedbackProfileObserver::QueueUnsentReports(
59    content::BrowserContext* context) {
60  feedback::FeedbackUploader* uploader =
61      feedback::FeedbackUploaderFactory::GetForBrowserContext(context);
62  BrowserThread::PostBlockingPoolTask(FROM_HERE,
63      base::Bind(
64          &FeedbackReport::LoadReportsAndQueue,
65          uploader->GetFeedbackReportsPath(),
66          base::Bind(&FeedbackProfileObserver::QueueSingleReport, uploader)));
67}
68
69}  // namespace feedback
70