Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/app_list_syncable_service.h" | 5 #include "chrome/browser/ui/app_list/app_list_syncable_service.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "chrome/browser/chrome_notification_types.h" | 8 #include "chrome/browser/chrome_notification_types.h" |
| 9 #include "chrome/browser/extensions/extension_service.h" | 9 #include "chrome/browser/extensions/extension_service.h" |
| 10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 } | 128 } |
| 129 | 129 |
| 130 AppListSyncableService::SyncItem::~SyncItem() { | 130 AppListSyncableService::SyncItem::~SyncItem() { |
| 131 } | 131 } |
| 132 | 132 |
| 133 // AppListSyncableService::ModelObserver | 133 // AppListSyncableService::ModelObserver |
| 134 | 134 |
| 135 class AppListSyncableService::ModelObserver : public AppListModelObserver { | 135 class AppListSyncableService::ModelObserver : public AppListModelObserver { |
| 136 public: | 136 public: |
| 137 explicit ModelObserver(AppListSyncableService* owner) | 137 explicit ModelObserver(AppListSyncableService* owner) |
| 138 : owner_(owner) { | 138 : owner_(owner), |
| 139 adding_item_(NULL) { | |
| 139 DVLOG(2) << owner_ << ": ModelObserver Added"; | 140 DVLOG(2) << owner_ << ": ModelObserver Added"; |
| 140 owner_->model()->AddObserver(this); | 141 owner_->model()->AddObserver(this); |
| 141 } | 142 } |
| 142 | 143 |
| 143 virtual ~ModelObserver() { | 144 virtual ~ModelObserver() { |
| 144 owner_->model()->RemoveObserver(this); | 145 owner_->model()->RemoveObserver(this); |
| 145 DVLOG(2) << owner_ << ": ModelObserver Removed"; | 146 DVLOG(2) << owner_ << ": ModelObserver Removed"; |
| 146 } | 147 } |
| 147 | 148 |
| 148 private: | 149 private: |
| 149 // AppListModelObserver | 150 // AppListModelObserver |
| 150 virtual void OnAppListItemAdded(AppListItem* item) OVERRIDE { | 151 virtual void OnAppListItemAdded(AppListItem* item) OVERRIDE { |
| 151 DVLOG(2) << owner_ << " OnAppListItemAdded: " << item->ToDebugString(); | 152 DCHECK(!adding_item_); |
| 153 adding_item_ = item; // Ignore updates while adding an item. | |
| 154 VLOG(2) << owner_ << " OnAppListItemAdded: " << item->ToDebugString(); | |
| 152 owner_->AddOrUpdateFromSyncItem(item); | 155 owner_->AddOrUpdateFromSyncItem(item); |
| 156 adding_item_ = NULL; | |
| 153 } | 157 } |
| 154 | 158 |
| 155 virtual void OnAppListItemWillBeDeleted(AppListItem* item) OVERRIDE { | 159 virtual void OnAppListItemWillBeDeleted(AppListItem* item) OVERRIDE { |
| 156 DVLOG(2) << owner_ << " OnAppListItemDeleted: " << item->ToDebugString(); | 160 DCHECK(!adding_item_); |
| 161 VLOG(2) << owner_ << " OnAppListItemDeleted: " << item->ToDebugString(); | |
| 162 // Don't sync folder removal in case the folder still exists on another | |
| 163 // device (e.g. with device specific items in it). Empty folders will be | |
| 164 // deleted when the last item is removed (in PruneEmptySyncFolders()). | |
| 165 if (item->GetItemType() == AppListFolderItem::kItemType) | |
| 166 return; | |
|
jennyz
2014/04/09 22:00:32
When users logs out and in again, the syncable ser
stevenjb
2014/04/09 22:17:16
AppListSyncableService has reliable information ab
| |
| 157 owner_->RemoveSyncItem(item->id()); | 167 owner_->RemoveSyncItem(item->id()); |
| 158 } | 168 } |
| 159 | 169 |
| 160 virtual void OnAppListItemUpdated(AppListItem* item) OVERRIDE { | 170 virtual void OnAppListItemUpdated(AppListItem* item) OVERRIDE { |
| 161 DVLOG(2) << owner_ << " OnAppListItemUpdated: " << item->ToDebugString(); | 171 if (adding_item_) { |
| 172 // Adding an item may trigger update notifications which should be | |
| 173 // ignored. | |
| 174 DCHECK_EQ(adding_item_, item); | |
| 175 return; | |
|
jennyz
2014/04/09 21:31:08
What if the update is not triggered by adding item
stevenjb
2014/04/09 21:48:16
This is all synchronous, so adding_item_ would be
jennyz
2014/04/09 22:00:32
Sounds good.
| |
| 176 } | |
| 177 VLOG(2) << owner_ << " OnAppListItemUpdated: " << item->ToDebugString(); | |
| 162 owner_->UpdateSyncItem(item); | 178 owner_->UpdateSyncItem(item); |
| 163 } | 179 } |
| 164 | 180 |
| 165 AppListSyncableService* owner_; | 181 AppListSyncableService* owner_; |
| 182 AppListItem* adding_item_; // Unowned pointer to item being added. | |
| 166 | 183 |
| 167 DISALLOW_COPY_AND_ASSIGN(ModelObserver); | 184 DISALLOW_COPY_AND_ASSIGN(ModelObserver); |
| 168 }; | 185 }; |
| 169 | 186 |
| 170 // AppListSyncableService | 187 // AppListSyncableService |
| 171 | 188 |
| 172 AppListSyncableService::AppListSyncableService( | 189 AppListSyncableService::AppListSyncableService( |
| 173 Profile* profile, | 190 Profile* profile, |
| 174 extensions::ExtensionSystem* extension_system) | 191 extensions::ExtensionSystem* extension_system) |
| 175 : profile_(profile), | 192 : profile_(profile), |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 297 } | 314 } |
| 298 | 315 |
| 299 return CreateSyncItemFromAppItem(app_item); | 316 return CreateSyncItemFromAppItem(app_item); |
| 300 } | 317 } |
| 301 | 318 |
| 302 AppListSyncableService::SyncItem* | 319 AppListSyncableService::SyncItem* |
| 303 AppListSyncableService::CreateSyncItemFromAppItem(AppListItem* app_item) { | 320 AppListSyncableService::CreateSyncItemFromAppItem(AppListItem* app_item) { |
| 304 sync_pb::AppListSpecifics::AppListItemType type; | 321 sync_pb::AppListSpecifics::AppListItemType type; |
| 305 if (!GetAppListItemType(app_item, &type)) | 322 if (!GetAppListItemType(app_item, &type)) |
| 306 return NULL; | 323 return NULL; |
| 324 VLOG(2) << this << " CreateSyncItemFromAppItem:" << app_item->ToDebugString(); | |
| 307 SyncItem* sync_item = CreateSyncItem(app_item->id(), type); | 325 SyncItem* sync_item = CreateSyncItem(app_item->id(), type); |
| 308 UpdateSyncItemFromAppItem(app_item, sync_item); | 326 UpdateSyncItemFromAppItem(app_item, sync_item); |
| 309 SendSyncChange(sync_item, SyncChange::ACTION_ADD); | 327 SendSyncChange(sync_item, SyncChange::ACTION_ADD); |
| 310 return sync_item; | 328 return sync_item; |
| 311 } | 329 } |
| 312 | 330 |
| 313 void AppListSyncableService::AddOrUpdateFromSyncItem(AppListItem* app_item) { | 331 void AppListSyncableService::AddOrUpdateFromSyncItem(AppListItem* app_item) { |
| 314 SyncItem* sync_item = FindSyncItem(app_item->id()); | 332 SyncItem* sync_item = FindSyncItem(app_item->id()); |
| 315 if (sync_item) { | 333 if (sync_item) { |
| 316 UpdateAppItemFromSyncItem(sync_item, app_item); | 334 UpdateAppItemFromSyncItem(sync_item, app_item); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 336 | 354 |
| 337 // Otherwise, we are adding the app as a non-default app (i.e. an app that | 355 // Otherwise, we are adding the app as a non-default app (i.e. an app that |
| 338 // was installed by Default and removed is getting installed explicitly by | 356 // was installed by Default and removed is getting installed explicitly by |
| 339 // the user), so delete the REMOVE_DEFAULT_APP. | 357 // the user), so delete the REMOVE_DEFAULT_APP. |
| 340 DeleteSyncItem(sync_item); | 358 DeleteSyncItem(sync_item); |
| 341 return false; | 359 return false; |
| 342 } | 360 } |
| 343 | 361 |
| 344 void AppListSyncableService::DeleteSyncItem(SyncItem* sync_item) { | 362 void AppListSyncableService::DeleteSyncItem(SyncItem* sync_item) { |
| 345 if (SyncStarted()) { | 363 if (SyncStarted()) { |
| 346 DVLOG(2) << this << " -> SYNC DELETE: " << sync_item->ToString(); | 364 VLOG(2) << this << " -> SYNC DELETE: " << sync_item->ToString(); |
| 347 SyncChange sync_change(FROM_HERE, SyncChange::ACTION_DELETE, | 365 SyncChange sync_change(FROM_HERE, SyncChange::ACTION_DELETE, |
| 348 GetSyncDataFromSyncItem(sync_item)); | 366 GetSyncDataFromSyncItem(sync_item)); |
| 349 sync_processor_->ProcessSyncChanges( | 367 sync_processor_->ProcessSyncChanges( |
| 350 FROM_HERE, syncer::SyncChangeList(1, sync_change)); | 368 FROM_HERE, syncer::SyncChangeList(1, sync_change)); |
| 351 } | 369 } |
| 352 std::string item_id = sync_item->item_id; | 370 std::string item_id = sync_item->item_id; |
| 353 delete sync_item; | 371 delete sync_item; |
| 354 sync_items_.erase(item_id); | 372 sync_items_.erase(item_id); |
| 355 } | 373 } |
| 356 | 374 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 399 if (type == sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP) { | 417 if (type == sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP) { |
| 400 // RemoveDefault item exists, just return. | 418 // RemoveDefault item exists, just return. |
| 401 DVLOG(2) << this << " : RemoveDefault Item exists."; | 419 DVLOG(2) << this << " : RemoveDefault Item exists."; |
| 402 return; | 420 return; |
| 403 } | 421 } |
| 404 | 422 |
| 405 if (type == sync_pb::AppListSpecifics::TYPE_APP && | 423 if (type == sync_pb::AppListSpecifics::TYPE_APP && |
| 406 AppIsDefault(extension_system_->extension_service(), id)) { | 424 AppIsDefault(extension_system_->extension_service(), id)) { |
| 407 // This is a Default app; update the entry to a REMOVE_DEFAULT entry. This | 425 // This is a Default app; update the entry to a REMOVE_DEFAULT entry. This |
| 408 // will overwrite any existing entry for the item. | 426 // will overwrite any existing entry for the item. |
| 409 DVLOG(2) << this << " -> SYNC UPDATE: REMOVE_DEFAULT: " | 427 VLOG(2) << this << " -> SYNC UPDATE: REMOVE_DEFAULT: " |
| 410 << sync_item->item_id; | 428 << sync_item->item_id; |
| 411 sync_item->item_type = sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP; | 429 sync_item->item_type = sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP; |
| 412 SendSyncChange(sync_item, SyncChange::ACTION_UPDATE); | 430 SendSyncChange(sync_item, SyncChange::ACTION_UPDATE); |
| 413 return; | 431 return; |
| 414 } | 432 } |
| 415 | 433 |
| 416 DeleteSyncItem(sync_item); | 434 DeleteSyncItem(sync_item); |
| 417 } | 435 } |
| 418 | 436 |
| 419 void AppListSyncableService::ResolveFolderPositions(bool move_oem_to_end) { | 437 void AppListSyncableService::ResolveFolderPositions(bool move_oem_to_end) { |
| 420 if (!app_list::switches::IsFolderUIEnabled()) | 438 if (!app_list::switches::IsFolderUIEnabled()) |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 503 result.set_num_items_after_association(sync_items_.size()); | 521 result.set_num_items_after_association(sync_items_.size()); |
| 504 result.set_num_items_added(new_items); | 522 result.set_num_items_added(new_items); |
| 505 result.set_num_items_deleted(0); | 523 result.set_num_items_deleted(0); |
| 506 result.set_num_items_modified(updated_items); | 524 result.set_num_items_modified(updated_items); |
| 507 | 525 |
| 508 // Send unsynced items. Does not affect |result|. | 526 // Send unsynced items. Does not affect |result|. |
| 509 syncer::SyncChangeList change_list; | 527 syncer::SyncChangeList change_list; |
| 510 for (std::set<std::string>::iterator iter = unsynced_items.begin(); | 528 for (std::set<std::string>::iterator iter = unsynced_items.begin(); |
| 511 iter != unsynced_items.end(); ++iter) { | 529 iter != unsynced_items.end(); ++iter) { |
| 512 SyncItem* sync_item = FindSyncItem(*iter); | 530 SyncItem* sync_item = FindSyncItem(*iter); |
| 513 DVLOG(2) << this << " -> SYNC ADD: " << sync_item->ToString(); | 531 VLOG(2) << this << " -> SYNC ADD: " << sync_item->ToString(); |
| 514 change_list.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_ADD, | 532 change_list.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_ADD, |
| 515 GetSyncDataFromSyncItem(sync_item))); | 533 GetSyncDataFromSyncItem(sync_item))); |
| 516 } | 534 } |
| 517 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); | 535 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); |
| 518 | 536 |
| 519 // Adding items may have created folders without setting their positions | 537 // Adding items may have created folders without setting their positions |
| 520 // since we haven't started observing the item list yet. Resolve those. | 538 // since we haven't started observing the item list yet. Resolve those. |
| 521 // Also ensure the OEM folder is at the end if its position hasn't been set. | 539 // Also ensure the OEM folder is at the end if its position hasn't been set. |
| 522 bool move_oem_to_end = !oem_folder_is_synced; | 540 bool move_oem_to_end = !oem_folder_is_synced; |
| 523 ResolveFolderPositions(move_oem_to_end); | 541 ResolveFolderPositions(move_oem_to_end); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 536 } | 554 } |
| 537 | 555 |
| 538 syncer::SyncDataList AppListSyncableService::GetAllSyncData( | 556 syncer::SyncDataList AppListSyncableService::GetAllSyncData( |
| 539 syncer::ModelType type) const { | 557 syncer::ModelType type) const { |
| 540 DCHECK_EQ(syncer::APP_LIST, type); | 558 DCHECK_EQ(syncer::APP_LIST, type); |
| 541 | 559 |
| 542 VLOG(1) << this << ": GetAllSyncData: " << sync_items_.size(); | 560 VLOG(1) << this << ": GetAllSyncData: " << sync_items_.size(); |
| 543 syncer::SyncDataList list; | 561 syncer::SyncDataList list; |
| 544 for (SyncItemMap::const_iterator iter = sync_items_.begin(); | 562 for (SyncItemMap::const_iterator iter = sync_items_.begin(); |
| 545 iter != sync_items_.end(); ++iter) { | 563 iter != sync_items_.end(); ++iter) { |
| 546 DVLOG(2) << this << " -> SYNC: " << iter->second->ToString(); | 564 VLOG(2) << this << " -> SYNC: " << iter->second->ToString(); |
| 547 list.push_back(GetSyncDataFromSyncItem(iter->second)); | 565 list.push_back(GetSyncDataFromSyncItem(iter->second)); |
| 548 } | 566 } |
| 549 return list; | 567 return list; |
| 550 } | 568 } |
| 551 | 569 |
| 552 syncer::SyncError AppListSyncableService::ProcessSyncChanges( | 570 syncer::SyncError AppListSyncableService::ProcessSyncChanges( |
| 553 const tracked_objects::Location& from_here, | 571 const tracked_objects::Location& from_here, |
| 554 const syncer::SyncChangeList& change_list) { | 572 const syncer::SyncChangeList& change_list) { |
| 555 if (!sync_processor_.get()) { | 573 if (!sync_processor_.get()) { |
| 556 return syncer::SyncError(FROM_HERE, | 574 return syncer::SyncError(FROM_HERE, |
| 557 syncer::SyncError::DATATYPE_ERROR, | 575 syncer::SyncError::DATATYPE_ERROR, |
| 558 "App List syncable service is not started.", | 576 "App List syncable service is not started.", |
| 559 syncer::APP_LIST); | 577 syncer::APP_LIST); |
| 560 } | 578 } |
| 561 | 579 |
| 562 // Don't observe the model while processing incoming sync changes. | 580 // Don't observe the model while processing incoming sync changes. |
| 563 model_observer_.reset(); | 581 model_observer_.reset(); |
| 564 | 582 |
| 565 VLOG(1) << this << ": ProcessSyncChanges: " << change_list.size(); | 583 VLOG(1) << this << ": ProcessSyncChanges: " << change_list.size(); |
| 566 for (syncer::SyncChangeList::const_iterator iter = change_list.begin(); | 584 for (syncer::SyncChangeList::const_iterator iter = change_list.begin(); |
| 567 iter != change_list.end(); ++iter) { | 585 iter != change_list.end(); ++iter) { |
| 568 const SyncChange& change = *iter; | 586 const SyncChange& change = *iter; |
| 569 DVLOG(2) << this << " Change: " | 587 VLOG(2) << this << " Change: " |
| 570 << change.sync_data().GetSpecifics().app_list().item_id() | 588 << change.sync_data().GetSpecifics().app_list().item_id() |
| 571 << " (" << change.change_type() << ")"; | 589 << " (" << change.change_type() << ")"; |
| 572 if (change.change_type() == SyncChange::ACTION_ADD || | 590 if (change.change_type() == SyncChange::ACTION_ADD || |
| 573 change.change_type() == SyncChange::ACTION_UPDATE) { | 591 change.change_type() == SyncChange::ACTION_UPDATE) { |
| 574 ProcessSyncItemSpecifics(change.sync_data().GetSpecifics().app_list()); | 592 ProcessSyncItemSpecifics(change.sync_data().GetSpecifics().app_list()); |
| 575 } else if (change.change_type() == SyncChange::ACTION_DELETE) { | 593 } else if (change.change_type() == SyncChange::ACTION_DELETE) { |
| 576 DeleteSyncItemSpecifics(change.sync_data().GetSpecifics().app_list()); | 594 DeleteSyncItemSpecifics(change.sync_data().GetSpecifics().app_list()); |
| 577 } else { | 595 } else { |
| 578 LOG(ERROR) << "Invalid sync change"; | 596 LOG(ERROR) << "Invalid sync change"; |
| 579 } | 597 } |
| 580 } | 598 } |
| 581 | 599 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 593 if (item_id.empty()) { | 611 if (item_id.empty()) { |
| 594 LOG(ERROR) << "AppList item with empty ID"; | 612 LOG(ERROR) << "AppList item with empty ID"; |
| 595 return false; | 613 return false; |
| 596 } | 614 } |
| 597 SyncItem* sync_item = FindSyncItem(item_id); | 615 SyncItem* sync_item = FindSyncItem(item_id); |
| 598 if (sync_item) { | 616 if (sync_item) { |
| 599 // If an item of the same type exists, update it. | 617 // If an item of the same type exists, update it. |
| 600 if (sync_item->item_type == specifics.item_type()) { | 618 if (sync_item->item_type == specifics.item_type()) { |
| 601 UpdateSyncItemFromSync(specifics, sync_item); | 619 UpdateSyncItemFromSync(specifics, sync_item); |
| 602 ProcessExistingSyncItem(sync_item); | 620 ProcessExistingSyncItem(sync_item); |
| 603 DVLOG(2) << this << " <- SYNC UPDATE: " << sync_item->ToString(); | 621 VLOG(2) << this << " <- SYNC UPDATE: " << sync_item->ToString(); |
| 604 return false; | 622 return false; |
| 605 } | 623 } |
| 606 // Otherwise, one of the entries should be TYPE_REMOVE_DEFAULT_APP. | 624 // Otherwise, one of the entries should be TYPE_REMOVE_DEFAULT_APP. |
| 607 if (sync_item->item_type != | 625 if (sync_item->item_type != |
| 608 sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP && | 626 sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP && |
| 609 specifics.item_type() != | 627 specifics.item_type() != |
| 610 sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP) { | 628 sync_pb::AppListSpecifics::TYPE_REMOVE_DEFAULT_APP) { |
| 611 LOG(ERROR) << "Synced item type: " << specifics.item_type() | 629 LOG(ERROR) << "Synced item type: " << specifics.item_type() |
| 612 << " != existing sync item type: " << sync_item->item_type | 630 << " != existing sync item type: " << sync_item->item_type |
| 613 << " Deleting item from model!"; | 631 << " Deleting item from model!"; |
| 614 model_->DeleteItem(item_id); | 632 model_->DeleteItem(item_id); |
| 615 } | 633 } |
| 616 DVLOG(2) << this << " - ProcessSyncItem: Delete existing entry: " | 634 VLOG(2) << this << " - ProcessSyncItem: Delete existing entry: " |
| 617 << sync_item->ToString(); | 635 << sync_item->ToString(); |
| 618 delete sync_item; | 636 delete sync_item; |
| 619 sync_items_.erase(item_id); | 637 sync_items_.erase(item_id); |
| 620 } | 638 } |
| 621 | 639 |
| 622 sync_item = CreateSyncItem(item_id, specifics.item_type()); | 640 sync_item = CreateSyncItem(item_id, specifics.item_type()); |
| 623 UpdateSyncItemFromSync(specifics, sync_item); | 641 UpdateSyncItemFromSync(specifics, sync_item); |
| 624 ProcessNewSyncItem(sync_item); | 642 ProcessNewSyncItem(sync_item); |
| 625 DVLOG(2) << this << " <- SYNC ADD: " << sync_item->ToString(); | 643 VLOG(2) << this << " <- SYNC ADD: " << sync_item->ToString(); |
| 626 return true; | 644 return true; |
| 627 } | 645 } |
| 628 | 646 |
| 629 void AppListSyncableService::ProcessNewSyncItem(SyncItem* sync_item) { | 647 void AppListSyncableService::ProcessNewSyncItem(SyncItem* sync_item) { |
| 630 VLOG(2) << "ProcessNewSyncItem: " << sync_item->ToString(); | 648 VLOG(2) << "ProcessNewSyncItem: " << sync_item->ToString(); |
| 631 switch (sync_item->item_type) { | 649 switch (sync_item->item_type) { |
| 632 case sync_pb::AppListSpecifics::TYPE_APP: { | 650 case sync_pb::AppListSpecifics::TYPE_APP: { |
| 633 // New apps are added through ExtensionAppModelBuilder. | 651 // New apps are added through ExtensionAppModelBuilder. |
| 634 // TODO(stevenjb): Determine how to handle app items in sync that | 652 // TODO(stevenjb): Determine how to handle app items in sync that |
| 635 // are not installed (e.g. default / OEM apps). | 653 // are not installed (e.g. default / OEM apps). |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 675 !AppIsOem(app_item->id())) { | 693 !AppIsOem(app_item->id())) { |
| 676 DVLOG(2) << " Moving Item To Folder: " << sync_item->parent_id; | 694 DVLOG(2) << " Moving Item To Folder: " << sync_item->parent_id; |
| 677 model_->MoveItemToFolder(app_item, sync_item->parent_id); | 695 model_->MoveItemToFolder(app_item, sync_item->parent_id); |
| 678 } | 696 } |
| 679 UpdateAppItemFromSyncItem(sync_item, app_item); | 697 UpdateAppItemFromSyncItem(sync_item, app_item); |
| 680 } | 698 } |
| 681 | 699 |
| 682 void AppListSyncableService::UpdateAppItemFromSyncItem( | 700 void AppListSyncableService::UpdateAppItemFromSyncItem( |
| 683 const AppListSyncableService::SyncItem* sync_item, | 701 const AppListSyncableService::SyncItem* sync_item, |
| 684 AppListItem* app_item) { | 702 AppListItem* app_item) { |
| 703 VLOG(2) << this << "UpdateAppItemFromSyncItem: " << sync_item->ToString(); | |
| 685 if (!app_item->position().Equals(sync_item->item_ordinal)) | 704 if (!app_item->position().Equals(sync_item->item_ordinal)) |
| 686 model_->SetItemPosition(app_item, sync_item->item_ordinal); | 705 model_->SetItemPosition(app_item, sync_item->item_ordinal); |
| 687 // Only update the item name if it is a Folder or the name is empty. | 706 // Only update the item name if it is a Folder or the name is empty. |
| 688 if (sync_item->item_name != app_item->name() && | 707 if (sync_item->item_name != app_item->name() && |
| 689 sync_item->item_id != kOemFolderId && | 708 sync_item->item_id != kOemFolderId && |
| 690 (app_item->GetItemType() == AppListFolderItem::kItemType || | 709 (app_item->GetItemType() == AppListFolderItem::kItemType || |
| 691 app_item->name().empty())) { | 710 app_item->name().empty())) { |
| 692 model_->SetItemName(app_item, sync_item->item_name); | 711 model_->SetItemName(app_item, sync_item->item_name); |
| 693 } | 712 } |
| 694 } | 713 } |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 706 | 725 |
| 707 void AppListSyncableService::SendSyncChange( | 726 void AppListSyncableService::SendSyncChange( |
| 708 SyncItem* sync_item, | 727 SyncItem* sync_item, |
| 709 SyncChange::SyncChangeType sync_change_type) { | 728 SyncChange::SyncChangeType sync_change_type) { |
| 710 if (!SyncStarted()) { | 729 if (!SyncStarted()) { |
| 711 DVLOG(2) << this << " - SendSyncChange: SYNC NOT STARTED: " | 730 DVLOG(2) << this << " - SendSyncChange: SYNC NOT STARTED: " |
| 712 << sync_item->ToString(); | 731 << sync_item->ToString(); |
| 713 return; | 732 return; |
| 714 } | 733 } |
| 715 if (sync_change_type == SyncChange::ACTION_ADD) | 734 if (sync_change_type == SyncChange::ACTION_ADD) |
| 716 DVLOG(2) << this << " -> SYNC ADD: " << sync_item->ToString(); | 735 VLOG(2) << this << " -> SYNC ADD: " << sync_item->ToString(); |
| 717 else | 736 else |
| 718 DVLOG(2) << this << " -> SYNC UPDATE: " << sync_item->ToString(); | 737 VLOG(2) << this << " -> SYNC UPDATE: " << sync_item->ToString(); |
| 719 SyncChange sync_change(FROM_HERE, sync_change_type, | 738 SyncChange sync_change(FROM_HERE, sync_change_type, |
| 720 GetSyncDataFromSyncItem(sync_item)); | 739 GetSyncDataFromSyncItem(sync_item)); |
| 721 sync_processor_->ProcessSyncChanges( | 740 sync_processor_->ProcessSyncChanges( |
| 722 FROM_HERE, syncer::SyncChangeList(1, sync_change)); | 741 FROM_HERE, syncer::SyncChangeList(1, sync_change)); |
| 723 } | 742 } |
| 724 | 743 |
| 725 AppListSyncableService::SyncItem* | 744 AppListSyncableService::SyncItem* |
| 726 AppListSyncableService::FindSyncItem(const std::string& item_id) { | 745 AppListSyncableService::FindSyncItem(const std::string& item_id) { |
| 727 SyncItemMap::iterator iter = sync_items_.find(item_id); | 746 SyncItemMap::iterator iter = sync_items_.find(item_id); |
| 728 if (iter == sync_items_.end()) | 747 if (iter == sync_items_.end()) |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 746 if (item_id.empty()) { | 765 if (item_id.empty()) { |
| 747 LOG(ERROR) << "Delete AppList item with empty ID"; | 766 LOG(ERROR) << "Delete AppList item with empty ID"; |
| 748 return; | 767 return; |
| 749 } | 768 } |
| 750 VLOG(2) << this << ": DeleteSyncItemSpecifics: " << item_id.substr(0, 8); | 769 VLOG(2) << this << ": DeleteSyncItemSpecifics: " << item_id.substr(0, 8); |
| 751 SyncItemMap::iterator iter = sync_items_.find(item_id); | 770 SyncItemMap::iterator iter = sync_items_.find(item_id); |
| 752 if (iter == sync_items_.end()) | 771 if (iter == sync_items_.end()) |
| 753 return; | 772 return; |
| 754 sync_pb::AppListSpecifics::AppListItemType item_type = | 773 sync_pb::AppListSpecifics::AppListItemType item_type = |
| 755 iter->second->item_type; | 774 iter->second->item_type; |
| 756 DVLOG(2) << this << " <- SYNC DELETE: " << iter->second->ToString(); | 775 VLOG(2) << this << " <- SYNC DELETE: " << iter->second->ToString(); |
| 757 delete iter->second; | 776 delete iter->second; |
| 758 sync_items_.erase(iter); | 777 sync_items_.erase(iter); |
| 759 // Only delete apps from the model. Folders will be deleted when all | 778 // Only delete apps from the model. Folders will be deleted when all |
| 760 // children have been deleted. | 779 // children have been deleted. |
| 761 if (item_type == sync_pb::AppListSpecifics::TYPE_APP) | 780 if (item_type == sync_pb::AppListSpecifics::TYPE_APP) |
| 762 model_->DeleteItem(item_id); | 781 model_->DeleteItem(item_id); |
| 763 } | 782 } |
| 764 | 783 |
| 765 std::string AppListSyncableService::FindOrCreateOemFolder() { | 784 std::string AppListSyncableService::FindOrCreateOemFolder() { |
| 766 AppListFolderItem* oem_folder = model_->FindFolderItem(kOemFolderId); | 785 AppListFolderItem* oem_folder = model_->FindFolderItem(kOemFolderId); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 789 } else { | 808 } else { |
| 790 res += " { " + item_name + " }"; | 809 res += " { " + item_name + " }"; |
| 791 res += " [" + item_ordinal.ToDebugString() + "]"; | 810 res += " [" + item_ordinal.ToDebugString() + "]"; |
| 792 if (!parent_id.empty()) | 811 if (!parent_id.empty()) |
| 793 res += " <" + parent_id.substr(0, 8) + ">"; | 812 res += " <" + parent_id.substr(0, 8) + ">"; |
| 794 } | 813 } |
| 795 return res; | 814 return res; |
| 796 } | 815 } |
| 797 | 816 |
| 798 } // namespace app_list | 817 } // namespace app_list |
| OLD | NEW |