14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_APP_LIST_START_PAGE_SERVICE_H_
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define CHROME_BROWSER_UI_APP_LIST_START_PAGE_SERVICE_H_
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <vector>
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/basictypes.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/ref_counted.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/observer_list.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string16.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/web_contents.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/app_list/speech_ui_model_observer.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace extensions {
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class Extension;
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class Profile;
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace app_list {
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class RecommendedApps;
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class StartPageObserver;
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// StartPageService collects data to be displayed in app list's start page
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// and hosts the start page contents.
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class StartPageService : public KeyedService {
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  typedef std::vector<scoped_refptr<const extensions::Extension> >
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExtensionList;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Gets the instance for the given profile.
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static StartPageService* Get(Profile* profile);
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void AddObserver(StartPageObserver* observer);
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void RemoveObserver(StartPageObserver* observer);
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void AppListShown();
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void AppListHidden();
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void ToggleSpeechRecognition();
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns true if the hotword is enabled in the app-launcher.
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool HotwordEnabled();
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // They return essentially the same web contents but might return NULL when
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // some flag disables the feature.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContents* GetStartPageContents();
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContents* GetSpeechRecognitionContents();
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RecommendedApps* recommended_apps() { return recommended_apps_.get(); }
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Profile* profile() { return profile_; }
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpeechRecognitionState state() { return state_; }
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void OnSpeechResult(const base::string16& query, bool is_final);
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void OnSpeechSoundLevelChanged(int16 level);
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void OnSpeechRecognitionStateChanged(SpeechRecognitionState new_state);
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class StartPageServiceFactory;
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // ProfileDestroyObserver to shutdown the service on exiting. WebContents
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // depends on the profile and needs to be closed before the profile and its
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // keyed service shutdown.
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class ProfileDestroyObserver;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The WebContentsDelegate implementation for the start page. This allows
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // getUserMedia() request from the web contents.
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class StartPageWebContentsDelegate;
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  explicit StartPageService(Profile* profile);
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~StartPageService();
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void LoadContents();
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void UnloadContents();
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // KeyedService overrides:
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void Shutdown() OVERRIDE;
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Profile* profile_;
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<content::WebContents> contents_;
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<StartPageWebContentsDelegate> contents_delegate_;
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<ProfileDestroyObserver> profile_destroy_observer_;
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RecommendedApps> recommended_apps_;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpeechRecognitionState state_;
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ObserverList<StartPageObserver> observers_;
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool speech_button_toggled_manually_;
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool speech_result_obtained_;
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(StartPageService);
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace app_list
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_APP_LIST_START_PAGE_SERVICE_H_
98