app_sync_ui_state.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_ASH_APP_SYNC_UI_STATE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_ASH_APP_SYNC_UI_STATE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_observer.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/extension_registry_observer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppSyncUIStateObserver; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncService; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace extensions { 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ExtensionRegistry; 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AppSyncUIState watches app sync and installation and change its state 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// accordingly. Its status is for UI display only. It only watches for new 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// normal user profile (i.e. it does not watch for guest profile or exsiting 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// user profile) and lasts for at the most 1 minute. 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AppSyncUIState : public KeyedService, 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public ProfileSyncServiceObserver, 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public extensions::ExtensionRegistryObserver { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Status { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATUS_NORMAL, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATUS_SYNCING, // Syncing apps or installing synced apps. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATUS_TIMED_OUT, // Timed out when waiting for sync to finish. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the instance for the given |profile|. It's a convenience wrapper 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of AppSyncUIStateFactory::GetForProfile. Note this function returns 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL if ShouldObserveAppSyncForProfile returns false for |profile|. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AppSyncUIState* Get(Profile* profile); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |profile| should be watched for app syncing. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ShouldObserveAppSyncForProfile(Profile* profile); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit AppSyncUIState(Profile* profile); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AppSyncUIState(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObserver(AppSyncUIStateObserver* observer); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(AppSyncUIStateObserver* observer); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Status status() const { return status_; } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartObserving(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StopObserving(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetStatus(Status status); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks and sets app sync status. If sync has not setup, do nothing. If sync 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is completed and there is no pending synced extension install, sets 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // STATUS_SYNCING. Otherwise, sets STATUS_NORMAL. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckAppSync(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked when |max_syncing_status_timer_| fires. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnMaxSyncingTimer(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ProfileSyncServiceObserver overrides: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStateChanged() OVERRIDE; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // extensions::ExtensionRegistryObserver overrides: 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnExtensionLoaded( 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::BrowserContext* browser_context, 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const extensions::Extension* extension) OVERRIDE; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncService* sync_service_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Timer to limit how much time STATUS_SYNCING is allowed. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<AppSyncUIState> max_syncing_status_timer_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Status status_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<AppSyncUIStateObserver> observers_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::ExtensionRegistry* extension_registry_; 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AppSyncUIState); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_ASH_APP_SYNC_UI_STATE_H_ 93