Home | History | Annotate | Download | only in ash
      1 // Copyright (c) 2012 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_UI_ASH_APP_SYNC_UI_STATE_H_
      6 #define CHROME_BROWSER_UI_ASH_APP_SYNC_UI_STATE_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/compiler_specific.h"
     10 #include "base/observer_list.h"
     11 #include "base/timer/timer.h"
     12 #include "chrome/browser/sync/profile_sync_service_observer.h"
     13 #include "components/browser_context_keyed_service/browser_context_keyed_service.h"
     14 #include "content/public/browser/notification_observer.h"
     15 #include "content/public/browser/notification_registrar.h"
     16 
     17 class AppSyncUIStateObserver;
     18 class Profile;
     19 class ProfileSyncService;
     20 
     21 // AppSyncUIState watches app sync and installation and change its state
     22 // accordingly. Its status is for UI display only. It only watches for new
     23 // normal user profile (i.e. it does not watch for guest profile or exsiting
     24 // user profile) and lasts for at the most 1 minute.
     25 class AppSyncUIState : public BrowserContextKeyedService,
     26                        public content::NotificationObserver,
     27                        public ProfileSyncServiceObserver {
     28  public:
     29   enum Status {
     30     STATUS_NORMAL,
     31     STATUS_SYNCING,    // Syncing apps or installing synced apps.
     32     STATUS_TIMED_OUT,  // Timed out when waiting for sync to finish.
     33   };
     34 
     35   // Returns the instance for the given |profile|. It's a convenience wrapper
     36   // of AppSyncUIStateFactory::GetForProfile. Note this function returns
     37   // NULL if ShouldObserveAppSyncForProfile returns false for |profile|.
     38   static AppSyncUIState* Get(Profile* profile);
     39 
     40   // Returns true if |profile| should be watched for app syncing.
     41   static bool ShouldObserveAppSyncForProfile(Profile* profile);
     42 
     43   explicit AppSyncUIState(Profile* profile);
     44   virtual ~AppSyncUIState();
     45 
     46   void AddObserver(AppSyncUIStateObserver* observer);
     47   void RemoveObserver(AppSyncUIStateObserver* observer);
     48 
     49   Status status() const { return status_; }
     50 
     51  private:
     52   void StartObserving();
     53   void StopObserving();
     54 
     55   void SetStatus(Status status);
     56 
     57   // Checks and sets app sync status. If sync has not setup, do nothing. If sync
     58   // is completed and there is no pending synced extension install, sets
     59   // STATUS_SYNCING. Otherwise, sets STATUS_NORMAL.
     60   void CheckAppSync();
     61 
     62   // Invoked when |max_syncing_status_timer_| fires.
     63   void OnMaxSyncingTimer();
     64 
     65   // content::NotificationObserver overrides:
     66   virtual void Observe(int type,
     67                        const content::NotificationSource& source,
     68                        const content::NotificationDetails& details) OVERRIDE;
     69 
     70   // ProfileSyncServiceObserver overrides:
     71   virtual void OnStateChanged() OVERRIDE;
     72 
     73   content::NotificationRegistrar registrar_;
     74 
     75   Profile* profile_;
     76   ProfileSyncService* sync_service_;
     77 
     78   // Timer to limit how much time STATUS_SYNCING is allowed.
     79   base::OneShotTimer<AppSyncUIState> max_syncing_status_timer_;
     80 
     81   Status status_;
     82   ObserverList<AppSyncUIStateObserver> observers_;
     83 
     84   DISALLOW_COPY_AND_ASSIGN(AppSyncUIState);
     85 };
     86 
     87 #endif  // CHROME_BROWSER_UI_ASH_APP_SYNC_UI_STATE_H_
     88