OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/ui/app_list/arc/arc_app_icon.h" | 5 #include "chrome/browser/ui/app_list/arc/arc_app_icon.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
165 class ArcAppIcon::DecodeRequest : public ImageDecoder::ImageRequest { | 165 class ArcAppIcon::DecodeRequest : public ImageDecoder::ImageRequest { |
166 public: | 166 public: |
167 DecodeRequest(const base::WeakPtr<ArcAppIcon>& host, | 167 DecodeRequest(const base::WeakPtr<ArcAppIcon>& host, |
168 int dimension, | 168 int dimension, |
169 ui::ScaleFactor scale_factor); | 169 ui::ScaleFactor scale_factor); |
170 ~DecodeRequest() override; | 170 ~DecodeRequest() override; |
171 | 171 |
172 // ImageDecoder::ImageRequest | 172 // ImageDecoder::ImageRequest |
173 void OnImageDecoded(const SkBitmap& bitmap) override; | 173 void OnImageDecoded(const SkBitmap& bitmap) override; |
174 void OnDecodeImageFailed() override; | 174 void OnDecodeImageFailed() override; |
175 | |
175 private: | 176 private: |
176 base::WeakPtr<ArcAppIcon> host_; | 177 base::WeakPtr<ArcAppIcon> host_; |
177 int dimension_; | 178 int dimension_; |
178 ui::ScaleFactor scale_factor_; | 179 ui::ScaleFactor scale_factor_; |
179 | 180 |
180 DISALLOW_COPY_AND_ASSIGN(DecodeRequest); | 181 DISALLOW_COPY_AND_ASSIGN(DecodeRequest); |
181 }; | 182 }; |
182 | 183 |
183 //////////////////////////////////////////////////////////////////////////////// | 184 //////////////////////////////////////////////////////////////////////////////// |
184 // ArcAppIcon::DecodeRequest | 185 // ArcAppIcon::DecodeRequest |
(...skipping 14 matching lines...) Expand all Loading... | |
199 | 200 |
200 if (!host_) | 201 if (!host_) |
201 return; | 202 return; |
202 | 203 |
203 int expected_dim = static_cast<int>( | 204 int expected_dim = static_cast<int>( |
204 ui::GetScaleForScaleFactor(scale_factor_) * dimension_ + 0.5f); | 205 ui::GetScaleForScaleFactor(scale_factor_) * dimension_ + 0.5f); |
205 if (bitmap.width() != expected_dim || bitmap.height() != expected_dim) { | 206 if (bitmap.width() != expected_dim || bitmap.height() != expected_dim) { |
206 VLOG(2) << "Decoded ARC icon has unexpected dimension " | 207 VLOG(2) << "Decoded ARC icon has unexpected dimension " |
207 << bitmap.width() << "x" << bitmap.height() << ". Expected " | 208 << bitmap.width() << "x" << bitmap.height() << ". Expected " |
208 << expected_dim << "x" << "."; | 209 << expected_dim << "x" << "."; |
210 | |
211 host_->MaybeRequestIcon(scale_factor_); | |
209 host_->DiscardDecodeRequest(this); | 212 host_->DiscardDecodeRequest(this); |
210 return; | 213 return; |
211 } | 214 } |
212 | 215 |
213 gfx::ImageSkia image_skia; | 216 gfx::ImageSkia image_skia; |
214 image_skia.AddRepresentation(gfx::ImageSkiaRep( | 217 image_skia.AddRepresentation(gfx::ImageSkiaRep( |
215 bitmap, | 218 bitmap, |
216 ui::GetScaleForScaleFactor(scale_factor_))); | 219 ui::GetScaleForScaleFactor(scale_factor_))); |
217 | |
218 host_->Update(&image_skia); | 220 host_->Update(&image_skia); |
219 host_->DiscardDecodeRequest(this); | 221 host_->DiscardDecodeRequest(this); |
220 } | 222 } |
221 | 223 |
222 void ArcAppIcon::DecodeRequest::OnDecodeImageFailed() { | 224 void ArcAppIcon::DecodeRequest::OnDecodeImageFailed() { |
223 VLOG(2) << "Failed to decode ARC icon."; | 225 VLOG(2) << "Failed to decode ARC icon."; |
224 | 226 |
225 if (!host_) | 227 if (!host_) |
226 return; | 228 return; |
227 | 229 |
230 host_->MaybeRequestIcon(scale_factor_); | |
228 host_->DiscardDecodeRequest(this); | 231 host_->DiscardDecodeRequest(this); |
229 } | 232 } |
230 | 233 |
231 //////////////////////////////////////////////////////////////////////////////// | 234 //////////////////////////////////////////////////////////////////////////////// |
232 // ArcAppIcon | 235 // ArcAppIcon |
233 | 236 |
234 // static | 237 // static |
235 void ArcAppIcon::DisableSafeDecodingForTesting() { | 238 void ArcAppIcon::DisableSafeDecodingForTesting() { |
236 disable_safe_decoding = true; | 239 disable_safe_decoding = true; |
237 } | 240 } |
(...skipping 25 matching lines...) Expand all Loading... | |
263 return; | 266 return; |
264 | 267 |
265 base::PostTaskWithTraitsAndReplyWithResult( | 268 base::PostTaskWithTraitsAndReplyWithResult( |
266 FROM_HERE, base::TaskTraits().MayBlock().WithPriority( | 269 FROM_HERE, base::TaskTraits().MayBlock().WithPriority( |
267 base::TaskPriority::BACKGROUND), | 270 base::TaskPriority::BACKGROUND), |
268 base::Bind(&ArcAppIcon::ReadOnFileThread, scale_factor, path, | 271 base::Bind(&ArcAppIcon::ReadOnFileThread, scale_factor, path, |
269 prefs->MaybeGetIconPathForDefaultApp(app_id_, scale_factor)), | 272 prefs->MaybeGetIconPathForDefaultApp(app_id_, scale_factor)), |
270 base::Bind(&ArcAppIcon::OnIconRead, weak_ptr_factory_.GetWeakPtr())); | 273 base::Bind(&ArcAppIcon::OnIconRead, weak_ptr_factory_.GetWeakPtr())); |
271 } | 274 } |
272 | 275 |
273 void ArcAppIcon::RequestIcon(ui::ScaleFactor scale_factor) { | 276 void ArcAppIcon::MaybeRequestIcon(ui::ScaleFactor scale_factor) { |
274 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 277 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
275 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(context_); | 278 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(context_); |
276 DCHECK(prefs); | 279 DCHECK(prefs); |
277 | 280 |
281 // Request for Icon has been recorded. Don't resend same request within same | |
282 // user session. | |
283 if (prefs->IsIconRequestRecorded(app_id_, scale_factor)) | |
khmel
2017/03/15 01:16:55
Could you please move this logic into prefs. It wo
lgcheng
2017/03/15 19:59:31
Done.
| |
284 return; | |
278 // ArcAppListPrefs notifies ArcAppModelBuilder via Observer when icon is ready | 285 // ArcAppListPrefs notifies ArcAppModelBuilder via Observer when icon is ready |
279 // and ArcAppModelBuilder refreshes the icon of the corresponding item by | 286 // and ArcAppModelBuilder refreshes the icon of the corresponding item by |
280 // calling LoadScaleFactor. | 287 // calling LoadScaleFactor. |
281 prefs->RequestIcon(app_id_, scale_factor); | 288 prefs->RequestIcon(app_id_, scale_factor); |
282 } | 289 } |
283 | 290 |
284 // static | 291 // static |
285 std::unique_ptr<ArcAppIcon::ReadResult> ArcAppIcon::ReadOnFileThread( | 292 std::unique_ptr<ArcAppIcon::ReadResult> ArcAppIcon::ReadOnFileThread( |
286 ui::ScaleFactor scale_factor, | 293 ui::ScaleFactor scale_factor, |
287 const base::FilePath& path, | 294 const base::FilePath& path, |
(...skipping 22 matching lines...) Expand all Loading... | |
310 return base::WrapUnique(new ArcAppIcon::ReadResult(false, | 317 return base::WrapUnique(new ArcAppIcon::ReadResult(false, |
311 path_to_read != path, | 318 path_to_read != path, |
312 scale_factor, | 319 scale_factor, |
313 unsafe_icon_data)); | 320 unsafe_icon_data)); |
314 } | 321 } |
315 | 322 |
316 void ArcAppIcon::OnIconRead( | 323 void ArcAppIcon::OnIconRead( |
317 std::unique_ptr<ArcAppIcon::ReadResult> read_result) { | 324 std::unique_ptr<ArcAppIcon::ReadResult> read_result) { |
318 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 325 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
319 | 326 |
320 if (read_result->request_to_install) | 327 // When unsafe_icon_data is empty, there are four senarios. |
321 RequestIcon(read_result->scale_factor); | 328 // 1. Default app icon path is non valid. In this case, request_to_install is |
329 // true. | |
330 // 2. Fail to read default icon file. In this case request_to_install is true. | |
331 // 3. Default icon file is empty. In this case request_to_install is true. | |
332 // 4. Icon file for app_id_ is empty. This indicates a file corruption of some | |
333 // sort of issue. We should try to request app icon. | |
334 if (read_result->request_to_install || read_result->unsafe_icon_data.empty()) | |
khmel
2017/03/15 01:16:55
Could you please move read_result->unsafe_icon_dat
lgcheng
2017/03/15 19:59:31
Done.
| |
335 MaybeRequestIcon(read_result->scale_factor); | |
322 | 336 |
323 if (!read_result->unsafe_icon_data.empty()) { | 337 if (!read_result->unsafe_icon_data.empty()) { |
324 decode_requests_.push_back(base::MakeUnique<DecodeRequest>( | 338 decode_requests_.push_back(base::MakeUnique<DecodeRequest>( |
325 weak_ptr_factory_.GetWeakPtr(), resource_size_in_dip_, | 339 weak_ptr_factory_.GetWeakPtr(), resource_size_in_dip_, |
326 read_result->scale_factor)); | 340 read_result->scale_factor)); |
327 if (disable_safe_decoding) { | 341 if (disable_safe_decoding) { |
328 SkBitmap bitmap; | 342 SkBitmap bitmap; |
329 if (!read_result->unsafe_icon_data.empty() && | 343 if (!read_result->unsafe_icon_data.empty() && |
330 gfx::PNGCodec::Decode( | 344 gfx::PNGCodec::Decode( |
331 reinterpret_cast<const unsigned char*>( | 345 reinterpret_cast<const unsigned char*>( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
363 void ArcAppIcon::DiscardDecodeRequest(DecodeRequest* request) { | 377 void ArcAppIcon::DiscardDecodeRequest(DecodeRequest* request) { |
364 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 378 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
365 | 379 |
366 auto it = std::find_if(decode_requests_.begin(), decode_requests_.end(), | 380 auto it = std::find_if(decode_requests_.begin(), decode_requests_.end(), |
367 [request](const std::unique_ptr<DecodeRequest>& ptr) { | 381 [request](const std::unique_ptr<DecodeRequest>& ptr) { |
368 return ptr.get() == request; | 382 return ptr.get() == request; |
369 }); | 383 }); |
370 CHECK(it != decode_requests_.end()); | 384 CHECK(it != decode_requests_.end()); |
371 decode_requests_.erase(it); | 385 decode_requests_.erase(it); |
372 } | 386 } |
OLD | NEW |