Home | History | Annotate | Download | only in android
      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