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

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: Fix findbugs... Created 6 years, 1 month 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
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 d0fef97454fb5f168070dc6d90c5eec010a0ff24..10b20780722b4f83f2a24bcb9d2243cdfb3b39ac 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.
@@ -138,72 +135,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) {
@@ -217,6 +148,19 @@ scoped_ptr<TouchSelectionController> CreateSelectionController(
touch_slop_pixels / content_view_core->GetDpiScale()));
}
+scoped_ptr<OverscrollControllerAndroid> CreateOverscrollController(
+ ContentViewCore* content_view_core) {
+ DCHECK(content_view_core);
+ ui::WindowAndroid* window = content_view_core->GetWindowAndroid();
+ DCHECK(window);
+ ui::WindowAndroidCompositor* compositor = window->GetCompositor();
+ DCHECK(compositor);
+ return make_scoped_ptr(new OverscrollControllerAndroid(
+ content_view_core->GetWebContents(),
+ compositor,
+ content_view_core->GetDpiScale()));
+}
+
ui::GestureProvider::Config CreateGestureProviderConfig() {
ui::GestureProvider::Config config = ui::DefaultGestureProviderConfig();
config.disable_click_delay =
@@ -273,7 +217,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,15 +419,15 @@ void RenderWidgetHostViewAndroid::MovePluginWindows(
void RenderWidgetHostViewAndroid::Focus() {
host_->Focus();
host_->SetInputMethodActive(true);
- if (overscroll_effect_)
- overscroll_effect_->Enable();
+ if (overscroll_controller_)
+ overscroll_controller_->Enable();
}
void RenderWidgetHostViewAndroid::Blur() {
host_->SetInputMethodActive(false);
host_->Blur();
- if (overscroll_effect_)
- overscroll_effect_->Disable();
+ if (overscroll_controller_)
+ overscroll_controller_->Disable();
}
bool RenderWidgetHostViewAndroid::HasFocus() const {
@@ -1029,10 +973,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(
@@ -1231,6 +1171,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);
@@ -1267,8 +1210,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_);
}
@@ -1280,8 +1223,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) {
@@ -1340,8 +1283,11 @@ 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, content_view_core_->GetLayer().get());
+ }
if (selection_controller_)
needs_animate |= selection_controller_->Animate(frame_time);
return needs_animate;
@@ -1392,12 +1338,8 @@ void RenderWidgetHostViewAndroid::ProcessAckedTouchEvent(
void RenderWidgetHostViewAndroid::GestureEventAck(
const blink::WebGestureEvent& event,
InputEventAckState ack_result) {
- // The overscroll effect requires an explicit release signal that may not be
- // sent from the renderer compositor.
- if (event.type == blink::WebInputEvent::GestureScrollEnd ||
- event.type == blink::WebInputEvent::GestureFlingStart) {
- DidOverscroll(DidOverscrollParams());
- }
+ if (overscroll_controller_)
+ overscroll_controller_->OnGestureEventAck(event, ack_result);
if (content_view_core_)
content_view_core_->OnGestureEventAck(event, ack_result);
@@ -1418,6 +1360,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;
@@ -1502,8 +1451,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));
@@ -1555,23 +1504,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() {
@@ -1586,7 +1520,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;
@@ -1617,9 +1551,10 @@ 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_ = CreateOverscrollController(content_view_core_);
+ }
}
void RenderWidgetHostViewAndroid::RunAckCallbacks() {
@@ -1640,15 +1575,15 @@ 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_ = CreateOverscrollController(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,
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698