• 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 
5 #ifndef CHROME_BROWSER_CHROMEOS_APP_MODE_STARTUP_APP_LAUNCHER_H_
6 #define CHROME_BROWSER_CHROMEOS_APP_MODE_STARTUP_APP_LAUNCHER_H_
7 
8 #include <string>
9 
10 #include "base/basictypes.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/weak_ptr.h"
13 #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h"
14 #include "google_apis/gaia/oauth2_token_service.h"
15 
16 class Profile;
17 
18 namespace extensions {
19 class WebstoreStandaloneInstaller;
20 }
21 
22 namespace chromeos {
23 
24 // Launches the app at startup. The flow roughly looks like this:
25 // First call Initialize():
26 // - Checks if the app is installed in user profile (aka app profile);
27 // - If the app is installed, launch it and finish the flow;
28 // - If not installed, prepare to start install by checking network online
29 //   state;
30 // - If network gets online, start to install the app from web store;
31 // Report OnLauncherInitialized() or OnLaunchFailed() to observers:
32 // - If all goes good, launches the app and finish the flow;
33 class StartupAppLauncher
34     : public base::SupportsWeakPtr<StartupAppLauncher>,
35       public OAuth2TokenService::Observer {
36  public:
37   class Delegate {
38    public:
39     // Invoked to perform actual network initialization work. Note the app
40     // launch flow is paused until ContinueWithNetworkReady is called.
41     virtual void InitializeNetwork() = 0;
42 
43     virtual void OnLoadingOAuthFile() = 0;
44     virtual void OnInitializingTokenService() = 0;
45     virtual void OnInstallingApp() = 0;
46     virtual void OnReadyToLaunch() = 0;
47     virtual void OnLaunchSucceeded() = 0;
48     virtual void OnLaunchFailed(KioskAppLaunchError::Error error) = 0;
49 
50    protected:
~Delegate()51     virtual ~Delegate() {}
52   };
53 
54   StartupAppLauncher(Profile* profile,
55                      const std::string& app_id,
56                      Delegate* delegate);
57 
58   virtual ~StartupAppLauncher();
59 
60   // Prepares the environment for an app launch.
61   void Initialize();
62 
63   // Continues the initialization after network is ready.
64   void ContinueWithNetworkReady();
65 
66   // Launches the app after the initialization is successful.
67   void LaunchApp();
68 
69  private:
70   // OAuth parameters from /home/chronos/kiosk_auth file.
71   struct KioskOAuthParams {
72     std::string refresh_token;
73     std::string client_id;
74     std::string client_secret;
75   };
76 
77   void OnLaunchSuccess();
78   void OnLaunchFailure(KioskAppLaunchError::Error error);
79 
80   void MaybeInstall();
81 
82   // Callbacks from ExtensionUpdater.
83   void OnUpdateCheckFinished();
84 
85   void BeginInstall();
86   void InstallCallback(bool success, const std::string& error);
87   void OnReadyToLaunch();
88   void UpdateAppData();
89 
90   void InitializeTokenService();
91   void InitializeNetwork();
92 
93   void StartLoadingOAuthFile();
94   static void LoadOAuthFileOnBlockingPool(KioskOAuthParams* auth_params);
95   void OnOAuthFileLoaded(KioskOAuthParams* auth_params);
96 
97   // OAuth2TokenService::Observer overrides.
98   virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE;
99   virtual void OnRefreshTokensLoaded() OVERRIDE;
100 
101   Profile* profile_;
102   const std::string app_id_;
103   Delegate* delegate_;
104   bool install_attempted_;
105   bool ready_to_launch_;
106 
107   scoped_refptr<extensions::WebstoreStandaloneInstaller> installer_;
108   KioskOAuthParams auth_params_;
109 
110   DISALLOW_COPY_AND_ASSIGN(StartupAppLauncher);
111 };
112 
113 }  // namespace chromeos
114 
115 #endif  // CHROME_BROWSER_CHROMEOS_APP_MODE_STARTUP_APP_LAUNCHER_H_
116