• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CHROME_BROWSER_CHROMEOS_FIRST_RUN_DRIVE_FIRST_RUN_CONTROLLER_H_
5 #define CHROME_BROWSER_CHROMEOS_FIRST_RUN_DRIVE_FIRST_RUN_CONTROLLER_H_
6 
7 #include "base/basictypes.h"
8 #include "base/observer_list.h"
9 #include "base/timer/timer.h"
10 #include "chrome/browser/profiles/profile.h"
11 
12 namespace chromeos {
13 
14 class DriveWebContentsManager;
15 
16 // This class is responsible for kicking off the Google Drive offline
17 // initialization process. There is an initial delay to avoid contention when
18 // the session starts. DriveFirstRunController will manage its own lifetime and
19 // destroy itself when the initialization succeeds or fails.
20 class DriveFirstRunController {
21  public:
22   // This enum is used for UMA metrics. Keep the fields in the same order as
23   // the "CrosEnableDriveOfflineOutcome" enum in histograms.xml.
24   enum UMAOutcome {
25     OUTCOME_OFFLINE_ENABLED,
26     OUTCOME_WEB_CONTENTS_TIMED_OUT,
27     OUTCOME_WEB_CONTENTS_LOAD_FAILED,
28     OUTCOME_WRONG_USER_TYPE,
29     OUTCOME_APP_NOT_INSTALLED,
30     OUTCOME_BACKGROUND_PAGE_EXISTS,
31     OUTCOME_MAX,
32   };
33 
34   class Observer {
35    public:
36     // Called when enabling offline mode times out. OnCompletion will be called
37     // immediately afterwards.
38     virtual void OnTimedOut() = 0;
39 
40     // Called when the first run flow finishes, informing the observer of
41     // success or failure.
42     virtual void OnCompletion(bool success) = 0;
43 
44    protected:
~Observer()45     virtual ~Observer() {}
46   };
47 
48   explicit DriveFirstRunController(Profile* profile);
49   ~DriveFirstRunController();
50 
51   // Starts the process to enable offline mode for the user's Drive account.
52   void EnableOfflineMode();
53 
54   // Manages observers of the first run flow.
55   void AddObserver(Observer* observer);
56   void RemoveObserver(Observer* observer);
57 
58   // Set delay times for testing purposes.
59   void SetDelaysForTest(int initial_delay_secs, int timeout_secs);
60 
61   // Set the app id and endpoint url for testing purposes.
62   void SetAppInfoForTest(const std::string& app_id,
63                          const std::string& endpoint_url);
64 
65  private:
66   // Used as a callback to indicate whether the offline initialization
67   // succeeds or fails.
68   void OnOfflineInit(bool success, UMAOutcome outcome);
69 
70   // Called when timed out waiting for offline initialization to complete.
71   void OnWebContentsTimedOut();
72 
73   // Creates and shows a system notification when enable offline succeeds.
74   void ShowNotification();
75 
76   // Cleans up internal state and schedules self for deletion.
77   void CleanUp();
78 
79   Profile* profile_;
80   scoped_ptr<DriveWebContentsManager> web_contents_manager_;
81   base::OneShotTimer<DriveFirstRunController> web_contents_timer_;
82   base::OneShotTimer<DriveFirstRunController> initial_delay_timer_;
83   bool started_;
84   ObserverList<Observer> observer_list_;
85 
86   int initial_delay_secs_;
87   int web_contents_timeout_secs_;
88   std::string drive_offline_endpoint_url_;
89   std::string drive_hosted_app_id_;
90 
91   DISALLOW_COPY_AND_ASSIGN(DriveFirstRunController);
92 };
93 
94 }  // namespace chromeos
95 
96 #endif  // CHROME_BROWSER_CHROMEOS_FIRST_RUN_DRIVE_FIRST_RUN_CONTROLLER_H_
97