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

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

Issue 14268004: Add overscroll edge effect animations for Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 8 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 1597e00b40a6faf85ce01de466303f514f2d404c..7ba2f80504313961ad9464aba0313907cc6af20e 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -15,6 +15,7 @@
#include "cc/output/compositor_frame.h"
#include "cc/output/compositor_frame_ack.h"
#include "content/browser/android/content_view_core_impl.h"
+#include "content/browser/android/overscroll_glow.h"
#include "content/browser/gpu/gpu_surface_tracker.h"
#include "content/browser/renderer_host/compositor_impl_android.h"
#include "content/browser/renderer_host/image_transport_factory_android.h"
@@ -67,17 +68,30 @@ void InsertSyncPointAndAckForCompositor(
route_id, renderer_host_id, ack);
}
+scoped_ptr<OverscrollGlow> CreateOverscrollEffect(
+ ContentViewCoreImpl* content_view_core){
+ if (content_view_core != NULL &&
+ !content_view_core->get_overscroll_edge().isNull() &&
+ !content_view_core->get_overscroll_glow().isNull()) {
+ return make_scoped_ptr(
+ new OverscrollGlow(content_view_core->get_overscroll_edge(),
+ content_view_core->get_overscroll_glow()));
+ }
+ return scoped_ptr<OverscrollGlow>();
+}
+
} // anonymous namespace
RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
RenderWidgetHostImpl* widget_host,
ContentViewCoreImpl* content_view_core)
: host_(widget_host),
- is_layer_attached_(true),
+ are_layers_attached_(true),
content_view_core_(NULL),
ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
cached_background_color_(SK_ColorWHITE),
- texture_id_in_layer_(0) {
+ texture_id_in_layer_(0),
+ overscroll_resources_updated_(true) {
if (CompositorImpl::UsesDirectGL()) {
surface_texture_transport_.reset(new SurfaceTextureTransportClient());
layer_ = surface_texture_transport_->Initialize();
@@ -289,28 +303,26 @@ bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const {
}
void RenderWidgetHostViewAndroid::Show() {
- if (is_layer_attached_)
+ if (are_layers_attached_)
return;
- is_layer_attached_ = true;
- if (content_view_core_)
- content_view_core_->AttachLayer(layer_);
+ are_layers_attached_ = true;
+ AttachLayers();
}
void RenderWidgetHostViewAndroid::Hide() {
- if (!is_layer_attached_)
+ if (!are_layers_attached_)
return;
- is_layer_attached_ = false;
- if (content_view_core_)
- content_view_core_->RemoveLayer(layer_);
+ are_layers_attached_ = false;
+ RemoveLayers();
}
bool RenderWidgetHostViewAndroid::IsShowing() {
// ContentViewCoreImpl represents the native side of the Java
// ContentViewCore. It being NULL means that it is not attached
// to the View system yet, so we treat this RWHVA as hidden.
- return is_layer_attached_ && content_view_core_;
+ return are_layers_attached_ && content_view_core_;
}
gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const {
@@ -391,6 +403,10 @@ void RenderWidgetHostViewAndroid::OnStartContentIntent(
content_view_core_->StartContentIntent(content_url);
}
+void RenderWidgetHostViewAndroid::OnSetOverscrollResources() {
+ overscroll_resources_updated_ = true;
+}
+
void RenderWidgetHostViewAndroid::ImeCancelComposition() {
ime_adapter_android_.CancelComposition();
}
@@ -413,10 +429,10 @@ void RenderWidgetHostViewAndroid::RenderViewGone(
}
void RenderWidgetHostViewAndroid::Destroy() {
- if (content_view_core_) {
- content_view_core_->RemoveLayer(layer_);
- content_view_core_ = NULL;
- }
+ RemoveLayers();
+ content_view_core_ = NULL;
+
+ overscroll_effect_.reset();
// The RenderWidgetHost's destruction led here, so don't call it.
host_ = NULL;
@@ -595,6 +611,13 @@ void RenderWidgetHostViewAndroid::BuffersSwapped(
texture_layer_->SetBounds(gfx::Size(content_size.width(),
content_size.height()));
+ if (overscroll_resources_updated_) {
+ SetOverscrollEffect(CreateOverscrollEffect(content_view_core_));
+ overscroll_resources_updated_ = false;
+ }
+ if (overscroll_effect_)
+ overscroll_effect_->set_size(content_size);
+
// Calculate the uv_max based on the content size relative to the texture
// size.
gfx::PointF uv_max;
@@ -608,6 +631,50 @@ void RenderWidgetHostViewAndroid::BuffersSwapped(
ack_callback.Run();
}
+void RenderWidgetHostViewAndroid::AttachLayers() {
+ if (!content_view_core_)
+ return;
+
+ content_view_core_->AttachLayer(layer_);
+
+ if (overscroll_effect_)
+ overscroll_effect_->set_parent_layer(content_view_core_->GetLayer());
+}
+
+void RenderWidgetHostViewAndroid::RemoveLayers() {
+ if (!content_view_core_)
+ return;
+
+ if (overscroll_effect_)
+ overscroll_effect_->set_parent_layer(NULL);
+
+ content_view_core_->RemoveLayer(layer_);
+}
+
+void RenderWidgetHostViewAndroid::SetOverscrollEffect(
+ scoped_ptr<OverscrollGlow> overscroll_effect) {
+ animation_timer_.Stop();
+ overscroll_effect_.swap(overscroll_effect);
+ if (content_view_core_ && are_layers_attached_)
+ overscroll_effect_->set_parent_layer(content_view_core_->GetLayer());
+}
+
+void RenderWidgetHostViewAndroid::AnimationCallback() {
+ if (overscroll_effect_ && overscroll_effect_->Animate(base::TimeTicks::Now()))
+ AnimateIfNeeded();
+}
+
+void RenderWidgetHostViewAndroid::AnimateIfNeeded() {
+ if (animation_timer_.IsRunning() || !overscroll_effect_)
+ return;
+
+ const base::TimeDelta animationInterval
+ = base::TimeDelta::FromMilliseconds(kDesiredAnimationIntervalInMs);
+
+ animation_timer_.Start(FROM_HERE, animationInterval, this,
+ &RenderWidgetHostViewAndroid::AnimationCallback);
+}
+
void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer(
const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
int gpu_host_id) {
@@ -761,16 +828,32 @@ void RenderWidgetHostViewAndroid::UpdateFrameInfo(
content_size, viewport_size, controls_offset, content_offset,
overdraw_bottom_height);
}
+
+ if (overscroll_effect_)
+ overscroll_effect_->set_horizontal_overscroll_enabled(
+ content_size.width() != viewport_size.width());
+
+}
+
+void RenderWidgetHostViewAndroid::OnOverscrolled(
+ const gfx::Vector2dF& accumulated_overscroll,
+ const gfx::Vector2dF& current_fling_velocity) {
+ if (overscroll_effect_) {
+ overscroll_effect_->OnOverscrolled(base::TimeTicks::Now(),
+ accumulated_overscroll,
+ current_fling_velocity);
+ AnimateIfNeeded();
+ }
}
void RenderWidgetHostViewAndroid::SetContentViewCore(
ContentViewCoreImpl* content_view_core) {
- if (content_view_core_ && is_layer_attached_)
- content_view_core_->RemoveLayer(layer_);
+ if (are_layers_attached_)
+ RemoveLayers();
content_view_core_ = content_view_core;
- if (content_view_core_ && is_layer_attached_)
- content_view_core_->AttachLayer(layer_);
+ if (are_layers_attached_)
+ AttachLayers();
}
void RenderWidgetHostViewAndroid::HasTouchEventHandlers(

Powered by Google App Engine
This is Rietveld 408576698