Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / android / shortcut_helper.h
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_weak_ref.h"
9 #include "base/basictypes.h"
10 #include "base/strings/string16.h"
11 #include "base/task/cancelable_task_tracker.h"
12 #include "chrome/browser/android/tab_android.h"
13 #include "content/public/browser/web_contents_observer.h"
14
15 namespace favicon_base {
16 struct FaviconBitmapResult;
17 }  // namespace favicon_base
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(
56       const favicon_base::FaviconBitmapResult& bitmap_result);
57
58   // WebContentsObserver
59   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
60   virtual void WebContentsDestroyed() 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   base::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 favicon_base::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_