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

Side by Side Diff: chrome/browser/download/download_item_model.cc

Issue 209613002: Download shelf autohides on showing in shell, just same as regular open Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move the 'user acted' flag into DownloadItemModelData and get rid of SetOpened/SetShown in Download… Created 6 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/download/download_item_model.h" 5 #include "chrome/browser/download/download_item_model.h"
6 6
7 #include "base/i18n/number_formatting.h" 7 #include "base/i18n/number_formatting.h"
8 #include "base/i18n/rtl.h" 8 #include "base/i18n/rtl.h"
9 #include "base/metrics/field_trial.h" 9 #include "base/metrics/field_trial.h"
10 #include "base/strings/string16.h" 10 #include "base/strings/string16.h"
(...skipping 20 matching lines...) Expand all
31 #include "ui/gfx/text_elider.h" 31 #include "ui/gfx/text_elider.h"
32 32
33 using base::TimeDelta; 33 using base::TimeDelta;
34 using content::DownloadItem; 34 using content::DownloadItem;
35 35
36 namespace { 36 namespace {
37 37
38 // Per DownloadItem data used by DownloadItemModel. The model doesn't keep any 38 // Per DownloadItem data used by DownloadItemModel. The model doesn't keep any
39 // state since there could be multiple models associated with a single 39 // state since there could be multiple models associated with a single
40 // DownloadItem, and the lifetime of the model is shorter than the DownloadItem. 40 // DownloadItem, and the lifetime of the model is shorter than the DownloadItem.
41 class DownloadItemModelData : public base::SupportsUserData::Data { 41 class DownloadItemModelData : public base::SupportsUserData::Data,
42 public DownloadItem::Observer {
asanka 2014/06/12 21:08:47 Let's try to avoid having the DownloadItemModelDat
42 public: 43 public:
43 // Get the DownloadItemModelData object for |download|. Returns NULL if 44 // Get the DownloadItemModelData object for |download|. Returns NULL if
44 // there's no model data. 45 // there's no model data.
45 static const DownloadItemModelData* Get(const DownloadItem* download); 46 static const DownloadItemModelData* Get(const DownloadItem* download);
46 47
47 // Get the DownloadItemModelData object for |download|. Creates a model data 48 // Get the DownloadItemModelData object for |download|. Creates a model data
48 // object if not found. Always returns a non-NULL pointer, unless OOM. 49 // object if not found. Always returns a non-NULL pointer, unless OOM.
49 static DownloadItemModelData* GetOrCreate(DownloadItem* download); 50 static DownloadItemModelData* GetOrCreate(DownloadItem* download);
50 51
51 bool should_show_in_shelf() const { return should_show_in_shelf_; } 52 bool should_show_in_shelf() const { return should_show_in_shelf_; }
52 void set_should_show_in_shelf(bool should_show_in_shelf) { 53 void set_should_show_in_shelf(bool should_show_in_shelf) {
53 should_show_in_shelf_ = should_show_in_shelf; 54 should_show_in_shelf_ = should_show_in_shelf;
54 } 55 }
55 56
56 bool was_ui_notified() const { return was_ui_notified_; } 57 bool was_ui_notified() const { return was_ui_notified_; }
57 void set_was_ui_notified(bool was_ui_notified) { 58 void set_was_ui_notified(bool was_ui_notified) {
58 was_ui_notified_ = was_ui_notified; 59 was_ui_notified_ = was_ui_notified;
59 } 60 }
60 61
61 bool should_prefer_opening_in_browser() const { 62 bool should_prefer_opening_in_browser() const {
62 return should_prefer_opening_in_browser_; 63 return should_prefer_opening_in_browser_;
63 } 64 }
64 void set_should_prefer_opening_in_browser(bool preference) { 65 void set_should_prefer_opening_in_browser(bool preference) {
65 should_prefer_opening_in_browser_ = preference; 66 should_prefer_opening_in_browser_ = preference;
66 } 67 }
67 68
69 bool user_acted() const {
70 return user_acted_;
71 }
72 void set_user_acted(bool acted) {
73 user_acted_ = acted;
74 }
75
68 private: 76 private:
69 DownloadItemModelData(); 77 virtual void OnDownloadOpened(DownloadItem* download) OVERRIDE;
70 virtual ~DownloadItemModelData() {} 78 virtual void OnDownloadShown(DownloadItem* download) OVERRIDE;
79 virtual void OnDownloadDestroyed(DownloadItem* download) OVERRIDE;
80
81 private:
82 explicit DownloadItemModelData(DownloadItem* download);
83 virtual ~DownloadItemModelData();
71 84
72 static const char kKey[]; 85 static const char kKey[];
73 86
87 // Download item that holds this data.
88 DownloadItem* download_;
89
74 // Whether the download should be displayed in the download shelf. True by 90 // Whether the download should be displayed in the download shelf. True by
75 // default. 91 // default.
76 bool should_show_in_shelf_; 92 bool should_show_in_shelf_;
77 93
78 // Whether the UI has been notified about this download. 94 // Whether the UI has been notified about this download.
79 bool was_ui_notified_; 95 bool was_ui_notified_;
80 96
81 // Whether the download should be opened in the browser vs. the system handler 97 // Whether the download should be opened in the browser vs. the system handler
82 // for the file type. 98 // for the file type.
83 bool should_prefer_opening_in_browser_; 99 bool should_prefer_opening_in_browser_;
100
101 // Whether user acted on this item, so that download shelf can autohide.
102 bool user_acted_;
84 }; 103 };
85 104
86 // static 105 // static
87 const char DownloadItemModelData::kKey[] = "DownloadItemModelData key"; 106 const char DownloadItemModelData::kKey[] = "DownloadItemModelData key";
88 107
89 // static 108 // static
90 const DownloadItemModelData* DownloadItemModelData::Get( 109 const DownloadItemModelData* DownloadItemModelData::Get(
91 const DownloadItem* download) { 110 const DownloadItem* download) {
92 return static_cast<const DownloadItemModelData*>(download->GetUserData(kKey)); 111 return static_cast<const DownloadItemModelData*>(download->GetUserData(kKey));
93 } 112 }
94 113
95 // static 114 // static
96 DownloadItemModelData* DownloadItemModelData::GetOrCreate( 115 DownloadItemModelData* DownloadItemModelData::GetOrCreate(
97 DownloadItem* download) { 116 DownloadItem* download) {
98 DownloadItemModelData* data = 117 DownloadItemModelData* data =
99 static_cast<DownloadItemModelData*>(download->GetUserData(kKey)); 118 static_cast<DownloadItemModelData*>(download->GetUserData(kKey));
100 if (data == NULL) { 119 if (data == NULL) {
101 data = new DownloadItemModelData(); 120 data = new DownloadItemModelData(download);
102 download->SetUserData(kKey, data); 121 download->SetUserData(kKey, data);
103 } 122 }
104 return data; 123 return data;
105 } 124 }
106 125
107 DownloadItemModelData::DownloadItemModelData() 126 DownloadItemModelData::DownloadItemModelData(DownloadItem* download)
108 : should_show_in_shelf_(true), 127 : download_(download),
128 should_show_in_shelf_(true),
109 was_ui_notified_(false), 129 was_ui_notified_(false),
110 should_prefer_opening_in_browser_(false) { 130 should_prefer_opening_in_browser_(false),
131 user_acted_(false) {
132 DCHECK(download);
133
134 // As |download| might be loaded from history, update our own state.
135 user_acted_ = download->GetOpened();
136 download_->AddObserver(this);
137 }
138
139 DownloadItemModelData::~DownloadItemModelData() {
140 if (download_)
141 download_->RemoveObserver(this);
142 }
143
144 void DownloadItemModelData::OnDownloadOpened(DownloadItem* download) {
145 DCHECK_EQ(download_, download);
146 user_acted_ = true;
147 }
148
149 void DownloadItemModelData::OnDownloadShown(DownloadItem* download) {
150 DCHECK_EQ(download_, download);
151
152 // The user can show download in shell even when it is not yet completed,
153 // as this flag is used to 'hide' the download item from user's sight, it is
154 // fair to do so only for completed downloads.
155 if (download->GetState() == DownloadItem::COMPLETE) {
156 user_acted_ = true;
157 }
158 }
159
160 void DownloadItemModelData::OnDownloadDestroyed(DownloadItem* download) {
161 DCHECK_EQ(download_, download);
162
163 // This is called from DownloadItem's destructor - so that
164 // base::SupportsUserData would destroy this model.
165 download_->RemoveObserver(this);
166 download_ = NULL;
111 } 167 }
112 168
113 base::string16 InterruptReasonStatusMessage(int reason) { 169 base::string16 InterruptReasonStatusMessage(int reason) {
114 int string_id = IDS_DOWNLOAD_INTERRUPTED_STATUS; 170 int string_id = IDS_DOWNLOAD_INTERRUPTED_STATUS;
115 171
116 switch (static_cast<content::DownloadInterruptReason>(reason)) { 172 switch (static_cast<content::DownloadInterruptReason>(reason)) {
117 case content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED: 173 case content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED:
118 string_id = IDS_DOWNLOAD_INTERRUPTED_STATUS_ACCESS_DENIED; 174 string_id = IDS_DOWNLOAD_INTERRUPTED_STATUS_ACCESS_DENIED;
119 break; 175 break;
120 case content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE: 176 case content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE:
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 if (!download_service) 739 if (!download_service)
684 return; 740 return;
685 741
686 ChromeDownloadManagerDelegate* delegate = 742 ChromeDownloadManagerDelegate* delegate =
687 download_service->GetDownloadManagerDelegate(); 743 download_service->GetDownloadManagerDelegate();
688 if (!delegate) 744 if (!delegate)
689 return; 745 return;
690 delegate->OpenDownloadUsingPlatformHandler(download_); 746 delegate->OpenDownloadUsingPlatformHandler(download_);
691 RecordDownloadOpenMethod(DOWNLOAD_OPEN_METHOD_USER_PLATFORM); 747 RecordDownloadOpenMethod(DOWNLOAD_OPEN_METHOD_USER_PLATFORM);
692 } 748 }
749
750 void DownloadItemModel::SetUserActed(bool acted) {
751 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_);
752 data->set_user_acted(acted);
753 }
754
755 bool DownloadItemModel::GetUserActed() const {
756 DownloadItemModelData* data = DownloadItemModelData::GetOrCreate(download_);
757 return data->user_acted();
758 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698