| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef IOS_CHROME_BROWSER_OVERLAYS_MODEL_PUBLIC_OVERLAY_PRESENTATION_CONTEXT_H_ |
| #define IOS_CHROME_BROWSER_OVERLAYS_MODEL_PUBLIC_OVERLAY_PRESENTATION_CONTEXT_H_ |
| |
| #include "ios/chrome/browser/overlays/model/public/overlay_dismissal_callback.h" |
| #include "ios/chrome/browser/overlays/model/public/overlay_modality.h" |
| #include "ios/chrome/browser/overlays/model/public/overlay_presentation_callback.h" |
| |
| class Browser; |
| class OverlayRequest; |
| class OverlayPresentationContextObserver; |
| |
| // Object that handles presenting the overlay UI for OverlayRequests. |
| class OverlayPresentationContext { |
| public: |
| // Returns the OverlayPresentationContextImpl for `browser` at `modality`. |
| static OverlayPresentationContext* FromBrowser(Browser* browser, |
| OverlayModality modality); |
| |
| virtual ~OverlayPresentationContext() = default; |
| |
| // Adds and removes `observer`. |
| virtual void AddObserver(OverlayPresentationContextObserver* observer) = 0; |
| virtual void RemoveObserver(OverlayPresentationContextObserver* observer) = 0; |
| |
| // Enum describing the current capabilities of the presentation context. |
| enum UIPresentationCapabilities { |
| // The context cannot show any overlay UI. |
| kNone = 0, |
| // The context can show overlay UI that is contained as a child to its |
| // backing UIViewController. |
| kContained = 1 << 0, |
| // The context can show overlay UI that is presented upon its backing |
| // UIViewController. |
| kPresented = 1 << 1, |
| }; |
| |
| // Returns the context's current presentation capabilities. Overlay UI should |
| // not be shown in this context if CanShowUIForRequest() returns false for |
| // the current capabilities. |
| virtual UIPresentationCapabilities GetPresentationCapabilities() const = 0; |
| |
| // Returns whether the presentation context can show the UI for `request` |
| // while it has `capabilities`. |
| virtual bool CanShowUIForRequest( |
| OverlayRequest* request, |
| UIPresentationCapabilities capabilities) const = 0; |
| |
| // Returns whether the presentation context supports showing the UI for |
| // `request` with its current presentation capabilities. |
| virtual bool CanShowUIForRequest(OverlayRequest* request) const = 0; |
| |
| // Whether overlay UI is currently shown in the context. |
| virtual bool IsShowingOverlayUI() const = 0; |
| |
| // Instructs the presentation context to prepare itself to show the overlay UI |
| // for `request`. If successful, updates the context's presentation |
| // capabilities to those required for `request`'s UI. Has no effect if the |
| // context is incapable of supporting `request`. For example, the context |
| // cannot support UIPresentationCapabilities::kPresented until it is added to |
| // a window (OverlayPresentationContextObserver can be used to detect window |
| // changes). |
| virtual void PrepareToShowOverlayUI(OverlayRequest* request) = 0; |
| |
| // Called to show the overlay UI for `request`. `presentation_callback` must |
| // be called when the UI is finished being presented. `dismissal_callback` |
| // must be stored and called whenever the UI is finished being dismissed for |
| // user interaction, hiding, or cancellation. Must only be called when: |
| // - IsShowingOverlayUI() returns false, and |
| // - CanShowUIForRequest() returns true for `request`. |
| virtual void ShowOverlayUI(OverlayRequest* request, |
| OverlayPresentationCallback presentation_callback, |
| OverlayDismissalCallback dismissal_callback) = 0; |
| |
| // Called to hide the overlay UI for `request`. Hidden overlays may be shown |
| // again, so they should be kept in memory or serialized so that the state can |
| // be restored if shown again. When hiding an overlay, the presented UI must |
| // be dismissed, and the overlay's dismissal callback must must be executed |
| // upon the dismissal's completion. Must only be called when `request` is |
| // displayed within the context. |
| virtual void HideOverlayUI(OverlayRequest* request) = 0; |
| |
| // Called to cancel the overlay UI for `request`. If the UI is presented, it |
| // should be dismissed and the dismissal callback should be executed upon the |
| // dismissal's completion. Otherwise, any state corresponding to any hidden |
| // overlays should be cleaned up. |
| virtual void CancelOverlayUI(OverlayRequest* request) = 0; |
| |
| // Disable the UI temporarily. This can be used if the UI enters a state where |
| // it is still visible, but overlays should not be displayed. |
| virtual void SetUIDisabled(bool disabled) = 0; |
| |
| // Whether the UI is temporarily disabled. |
| virtual bool IsUIDisabled() = 0; |
| }; |
| |
| #endif // IOS_CHROME_BROWSER_OVERLAYS_MODEL_PUBLIC_OVERLAY_PRESENTATION_CONTEXT_H_ |