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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_ANDROID_SHORTCUT_HELPER_H_ 6 #define CHROME_BROWSER_ANDROID_SHORTCUT_HELPER_H_ 7 8 #include "base/android/jni_helper.h" 9 #include "base/basictypes.h" 10 #include "base/strings/string16.h" 11 #include "chrome/browser/android/tab_android.h" 12 #include "chrome/common/cancelable_task_tracker.h" 13 #include "content/public/browser/web_contents_observer.h" 14 15 namespace chrome { 16 struct FaviconBitmapResult; 17 } // namespace chrome 18 19 namespace content { 20 class WebContents; 21 } // namespace content 22 23 namespace IPC { 24 class Message; 25 } 26 27 class GURL; 28 29 // Adds a shortcut to the current URL to the Android home screen. 30 // This proceeds over three phases: 31 // 1) The renderer is asked to parse out webapp related meta tags with an async 32 // IPC message. 33 // 2) The highest-resolution favicon available is retrieved for use as the 34 // icon on the home screen. 35 // 3) A JNI call is made to fire an Intent at the Android launcher, which adds 36 // the shortcut. 37 class ShortcutBuilder : public content::WebContentsObserver { 38 public: 39 enum ShortcutType { 40 APP_SHORTCUT, 41 APP_SHORTCUT_APPLE, 42 BOOKMARK 43 }; 44 45 explicit ShortcutBuilder(content::WebContents* web_contents, 46 const base::string16& title, 47 int launcher_large_icon_size); 48 virtual ~ShortcutBuilder() {} 49 50 void OnDidRetrieveWebappInformation(bool success, 51 bool is_mobile_webapp_capable, 52 bool is_apple_mobile_webapp_capable, 53 const GURL& expected_url); 54 55 void FinishAddingShortcut(const chrome::FaviconBitmapResult& bitmap_result); 56 57 // WebContentsObserver 58 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 59 virtual void WebContentsDestroyed(content::WebContents* web_contents) 60 OVERRIDE; 61 62 private: 63 void Destroy(); 64 65 GURL url_; 66 base::string16 title_; 67 int launcher_large_icon_size_; 68 ShortcutType shortcut_type_; 69 CancelableTaskTracker cancelable_task_tracker_; 70 71 DISALLOW_COPY_AND_ASSIGN(ShortcutBuilder); 72 }; 73 74 class ShortcutHelper { 75 public: 76 // Adds a shortcut to the current URL to the Android home screen, firing 77 // background tasks to pull all the data required. 78 static void AddShortcut(content::WebContents* web_contents, 79 const base::string16& title, 80 int launcher_larger_icon_size); 81 82 // Adds a shortcut to the launcher. Must be called from a WorkerPool task. 83 static void AddShortcutInBackground( 84 const GURL& url, 85 const base::string16& title, 86 ShortcutBuilder::ShortcutType shortcut_type, 87 const chrome::FaviconBitmapResult& bitmap_result); 88 89 // Registers JNI hooks. 90 static bool RegisterShortcutHelper(JNIEnv* env); 91 92 private: 93 DISALLOW_COPY_AND_ASSIGN(ShortcutHelper); 94 }; 95 96 #endif // CHROME_BROWSER_ANDROID_SHORTCUT_HELPER_H_ 97