Home | History | Annotate | Download | only in screens
      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_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_
      6 #define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_
      7 
      8 #include <set>
      9 
     10 #include "base/callback.h"
     11 #include "base/compiler_specific.h"
     12 #include "base/gtest_prod_util.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "base/time/time.h"
     15 #include "base/timer/timer.h"
     16 #include "chrome/browser/chromeos/login/screens/update_screen_actor.h"
     17 #include "chrome/browser/chromeos/login/screens/wizard_screen.h"
     18 #include "chrome/browser/chromeos/net/network_portal_detector.h"
     19 #include "chromeos/dbus/update_engine_client.h"
     20 
     21 namespace chromeos {
     22 
     23 class ErrorScreen;
     24 class NetworkState;
     25 class ScreenObserver;
     26 
     27 // Controller for the update screen. It does not depend on the specific
     28 // implementation of the screen showing (Views of WebUI based), the dependency
     29 // is moved to the UpdateScreenActor instead.
     30 class UpdateScreen: public UpdateEngineClient::Observer,
     31                     public UpdateScreenActor::Delegate,
     32                     public WizardScreen,
     33                     public NetworkPortalDetector::Observer {
     34  public:
     35   UpdateScreen(ScreenObserver* screen_observer, UpdateScreenActor* actor);
     36   virtual ~UpdateScreen();
     37 
     38   // Overridden from WizardScreen.
     39   virtual void PrepareToShow() OVERRIDE;
     40   virtual void Show() OVERRIDE;
     41   virtual void Hide() OVERRIDE;
     42   virtual std::string GetName() const OVERRIDE;
     43 
     44   // UpdateScreenActor::Delegate implementation:
     45   virtual void CancelUpdate() OVERRIDE;
     46   virtual void OnActorDestroyed(UpdateScreenActor* actor) OVERRIDE;
     47   virtual void OnConnectToNetworkRequested(
     48       const std::string& service_path) OVERRIDE;
     49 
     50   // Starts network check. Made virtual to simplify mocking.
     51   virtual void StartNetworkCheck();
     52 
     53   // Reboot check delay get/set, in seconds.
     54   int reboot_check_delay() const { return reboot_check_delay_; }
     55   void SetRebootCheckDelay(int seconds);
     56 
     57   // Returns true if this instance is still active (i.e. has not been deleted).
     58   static bool HasInstance(UpdateScreen* inst);
     59 
     60   void SetIgnoreIdleStatus(bool ignore_idle_status);
     61 
     62   enum ExitReason {
     63      REASON_UPDATE_CANCELED = 0,
     64      REASON_UPDATE_INIT_FAILED,
     65      REASON_UPDATE_NON_CRITICAL,
     66      REASON_UPDATE_ENDED
     67   };
     68   // Reports update results to the ScreenObserver.
     69   virtual void ExitUpdate(ExitReason reason);
     70 
     71   // UpdateEngineClient::Observer implementation:
     72   virtual void UpdateStatusChanged(
     73       const UpdateEngineClient::Status& status) OVERRIDE;
     74 
     75   // NetworkPortalDetector::Observer implementation:
     76   virtual void OnPortalDetectionCompleted(
     77       const NetworkState* network,
     78       const NetworkPortalDetector::CaptivePortalState& state) OVERRIDE;
     79 
     80  private:
     81   FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestBasic);
     82   FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestUpdateAvailable);
     83   FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestAPReselection);
     84 
     85   enum State {
     86     STATE_IDLE = 0,
     87     STATE_FIRST_PORTAL_CHECK,
     88     STATE_UPDATE,
     89     STATE_ERROR
     90   };
     91 
     92   // Updates downloading stats (remaining time and downloading
     93   // progress) on the AU screen.
     94   void UpdateDownloadingStats(const UpdateEngineClient::Status& status);
     95 
     96   // Returns true if there is critical system update that requires installation
     97   // and immediate reboot.
     98   bool HasCriticalUpdate();
     99 
    100   // Timer notification handlers.
    101   void OnWaitForRebootTimeElapsed();
    102 
    103   // Checks that screen is shown, shows if not.
    104   void MakeSureScreenIsShown();
    105 
    106   // Returns an instance of the error screen.
    107   ErrorScreen* GetErrorScreen();
    108 
    109   void StartUpdateCheck();
    110   void ShowErrorMessage();
    111   void HideErrorMessage();
    112   void UpdateErrorMessage(
    113       const NetworkState* network,
    114       const NetworkPortalDetector::CaptivePortalStatus status);
    115   // Timer for the interval to wait for the reboot.
    116   // If reboot didn't happen - ask user to reboot manually.
    117   base::OneShotTimer<UpdateScreen> reboot_timer_;
    118 
    119   // Returns a static InstanceSet.
    120   typedef std::set<UpdateScreen*> InstanceSet;
    121   static InstanceSet& GetInstanceSet();
    122 
    123   // Current state of the update screen.
    124   State state_;
    125 
    126   // Time in seconds after which we decide that the device has not rebooted
    127   // automatically. If reboot didn't happen during this interval, ask user to
    128   // reboot device manually.
    129   int reboot_check_delay_;
    130 
    131   // True if in the process of checking for update.
    132   bool is_checking_for_update_;
    133   // Flag that is used to detect when update download has just started.
    134   bool is_downloading_update_;
    135   // If true, update deadlines are ignored.
    136   // Note, this is false by default.
    137   bool is_ignore_update_deadlines_;
    138   // Whether the update screen is shown.
    139   bool is_shown_;
    140   // Ignore fist IDLE status that is sent before update screen initiated check.
    141   bool ignore_idle_status_;
    142 
    143   // Keeps actor which is delegated with all showing operations.
    144   UpdateScreenActor* actor_;
    145 
    146   // Time of the first notification from the downloading stage.
    147   base::Time download_start_time_;
    148   double download_start_progress_;
    149 
    150   // Time of the last notification from the downloading stage.
    151   base::Time download_last_time_;
    152   double download_last_progress_;
    153 
    154   bool is_download_average_speed_computed_;
    155   double download_average_speed_;
    156 
    157   // True if there was no notification from NetworkPortalDetector
    158   // about state for the default network.
    159   bool is_first_detection_notification_;
    160 
    161   // True if there was no notification about captive portal state for
    162   // the default network.
    163   bool is_first_portal_notification_;
    164 
    165   base::WeakPtrFactory<UpdateScreen> weak_factory_;
    166 
    167   DISALLOW_COPY_AND_ASSIGN(UpdateScreen);
    168 };
    169 
    170 }  // namespace chromeos
    171 
    172 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_
    173