Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2240)

Unified Diff: ash/system/tray_update.cc

Issue 10291004: ash: Show a nagging reminder for available updates. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/system/tray_update.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/system/tray_update.cc
diff --git a/ash/system/tray_update.cc b/ash/system/tray_update.cc
index 0c0ee041b33bf4c9a6f077234435b9315081716f..6b979159284b8cb7dfff950612ca700190580422 100644
--- a/ash/system/tray_update.cc
+++ b/ash/system/tray_update.cc
@@ -5,12 +5,20 @@
#include "ash/system/tray_update.h"
#include "ash/shell.h"
+#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_views.h"
+#include "ash/wm/shelf_layout_manager.h"
+#include "base/time.h"
+#include "base/timer.h"
#include "grit/ash_strings.h"
#include "grit/ui_resources.h"
+#include "ui/aura/window.h"
#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/compositor/layer.h"
+#include "ui/gfx/compositor/layer_animation_sequence.h"
+#include "ui/gfx/compositor/layer_animation_observer.h"
#include "ui/gfx/image/image.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
@@ -19,6 +27,12 @@
namespace {
+// How many seconds should we wait before showing the nag reminder?
+const int kUpdateNaggingTimeSeconds = 24 * 60 * 60;
+
+// How long should the nag reminder be displayed?
+const int kShowUpdateNaggerForSeconds = 15;
+
class UpdateView : public ash::internal::ActionableView {
public:
UpdateView() {
@@ -56,6 +70,58 @@ class UpdateView : public ash::internal::ActionableView {
namespace ash {
namespace internal {
+namespace tray {
+
+class UpdateNagger : public ui::LayerAnimationObserver {
+ public:
+ explicit UpdateNagger(SystemTrayItem* owner)
+ : owner_(owner) {
+ RestartTimer();
+ Shell::GetInstance()->tray()->widget()->GetNativeView()->layer()->
+ GetAnimator()->AddObserver(this);
+ }
+
+ virtual ~UpdateNagger() {
+ Shell::GetInstance()->tray()->widget()->GetNativeView()->layer()->
+ GetAnimator()->RemoveObserver(this);
+ }
+
+ void RestartTimer() {
+ timer_.Stop();
+ timer_.Start(FROM_HERE,
+ base::TimeDelta::FromSeconds(kUpdateNaggingTimeSeconds),
+ this,
+ &UpdateNagger::Nag);
+ }
+
+ private:
+ void Nag() {
+ owner_->PopupDetailedView(kShowUpdateNaggerForSeconds, false);
+ }
+
+ // Overridden from ui::LayerAnimationObserver.
+ virtual void OnLayerAnimationEnded(
+ ui::LayerAnimationSequence* sequence) OVERRIDE {
+ if (Shell::GetInstance()->shelf()->IsVisible())
+ timer_.Stop();
+ else if (!timer_.IsRunning())
+ RestartTimer();
+ }
+
+ virtual void OnLayerAnimationAborted(
+ ui::LayerAnimationSequence* sequence) OVERRIDE {}
+
+ virtual void OnLayerAnimationScheduled(
+ ui::LayerAnimationSequence* sequence) OVERRIDE {}
+
+ SystemTrayItem* owner_;
+ base::OneShotTimer<UpdateNagger> timer_;
+
+ DISALLOW_COPY_AND_ASSIGN(UpdateNagger);
+};
+
+} // namespace tray
+
TrayUpdate::TrayUpdate()
: TrayImageItem(IDR_AURA_UBER_TRAY_UPDATE) {
}
@@ -72,11 +138,26 @@ views::View* TrayUpdate::CreateDefaultView(user::LoginStatus status) {
return new UpdateView;
}
-void TrayUpdate::DestroyDefaultView() {
+views::View* TrayUpdate::CreateDetailedView(user::LoginStatus status) {
+ return CreateDefaultView(status);
+}
+
+void TrayUpdate::DestroyDetailedView() {
+ if (nagger_.get()) {
+ // The nagger was being displayed. Now that the detailed view is being
+ // closed, that means either the user clicks on it to restart, or the user
+ // didn't click on it to restart. In either case, start the timer to show
+ // the nag reminder again after the specified time.
+ nagger_->RestartTimer();
+ }
}
void TrayUpdate::OnUpdateRecommended() {
tray_view()->SetVisible(true);
+ if (!Shell::GetInstance()->shelf()->IsVisible() && !nagger_.get()) {
+ // The shelf is not visible, and there is no nagger scheduled.
+ nagger_.reset(new tray::UpdateNagger(this));
+ }
}
} // namespace internal
« no previous file with comments | « ash/system/tray_update.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698