Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 679493002: [Android] Add a native pull-to-refresh overscroll effect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tests! Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_host_view_android.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 62b98a736ba704483d65ce39502ad9049c317703..6f9ccf2d24c177c0e5c3e8bad1ba6f3b81b7e457 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -34,7 +34,7 @@
#include "content/browser/android/edge_effect.h"
#include "content/browser/android/edge_effect_l.h"
#include "content/browser/android/in_process/synchronous_compositor_impl.h"
-#include "content/browser/android/overscroll_glow.h"
+#include "content/browser/android/overscroll_controller_android.h"
#include "content/browser/devtools/render_view_devtools_agent_host.h"
#include "content/browser/gpu/compositor_util.h"
#include "content/browser/gpu/gpu_data_manager_impl.h"
@@ -88,9 +88,6 @@ const int kUndefinedOutputSurfaceId = -1;
// V1 saw errors of ~0.065 between computed window and content widths.
const float kMobileViewportWidthEpsilon = 0.15f;
-// Used for conditional creation of EdgeEffect types for overscroll.
-const int kKitKatMR2SDKVersion = 19;
-
static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime";
// Sends an acknowledgement to the renderer of a processed IME event.
@@ -137,72 +134,6 @@ ui::LatencyInfo CreateLatencyInfo(const blink::WebInputEvent& event) {
return latency_info;
}
-OverscrollGlow::DisplayParameters CreateOverscrollDisplayParameters(
- const cc::CompositorFrameMetadata& frame_metadata) {
- const float scale_factor =
- frame_metadata.page_scale_factor * frame_metadata.device_scale_factor;
-
- // Compute the size and offsets for each edge, where each effect is sized to
- // the viewport and offset by the distance of each viewport edge to the
- // respective content edge.
- OverscrollGlow::DisplayParameters params;
- params.size = gfx::ScaleSize(
- frame_metadata.scrollable_viewport_size, scale_factor);
- params.edge_offsets[OverscrollGlow::EDGE_TOP] =
- -frame_metadata.root_scroll_offset.y() * scale_factor;
- params.edge_offsets[OverscrollGlow::EDGE_LEFT] =
- -frame_metadata.root_scroll_offset.x() * scale_factor;
- params.edge_offsets[OverscrollGlow::EDGE_BOTTOM] =
- (frame_metadata.root_layer_size.height() -
- frame_metadata.root_scroll_offset.y() -
- frame_metadata.scrollable_viewport_size.height()) *
- scale_factor;
- params.edge_offsets[OverscrollGlow::EDGE_RIGHT] =
- (frame_metadata.root_layer_size.width() -
- frame_metadata.root_scroll_offset.x() -
- frame_metadata.scrollable_viewport_size.width()) *
- scale_factor;
-
- return params;
-}
-
-bool UseEdgeEffectL() {
- static bool use_edge_effect_l =
- base::android::BuildInfo::GetInstance()->sdk_int() > kKitKatMR2SDKVersion;
- return use_edge_effect_l;
-}
-
-scoped_ptr<EdgeEffectBase> CreateEdgeEffect(
- ui::SystemUIResourceManager* resource_manager,
- float device_scale_factor) {
- DCHECK(resource_manager);
- if (UseEdgeEffectL())
- return scoped_ptr<EdgeEffectBase>(new EdgeEffectL(resource_manager));
-
- return scoped_ptr<EdgeEffectBase>(
- new EdgeEffect(resource_manager, device_scale_factor));
-}
-
-scoped_ptr<OverscrollGlow> CreateOverscrollEffect(
- ContentViewCore* content_view_core) {
- DCHECK(content_view_core);
- ui::WindowAndroidCompositor* compositor =
- content_view_core->GetWindowAndroid()->GetCompositor();
- DCHECK(compositor);
- ui::SystemUIResourceManager* system_resource_manager =
- &compositor->GetSystemUIResourceManager();
-
- if (UseEdgeEffectL())
- EdgeEffectL::PreloadResources(system_resource_manager);
- else
- EdgeEffect::PreloadResources(system_resource_manager);
-
- return make_scoped_ptr(
- new OverscrollGlow(base::Bind(&CreateEdgeEffect,
- system_resource_manager,
- content_view_core->GetDpiScale())));
-}
-
scoped_ptr<TouchSelectionController> CreateSelectionController(
TouchSelectionControllerClient* client,
ContentViewCore* content_view_core) {
@@ -273,7 +204,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
ime_adapter_android_(this),
cached_background_color_(SK_ColorWHITE),
last_output_surface_id_(kUndefinedOutputSurfaceId),
- overscroll_effect_enabled_(
+ overscroll_controller_enabled_(
!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableOverscrollEdgeEffect)),
gesture_provider_(CreateGestureProviderConfig(), this),
@@ -475,8 +406,8 @@ void RenderWidgetHostViewAndroid::MovePluginWindows(
void RenderWidgetHostViewAndroid::Focus() {
host_->Focus();
host_->SetInputMethodActive(true);
- if (overscroll_effect_)
- overscroll_effect_->Enable();
+ if (overscroll_controller_)
+ overscroll_controller_->Enable();
if (selection_controller_)
selection_controller_->SetTemporarilyHidden(false);
}
@@ -484,8 +415,8 @@ void RenderWidgetHostViewAndroid::Focus() {
void RenderWidgetHostViewAndroid::Blur() {
host_->SetInputMethodActive(false);
host_->Blur();
- if (overscroll_effect_)
- overscroll_effect_->Disable();
+ if (overscroll_controller_)
+ overscroll_controller_->Disable();
if (selection_controller_)
selection_controller_->SetTemporarilyHidden(true);
}
@@ -1032,10 +963,6 @@ void RenderWidgetHostViewAndroid::ComputeContentsSize(
frame_metadata.scrollable_viewport_size,
frame_metadata.device_scale_factor * frame_metadata.page_scale_factor));
- if (overscroll_effect_) {
- overscroll_effect_->UpdateDisplayParameters(
- CreateOverscrollDisplayParameters(frame_metadata));
- }
}
void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame(
@@ -1226,6 +1153,9 @@ void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated(
if (!content_view_core_)
return;
+ if (overscroll_controller_)
+ overscroll_controller_->OnFrameMetadataUpdated(frame_metadata);
+
if (selection_controller_) {
selection_controller_->OnSelectionBoundsChanged(
frame_metadata.selection_start, frame_metadata.selection_end);
@@ -1262,8 +1192,8 @@ void RenderWidgetHostViewAndroid::AttachLayers() {
return;
content_view_core_->AttachLayer(layer_);
- if (overscroll_effect_)
- overscroll_effect_->Enable();
+ if (overscroll_controller_)
+ overscroll_controller_->Enable();
layer_->SetHideLayerAndSubtree(!is_showing_);
}
@@ -1275,8 +1205,8 @@ void RenderWidgetHostViewAndroid::RemoveLayers() {
return;
content_view_core_->RemoveLayer(layer_);
- if (overscroll_effect_)
- overscroll_effect_->Disable();
+ if (overscroll_controller_)
+ overscroll_controller_->Disable();
}
void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32 requests) {
@@ -1335,8 +1265,9 @@ void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time,
}
bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) {
- bool needs_animate =
- overscroll_effect_ ? overscroll_effect_->Animate(frame_time) : false;
+ bool needs_animate = false;
+ if (overscroll_controller_)
+ needs_animate |= overscroll_controller_->Animate(frame_time);
if (selection_controller_)
needs_animate |= selection_controller_->Animate(frame_time);
return needs_animate;
@@ -1394,6 +1325,9 @@ void RenderWidgetHostViewAndroid::GestureEventAck(
DidOverscroll(DidOverscrollParams());
}
+ if (overscroll_controller_)
+ overscroll_controller_->OnGestureEventAck(event, ack_result);
+
if (content_view_core_)
content_view_core_->OnGestureEventAck(event, ack_result);
}
@@ -1413,6 +1347,13 @@ InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent(
}
}
+ if (overscroll_controller_ &&
+ blink::WebInputEvent::isGestureEventType(input_event.type) &&
+ overscroll_controller_->WillHandleGestureEvent(
+ static_cast<const blink::WebGestureEvent&>(input_event))) {
+ return INPUT_EVENT_ACK_STATE_CONSUMED;
+ }
+
if (content_view_core_ &&
content_view_core_->FilterInputEvent(input_event))
return INPUT_EVENT_ACK_STATE_CONSUMED;
@@ -1497,8 +1438,8 @@ void RenderWidgetHostViewAndroid::SendMouseWheelEvent(
void RenderWidgetHostViewAndroid::SendGestureEvent(
const blink::WebGestureEvent& event) {
// Sending a gesture that may trigger overscroll should resume the effect.
- if (overscroll_effect_)
- overscroll_effect_->Enable();
+ if (overscroll_controller_)
+ overscroll_controller_->Enable();
if (host_)
host_->ForwardGestureEventWithLatencyInfo(event, CreateLatencyInfo(event));
@@ -1545,23 +1486,8 @@ void RenderWidgetHostViewAndroid::DidOverscroll(
if (!content_view_core_ || !layer_.get() || !is_showing_)
return;
- const float device_scale_factor = content_view_core_->GetDpiScale();
-
- if (overscroll_effect_ &&
- overscroll_effect_->OnOverscrolled(
- content_view_core_->GetLayer().get(),
- base::TimeTicks::Now(),
- gfx::ScaleVector2d(params.accumulated_overscroll,
- device_scale_factor),
- gfx::ScaleVector2d(params.latest_overscroll_delta,
- device_scale_factor),
- gfx::ScaleVector2d(params.current_fling_velocity,
- device_scale_factor),
- gfx::ScaleVector2d(
- params.causal_event_viewport_point.OffsetFromOrigin(),
- device_scale_factor))) {
- SetNeedsAnimate();
- }
+ if (overscroll_controller_)
+ overscroll_controller_->OnOverscrolled(params);
}
void RenderWidgetHostViewAndroid::DidStopFlinging() {
@@ -1576,7 +1502,7 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
bool resize = false;
if (content_view_core != content_view_core_) {
- overscroll_effect_.reset();
+ overscroll_controller_.reset();
selection_controller_.reset();
ReleaseLocksOnSurface();
resize = true;
@@ -1607,9 +1533,11 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
if (!selection_controller_)
selection_controller_ = CreateSelectionController(this, content_view_core_);
- if (overscroll_effect_enabled_ && !overscroll_effect_ &&
- content_view_core_->GetWindowAndroid()->GetCompositor())
- overscroll_effect_ = CreateOverscrollEffect(content_view_core_);
+ if (overscroll_controller_enabled_ && !overscroll_controller_ &&
+ content_view_core_->GetWindowAndroid()->GetCompositor()) {
+ overscroll_controller_.reset(
+ new OverscrollControllerAndroid(content_view_core_));
+ }
}
void RenderWidgetHostViewAndroid::RunAckCallbacks() {
@@ -1630,15 +1558,17 @@ void RenderWidgetHostViewAndroid::OnCompositingDidCommit() {
void RenderWidgetHostViewAndroid::OnAttachCompositor() {
DCHECK(content_view_core_);
- if (overscroll_effect_enabled_ && !overscroll_effect_)
- overscroll_effect_ = CreateOverscrollEffect(content_view_core_);
+ if (overscroll_controller_enabled_ && !overscroll_controller_) {
+ overscroll_controller_.reset(
+ new OverscrollControllerAndroid(content_view_core_));
+ }
}
void RenderWidgetHostViewAndroid::OnDetachCompositor() {
DCHECK(content_view_core_);
DCHECK(!using_synchronous_compositor_);
RunAckCallbacks();
- overscroll_effect_.reset();
+ overscroll_controller_.reset();
}
void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time,

Powered by Google App Engine
This is Rietveld 408576698