// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/download/download_shelf.h" #include "base/bind.h" #include "base/callback.h" #include "base/message_loop.h" #include "chrome/browser/download/download_item_model.h" #include "chrome/browser/download/download_started_animation.h" #include "chrome/browser/platform_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/download_item.h" #include "content/public/browser/download_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_view.h" #include "ui/base/animation/animation.h" using content::DownloadItem; namespace { // Delay before we show a transient download. const int64 kDownloadShowDelayInSeconds = 2; } // namespace DownloadShelf::DownloadShelf() : should_show_on_unhide_(false), is_hidden_(false), weak_ptr_factory_(this) { } DownloadShelf::~DownloadShelf() { } void DownloadShelf::AddDownload(DownloadItem* download) { DCHECK(download); if (DownloadItemModel(download).ShouldRemoveFromShelfWhenComplete()) { // If we are going to remove the download from the shelf upon completion, // wait a few seconds to see if it completes quickly. If it's a small // download, then the user won't have time to interact with it. MessageLoop::current()->PostDelayedTask( FROM_HERE, base::Bind(&DownloadShelf::ShowDownloadById, weak_ptr_factory_.GetWeakPtr(), download->GetId()), GetTransientDownloadShowDelay()); } else { ShowDownload(download); } } void DownloadShelf::Show() { if (is_hidden_) { should_show_on_unhide_ = true; return; } DoShow(); } void DownloadShelf::Close(CloseReason reason) { if (is_hidden_) { should_show_on_unhide_ = false; return; } DoClose(reason); } void DownloadShelf::Hide() { if (is_hidden_) return; is_hidden_ = true; if (IsShowing()) { should_show_on_unhide_ = true; DoClose(AUTOMATIC); } } void DownloadShelf::Unhide() { if (!is_hidden_) return; is_hidden_ = false; if (should_show_on_unhide_) { should_show_on_unhide_ = false; DoShow(); } } base::TimeDelta DownloadShelf::GetTransientDownloadShowDelay() { return base::TimeDelta::FromSeconds(kDownloadShowDelayInSeconds); } content::DownloadManager* DownloadShelf::GetDownloadManager() { DCHECK(browser()); return content::BrowserContext::GetDownloadManager(browser()->profile()); } void DownloadShelf::ShowDownload(DownloadItem* download) { if (download->GetState() == DownloadItem::COMPLETE && DownloadItemModel(download).ShouldRemoveFromShelfWhenComplete()) { return; } if (is_hidden_) Unhide(); Show(); DoAddDownload(download); // browser() can be NULL for tests. if (!browser()) return; // Show the download started animation if: // - Download started animation is enabled for this download. It is disabled // for "Save As" downloads and extension installs, for example. // - The browser has an active visible WebContents. (browser isn't minimized, // or running under a test etc.) // - Rich animations are enabled. content::WebContents* shelf_tab = browser()->tab_strip_model()->GetActiveWebContents(); if (DownloadItemModel(download).ShouldShowDownloadStartedAnimation() && shelf_tab && platform_util::IsVisible(shelf_tab->GetView()->GetNativeView()) && ui::Animation::ShouldRenderRichAnimation()) { DownloadStartedAnimation::Show(shelf_tab); } } void DownloadShelf::ShowDownloadById(int32 download_id) { content::DownloadManager* download_manager = GetDownloadManager(); if (!download_manager) return; DownloadItem* download = download_manager->GetDownload(download_id); if (!download) return; ShowDownload(download); }