Commit d28baa33 authored by jdduke's avatar jdduke Committed by Commit bot

[Android] Isolate OverscrollRefresh from device density

Make the OverscrollRefresh effect take the target drag threshold as a
parameter. This isolates it from direct dependencies on the device scale
factor, making associated unit tests determnistics across all devices.

BUG=435125

Review URL: https://codereview.chromium.org/748433002

Cr-Commit-Position: refs/heads/master@{#305026}
parent 4edf9ba7
...@@ -21,6 +21,10 @@ namespace { ...@@ -21,6 +21,10 @@ namespace {
// Used for conditional creation of EdgeEffect types for the overscroll glow. // Used for conditional creation of EdgeEffect types for the overscroll glow.
const int kAndroidLSDKVersion = 21; const int kAndroidLSDKVersion = 21;
// Default offset in dips from the top of the view beyond which the refresh
// action will be activated.
const int kDefaultRefreshDragTargetDips = 64;
scoped_ptr<EdgeEffectBase> CreateGlowEdgeEffect( scoped_ptr<EdgeEffectBase> CreateGlowEdgeEffect(
ui::SystemUIResourceManager* resource_manager, ui::SystemUIResourceManager* resource_manager,
float dpi_scale) { float dpi_scale) {
...@@ -47,7 +51,9 @@ OverscrollControllerAndroid::OverscrollControllerAndroid( ...@@ -47,7 +51,9 @@ OverscrollControllerAndroid::OverscrollControllerAndroid(
glow_effect_(base::Bind(&CreateGlowEdgeEffect, glow_effect_(base::Bind(&CreateGlowEdgeEffect,
&compositor->GetSystemUIResourceManager(), &compositor->GetSystemUIResourceManager(),
dpi_scale_)), dpi_scale_)),
refresh_effect_(&compositor->GetSystemUIResourceManager(), this), refresh_effect_(&compositor->GetSystemUIResourceManager(),
this,
kDefaultRefreshDragTargetDips * dpi_scale),
triggered_refresh_active_(false) { triggered_refresh_active_(false) {
DCHECK(web_contents); DCHECK(web_contents);
} }
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_host.h"
#include "content/browser/android/animation_utils.h" #include "content/browser/android/animation_utils.h"
#include "ui/base/android/system_ui_resource_manager.h" #include "ui/base/android/system_ui_resource_manager.h"
#include "ui/gfx/screen.h"
using std::abs; using std::abs;
using std::max; using std::max;
...@@ -21,10 +20,6 @@ const ui::SystemUIResourceType kIdleResourceType = ui::OVERSCROLL_REFRESH_IDLE; ...@@ -21,10 +20,6 @@ const ui::SystemUIResourceType kIdleResourceType = ui::OVERSCROLL_REFRESH_IDLE;
const ui::SystemUIResourceType kActiveResourceType = const ui::SystemUIResourceType kActiveResourceType =
ui::OVERSCROLL_REFRESH_ACTIVE; ui::OVERSCROLL_REFRESH_ACTIVE;
// Default offset in dips from the top of the view to where the progress spinner
// should stop.
const int kDefaultSpinnerTargetDips = 64;
// Drag movement multiplier between user input and effect translation. // Drag movement multiplier between user input and effect translation.
const float kDragRate = .5f; const float kDragRate = .5f;
...@@ -111,14 +106,11 @@ void UpdateLayer(cc::UIResourceLayer* layer, ...@@ -111,14 +106,11 @@ void UpdateLayer(cc::UIResourceLayer* layer,
class OverscrollRefresh::Effect { class OverscrollRefresh::Effect {
public: public:
Effect(ui::SystemUIResourceManager* resource_manager) Effect(ui::SystemUIResourceManager* resource_manager, float target_drag)
: resource_manager_(resource_manager), : resource_manager_(resource_manager),
idle_layer_(cc::UIResourceLayer::Create()), idle_layer_(cc::UIResourceLayer::Create()),
active_layer_(cc::UIResourceLayer::Create()), active_layer_(cc::UIResourceLayer::Create()),
target_drag_(kDefaultSpinnerTargetDips * target_drag_(target_drag),
gfx::Screen::GetNativeScreen()
->GetPrimaryDisplay()
.device_scale_factor()),
drag_(0), drag_(0),
idle_alpha_(0), idle_alpha_(0),
active_alpha_(0), active_alpha_(0),
...@@ -361,11 +353,12 @@ class OverscrollRefresh::Effect { ...@@ -361,11 +353,12 @@ class OverscrollRefresh::Effect {
OverscrollRefresh::OverscrollRefresh( OverscrollRefresh::OverscrollRefresh(
ui::SystemUIResourceManager* resource_manager, ui::SystemUIResourceManager* resource_manager,
OverscrollRefreshClient* client) OverscrollRefreshClient* client,
float target_drag_offset_pixels)
: client_(client), : client_(client),
scrolled_to_top_(true), scrolled_to_top_(true),
scroll_consumption_state_(DISABLED), scroll_consumption_state_(DISABLED),
effect_(new Effect(resource_manager)) { effect_(new Effect(resource_manager, target_drag_offset_pixels)) {
DCHECK(client); DCHECK(client);
} }
......
...@@ -44,8 +44,12 @@ class CONTENT_EXPORT OverscrollRefreshClient { ...@@ -44,8 +44,12 @@ class CONTENT_EXPORT OverscrollRefreshClient {
// and beyond a particular threshold when released. // and beyond a particular threshold when released.
class CONTENT_EXPORT OverscrollRefresh { class CONTENT_EXPORT OverscrollRefresh {
public: public:
// Both |resource_manager| and |client| must not be null.
// |target_drag_offset_pixels| is the threshold beyond which the effect
// will trigger a refresh action when released.
OverscrollRefresh(ui::SystemUIResourceManager* resource_manager, OverscrollRefresh(ui::SystemUIResourceManager* resource_manager,
OverscrollRefreshClient* client); OverscrollRefreshClient* client,
float target_drag_offset_pixels);
~OverscrollRefresh(); ~OverscrollRefresh();
// Scroll event stream listening methods. // Scroll event stream listening methods.
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
namespace content { namespace content {
const float kDragTargetPixels = 100;
gfx::SizeF DefaultViewportSize() { gfx::SizeF DefaultViewportSize() {
return gfx::SizeF(512, 512); return gfx::SizeF(512, 512);
} }
...@@ -49,7 +51,7 @@ class OverscrollRefreshTest : public OverscrollRefreshClient, ...@@ -49,7 +51,7 @@ class OverscrollRefreshTest : public OverscrollRefreshClient,
}; };
TEST_F(OverscrollRefreshTest, Basic) { TEST_F(OverscrollRefreshTest, Basic) {
OverscrollRefresh effect(this, this); OverscrollRefresh effect(this, this, kDragTargetPixels);
gfx::Vector2dF origin_scroll_offset; gfx::Vector2dF origin_scroll_offset;
effect.UpdateDisplay(DefaultViewportSize(), origin_scroll_offset); effect.UpdateDisplay(DefaultViewportSize(), origin_scroll_offset);
...@@ -112,7 +114,7 @@ TEST_F(OverscrollRefreshTest, Basic) { ...@@ -112,7 +114,7 @@ TEST_F(OverscrollRefreshTest, Basic) {
} }
TEST_F(OverscrollRefreshTest, AnimationTerminatesEvenIfRefreshNeverTerminates) { TEST_F(OverscrollRefreshTest, AnimationTerminatesEvenIfRefreshNeverTerminates) {
OverscrollRefresh effect(this, this); OverscrollRefresh effect(this, this, kDragTargetPixels);
effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF());
effect.OnScrollBegin(); effect.OnScrollBegin();
ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10)));
...@@ -144,7 +146,7 @@ TEST_F(OverscrollRefreshTest, AnimationTerminatesEvenIfRefreshNeverTerminates) { ...@@ -144,7 +146,7 @@ TEST_F(OverscrollRefreshTest, AnimationTerminatesEvenIfRefreshNeverTerminates) {
} }
TEST_F(OverscrollRefreshTest, NotTriggeredIfBelowThreshold) { TEST_F(OverscrollRefreshTest, NotTriggeredIfBelowThreshold) {
OverscrollRefresh effect(this, this); OverscrollRefresh effect(this, this, kDragTargetPixels);
effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF());
effect.OnScrollBegin(); effect.OnScrollBegin();
ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10)));
...@@ -159,7 +161,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfBelowThreshold) { ...@@ -159,7 +161,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfBelowThreshold) {
} }
TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialYOffsetIsNotZero) { TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialYOffsetIsNotZero) {
OverscrollRefresh effect(this, this); OverscrollRefresh effect(this, this, kDragTargetPixels);
// A positive y scroll offset at the start of scroll will prevent activation, // A positive y scroll offset at the start of scroll will prevent activation,
// even if the subsequent scroll overscrolls upward. // even if the subsequent scroll overscrolls upward.
...@@ -180,7 +182,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialYOffsetIsNotZero) { ...@@ -180,7 +182,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialYOffsetIsNotZero) {
} }
TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollDownward) { TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollDownward) {
OverscrollRefresh effect(this, this); OverscrollRefresh effect(this, this, kDragTargetPixels);
effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF());
effect.OnScrollBegin(); effect.OnScrollBegin();
...@@ -199,7 +201,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollDownward) { ...@@ -199,7 +201,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollDownward) {
} }
TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollOrTouchConsumed) { TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollOrTouchConsumed) {
OverscrollRefresh effect(this, this); OverscrollRefresh effect(this, this, kDragTargetPixels);
effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF());
effect.OnScrollBegin(); effect.OnScrollBegin();
ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10)));
...@@ -220,7 +222,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollOrTouchConsumed) { ...@@ -220,7 +222,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollOrTouchConsumed) {
} }
TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollsJanked) { TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollsJanked) {
OverscrollRefresh effect(this, this); OverscrollRefresh effect(this, this, kDragTargetPixels);
effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF());
effect.OnScrollBegin(); effect.OnScrollBegin();
ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10)));
...@@ -237,7 +239,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollsJanked) { ...@@ -237,7 +239,7 @@ TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollsJanked) {
} }
TEST_F(OverscrollRefreshTest, NotTriggeredIfFlungDownward) { TEST_F(OverscrollRefreshTest, NotTriggeredIfFlungDownward) {
OverscrollRefresh effect(this, this); OverscrollRefresh effect(this, this, kDragTargetPixels);
effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF());
effect.OnScrollBegin(); effect.OnScrollBegin();
ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10)));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment