blob: 131f735d8b04be7fbcaf702035b20b6e682a8ed0 [file] [log] [blame]
// 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/ui/intents/web_intent_picker_model.h"
#include <algorithm>
#include "base/logging.h"
#include "base/stl_util.h"
#include "chrome/browser/ui/intents/web_intent_picker_model_observer.h"
#include "grit/generated_resources.h"
#include "grit/ui_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image.h"
namespace {
const size_t kMaxSuggestionCount = 5; // Maximum number of visible suggestions.
} // namespace
WebIntentPickerModel::WebIntentPickerModel()
: observer_(NULL),
waiting_for_suggestions_(true),
default_service_hash_(0) {
}
WebIntentPickerModel::~WebIntentPickerModel() {
DestroyAll();
}
void WebIntentPickerModel::AddInstalledService(
const string16& title,
const GURL& url,
webkit_glue::WebIntentServiceData::Disposition disposition) {
// TODO(groby): Revisit to remove O(n^2) complexity.
for (size_t i = 0; i < installed_services_.size(); ++i) {
InstalledService* service = installed_services_[i];
if (service->title == title && service->url == url &&
service->disposition == disposition)
return;
}
installed_services_.push_back(new InstalledService(title, url, disposition));
if (observer_)
observer_->OnModelChanged(this);
}
void WebIntentPickerModel::RemoveInstalledServiceAt(size_t index) {
DCHECK_LT(index, installed_services_.size());
InstalledService* service = installed_services_[index];
installed_services_.erase(installed_services_.begin() + index);
delete service;
if (observer_)
observer_->OnModelChanged(this);
}
void WebIntentPickerModel::Clear() {
DestroyAll();
action_.clear();
type_.clear();
inline_disposition_url_ = GURL::EmptyGURL();
waiting_for_suggestions_ = true;
if (observer_)
observer_->OnModelChanged(this);
}
const WebIntentPickerModel::InstalledService&
WebIntentPickerModel::GetInstalledServiceAt(size_t index) const {
DCHECK_LT(index, installed_services_.size());
return *installed_services_[index];
}
const WebIntentPickerModel::InstalledService*
WebIntentPickerModel::GetInstalledServiceWithURL(const GURL& url) const {
for (size_t i = 0; i < installed_services_.size(); ++i) {
InstalledService* service = installed_services_[i];
if (service->url == url)
return service;
}
return NULL;
}
size_t WebIntentPickerModel::GetInstalledServiceCount() const {
return installed_services_.size();
}
void WebIntentPickerModel::UpdateFaviconAt(size_t index,
const gfx::Image& image) {
DCHECK_LT(index, installed_services_.size());
installed_services_[index]->favicon = image;
if (observer_)
observer_->OnFaviconChanged(this, index);
}
void WebIntentPickerModel::AddSuggestedExtensions(
const std::vector<SuggestedExtension>& suggestions) {
suggested_extensions_.insert(suggested_extensions_.end(),
suggestions.begin(),
suggestions.end());
if (observer_)
observer_->OnModelChanged(this);
}
const WebIntentPickerModel::SuggestedExtension&
WebIntentPickerModel::GetSuggestedExtensionAt(size_t index) const {
DCHECK_LT(index, suggested_extensions_.size());
return suggested_extensions_[index];
}
size_t WebIntentPickerModel::GetSuggestedExtensionCount() const {
return std::min(suggested_extensions_.size(), kMaxSuggestionCount);
}
string16 WebIntentPickerModel::GetSuggestionsLinkText() const {
if (suggested_extensions_.size() <= kMaxSuggestionCount)
return string16();
return l10n_util::GetStringUTF16(GetInstalledServiceCount() == 0 ?
IDS_INTENT_PICKER_GET_MORE_SERVICES_NONE_INSTALLED :
IDS_INTENT_PICKER_GET_MORE_SERVICES);
}
void WebIntentPickerModel::SetSuggestedExtensionIconWithId(
const string16& id,
const gfx::Image& image) {
for (size_t i = 0; i < suggested_extensions_.size(); ++i) {
SuggestedExtension& extension = suggested_extensions_[i];
if (extension.id == id) {
extension.icon = image;
if (observer_)
observer_->OnExtensionIconChanged(this, extension.id);
break;
}
}
}
void WebIntentPickerModel::SetInlineDisposition(const GURL& url) {
inline_disposition_url_ = url;
if (observer_) {
const InstalledService* service = GetInstalledServiceWithURL(url);
DCHECK(service);
observer_->OnInlineDisposition(service->title, url);
}
}
bool WebIntentPickerModel::IsInlineDisposition() const {
return !inline_disposition_url_.is_empty();
}
bool WebIntentPickerModel::IsWaitingForSuggestions() const {
return waiting_for_suggestions_;
}
void WebIntentPickerModel::SetWaitingForSuggestions(bool waiting) {
waiting_for_suggestions_ = waiting;
if (observer_)
observer_->OnModelChanged(this);
}
void WebIntentPickerModel::DestroyAll() {
STLDeleteElements(&installed_services_);
}
WebIntentPickerModel::InstalledService::InstalledService(
const string16& title,
const GURL& url,
webkit_glue::WebIntentServiceData::Disposition disposition)
: title(title),
url(url),
favicon(ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
IDR_DEFAULT_FAVICON)),
disposition(disposition) {
}
WebIntentPickerModel::InstalledService::~InstalledService() {
}
WebIntentPickerModel::SuggestedExtension::SuggestedExtension(
const string16& title,
const string16& id,
double average_rating)
: title(title),
id(id),
average_rating(average_rating),
icon(ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
IDR_DEFAULT_FAVICON)) {
}
WebIntentPickerModel::SuggestedExtension::~SuggestedExtension() {
}