• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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);
~ShortcutBuilder()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