15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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_UPGRADE_DETECTOR_IMPL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/version.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/metrics/variations/variations_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/upgrade_detector.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> struct DefaultSingletonTraits;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class UpgradeDetectorImpl :
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public UpgradeDetector,
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public chrome_variations::VariationsService::Observer {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UpgradeDetectorImpl();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Returns the currently installed Chrome version, which may be newer than the
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // one currently running. Not supported on Android, iOS or ChromeOS. Must be
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // run on a thread where I/O operations are allowed (e.g. FILE thread).
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static base::Version GetCurrentlyInstalledVersion();
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the singleton instance.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static UpgradeDetectorImpl* GetInstance();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected:
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  UpgradeDetectorImpl();
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // chrome_variations::VariationsService::Observer:
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnExperimentChangesDetected(Severity severity) OVERRIDE;
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Trigger an "on upgrade" notification based on the specified |time_passed|
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // interval. Exposed as protected for testing.
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void NotifyOnUpgradeWithTimePassed(base::TimeDelta time_passed);
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct DefaultSingletonTraits<UpgradeDetectorImpl>;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start the timer that will call |CheckForUpgrade()|.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartTimerForUpgradeCheck();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launches a task on the file thread to check if we have the latest version.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckForUpgrade();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Starts the upgrade notification timer that will check periodically whether
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // enough time has elapsed to update the severity (which maps to visual
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // badging) of the notification.
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void StartUpgradeNotificationTimer();
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends out a notification and starts a one shot timer to wait until
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifying the user.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpgradeDetected(UpgradeAvailable upgrade_available);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true after calling UpgradeDetected if current install is outdated.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DetectOutdatedInstall();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The function that sends out a notification (after a certain time has
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // elapsed) that lets the rest of the UI know we should start notifying the
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user that a new version is available.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyOnUpgrade();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the FILE thread to detect an upgrade. Calls back UpgradeDetected
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on the UI thread if so. Although it looks weird, this needs to be a static
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // method receiving a WeakPtr<> to this object so that we can interrupt
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the UpgradeDetected callback before it runs. Having this method non-static
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and using |this| directly wouldn't be thread safe. And keeping it as a
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // non-class function would prevent it from calling UpgradeDetected.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void DetectUpgradeTask(
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::WeakPtr<UpgradeDetectorImpl> upgrade_detector);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We periodically check to see if Chrome has been upgraded.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RepeatingTimer<UpgradeDetectorImpl> detect_upgrade_timer_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After we detect an upgrade we start a recurring timer to see if enough time
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has passed and we should start notifying the user.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RepeatingTimer<UpgradeDetectorImpl> upgrade_notification_timer_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this build is a dev or canary channel build.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_unstable_channel_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // True if auto update is turned on.
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool is_auto_update_enabled_;
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // When the upgrade was detected - either a software update or a variations
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // update, whichever happened first.
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeTicks upgrade_detected_time_;
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The date the binaries were built.
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time build_date_;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // We use this factory to create callback tasks for UpgradeDetected. We pass
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the task to the actual upgrade detection code, which is in
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // DetectUpgradeTask.
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<UpgradeDetectorImpl> weak_factory_;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UpgradeDetectorImpl);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_
105