blob: a682baa8e6ecfa8deb76f6d3419c568e9ad75826 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_APP_LIST_APP_LIST_CONTROLLER_IMPL_H_
#define ASH_APP_LIST_APP_LIST_CONTROLLER_IMPL_H_
#include <memory>
#include <string>
#include <vector>
#include "ash/app_list/app_list_view_delegate.h"
#include "ash/app_list/model/app_list_model.h"
#include "ash/app_list/model/app_list_model_observer.h"
#include "ash/app_list/model/app_list_view_state.h"
#include "ash/app_list/model/search/search_model.h"
#include "ash/app_list/presenter/app_list_presenter_impl.h"
#include "ash/ash_export.h"
#include "ash/public/cpp/app_list/app_list_constants.h"
#include "ash/public/interfaces/app_list.mojom.h"
#include "ash/session/session_observer.h"
#include "ash/shell_observer.h"
#include "ash/wallpaper/wallpaper_controller_observer.h"
#include "ash/wm/tablet_mode/tablet_mode_observer.h"
#include "components/sync/model/string_ordinal.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "mojo/public/cpp/bindings/interface_ptr_set.h"
#include "ui/keyboard/keyboard_controller_observer.h"
namespace ui {
class MouseWheelEvent;
} // namespace ui
namespace app_list {
class AnswerCardContentsRegistry;
} // namespace app_list
namespace ash {
// Ash's AppListController owns the AppListModel and implements interface
// functions that allow Chrome to modify and observe the Shelf and AppListModel
// state.
class ASH_EXPORT AppListControllerImpl
: public mojom::AppListController,
public SessionObserver,
public app_list::AppListModelObserver,
public app_list::AppListViewDelegate,
public ash::ShellObserver,
public TabletModeObserver,
public keyboard::KeyboardControllerObserver,
public WallpaperControllerObserver {
public:
using AppListItemMetadataPtr = mojom::AppListItemMetadataPtr;
using SearchResultMetadataPtr = mojom::SearchResultMetadataPtr;
AppListControllerImpl();
~AppListControllerImpl() override;
// Binds the mojom::AppListController interface request to this object.
void BindRequest(mojom::AppListControllerRequest request);
app_list::AppListPresenterImpl* presenter() { return &presenter_; }
// mojom::AppListController:
void SetClient(mojom::AppListClientPtr client_ptr) override;
void AddItem(AppListItemMetadataPtr app_item) override;
void AddItemToFolder(AppListItemMetadataPtr app_item,
const std::string& folder_id) override;
void RemoveItem(const std::string& id) override;
void RemoveUninstalledItem(const std::string& id) override;
void MoveItemToFolder(const std::string& id,
const std::string& folder_id) override;
void SetStatus(ash::AppListModelStatus status) override;
void SetState(ash::AppListState state) override;
void HighlightItemInstalledFromUI(const std::string& id) override;
void SetSearchEngineIsGoogle(bool is_google) override;
void SetSearchTabletAndClamshellAccessibleName(
const base::string16& tablet_accessible_name,
const base::string16& clamshell_accessible_name) override;
void SetSearchHintText(const base::string16& hint_text) override;
void UpdateSearchBox(const base::string16& text,
bool initiated_by_user) override;
void PublishSearchResults(
std::vector<SearchResultMetadataPtr> results) override;
void SetItemMetadata(const std::string& id,
AppListItemMetadataPtr data) override;
void SetItemIcon(const std::string& id, const gfx::ImageSkia& icon) override;
void SetItemIsInstalling(const std::string& id, bool is_installing) override;
void SetItemPercentDownloaded(const std::string& id,
int32_t percent_downloaded) override;
void SetModelData(std::vector<AppListItemMetadataPtr> apps,
bool is_search_engine_google) override;
void SetSearchResultMetadata(SearchResultMetadataPtr metadata) override;
void SetSearchResultIsInstalling(const std::string& id,
bool is_installing) override;
void SetSearchResultPercentDownloaded(const std::string& id,
int32_t percent_downloaded) override;
void NotifySearchResultItemInstalled(const std::string& id) override;
void GetIdToAppListIndexMap(GetIdToAppListIndexMapCallback callback) override;
void FindOrCreateOemFolder(
const std::string& oem_folder_name,
const syncer::StringOrdinal& preferred_oem_position,
FindOrCreateOemFolderCallback callback) override;
void ResolveOemFolderPosition(
const syncer::StringOrdinal& preferred_oem_position,
ResolveOemFolderPositionCallback callback) override;
void DismissAppList() override;
void GetAppInfoDialogBounds(GetAppInfoDialogBoundsCallback callback) override;
void ShowAppListAndSwitchToState(ash::AppListState state) override;
void ShowAppList() override;
// app_list::AppListModelObserver:
void OnAppListItemAdded(app_list::AppListItem* item) override;
void OnAppListItemWillBeDeleted(app_list::AppListItem* item) override;
void OnAppListItemUpdated(app_list::AppListItem* item) override;
// SessionObserver:
void OnSessionStateChanged(session_manager::SessionState state) override;
// Methods used in ash:
bool GetTargetVisibility() const;
bool IsVisible() const;
void Show(int64_t display_id,
app_list::AppListShowSource show_source,
base::TimeTicks event_time_stamp);
void UpdateYPositionAndOpacity(int y_position_in_screen,
float background_opacity);
void EndDragFromShelf(app_list::AppListViewState app_list_state);
void ProcessMouseWheelEvent(const ui::MouseWheelEvent& event);
void ToggleAppList(int64_t display_id,
app_list::AppListShowSource show_source,
base::TimeTicks event_time_stamp);
app_list::AppListViewState GetAppListViewState();
// app_list::AppListViewDelegate:
app_list::AppListModel* GetModel() override;
app_list::SearchModel* GetSearchModel() override;
void StartSearch(const base::string16& raw_query) override;
void OpenSearchResult(const std::string& result_id, int event_flags) override;
void InvokeSearchResultAction(const std::string& result_id,
int action_index,
int event_flags) override;
using GetContextMenuModelCallback =
AppListViewDelegate::GetContextMenuModelCallback;
void GetSearchResultContextMenuModel(
const std::string& result_id,
GetContextMenuModelCallback callback) override;
void SearchResultContextMenuItemSelected(const std::string& result_id,
int command_id,
int event_flags) override;
void ViewShown(int64_t display_id) override;
void ViewClosing() override;
void GetWallpaperProminentColors(
GetWallpaperProminentColorsCallback callback) override;
void ActivateItem(const std::string& id, int event_flags) override;
void GetContextMenuModel(const std::string& id,
GetContextMenuModelCallback callback) override;
void ContextMenuItemSelected(const std::string& id,
int command_id,
int event_flags) override;
void ShowWallpaperContextMenu(const gfx::Point& onscreen_location,
ui::MenuSourceType source_type) override;
void OnVisibilityChanged(bool visible);
void OnTargetVisibilityChanged(bool visible);
void StartVoiceInteractionSession();
void ToggleVoiceInteractionSession();
void FlushForTesting();
// ShellObserver:
void OnOverviewModeStarting() override;
void OnOverviewModeEnding() override;
// TabletModeObserver:
void OnTabletModeStarted() override;
void OnTabletModeEnded() override;
// KeyboardControllerObserver:
void OnKeyboardVisibilityStateChanged(bool is_visible) override;
// WallpaperControllerObserver:
void OnWallpaperColorsChanged() override;
void OnWallpaperPreviewStarted() override;
void OnWallpaperPreviewEnded() override;
bool onscreen_keyboard_shown() const { return onscreen_keyboard_shown_; }
// Returns true if the home launcher is enabled in tablet mode.
bool IsHomeLauncherEnabledInTabletMode() const;
private:
syncer::StringOrdinal GetOemFolderPos();
std::unique_ptr<app_list::AppListItem> CreateAppListItem(
AppListItemMetadataPtr metadata);
app_list::AppListFolderItem* FindFolderItem(const std::string& folder_id);
// Update the visibility of the home launcher based on e.g. if the device is
// in overview mode.
void UpdateHomeLauncherVisibility();
base::string16 last_raw_query_;
mojom::AppListClientPtr client_;
app_list::AppListModel model_;
app_list::SearchModel search_model_;
// |presenter_| should be put below |client_| and |model_| to prevent a crash
// in destruction.
app_list::AppListPresenterImpl presenter_;
// Bindings for the AppListController interface.
mojo::BindingSet<mojom::AppListController> bindings_;
// Token to view map for classic/mus ash (i.e. non-mash).
std::unique_ptr<app_list::AnswerCardContentsRegistry>
answer_card_contents_registry_;
// Whether the on-screen keyboard is shown.
bool onscreen_keyboard_shown_ = false;
// Whether the home launcher feature is enabled.
const bool is_home_launcher_enabled_;
// Whether the device is in overview mode. The home launcher (if enabled)
// should be hidden during overview mode.
bool in_overview_mode_ = false;
// Whether the wallpaper is being previewed. The home launcher (if enabled)
// should be hidden during wallpaper preview.
bool in_wallpaper_preview_ = false;
DISALLOW_COPY_AND_ASSIGN(AppListControllerImpl);
};
} // namespace ash
#endif // ASH_APP_LIST_APP_LIST_CONTROLLER_IMPL_H_