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 "base/timer/timer.h" 14 #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h" 15 #include "chrome/browser/signin/oauth2_token_service.h" 16 #include "net/base/network_change_notifier.h" 17 #include "ui/base/events/event_handler.h" 18 19 class Profile; 20 21 namespace extensions { 22 class WebstoreStandaloneInstaller; 23 } 24 25 namespace chromeos { 26 27 // Launches the app at startup. The flow roughly looks like this: 28 // - Starts the app launch splash screen; 29 // - Checks if the app is installed in user profile (aka app profile); 30 // - If the app is installed, launch it and finish the flow; 31 // - If not installed, prepare to start install by checking network online 32 // state; 33 // - If network gets online in time, start to install the app from web store; 34 // - If all goes good, launches the app and finish the flow; 35 // If anything goes wrong, it exits app mode and goes back to login screen. 36 class StartupAppLauncher 37 : public base::SupportsWeakPtr<StartupAppLauncher>, 38 public OAuth2TokenService::Observer, 39 public net::NetworkChangeNotifier::NetworkChangeObserver, 40 public ui::EventHandler { 41 public: 42 StartupAppLauncher(Profile* profile, const std::string& app_id); 43 44 // Starts app launcher. If |skip_auth_setup| is set, we will skip 45 // TokenService initialization. 46 void Start(); 47 48 private: 49 // OAuth parameters from /home/chronos/kiosk_auth file. 50 struct KioskOAuthParams { 51 std::string refresh_token; 52 std::string client_id; 53 std::string client_secret; 54 }; 55 56 // Private dtor because this class manages its own lifetime. 57 virtual ~StartupAppLauncher(); 58 59 void Cleanup(); 60 void OnLaunchSuccess(); 61 void OnLaunchFailure(KioskAppLaunchError::Error error); 62 63 void Launch(); 64 65 void BeginInstall(); 66 void InstallCallback(bool success, const std::string& error); 67 68 void InitializeTokenService(); 69 void InitializeNetwork(); 70 71 void OnNetworkWaitTimedout(); 72 73 void StartLoadingOAuthFile(); 74 static void LoadOAuthFileOnBlockingPool(KioskOAuthParams* auth_params); 75 void OnOAuthFileLoaded(KioskOAuthParams* auth_params); 76 77 // OAuth2TokenService::Observer overrides. 78 virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE; 79 virtual void OnRefreshTokensLoaded() OVERRIDE; 80 81 // net::NetworkChangeNotifier::NetworkChangeObserver overrides: 82 virtual void OnNetworkChanged( 83 net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; 84 85 // ui::EventHandler overrides: 86 virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; 87 88 Profile* profile_; 89 const std::string app_id_; 90 91 int64 launch_splash_start_time_; 92 93 scoped_refptr<extensions::WebstoreStandaloneInstaller> installer_; 94 base::OneShotTimer<StartupAppLauncher> network_wait_timer_; 95 KioskOAuthParams auth_params_; 96 97 DISALLOW_COPY_AND_ASSIGN(StartupAppLauncher); 98 }; 99 100 } // namespace chromeos 101 102 #endif // CHROME_BROWSER_CHROMEOS_APP_MODE_STARTUP_APP_LAUNCHER_H_ 103