1// Copyright (c) 2012 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_UI_NETWORK_PROFILE_BUBBLE_H_
6#define CHROME_BROWSER_UI_NETWORK_PROFILE_BUBBLE_H_
7
8#include "base/basictypes.h"
9
10class Browser;
11class Profile;
12
13namespace base {
14class FilePath;
15}
16
17namespace user_prefs {
18class PrefRegistrySyncable;
19}
20
21// This class will try to detect if the profile is on a network share and if
22// this is the case notify the user with an info bubble.
23class NetworkProfileBubble {
24 public:
25  enum MetricNetworkedProfileCheck {
26   // Check was suppressed by command line flag.
27   METRIC_CHECK_SUPPRESSED,
28   // WTSQuerySessionInformation call failed.
29   METRIC_CHECK_FAILED,
30   // File access in profile dir failed.
31   METRIC_CHECK_IO_FAILED,
32
33   // Profile on a network share detected.
34   METRIC_PROFILE_ON_NETWORK,
35   // Profile not on a network share detected.
36   METRIC_PROFILE_NOT_ON_NETWORK,
37
38   // Check was suppressed because of remote session.
39   METRIC_REMOTE_SESSION,
40
41   // User has clicked learn more on the notification bubble.
42   METRIC_LEARN_MORE_CLICKED,
43   // User has clicked OK on the notification bubble.
44   METRIC_ACKNOWLEDGED,
45
46   METRIC_NETWORKED_PROFILE_CHECK_SIZE  // Must be the last.
47  };
48
49  // Returns true if the check for network located profile should be done. This
50  // test is only performed up to |kMaxWarnings| times in a row and then
51  // repeated after a period of silence that lasts |kSilenceDurationDays| days.
52  static bool ShouldCheckNetworkProfile(Profile* profile);
53
54  // Verifies that the profile folder is not located on a network share, and if
55  // it is shows the warning bubble to the user.
56  static void CheckNetworkProfile(const base::FilePath& profile_folder);
57
58  // Shows the notification bubble using the provided |browser|.
59  static void ShowNotification(Browser* browser);
60
61  static void SetNotificationShown(bool shown);
62
63  // Register the pref that controls whether the bubble should be shown anymore.
64  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
65
66  // Helper function wrapping the UMA_HISTOGRAM_ENUMERATION macro.
67  static void RecordUmaEvent(MetricNetworkedProfileCheck event);
68
69 private:
70  // This function creates the notification bubble, attaches it to the
71  // |anchor| View and then shows it to the user.
72  static void NotifyNetworkProfileDetected();
73
74  // Set to true once the notification check has been performed to avoid showing
75  // the notification more than once per browser run.
76  // This flag is not thread-safe and should only be accessed on the UI thread!
77  static bool notification_shown_;
78
79  DISALLOW_IMPLICIT_CONSTRUCTORS(NetworkProfileBubble);
80};
81
82#endif  // CHROME_BROWSER_UI_NETWORK_PROFILE_BUBBLE_H_
83