Skip to content

Commit

Permalink
Sync app order for extension items
Browse files Browse the repository at this point in the history
This restores syncing app order using the extensions sync to keep ToT
behavior in better shape.

BUG=306945
R=jennyz@chromium.org, xiyuan@chromium.org

Review URL: https://codereview.chromium.org/29613004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@229971 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
stevenjb@chromium.org committed Oct 22, 2013
1 parent ec92548 commit c647c4b
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 4 deletions.
29 changes: 29 additions & 0 deletions chrome/browser/ui/app_list/extension_app_item.cc
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,35 @@ void ExtensionAppItem::UpdateIcon() {
SetIcon(icon, !HasOverlay());
}

void ExtensionAppItem::Move(const ExtensionAppItem* prev,
const ExtensionAppItem* next) {
if (!prev && !next)
return; // No reordering necessary

ExtensionService* service =
extensions::ExtensionSystem::Get(profile_)->extension_service();
ExtensionSorting* sorting = service->extension_prefs()->extension_sorting();

syncer::StringOrdinal page;
std::string prev_id, next_id;
if (!prev) {
next_id = next->extension_id();
page = sorting->GetPageOrdinal(next_id);
} else if (!next) {
prev_id = prev->extension_id();
page = sorting->GetPageOrdinal(prev_id);
} else {
prev_id = prev->extension_id();
page = sorting->GetPageOrdinal(prev_id);
// Only set |next_id| if on the same page, otherwise just insert after prev.
if (page.Equals(sorting->GetPageOrdinal(next->extension_id())))
next_id = next->extension_id();
}
service->extension_prefs()->SetAppDraggedByUser(extension_id_);
sorting->SetPageOrdinal(extension_id_, page);
service->OnExtensionMoved(extension_id_, prev_id, next_id);
}

const Extension* ExtensionAppItem::GetExtension() const {
const ExtensionService* service =
extensions::ExtensionSystem::Get(profile_)->extension_service();
Expand Down
5 changes: 5 additions & 0 deletions chrome/browser/ui/app_list/extension_app_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ class ExtensionAppItem : public app_list::AppListItemModel,
// it gray.
void UpdateIcon();

// Update page and app launcher ordinals to put the app in between |prev| and
// |next|. Note that |prev| and |next| could be NULL when the app is put at
// the beginning or at the end.
void Move(const ExtensionAppItem* prev, const ExtensionAppItem* next);

const std::string& extension_id() const { return extension_id_; }

static const char kAppType[];
Expand Down
39 changes: 39 additions & 0 deletions chrome/browser/ui/app_list/extension_app_model_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,13 @@ ExtensionAppModelBuilder::ExtensionAppModelBuilder(
model_(model),
highlighted_app_pending_(false),
tracker_(NULL) {
model_->apps()->AddObserver(this);
SwitchProfile(profile); // Builds the model.
}

ExtensionAppModelBuilder::~ExtensionAppModelBuilder() {
OnShutdown();
model_->apps()->RemoveObserver(this);
}

void ExtensionAppModelBuilder::OnBeginExtensionInstall(
Expand Down Expand Up @@ -239,3 +241,40 @@ void ExtensionAppModelBuilder::UpdateHighlight() {
item->SetHighlighted(true);
highlighted_app_pending_ = false;
}

void ExtensionAppModelBuilder::ListItemsAdded(size_t start, size_t count) {
}

void ExtensionAppModelBuilder::ListItemsRemoved(size_t start, size_t count) {
}

void ExtensionAppModelBuilder::ListItemMoved(size_t index,
size_t target_index) {
app_list::AppListModel::Apps* app_list = model_->apps();
app_list::AppListItemModel* item = app_list->GetItemAt(target_index);
if (item->GetAppType() != ExtensionAppItem::kAppType)
return;

ExtensionAppItem* prev = NULL;
for (size_t idx = target_index; idx > 1; --idx) {
app_list::AppListItemModel* item = app_list->GetItemAt(idx - 1);
if (item->GetAppType() == ExtensionAppItem::kAppType) {
prev = static_cast<ExtensionAppItem*>(item);
break;
}
}
ExtensionAppItem* next = NULL;
for (size_t idx = target_index; idx < app_list->item_count() - 1; ++idx) {
app_list::AppListItemModel* item = app_list->GetItemAt(idx + 1);
if (item->GetAppType() == ExtensionAppItem::kAppType) {
next = static_cast<ExtensionAppItem*>(item);
break;
}
}
if (prev || next)
static_cast<ExtensionAppItem*>(item)->Move(prev, next);
}

void ExtensionAppModelBuilder::ListItemsChanged(size_t start, size_t count) {
NOTREACHED();
}
13 changes: 9 additions & 4 deletions chrome/browser/ui/app_list/extension_app_model_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ class ImageSkia;

// This class populates and maintains the given |model| with information from
// |profile|.
class ExtensionAppModelBuilder : public extensions::InstallObserver {
class ExtensionAppModelBuilder : public extensions::InstallObserver,
public ui::ListModelObserver {
public:
ExtensionAppModelBuilder(Profile* profile,
app_list::AppListModel* model,
Expand All @@ -42,16 +43,14 @@ class ExtensionAppModelBuilder : public extensions::InstallObserver {
private:
typedef std::vector<ExtensionAppItem*> ExtensionAppList;

// Overridden from extensions::InstallObserver:
// extensions::InstallObserver
virtual void OnBeginExtensionInstall(const std::string& extension_id,
const std::string& extension_name,
const gfx::ImageSkia& installing_icon,
bool is_app,
bool is_platform_app) OVERRIDE;

virtual void OnDownloadProgress(const std::string& extension_id,
int percent_downloaded) OVERRIDE;

virtual void OnInstallFailure(const std::string& extension_id) OVERRIDE;
virtual void OnExtensionInstalled(
const extensions::Extension* extension) OVERRIDE {}
Expand All @@ -66,6 +65,12 @@ class ExtensionAppModelBuilder : public extensions::InstallObserver {
const std::string& extension_id) OVERRIDE;
virtual void OnShutdown() OVERRIDE;

// ui::ListModelObserver
virtual void ListItemsAdded(size_t start, size_t count) OVERRIDE;
virtual void ListItemsRemoved(size_t start, size_t count) OVERRIDE;
virtual void ListItemMoved(size_t index, size_t target_index) OVERRIDE;
virtual void ListItemsChanged(size_t start, size_t count) OVERRIDE;

// Adds apps in |extensions| to |apps|.
void AddApps(const ExtensionSet* extensions, ExtensionAppList* apps);

Expand Down

0 comments on commit c647c4b

Please sign in to comment.