| // Copyright 2015 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_DATA_FETCHER_H_ |
| #define COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_DATA_FETCHER_H_ |
| |
| #include <string> |
| |
| #include "base/memory/raw_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/task/cancelable_task_tracker.h" |
| #include "base/time/time.h" |
| #include "base/timer/timer.h" |
| #include "components/webapps/browser/android/add_to_homescreen_params.h" |
| #include "components/webapps/browser/android/shortcut_info.h" |
| #include "components/webapps/browser/installable/installable_logging.h" |
| #include "components/webapps/common/web_page_metadata_agent.mojom.h" |
| #include "content/public/browser/web_contents.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| |
| namespace webapps { |
| |
| class InstallableManager; |
| struct InstallableData; |
| |
| // Aysnchronously fetches and processes data needed to create a shortcut for an |
| // Android Home screen launcher. |
| class AddToHomescreenDataFetcher { |
| public: |
| class Observer { |
| public: |
| // Called when the homescreen icon title (and possibly information from the |
| // web manifest) is available. |
| virtual void OnUserTitleAvailable( |
| const std::u16string& title, |
| const GURL& url, |
| AddToHomescreenParams::AppType app_type) = 0; |
| |
| // Called when all the data needed to prompt the user to add to home screen |
| // is available. |
| virtual void OnDataAvailable( |
| const ShortcutInfo& info, |
| const SkBitmap& primary_icon, |
| AddToHomescreenParams::AppType app_type, |
| const InstallableStatusCode installable_status) = 0; |
| |
| protected: |
| virtual ~Observer() = default; |
| }; |
| |
| // Initialize the fetcher by requesting the information about the page from |
| // the renderer process. The initialization is asynchronous and |
| // OnDidGetWebAppInstallInfo is expected to be called when finished. |
| // |observer| must outlive AddToHomescreenDataFetcher. |
| AddToHomescreenDataFetcher(content::WebContents* web_contents, |
| int data_timeout_ms, |
| Observer* observer); |
| AddToHomescreenDataFetcher(const AddToHomescreenDataFetcher&) = delete; |
| AddToHomescreenDataFetcher& operator=(const AddToHomescreenDataFetcher&) = |
| delete; |
| |
| ~AddToHomescreenDataFetcher(); |
| |
| // Accessors, etc. |
| content::WebContents* web_contents() { return web_contents_.get(); } |
| const SkBitmap& primary_icon() const { return primary_icon_; } |
| ShortcutInfo& shortcut_info() { return shortcut_info_; } |
| |
| private: |
| // Start the pipeline to fetch data. |
| void FetchInstallableData(); |
| |
| // Called to stop the timeout timer. |
| void StopTimer(); |
| |
| // Called if either InstallableManager or the favicon fetch takes too long. |
| void OnDataTimedout(); |
| |
| // Called when InstallableManager finishes looking for a manifest. |
| void OnDidGetInstallableData(const InstallableData& data); |
| |
| // Called when InstallableManager finishes looking for a primary icon. |
| void OnDidGetPrimaryIcon(const InstallableData& data); |
| |
| // Called when InstallableManager finishes checking for installability. |
| void OnDidPerformInstallableCheck(const InstallableData& data); |
| |
| // Called when installable check failed on any step and continue with the add |
| // shortcut flow. |
| void PrepareToAddShortcut(); |
| |
| // Creates an icon to display to the user to confirm the add to home screen |
| // from the given |base_icon|. If |use_for_launcher| is true, the created icon |
| // will also be used as the launcher icon. |
| void CreateIconForView(const SkBitmap& base_icon); |
| |
| // Notifies the observer that the shortcut data is all available. |
| void OnIconCreated(const SkBitmap& icon_for_view, bool is_icon_generated); |
| |
| base::WeakPtr<content::WebContents> web_contents_; |
| |
| raw_ptr<InstallableManager, DanglingUntriaged> installable_manager_; |
| raw_ptr<Observer> observer_; |
| |
| InstallableStatusCode installable_status_code_ = |
| InstallableStatusCode::NO_ERROR_DETECTED; |
| |
| // The icons must only be set on the UI thread for thread safety. |
| SkBitmap raw_primary_icon_; |
| SkBitmap primary_icon_; |
| ShortcutInfo shortcut_info_; |
| |
| base::CancelableTaskTracker favicon_task_tracker_; |
| base::OneShotTimer data_timeout_timer_; |
| base::TimeTicks start_time_; |
| |
| const base::TimeDelta data_timeout_ms_; |
| |
| base::WeakPtrFactory<AddToHomescreenDataFetcher> weak_ptr_factory_{this}; |
| }; |
| |
| } // namespace webapps |
| |
| #endif // COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_DATA_FETCHER_H_ |