1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.h"
6 
7 #include <vector>
8 
9 #include "chrome/browser/profiles/profile.h"
10 #include "content/public/browser/browser_context.h"
11 
12 namespace ash {
13 
14 namespace {
15 
16 content::DownloadManager* download_manager_for_testing = nullptr;
17 
18 }  // namespace
19 
20 // HoldingSpaceDownloadsDelegate -----------------------------------------------
21 
HoldingSpaceDownloadsDelegate(Profile * profile,HoldingSpaceModel * model,ItemDownloadedCallback item_downloaded_callback)22 HoldingSpaceDownloadsDelegate::HoldingSpaceDownloadsDelegate(
23     Profile* profile,
24     HoldingSpaceModel* model,
25     ItemDownloadedCallback item_downloaded_callback)
26     : HoldingSpaceKeyedServiceDelegate(profile, model),
27       item_downloaded_callback_(item_downloaded_callback) {}
28 
29 HoldingSpaceDownloadsDelegate::~HoldingSpaceDownloadsDelegate() = default;
30 
31 // static
SetDownloadManagerForTesting(content::DownloadManager * download_manager)32 void HoldingSpaceDownloadsDelegate::SetDownloadManagerForTesting(
33     content::DownloadManager* download_manager) {
34   download_manager_for_testing = download_manager;
35 }
36 
Init()37 void HoldingSpaceDownloadsDelegate::Init() {
38   download_manager_observer_.Add(
39       download_manager_for_testing
40           ? download_manager_for_testing
41           : content::BrowserContext::GetDownloadManager(profile()));
42 }
43 
Shutdown()44 void HoldingSpaceDownloadsDelegate::Shutdown() {
45   RemoveObservers();
46 }
47 
OnPersistenceRestored()48 void HoldingSpaceDownloadsDelegate::OnPersistenceRestored() {
49   content::DownloadManager* download_manager =
50       download_manager_for_testing
51           ? download_manager_for_testing
52           : content::BrowserContext::GetDownloadManager(profile());
53 
54   if (download_manager->IsManagerInitialized())
55     OnManagerInitialized();
56 }
57 
OnManagerInitialized()58 void HoldingSpaceDownloadsDelegate::OnManagerInitialized() {
59   if (is_restoring_persistence())
60     return;
61 
62   content::DownloadManager* download_manager =
63       download_manager_for_testing
64           ? download_manager_for_testing
65           : content::BrowserContext::GetDownloadManager(profile());
66 
67   DCHECK(download_manager->IsManagerInitialized());
68 
69   download::SimpleDownloadManager::DownloadVector downloads;
70   download_manager->GetAllDownloads(&downloads);
71 
72   for (auto* download : downloads) {
73     switch (download->GetState()) {
74       case download::DownloadItem::IN_PROGRESS:
75         download_item_observer_.Add(download);
76         break;
77       case download::DownloadItem::COMPLETE:
78       case download::DownloadItem::CANCELLED:
79       case download::DownloadItem::INTERRUPTED:
80       case download::DownloadItem::MAX_DOWNLOAD_STATE:
81         break;
82     }
83   }
84 }
85 
ManagerGoingDown(content::DownloadManager * manager)86 void HoldingSpaceDownloadsDelegate::ManagerGoingDown(
87     content::DownloadManager* manager) {
88   RemoveObservers();
89 }
90 
OnDownloadCreated(content::DownloadManager * manager,download::DownloadItem * item)91 void HoldingSpaceDownloadsDelegate::OnDownloadCreated(
92     content::DownloadManager* manager,
93     download::DownloadItem* item) {
94   // Ignore `OnDownloadCreated()` events prior to `manager` initialization. For
95   // those events we bind any observers necessary in `OnManagerInitialized()`.
96   if (!is_restoring_persistence() && manager->IsManagerInitialized())
97     download_item_observer_.Add(item);
98 }
99 
OnDownloadUpdated(download::DownloadItem * item)100 void HoldingSpaceDownloadsDelegate::OnDownloadUpdated(
101     download::DownloadItem* item) {
102   switch (item->GetState()) {
103     case download::DownloadItem::COMPLETE:
104       OnDownloadCompleted(item->GetFullPath());
105       FALLTHROUGH;
106     case download::DownloadItem::CANCELLED:
107     case download::DownloadItem::INTERRUPTED:
108       download_item_observer_.Remove(item);
109       break;
110     case download::DownloadItem::IN_PROGRESS:
111     case download::DownloadItem::MAX_DOWNLOAD_STATE:
112       break;
113   }
114 }
115 
OnDownloadCompleted(const base::FilePath & file_path)116 void HoldingSpaceDownloadsDelegate::OnDownloadCompleted(
117     const base::FilePath& file_path) {
118   if (!is_restoring_persistence())
119     item_downloaded_callback_.Run(file_path);
120 }
121 
RemoveObservers()122 void HoldingSpaceDownloadsDelegate::RemoveObservers() {
123   download_manager_observer_.RemoveAll();
124   download_item_observer_.RemoveAll();
125 }
126 
127 }  // namespace ash
128