upgrade_detector_impl.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/timer.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/upgrade_detector.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> struct DefaultSingletonTraits;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UpgradeDetectorImpl : public UpgradeDetector {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UpgradeDetectorImpl();
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the singleton instance.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static UpgradeDetectorImpl* GetInstance();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct DefaultSingletonTraits<UpgradeDetectorImpl>;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpgradeDetectorImpl();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start the timer that will call |CheckForUpgrade()|.
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartTimerForUpgradeCheck();
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launches a task on the file thread to check if we have the latest version.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckForUpgrade();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends out a notification and starts a one shot timer to wait until
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifying the user.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpgradeDetected(UpgradeAvailable upgrade_available);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true after calling UpgradeDetected if current install is outdated.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DetectOutdatedInstall();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The function that sends out a notification (after a certain time has
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // elapsed) that lets the rest of the UI know we should start notifying the
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user that a new version is available.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyOnUpgrade();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the FILE thread to detect an upgrade. Calls back UpgradeDetected
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on the UI thread if so. Although it looks weird, this needs to be a static
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // method receiving a WeakPtr<> to this object so that we can interrupt
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the UpgradeDetected callback before it runs. Having this method non-static
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and using |this| directly wouldn't be thread safe. And keeping it as a
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // non-class function would prevent it from calling UpgradeDetected.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void DetectUpgradeTask(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::WeakPtr<UpgradeDetectorImpl> upgrade_detector);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We periodically check to see if Chrome has been upgraded.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RepeatingTimer<UpgradeDetectorImpl> detect_upgrade_timer_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After we detect an upgrade we start a recurring timer to see if enough time
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has passed and we should start notifying the user.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RepeatingTimer<UpgradeDetectorImpl> upgrade_notification_timer_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use this factory to create callback tasks for UpgradeDetected. We pass
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the task to the actual upgrade detection code, which is in
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DetectUpgradeTask.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<UpgradeDetectorImpl> weak_factory_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this build is a dev or canary channel build.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_unstable_channel_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The date the binaries were built.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time build_date_;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UpgradeDetectorImpl);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_
76