| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CONTENT_BROWSER_ANDROID_OVERSCROLL_REFRESH_H_ | 5 #ifndef CONTENT_BROWSER_ANDROID_OVERSCROLL_REFRESH_H_ |
| 6 #define CONTENT_BROWSER_ANDROID_OVERSCROLL_REFRESH_H_ | 6 #define CONTENT_BROWSER_ANDROID_OVERSCROLL_REFRESH_H_ |
| 7 | 7 |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/macros.h" |
| 9 #include "base/time/time.h" | |
| 10 #include "content/common/content_export.h" | 9 #include "content/common/content_export.h" |
| 11 #include "ui/gfx/geometry/size_f.h" | 10 #include "ui/gfx/geometry/size_f.h" |
| 12 #include "ui/gfx/geometry/vector2d_f.h" | 11 #include "ui/gfx/geometry/vector2d_f.h" |
| 13 | 12 |
| 14 namespace cc { | |
| 15 class Layer; | |
| 16 } | |
| 17 | |
| 18 namespace ui { | |
| 19 class ResourceManager; | |
| 20 } | |
| 21 | |
| 22 namespace content { | 13 namespace content { |
| 23 | 14 |
| 24 // Allows both page reload activation and page reloading state queries. | 15 class CONTENT_EXPORT OverscrollRefreshHandler { |
| 25 class CONTENT_EXPORT OverscrollRefreshClient { | |
| 26 public: | 16 public: |
| 27 virtual ~OverscrollRefreshClient() {} | 17 // Signals the start of an overscrolling pull. Returns whether the handler |
| 18 // will consume the overscroll gesture, in which case it will receive the |
| 19 // remaining pull updates. |
| 20 virtual bool PullStart() = 0; |
| 28 | 21 |
| 29 // Called when the effect is released beyond the activation threshold. This | 22 // Signals a pull update, where |delta| is in device pixels. |
| 30 // should cause a refresh of some kind, e.g., page reload. | 23 virtual void PullUpdate(float delta) = 0; |
| 31 virtual void TriggerRefresh() = 0; | |
| 32 | 24 |
| 33 // Whether the triggered refresh has yet to complete. The effect will continue | 25 // Signals the release of the pull, and whether the release is allowed to |
| 34 // animating until the refresh completes (or it reaches a reasonable timeout). | 26 // trigger the refresh action. |
| 35 virtual bool IsStillRefreshing() const = 0; | 27 virtual void PullRelease(bool allow_refresh) = 0; |
| 28 |
| 29 // Reset the active pull state. |
| 30 virtual void PullReset() = 0; |
| 31 |
| 32 protected: |
| 33 virtual ~OverscrollRefreshHandler() {} |
| 36 }; | 34 }; |
| 37 | 35 |
| 38 // Simple pull-to-refresh styled effect. Listens to scroll events, conditionally | 36 // Simple pull-to-refresh styled effect. Listens to scroll events, conditionally |
| 39 // activating when: | 37 // activating when: |
| 40 // 1) The scroll begins when the page's root layer 1) has no vertical scroll | 38 // 1) The scroll begins when the page's root layer 1) has no vertical scroll |
| 41 // offset and 2) lacks the overflow-y:hidden property. | 39 // offset and 2) lacks the overflow-y:hidden property. |
| 42 // 2) The page doesn't consume the initial scroll events. | 40 // 2) The page doesn't consume the initial scroll events. |
| 43 // 3) The initial scroll direction is upward. | 41 // 3) The initial scroll direction is upward. |
| 44 // The actual page reload action is triggered only when the effect is active | 42 // The actuall pull response, animation and action are delegated to the |
| 45 // and beyond a particular threshold when released. | 43 // provided refresh handler. |
| 46 class CONTENT_EXPORT OverscrollRefresh { | 44 class CONTENT_EXPORT OverscrollRefresh { |
| 47 public: | 45 public: |
| 48 // Minmum number of overscrolling pull events required to activate the effect. | 46 // Minmum number of overscrolling pull events required to activate the effect. |
| 49 // Useful for avoiding accidental triggering when a scroll janks (is delayed), | 47 // Useful for avoiding accidental triggering when a scroll janks (is delayed), |
| 50 // capping the impulse per event. | 48 // capping the impulse per event. |
| 51 enum { kMinPullsToActivate = 3 }; | 49 enum { kMinPullsToActivate = 3 }; |
| 52 | 50 |
| 53 // Both |resource_manager| and |client| must not be null. | 51 explicit OverscrollRefresh(OverscrollRefreshHandler* handler); |
| 54 // |target_drag_offset_pixels| is the threshold beyond which the effect | |
| 55 // will trigger a refresh action when released. When |mirror| is true, | |
| 56 // the effect and its rotation will be mirrored about the y axis. | |
| 57 OverscrollRefresh(ui::ResourceManager* resource_manager, | |
| 58 OverscrollRefreshClient* client, | |
| 59 float target_drag_offset_pixels, | |
| 60 bool mirror); | |
| 61 ~OverscrollRefresh(); | 52 ~OverscrollRefresh(); |
| 62 | 53 |
| 63 // Scroll event stream listening methods. | 54 // Scroll event stream listening methods. |
| 64 void OnScrollBegin(); | 55 void OnScrollBegin(); |
| 56 // Returns whether the refresh was activated. |
| 65 void OnScrollEnd(const gfx::Vector2dF& velocity); | 57 void OnScrollEnd(const gfx::Vector2dF& velocity); |
| 66 | 58 |
| 67 // Scroll ack listener. The effect will only be activated if the initial | 59 // Scroll ack listener. The effect will only be activated if the initial |
| 68 // updates go unconsumed. | 60 // updates go unconsumed. |
| 69 void OnScrollUpdateAck(bool was_consumed); | 61 void OnScrollUpdateAck(bool was_consumed); |
| 70 | 62 |
| 71 // Returns true if the effect has consumed the |scroll_delta|. | 63 // Returns true if the effect has consumed the |scroll_delta|. |
| 72 bool WillHandleScrollUpdate(const gfx::Vector2dF& scroll_delta); | 64 bool WillHandleScrollUpdate(const gfx::Vector2dF& scroll_delta); |
| 73 | 65 |
| 74 // Release the effect (if active), preventing any associated refresh action. | 66 // Release the effect (if active), preventing any associated refresh action. |
| 75 void ReleaseWithoutActivation(); | 67 void ReleaseWithoutActivation(); |
| 76 | 68 |
| 77 // Returns true if the effect still needs animation ticks, with effect layers | 69 // Notify the effect of the latest scroll offset and overflow properties. |
| 78 // attached to |parent| if necessary. | 70 // The effect will be disabled when the offset is non-zero or overflow is |
| 79 // Note: The effect will detach itself when no further animation is required. | 71 // hidden. Note: All dimensions are in device pixels. |
| 80 bool Animate(base::TimeTicks current_time, cc::Layer* parent_layer); | 72 void OnFrameUpdated(const gfx::Vector2dF& content_scroll_offset, |
| 81 | 73 bool root_overflow_y_hidden); |
| 82 // Update the effect according to the most recent display parameters, | |
| 83 // Note: All dimensions are in device pixels. | |
| 84 void UpdateDisplay(const gfx::SizeF& viewport_size, | |
| 85 const gfx::Vector2dF& content_scroll_offset, | |
| 86 bool root_overflow_y_hidden); | |
| 87 | 74 |
| 88 // Reset the effect to its inactive state, immediately detaching and | 75 // Reset the effect to its inactive state, immediately detaching and |
| 89 // disabling any active effects. | 76 // disabling any active effects. |
| 90 void Reset(); | 77 void Reset(); |
| 91 | 78 |
| 92 // Returns true if the refresh effect is either being manipulated or animated. | 79 // Returns true if the refresh effect is either being manipulated or animated. |
| 93 bool IsActive() const; | 80 bool IsActive() const; |
| 94 | 81 |
| 95 // Returns true if the effect is waiting for an unconsumed scroll to start. | 82 // Returns true if the effect is waiting for an unconsumed scroll to start. |
| 96 bool IsAwaitingScrollUpdateAck() const; | 83 bool IsAwaitingScrollUpdateAck() const; |
| 97 | 84 |
| 98 private: | 85 private: |
| 99 void Release(bool allow_activation); | 86 void Release(bool allow_refresh); |
| 100 | 87 |
| 101 OverscrollRefreshClient* const client_; | |
| 102 | |
| 103 gfx::SizeF viewport_size_; | |
| 104 bool scrolled_to_top_; | 88 bool scrolled_to_top_; |
| 105 bool overflow_y_hidden_; | 89 bool overflow_y_hidden_; |
| 106 | 90 |
| 107 enum ScrollConsumptionState { | 91 enum ScrollConsumptionState { |
| 108 DISABLED, | 92 DISABLED, |
| 109 AWAITING_SCROLL_UPDATE_ACK, | 93 AWAITING_SCROLL_UPDATE_ACK, |
| 110 ENABLED, | 94 ENABLED, |
| 111 } scroll_consumption_state_; | 95 } scroll_consumption_state_; |
| 112 | 96 |
| 113 class Effect; | 97 OverscrollRefreshHandler* const handler_; |
| 114 scoped_ptr<Effect> effect_; | |
| 115 | 98 |
| 116 DISALLOW_COPY_AND_ASSIGN(OverscrollRefresh); | 99 DISALLOW_COPY_AND_ASSIGN(OverscrollRefresh); |
| 117 }; | 100 }; |
| 118 | 101 |
| 119 } // namespace content | 102 } // namespace content |
| 120 | 103 |
| 121 #endif // CONTENT_BROWSER_ANDROID_OVERSCROLL_REFRESH_H_ | 104 #endif // CONTENT_BROWSER_ANDROID_OVERSCROLL_REFRESH_H_ |
| OLD | NEW |