| Index: ios/chrome/browser/google/google_logo_service.mm
|
| diff --git a/ios/chrome/browser/google/google_logo_service.mm b/ios/chrome/browser/google/google_logo_service.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..adcd21488c7aebd2131cf78f9821fe67a710e86c
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/google/google_logo_service.mm
|
| @@ -0,0 +1,131 @@
|
| +// Copyright 2014 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 "ios/chrome/browser/google/google_logo_service.h"
|
| +
|
| +#import <Foundation/Foundation.h>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/strings/sys_string_conversions.h"
|
| +#include "base/threading/thread_task_runner_handle.h"
|
| +#include "components/search_engines/template_url_service.h"
|
| +#include "components/search_provider_logos/google_logo_api.h"
|
| +#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
|
| +#include "ios/chrome/browser/search_engines/template_url_service_factory.h"
|
| +#include "ios/chrome/browser/search_engines/ui_thread_search_terms_data.h"
|
| +#include "ios/web/public/web_thread.h"
|
| +#include "net/url_request/url_request_context_getter.h"
|
| +#include "ui/gfx/image/image.h"
|
| +
|
| +using search_provider_logos::Logo;
|
| +using search_provider_logos::LogoDelegate;
|
| +using search_provider_logos::LogoTracker;
|
| +
|
| +namespace {
|
| +
|
| +const char kGoogleDoodleURLPath[] = "async/newtab_mobile";
|
| +static NSArray* const kDoodleCacheDirectory = @[ @"Chromium", @"Doodle" ];
|
| +
|
| +// Cache directory for doodle.
|
| +base::FilePath DoodleDirectory() {
|
| + NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
|
| + NSUserDomainMask, YES);
|
| + NSString* path = [paths objectAtIndex:0];
|
| + NSArray* path_components =
|
| + [NSArray arrayWithObjects:path, kDoodleCacheDirectory[0],
|
| + kDoodleCacheDirectory[1], nil];
|
| + return base::FilePath(
|
| + base::SysNSStringToUTF8([NSString pathWithComponents:path_components]));
|
| +}
|
| +
|
| +// Returns the URL where the doodle can be downloaded, e.g.
|
| +// https://www.google.com/async/newtab_mobile. This depends on the user's
|
| +// Google domain.
|
| +GURL GetGoogleDoodleURL(ios::ChromeBrowserState* browser_state) {
|
| + GURL google_base_url(
|
| + ios::UIThreadSearchTermsData(browser_state).GoogleBaseURLValue());
|
| + // SetPathStr() requires its argument to stay in scope as long as
|
| + // |replacements| is, so a std::string is needed, instead of a char*.
|
| + std::string path = kGoogleDoodleURLPath;
|
| + GURL::Replacements replacements;
|
| + replacements.SetPathStr(path);
|
| +
|
| + return google_base_url.ReplaceComponents(replacements);
|
| +}
|
| +
|
| +class IOSChromeLogoDelegate : public search_provider_logos::LogoDelegate {
|
| + public:
|
| + IOSChromeLogoDelegate() {}
|
| + ~IOSChromeLogoDelegate() override {}
|
| +
|
| + // search_provider_logos::LogoDelegate implementation.
|
| + void DecodeUntrustedImage(
|
| + const scoped_refptr<base::RefCountedString>& encoded_image,
|
| + base::Callback<void(const SkBitmap&)> image_decoded_callback) override {
|
| + SkBitmap bitmap = gfx::Image::CreateFrom1xPNGBytes(encoded_image->front(),
|
| + encoded_image->size())
|
| + .AsBitmap();
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE, base::Bind(image_decoded_callback, bitmap));
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(IOSChromeLogoDelegate);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +GoogleLogoService::GoogleLogoService(ios::ChromeBrowserState* browser_state)
|
| + : browser_state_(browser_state) {}
|
| +
|
| +GoogleLogoService::~GoogleLogoService() {}
|
| +
|
| +void GoogleLogoService::GetLogo(search_provider_logos::LogoObserver* observer) {
|
| + TemplateURLService* template_url_service =
|
| + ios::TemplateURLServiceFactory::GetForBrowserState(browser_state_);
|
| + if (!template_url_service)
|
| + return;
|
| +
|
| + TemplateURL* template_url = template_url_service->GetDefaultSearchProvider();
|
| + if (!template_url ||
|
| + !template_url->url_ref().HasGoogleBaseURLs(
|
| + template_url_service->search_terms_data()))
|
| + return;
|
| +
|
| + if (!logo_tracker_) {
|
| + logo_tracker_.reset(new LogoTracker(
|
| + DoodleDirectory(),
|
| + web::WebThread::GetTaskRunnerForThread(web::WebThread::FILE),
|
| + web::WebThread::GetBlockingPool(), browser_state_->GetRequestContext(),
|
| + std::unique_ptr<search_provider_logos::LogoDelegate>(
|
| + new IOSChromeLogoDelegate())));
|
| + }
|
| +
|
| + logo_tracker_->SetServerAPI(
|
| + GetGoogleDoodleURL(browser_state_),
|
| + base::Bind(&search_provider_logos::GoogleParseLogoResponse),
|
| + base::Bind(&search_provider_logos::GoogleAppendQueryparamsToLogoURL),
|
| + true, false /* transparent */);
|
| + logo_tracker_->GetLogo(observer);
|
| +}
|
| +
|
| +void GoogleLogoService::SetCachedLogo(const search_provider_logos::Logo* logo) {
|
| + if (logo) {
|
| + if (cached_metadata_.fingerprint == logo->metadata.fingerprint) {
|
| + return;
|
| + }
|
| + logo->image.deepCopyTo(&cached_image_);
|
| + cached_metadata_ = logo->metadata;
|
| + } else {
|
| + cached_image_ = SkBitmap();
|
| + cached_metadata_ = empty_metadata;
|
| + }
|
| +}
|
| +
|
| +search_provider_logos::Logo GoogleLogoService::GetCachedLogo() {
|
| + search_provider_logos::Logo logo;
|
| + logo.image = cached_image_;
|
| + logo.metadata = cached_metadata_;
|
| + return logo;
|
| +}
|
|
|