| // Copyright 2017 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 UI_KEYBOARD_NOTIFICATION_MANAGER_H_ |
| #define UI_KEYBOARD_NOTIFICATION_MANAGER_H_ |
| |
| #include "base/observer_list.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/keyboard/keyboard_export.h" |
| |
| namespace keyboard { |
| |
| class KeyboardControllerObserver; |
| |
| template <typename T> |
| class ValueNotificationConsolidator { |
| public: |
| ValueNotificationConsolidator() {} |
| |
| bool ShouldSendNotification(const T new_value); |
| |
| private: |
| bool never_sent_ = true; |
| T value_; |
| }; |
| |
| // Logic for consolidating consecutive identical notifications from the |
| // KeyboardControllerObserver. |
| class KEYBOARD_EXPORT NotificationManager { |
| public: |
| NotificationManager(); |
| |
| // Sends various KeyboardControllerObserver notifications related to bounds |
| // changes: |
| // - visual bounds change |
| // - occluded bounds change |
| // - layout displacement bounds change |
| // - general visibility change |
| void SendNotifications( |
| bool does_occluded_bounds_affect_layout, |
| const gfx::Rect& visual_bounds, |
| const gfx::Rect& occluded_bounds, |
| const base::ObserverList<KeyboardControllerObserver>::Unchecked& |
| observers); |
| |
| bool ShouldSendVisibilityNotification(bool current_visibility); |
| |
| bool ShouldSendVisualBoundsNotification(const gfx::Rect& new_bounds); |
| |
| bool ShouldSendOccludedBoundsNotification(const gfx::Rect& new_bounds); |
| |
| bool ShouldSendWorkspaceDisplacementBoundsNotification( |
| const gfx::Rect& new_bounds); |
| |
| private: |
| // ValueNotificationConsolidator uses == for comparison, but empty rectangles |
| // ought to be considered equal regardless of location or non-zero dimensions. |
| // This method will return a default empty (0,0,0,0) rectangle for any 0-area |
| // rectangle, otherwise it returns the original rectangle, unmodified. |
| gfx::Rect CanonicalizeEmptyRectangles(const gfx::Rect& rect) const; |
| |
| ValueNotificationConsolidator<bool> visibility_; |
| ValueNotificationConsolidator<gfx::Rect> visual_bounds_; |
| ValueNotificationConsolidator<gfx::Rect> occluded_bounds_; |
| ValueNotificationConsolidator<gfx::Rect> workspace_displaced_bounds_; |
| }; |
| |
| } // namespace keyboard |
| |
| #endif // UI_KEYBOARD_NOTIFICATION_MANAGER_H_ |