12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_APP_MODE_STARTUP_APP_LAUNCHER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_APP_MODE_STARTUP_APP_LAUNCHER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/install_observer.h" 16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Launches the app at startup. The flow roughly looks like this: 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// First call Initialize(): 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - Attempts to load oauth token file. Stores the loaded tokens in 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |auth_params_|. 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - Initialize token service and inject |auth_params_| if needed. 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - Initialize network if app is not installed or not offline_enabled. 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - If network is online, install or update the app as needed. 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - After the app is installed/updated, launch it and finish the flow; 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Report OnLauncherInitialized() or OnLaunchFailed() to observers: 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - If all goes good, launches the app and finish the flow; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass StartupAppLauncher : public base::SupportsWeakPtr<StartupAppLauncher>, 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public OAuth2TokenService::Observer, 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public extensions::InstallObserver, 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public KioskAppManagerObserver { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) class Delegate { 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Invoked to perform actual network initialization work. Note the app 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // launch flow is paused until ContinueWithNetworkReady is called. 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void InitializeNetwork() = 0; 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns true if Internet is online. 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool IsNetworkReady() = 0; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnLoadingOAuthFile() = 0; 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnInitializingTokenService() = 0; 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnInstallingApp() = 0; 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnReadyToLaunch() = 0; 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnLaunchSucceeded() = 0; 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnLaunchFailed(KioskAppLaunchError::Error error) = 0; 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool IsShowingNetworkConfigScreen() = 0; 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected: 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~Delegate() {} 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) }; 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StartupAppLauncher(Profile* profile, 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& app_id, 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool diagnostic_mode, 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Delegate* delegate); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~StartupAppLauncher(); 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Prepares the environment for an app launch. 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void Initialize(); 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Continues the initialization after network is ready. 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ContinueWithNetworkReady(); 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Launches the app after the initialization is successful. 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void LaunchApp(); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Restarts launcher; 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void RestartLauncher(); 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OAuth parameters from /home/chronos/kiosk_auth file. 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct KioskOAuthParams { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string refresh_token; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string client_id; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string client_secret; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnLaunchSuccess(); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnLaunchFailure(KioskAppLaunchError::Error error); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Callbacks from ExtensionUpdater. 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnUpdateCheckFinished(); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void BeginInstall(); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void OnReadyToLaunch(); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UpdateAppData(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void InitializeTokenService(); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void MaybeInitializeNetwork(); 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void MaybeLaunchApp(); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StartLoadingOAuthFile(); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void LoadOAuthFileOnBlockingPool(KioskOAuthParams* auth_params); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnOAuthFileLoaded(KioskOAuthParams* auth_params); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnKioskAppDataLoadStatusChanged(const std::string& app_id); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // OAuth2TokenService::Observer overrides. 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE; 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnRefreshTokensLoaded() OVERRIDE; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // extensions::InstallObserver overrides. 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnFinishCrxInstall(const std::string& extension_id, 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool success) OVERRIDE; 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // KioskAppManagerObserver overrides. 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnKioskExtensionLoadedInCache( 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& app_id) OVERRIDE; 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnKioskExtensionDownloadFailed( 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& app_id) OVERRIDE; 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string app_id_; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const bool diagnostic_mode_; 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Delegate* delegate_; 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool network_ready_handled_; 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int launch_attempt_; 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool ready_to_launch_; 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool wait_for_crx_update_; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) KioskOAuthParams auth_params_; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(StartupAppLauncher); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_APP_MODE_STARTUP_APP_LAUNCHER_H_ 136