| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/webui/ntp/app_launcher_handler.h" | 5 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 ExtensionPrefs::LAUNCH_DEFAULT)); | 153 ExtensionPrefs::LAUNCH_DEFAULT)); |
| 154 value->SetBoolean("offline_enabled", extension->offline_enabled()); | 154 value->SetBoolean("offline_enabled", extension->offline_enabled()); |
| 155 value->SetBoolean("is_component", | 155 value->SetBoolean("is_component", |
| 156 extension->location() == Extension::COMPONENT); | 156 extension->location() == Extension::COMPONENT); |
| 157 value->SetBoolean("is_webstore", | 157 value->SetBoolean("is_webstore", |
| 158 extension->id() == extension_misc::kWebStoreAppId); | 158 extension->id() == extension_misc::kWebStoreAppId); |
| 159 | 159 |
| 160 if (notification) | 160 if (notification) |
| 161 value->Set("notification", SerializeNotification(*notification)); | 161 value->Set("notification", SerializeNotification(*notification)); |
| 162 | 162 |
| 163 int app_launch_index = prefs->GetAppLaunchIndex(extension->id()); | 163 std::string app_launch_index = prefs->GetAppLaunchIndex(extension->id()); |
| 164 if (app_launch_index == -1) { | 164 if (app_launch_index.compare(extension_misc::kUnsetIndex) == 0) { |
| 165 // Make sure every app has a launch index (some predate the launch index). | 165 // Make sure every app has a launch index (some predate the launch index). |
| 166 // The webstore's app launch index is set to -2 to make sure it's first. | 166 // The webstore's app launch index is set to -2 to make sure it's first. |
| 167 // The next time the user drags (any) app this will be set to something | 167 // The next time the user drags (any) app this will be set to something |
| 168 // sane (i.e. >= 0). | 168 // sane (i.e. >= 0). |
| 169 app_launch_index = extension->id() == extension_misc::kWebStoreAppId ? | 169 app_launch_index = extension->id() == extension_misc::kWebStoreAppId ? |
| 170 -2 : prefs->GetNextAppLaunchIndex(0); | 170 "-2" : prefs->GetNextAppLaunchIndex("0"); |
| 171 prefs->SetAppLaunchIndex(extension->id(), app_launch_index); | 171 prefs->SetAppLaunchIndex(extension->id(), app_launch_index); |
| 172 } | 172 } |
| 173 value->SetInteger("app_launch_index", app_launch_index); | 173 value->SetString("app_launch_index", app_launch_index); |
| 174 | 174 |
| 175 int page_index = prefs->GetPageIndex(extension->id()); | 175 std::string page_index = prefs->GetPageIndex(extension->id()); |
| 176 if (page_index < 0) { | 176 if (page_index.compare(extension_misc::kUnsetIndex) == 0) { |
| 177 // Make sure every app has a page index (some predate the page index). | 177 // Make sure every app has a page index (some predate the page index). |
| 178 // The webstore app should be on the first page. | 178 // The webstore app should be on the first page. |
| 179 page_index = extension->id() == extension_misc::kWebStoreAppId ? | 179 page_index = extension->id() == extension_misc::kWebStoreAppId ? |
| 180 0 : prefs->GetNaturalAppPageIndex(); | 180 "0" : prefs->GetNaturalAppPageIndex(); |
| 181 prefs->SetPageIndex(extension->id(), page_index); | 181 prefs->SetPageIndex(extension->id(), page_index); |
| 182 } | 182 } |
| 183 value->SetInteger("page_index", page_index); | 183 value->SetString("page_index", page_index); |
| 184 } | 184 } |
| 185 | 185 |
| 186 // TODO(estade): remove this. We record app launches via js calls rather than | 186 // TODO(estade): remove this. We record app launches via js calls rather than |
| 187 // pings for ntp4. | 187 // pings for ntp4. |
| 188 // static | 188 // static |
| 189 bool AppLauncherHandler::HandlePing(Profile* profile, const std::string& path) { | 189 bool AppLauncherHandler::HandlePing(Profile* profile, const std::string& path) { |
| 190 std::vector<std::string> params; | 190 std::vector<std::string> params; |
| 191 base::SplitString(path, '+', ¶ms); | 191 base::SplitString(path, '+', ¶ms); |
| 192 | 192 |
| 193 // Check if the user launched an app from the most visited or recently | 193 // Check if the user launched an app from the most visited or recently |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 dictionary->SetBoolean("disableCreateAppShortcut", true); | 414 dictionary->SetBoolean("disableCreateAppShortcut", true); |
| 415 #endif | 415 #endif |
| 416 | 416 |
| 417 dictionary->SetBoolean( | 417 dictionary->SetBoolean( |
| 418 "showLauncher", | 418 "showLauncher", |
| 419 extension_service_->apps_promo()->ShouldShowAppLauncher( | 419 extension_service_->apps_promo()->ShouldShowAppLauncher( |
| 420 extension_service_->GetAppIds())); | 420 extension_service_->GetAppIds())); |
| 421 | 421 |
| 422 if (NewTabUI::NTP4Enabled()) { | 422 if (NewTabUI::NTP4Enabled()) { |
| 423 PrefService* prefs = Profile::FromWebUI(web_ui_)->GetPrefs(); | 423 PrefService* prefs = Profile::FromWebUI(web_ui_)->GetPrefs(); |
| 424 const ListValue* app_page_names = prefs->GetList(prefs::kNTPAppPageNames); | 424 const DictionaryValue* app_page_names = |
| 425 if (app_page_names && app_page_names->GetSize()) { | 425 prefs->GetDictionary(prefs::kNTPAppPageNames); |
| 426 if (app_page_names && app_page_names->size()) { |
| 426 dictionary->Set("appPageNames", | 427 dictionary->Set("appPageNames", |
| 427 static_cast<ListValue*>(app_page_names->DeepCopy())); | 428 static_cast<DictionaryValue*>(app_page_names->DeepCopy()))
; |
| 428 } | 429 } |
| 429 } | 430 } |
| 430 } | 431 } |
| 431 | 432 |
| 432 DictionaryValue* AppLauncherHandler::GetAppInfo(const Extension* extension) { | 433 DictionaryValue* AppLauncherHandler::GetAppInfo(const Extension* extension) { |
| 433 AppNotificationManager* notification_manager = | 434 AppNotificationManager* notification_manager = |
| 434 extension_service_->app_notification_manager(); | 435 extension_service_->app_notification_manager(); |
| 435 DictionaryValue* app_info = new DictionaryValue(); | 436 DictionaryValue* app_info = new DictionaryValue(); |
| 436 // CreateAppInfo can change the extension prefs. | 437 // CreateAppInfo can change the extension prefs. |
| 437 AutoReset<bool> auto_reset(&ignore_changes_, true); | 438 AutoReset<bool> auto_reset(&ignore_changes_, true); |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 | 710 |
| 710 extension_service_->extension_prefs()->SetAppDraggedByUser(dragged_app_id); | 711 extension_service_->extension_prefs()->SetAppDraggedByUser(dragged_app_id); |
| 711 extension_service_->extension_prefs()->SetAppLauncherOrder(extension_ids); | 712 extension_service_->extension_prefs()->SetAppLauncherOrder(extension_ids); |
| 712 } | 713 } |
| 713 | 714 |
| 714 void AppLauncherHandler::HandleSetPageIndex(const ListValue* args) { | 715 void AppLauncherHandler::HandleSetPageIndex(const ListValue* args) { |
| 715 std::string extension_id; | 716 std::string extension_id; |
| 716 double page_index; | 717 double page_index; |
| 717 CHECK(args->GetString(0, &extension_id)); | 718 CHECK(args->GetString(0, &extension_id)); |
| 718 CHECK(args->GetDouble(1, &page_index)); | 719 CHECK(args->GetDouble(1, &page_index)); |
| 720 std::string page_index_str = base::IntToString(static_cast<int>(page_index)); |
| 719 | 721 |
| 720 // Don't update the page; it already knows the apps have been reordered. | 722 // Don't update the page; it already knows the apps have been reordered. |
| 721 scoped_ptr<AutoReset<bool> > auto_reset; | 723 scoped_ptr<AutoReset<bool> > auto_reset; |
| 722 if (NewTabUI::NTP4Enabled()) | 724 if (NewTabUI::NTP4Enabled()) |
| 723 auto_reset.reset(new AutoReset<bool>(&ignore_changes_, true)); | 725 auto_reset.reset(new AutoReset<bool>(&ignore_changes_, true)); |
| 724 | 726 |
| 725 extension_service_->extension_prefs()->SetPageIndex(extension_id, | 727 extension_service_->extension_prefs()->SetPageIndex(extension_id, |
| 726 static_cast<int>(page_index)); | 728 page_index_str); |
| 727 } | 729 } |
| 728 | 730 |
| 729 void AppLauncherHandler::HandlePromoSeen(const ListValue* args) { | 731 void AppLauncherHandler::HandlePromoSeen(const ListValue* args) { |
| 730 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, | 732 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, |
| 731 extension_misc::PROMO_SEEN, | 733 extension_misc::PROMO_SEEN, |
| 732 extension_misc::PROMO_BUCKET_BOUNDARY); | 734 extension_misc::PROMO_BUCKET_BOUNDARY); |
| 733 } | 735 } |
| 734 | 736 |
| 735 void AppLauncherHandler::HandleSaveAppPageName(const ListValue* args) { | 737 void AppLauncherHandler::HandleSaveAppPageName(const ListValue* args) { |
| 736 string16 name; | 738 string16 name; |
| 737 CHECK(args->GetString(0, &name)); | 739 CHECK(args->GetString(0, &name)); |
| 738 | 740 |
| 739 double page_index; | 741 double page_index; |
| 740 CHECK(args->GetDouble(1, &page_index)); | 742 CHECK(args->GetDouble(1, &page_index)); |
| 743 std::string page_index_str = base::IntToString(static_cast<int>(page_index)); |
| 741 | 744 |
| 742 AutoReset<bool> auto_reset(&ignore_changes_, true); | 745 AutoReset<bool> auto_reset(&ignore_changes_, true); |
| 743 PrefService* prefs = Profile::FromWebUI(web_ui_)->GetPrefs(); | 746 PrefService* prefs = Profile::FromWebUI(web_ui_)->GetPrefs(); |
| 744 ListPrefUpdate update(prefs, prefs::kNTPAppPageNames); | 747 DictionaryPrefUpdate update(prefs, prefs::kNTPAppPageNames); |
| 745 ListValue* list = update.Get(); | 748 DictionaryValue* dictionary = update.Get(); |
| 746 list->Set(static_cast<size_t>(page_index), Value::CreateStringValue(name)); | 749 dictionary->Set(page_index_str, Value::CreateStringValue(name)); |
| 747 } | 750 } |
| 748 | 751 |
| 749 void AppLauncherHandler::HandleGenerateAppForLink(const ListValue* args) { | 752 void AppLauncherHandler::HandleGenerateAppForLink(const ListValue* args) { |
| 750 std::string url; | 753 std::string url; |
| 751 CHECK(args->GetString(0, &url)); | 754 CHECK(args->GetString(0, &url)); |
| 752 GURL launch_url(url); | 755 GURL launch_url(url); |
| 753 | 756 |
| 754 string16 title; | 757 string16 title; |
| 755 CHECK(args->GetString(1, &title)); | 758 CHECK(args->GetString(1, &title)); |
| 756 | 759 |
| 757 double page_index; | 760 double page_index; |
| 758 CHECK(args->GetDouble(2, &page_index)); | 761 CHECK(args->GetDouble(2, &page_index)); |
| 762 std::string page_index_str = base::IntToString(static_cast<int>(page_index)); |
| 759 | 763 |
| 760 Profile* profile = Profile::FromWebUI(web_ui_); | 764 Profile* profile = Profile::FromWebUI(web_ui_); |
| 761 FaviconService* favicon_service = | 765 FaviconService* favicon_service = |
| 762 profile->GetFaviconService(Profile::EXPLICIT_ACCESS); | 766 profile->GetFaviconService(Profile::EXPLICIT_ACCESS); |
| 763 if (!favicon_service) { | 767 if (!favicon_service) { |
| 764 LOG(ERROR) << "No favicon service"; | 768 LOG(ERROR) << "No favicon service"; |
| 765 return; | 769 return; |
| 766 } | 770 } |
| 767 | 771 |
| 768 scoped_ptr<AppInstallInfo> install_info(new AppInstallInfo()); | 772 scoped_ptr<AppInstallInfo> install_info(new AppInstallInfo()); |
| 769 install_info->is_bookmark_app = true; | 773 install_info->is_bookmark_app = true; |
| 770 install_info->title = title; | 774 install_info->title = title; |
| 771 install_info->app_url = launch_url; | 775 install_info->app_url = launch_url; |
| 772 install_info->page_index = static_cast<int>(page_index); | 776 install_info->page_index = page_index_str; |
| 773 | 777 |
| 774 FaviconService::Handle h = favicon_service->GetFaviconForURL( | 778 FaviconService::Handle h = favicon_service->GetFaviconForURL( |
| 775 launch_url, history::FAVICON, &favicon_consumer_, | 779 launch_url, history::FAVICON, &favicon_consumer_, |
| 776 NewCallback(this, &AppLauncherHandler::OnFaviconForApp)); | 780 NewCallback(this, &AppLauncherHandler::OnFaviconForApp)); |
| 777 favicon_consumer_.SetClientData(favicon_service, h, install_info.release()); | 781 favicon_consumer_.SetClientData(favicon_service, h, install_info.release()); |
| 778 } | 782 } |
| 779 | 783 |
| 780 void AppLauncherHandler::HandleRecordAppLaunchByURL( | 784 void AppLauncherHandler::HandleRecordAppLaunchByURL( |
| 781 const base::ListValue* args) { | 785 const base::ListValue* args) { |
| 782 std::string url; | 786 std::string url; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 825 return; | 829 return; |
| 826 | 830 |
| 827 scoped_ptr<StringValue> app_id(Value::CreateStringValue(highlight_app_id_)); | 831 scoped_ptr<StringValue> app_id(Value::CreateStringValue(highlight_app_id_)); |
| 828 web_ui_->CallJavascriptFunction("ntp4.setAppToBeHighlighted", *app_id); | 832 web_ui_->CallJavascriptFunction("ntp4.setAppToBeHighlighted", *app_id); |
| 829 highlight_app_id_.clear(); | 833 highlight_app_id_.clear(); |
| 830 } | 834 } |
| 831 | 835 |
| 832 // static | 836 // static |
| 833 void AppLauncherHandler::RegisterUserPrefs(PrefService* pref_service) { | 837 void AppLauncherHandler::RegisterUserPrefs(PrefService* pref_service) { |
| 834 // TODO(csilv): We will want this to be a syncable preference instead. | 838 // TODO(csilv): We will want this to be a syncable preference instead. |
| 835 pref_service->RegisterListPref(prefs::kNTPAppPageNames, | 839 pref_service->RegisterDictionaryPref(prefs::kNTPAppPageNames, |
| 836 PrefService::UNSYNCABLE_PREF); | 840 PrefService::UNSYNCABLE_PREF); |
| 837 } | 841 } |
| 838 | 842 |
| 839 // statiic | 843 // static |
| 840 void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) { | 844 void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) { |
| 841 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, | 845 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, |
| 842 extension_misc::APP_LAUNCH_NTP_WEBSTORE, | 846 extension_misc::APP_LAUNCH_NTP_WEBSTORE, |
| 843 extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); | 847 extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); |
| 844 | 848 |
| 845 if (!promo_active) return; | 849 if (!promo_active) return; |
| 846 | 850 |
| 847 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, | 851 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, |
| 848 extension_misc::PROMO_LAUNCH_WEB_STORE, | 852 extension_misc::PROMO_LAUNCH_WEB_STORE, |
| 849 extension_misc::PROMO_BUCKET_BOUNDARY); | 853 extension_misc::PROMO_BUCKET_BOUNDARY); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 | 994 |
| 991 void AppLauncherHandler::UninstallDefaultApps() { | 995 void AppLauncherHandler::UninstallDefaultApps() { |
| 992 AppsPromo* apps_promo = extension_service_->apps_promo(); | 996 AppsPromo* apps_promo = extension_service_->apps_promo(); |
| 993 const ExtensionIdSet& app_ids = apps_promo->old_default_apps(); | 997 const ExtensionIdSet& app_ids = apps_promo->old_default_apps(); |
| 994 for (ExtensionIdSet::const_iterator iter = app_ids.begin(); | 998 for (ExtensionIdSet::const_iterator iter = app_ids.begin(); |
| 995 iter != app_ids.end(); ++iter) { | 999 iter != app_ids.end(); ++iter) { |
| 996 if (extension_service_->GetExtensionById(*iter, true)) | 1000 if (extension_service_->GetExtensionById(*iter, true)) |
| 997 extension_service_->UninstallExtension(*iter, false, NULL); | 1001 extension_service_->UninstallExtension(*iter, false, NULL); |
| 998 } | 1002 } |
| 999 } | 1003 } |
| OLD | NEW |