// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_ACCELERATORS_ACCELERATOR_COMMANDS_H_
#define ASH_ACCELERATORS_ACCELERATOR_COMMANDS_H_

#include "ash/app_list/app_list_metrics.h"
#include "ash/ash_export.h"
#include "ash/focus_cycler.h"
#include "ash/public/cpp/accelerators.h"
#include "ash/public/cpp/session/session_types.h"

// This file contains implementations of commands that are bound to keyboard
// shortcuts in Ash or in the embedding application (e.g. Chrome).
//
// Keep the functions in this file in alphabetical order.
namespace ash {

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
// Captures usage of Alt+[ and Alt+].
enum class WindowSnapAcceleratorAction {
  kCycleLeftSnapInClamshellNoOverview = 0,
  kCycleLeftSnapInClamshellOverview = 1,
  kCycleLeftSnapInTablet = 2,
  kCycleRightSnapInClamshellNoOverview = 3,
  kCycleRightSnapInClamshellOverview = 4,
  kCycleRightSnapInTablet = 5,
  kMaxValue = kCycleRightSnapInTablet,
};

// UMA accessibility histogram names.
ASH_EXPORT extern const char kAccessibilityHighContrastShortcut[];
ASH_EXPORT extern const char kAccessibilitySpokenFeedbackShortcut[];
ASH_EXPORT extern const char kAccessibilityScreenMagnifierShortcut[];
ASH_EXPORT extern const char kAccessibilityDockedMagnifierShortcut[];

// Name of histogram corresponding to |WindowSnapAcceleratorAction|.
ASH_EXPORT extern const char kAccelWindowSnap[];

namespace accelerators {

//////////////////////////////////////////////////////////////////////////////
// CanFoo() functions:
// True should be returned if running |action| does something. Otherwise,
// false should be returned to give the web contents a chance at handling the
// accelerator.
// Note: These functions should be independent and not depend on
// ui::Accelerator.

ASH_EXPORT bool CanActivateTouchHud();

ASH_EXPORT bool CanCreateNewIncognitoWindow();

ASH_EXPORT bool CanCycleInputMethod();

ASH_EXPORT bool CanCycleMru();

ASH_EXPORT bool CanCycleSameAppWindows();

ASH_EXPORT bool CanCycleUser();

ASH_EXPORT bool CanFindPipWidget();

ASH_EXPORT bool CanFocusCameraPreview();

ASH_EXPORT bool CanLock();

ASH_EXPORT bool CanMoveActiveWindowBetweenDisplays();

ASH_EXPORT bool CanGroupOrUngroupWindows();

ASH_EXPORT void GroupOrUngroupWindowsInSnapGroup();

ASH_EXPORT bool CanMinimizeSnapGroupWindows();

ASH_EXPORT bool CanMinimizeTopWindowOnBack();

ASH_EXPORT bool CanPerformMagnifierZoom();

ASH_EXPORT bool CanScreenshot(bool take_screenshot);

ASH_EXPORT bool CanShowStylusTools();

ASH_EXPORT bool CanStopScreenRecording();

ASH_EXPORT bool CanSwapPrimaryDisplay();

ASH_EXPORT bool CanToggleCalendar();

ASH_EXPORT bool CanEnableOrToggleDictation();

ASH_EXPORT bool CanToggleFloatingWindow();

ASH_EXPORT bool CanToggleGameDashboard();

ASH_EXPORT bool CanToggleMultitaskMenu();

ASH_EXPORT bool CanToggleOverview();

ASH_EXPORT bool CanTogglePrivacyScreen();

ASH_EXPORT bool CanToggleProjectorMarker();

ASH_EXPORT bool CanToggleResizeLockMenu();

ASH_EXPORT bool CanUnpinWindow();

ASH_EXPORT bool CanWindowSnap();

//////////////////////////////////////////////////////////////////////////////
// Accelerator commands.
// Note: These functions should be independent and not depend on ui::Accelerator

// Activates desk on the left/right.
ASH_EXPORT void ActivateDesk(bool activate_left);

// Activates desk 1 to 8.
ASH_EXPORT void ActivateDeskAtIndex(AcceleratorAction action);

// Changes the scale of the active magnifier.
ASH_EXPORT void ActiveMagnifierZoom(int delta_index);

// Brightness down.
ASH_EXPORT void BrightnessDown();

// Brightness up.
ASH_EXPORT void BrightnessUp();

// Cycles windows of the same app/all windows backwards in the MRU window list.
ASH_EXPORT void CycleBackwardMru(bool same_app_only);

// Cycles windows of the same app/all windows forwards in the MRU window list.
ASH_EXPORT void CycleForwardMru(bool same_app_only);

// Switches to next/previous user.
ASH_EXPORT void CycleUser(CycleUserDirection direction);

// Disables caps-lock.
ASH_EXPORT void DisableCapsLock();

// Fingerprint sensor touched with finger finger_id finger_id can be 1,2 or 3.
// 3 different id is enough to cover all testing scenarios and it's better to
// minimize the number of used dev keyboard shortcuts.
ASH_EXPORT void TouchFingerprintSensor(int finger_id);

// Focuses the camera preview if it is present.
ASH_EXPORT void FocusCameraPreview();

// Focuses the PiP window if it is present.
ASH_EXPORT void FocusPip();

// Focuses the shelf.
ASH_EXPORT void FocusShelf();

// Dims keyboard.
ASH_EXPORT void KeyboardBrightnessDown();

// Makes keyboard brighter
ASH_EXPORT void KeyboardBrightnessUp();

// Launches the nth(0-7) app on the shelf.
ASH_EXPORT void LaunchAppN(int n);

// Launches the right-most app on the shelf.
ASH_EXPORT void LaunchLastApp();

// Presses lock button.
ASH_EXPORT void LockPressed(bool pressed);

// Locks the screen.
ASH_EXPORT void LockScreen();

// Takes partial screenshot/recording.
ASH_EXPORT void MaybeTakePartialScreenshot();

// Takes window screenshot/recording.
ASH_EXPORT void MaybeTakeWindowScreenshot();

// Fast-forwards playing media.
ASH_EXPORT void MediaFastForward();

// Goes to the next media track.
ASH_EXPORT void MediaNextTrack();

// Pauses media.
ASH_EXPORT void MediaPause();

// Plays media.
ASH_EXPORT void MediaPlay();

// Toggles pause or play on media.
ASH_EXPORT void MediaPlayPause();

// Goes to the previous media track.
ASH_EXPORT void MediaPrevTrack();

// Rewinds playing media.
ASH_EXPORT void MediaRewind();

// Stops playing media.
ASH_EXPORT void MediaStop();

// Moves active window between displays.
ASH_EXPORT void MoveActiveWindowBetweenDisplays();

// Toggles microphone mute.
ASH_EXPORT void MicrophoneMuteToggle();

// Moves active window to the desk on the left/right.
ASH_EXPORT void MoveActiveItem(bool going_left);

// Creates a new desk.
ASH_EXPORT void NewDesk();

// Opens a new incognito browser window.
ASH_EXPORT void NewIncognitoWindow();

// Opens a new tab.
ASH_EXPORT void NewTab();

// Opens a new browser window.
ASH_EXPORT void NewWindow();

// Opens the calculator app.
ASH_EXPORT void OpenCalculator();

// Opens Crosh.
ASH_EXPORT void OpenCrosh();

// Opens the diagnostics app.
ASH_EXPORT void OpenDiagnostics();

// Opens the feedback app.
ASH_EXPORT void OpenFeedbackPage();

// Opens the file manager app.
ASH_EXPORT void OpenFileManager();

// Opens the help/explore app.
ASH_EXPORT void OpenHelp();

// Presses power button.
ASH_EXPORT void PowerPressed(bool pressed);

// Records when the user changes the output volume via keyboard to metrics.
ASH_EXPORT void RecordVolumeSource();

// Removes the current desk.
ASH_EXPORT void RemoveCurrentDesk();

// Resets the display zooming to the default state.
ASH_EXPORT void ResetDisplayZoom();

// Restores the last closed tab in the browser.
ASH_EXPORT void RestoreTab();

// Rotates the active window 90 degrees.
ASH_EXPORT void RotateActiveWindow();

// Rotates pane focus on next/previous pane.
ASH_EXPORT void RotatePaneFocus(FocusCycler::Direction direction);

// Rotates screen 90 degrees.
ASH_EXPORT void RotateScreen();

// Changes primary display to the secondary display next to current primary
// display
ASH_EXPORT void ShiftPrimaryDisplay();

// Opens Emoji Picker.
ASH_EXPORT void ShowEmojiPicker();

// Sees keyboard shortcut helper.
ASH_EXPORT void ShowKeyboardShortcutViewer();

// Opens Shortcut Customization.
ASH_EXPORT void ShowShortcutCustomizationApp();

// Brings up task manager.
ASH_EXPORT void ShowTaskManager();

// Stops the capture mode recording.
ASH_EXPORT void StopScreenRecording();

// Puts device in sleep mode(suspend).
ASH_EXPORT void Suspend();

// Switches to next language.
ASH_EXPORT void SwitchToNextIme();

// Takes screenshot.
ASH_EXPORT void TakeScreenshot(bool from_snapshot_key);

// Toggles app list.
ASH_EXPORT void ToggleAppList(AppListShowSource show_source,
                              base::TimeTicks event_time_stamp);

// Assigns active window to all desks.
ASH_EXPORT void ToggleAssignToAllDesk();

// Toggles Google assistant.
ASH_EXPORT void ToggleAssistant();

// Toogles to show and hide the calendar widget.
ASH_EXPORT void ToggleCalendar();

// Turns caps lock on and off.
ASH_EXPORT void ToggleCapsLock();

// Toggles the clipboard history.
ASH_EXPORT void ToggleClipboardHistory(bool is_plain_text_paste);

// Enables Dictation if the feature is currently disabled. Toggles (either
// starts or stops) Dictation if the feature is currently enabled.
ASH_EXPORT void EnableOrToggleDictation();

// Turns the docked magnifier on or off.
ASH_EXPORT void ToggleDockedMagnifier();

// Toggles the floating window.
ASH_EXPORT void ToggleFloating();

// Toggles the fullscreen state. The behavior can be overridden
// by WindowStateDelegate::ToggleFullscreen().
ASH_EXPORT void ToggleFullscreen();

// Turns the fullscreen magnifier mode on or off.
ASH_EXPORT void ToggleFullscreenMagnifier();

// Toggles the game dashboard on the current window.
ASH_EXPORT void ToggleGameDashboard();

// Turns the high contrast mode on or off.
ASH_EXPORT void ToggleHighContrast();

// Toggles to show/close the Ime Menu.
ASH_EXPORT void ToggleImeMenuBubble();

// Toggles keyboard backlight.
ASH_EXPORT void ToggleKeyboardBacklight();

// Toggles the maxmized state. If the window is in fulllscreen, it exits
// fullscreen mode.
ASH_EXPORT void ToggleMaximized();

// Turns the message center on or off.
ASH_EXPORT void ToggleMessageCenterBubble();

// Minimizes the active window, if present. If no windows are active, restores
// the first unminimized window. Returns true if a window was minimized or
// restored.
ASH_EXPORT bool ToggleMinimized();

// Minimizes the topmost unminimized snap groups. If there is no such snap
// group, restores the most recently used minimized snap group.
ASH_EXPORT void ToggleSnapGroupsMinimize();

// Turns the mirror mode on or off.
ASH_EXPORT void ToggleMirrorMode();

// Toggles the multitask menu.
ASH_EXPORT void ToggleMultitaskMenu();

// Turns the overview mode on or off.
ASH_EXPORT void ToggleOverview();

// Toggles on/off the electronic privacy screen.
ASH_EXPORT void TogglePrivacyScreen();

// Toggles the Projector annotation tray UI and marker enabled state.
ASH_EXPORT void ToggleProjectorMarker();

// Toggles the resize lock mode menu for a focused ARC++ resize-locked app if
// present.
ASH_EXPORT void ToggleResizeLockMenu();

// Turns ChromeVox (spoken feedback) on or off.
ASH_EXPORT void ToggleSpokenFeedback();

// Toggles the stylus tools bubble on or off.
ASH_EXPORT void ToggleStylusTools();

// Turns the system tray on or off.
ASH_EXPORT void ToggleSystemTrayBubble();

// Turns the wifi on or off.
ASH_EXPORT void ToggleWifi();

// Toggles the unified desktop mode which allows a window to span multiple
// displays.
ASH_EXPORT void ToggleUnifiedDesktop();

// Minimizes the top window on the back.
ASH_EXPORT void TopWindowMinimizeOnBack();

// Clears the touch hud.
ASH_EXPORT void TouchHudClear();

// Changes the touch hud mode.
ASH_EXPORT void TouchHudModeChange();

// If a window is pinned (aka forced fullscreen), exits from pinned mode.
ASH_EXPORT void UnpinWindow();

// Volume down.
ASH_EXPORT void VolumeDown();

// Volume mute.
ASH_EXPORT void VolumeMute();

// Volume mute toggle.
ASH_EXPORT void VolumeMuteToggle();

// Volume up.
ASH_EXPORT void VolumeUp();

// Minimizes the window.
ASH_EXPORT void WindowMinimize();

// Snaps window to the left/right.
ASH_EXPORT void WindowSnap(AcceleratorAction action);

// Changes the display zooming up or down.
ASH_EXPORT bool ZoomDisplay(bool up);

}  // namespace accelerators
}  // namespace ash

#endif  // ASH_ACCELERATORS_ACCELERATOR_COMMANDS_H_
