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