1// Copyright 2013 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#ifndef CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_STATS_COLLECTOR_H_
6#define CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_STATS_COLLECTOR_H_
7
8#include <set>
9#include <string>
10
11#include "ui/message_center/message_center.h"
12#include "ui/message_center/message_center_observer.h"
13#include "ui/message_center/message_center_types.h"
14
15namespace message_center {
16class MessageCenter;
17}
18
19// MessageCenterStatsCollector sends both raw and per-notification statistics
20// to the UMA servers, if the user has opted in.  It observes the message center
21// to gather its data.
22class MessageCenterStatsCollector
23    : public message_center::MessageCenterObserver {
24 public:
25  enum NotificationActionType {
26    NOTIFICATION_ACTION_UNKNOWN,
27    NOTIFICATION_ACTION_ADD,
28    NOTIFICATION_ACTION_UPDATE,
29    NOTIFICATION_ACTION_CLICK,
30    NOTIFICATION_ACTION_BUTTON_CLICK,
31    NOTIFICATION_ACTION_DISPLAY,
32    NOTIFICATION_ACTION_CLOSE_BY_USER,
33    NOTIFICATION_ACTION_CLOSE_BY_SYSTEM,
34    // NOTE: Add new action types only immediately above this line. Also,
35    // make sure the enum list in tools/histogram/histograms.xml is
36    // updated with any change in here.
37    NOTIFICATION_ACTION_COUNT
38  };
39
40  explicit MessageCenterStatsCollector(
41      message_center::MessageCenter* message_center);
42  virtual ~MessageCenterStatsCollector();
43
44 private:
45  // Represents the aggregate stats for each notification.
46  class NotificationStats {
47   public:
48    // Default constructor for map.
49    NotificationStats();
50
51    explicit NotificationStats(const std::string& id);
52    virtual ~NotificationStats();
53
54    // Called when we get an action from the message center.
55    void CollectAction(NotificationActionType type);
56
57    // Sends aggregate data to UMA.
58    void RecordAggregateStats();
59
60   private:
61    std::string id_;
62    bool actions_[NOTIFICATION_ACTION_COUNT];
63  };
64
65  // MessageCenterObserver
66  virtual void OnNotificationAdded(const std::string& notification_id) OVERRIDE;
67  virtual void OnNotificationRemoved(const std::string& notification_id,
68                                     bool by_user) OVERRIDE;
69  virtual void OnNotificationUpdated(
70      const std::string& notification_id) OVERRIDE;
71  virtual void OnNotificationClicked(
72      const std::string& notification_id) OVERRIDE;
73  virtual void OnNotificationButtonClicked(const std::string& notification_id,
74                                           int button_index) OVERRIDE;
75  virtual void OnNotificationDisplayed(
76      const std::string& notification_id,
77      const message_center::DisplaySource source) OVERRIDE;
78  virtual void OnCenterVisibilityChanged(
79      message_center::Visibility visibility) OVERRIDE;
80  virtual void OnQuietModeChanged(bool in_quiet_mode) OVERRIDE;
81
82  // Weak, global.
83  message_center::MessageCenter* message_center_;
84
85  typedef std::map<std::string,NotificationStats> StatsCollection;
86  StatsCollection stats_;
87
88  DISALLOW_COPY_AND_ASSIGN(MessageCenterStatsCollector);
89};
90
91#endif  // CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_STATS_COLLECTOR_H_
92