Bug 1358805 - part 5: Update the dynamic toolbar animator to gracefully handle toolbar snapshot generation failure r=kats
MozReview-Commit-ID: B3t6l5ZqhC5
--- a/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
+++ b/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
@@ -273,16 +273,20 @@ AndroidDynamicToolbarAnimator::ToolbarAn
NotifyControllerPendingAnimation(MOVE_TOOLBAR_DOWN, eAnimate);
break;
case REQUEST_HIDE_TOOLBAR_IMMEDIATELY:
NotifyControllerPendingAnimation(MOVE_TOOLBAR_UP, eImmediate);
break;
case REQUEST_HIDE_TOOLBAR_ANIMATED:
NotifyControllerPendingAnimation(MOVE_TOOLBAR_UP, eAnimate);
break;
+ case TOOLBAR_SNAPSHOT_FAILED:
+ mToolbarState = eToolbarVisible;
+ NotifyControllerSnapshotFailed();
+ break;
default:
break;
}
}
bool
AndroidDynamicToolbarAnimator::UpdateAnimation(const TimeStamp& aCurrentFrame)
{
@@ -888,10 +892,23 @@ AndroidDynamicToolbarAnimator::Translate
ScreenIntCoord
AndroidDynamicToolbarAnimator::GetFixedLayerMarginsBottom()
{
MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
return mCompositorToolbarHeight - (mCompositorSurfaceHeight - mCompositorCompositionSize.height);
}
+void
+AndroidDynamicToolbarAnimator::NotifyControllerSnapshotFailed()
+{
+ if (!APZThreadUtils::IsControllerThread()) {
+ APZThreadUtils::RunOnControllerThread(NewRunnableMethod(this, &AndroidDynamicToolbarAnimator::NotifyControllerSnapshotFailed));
+ return;
+ }
+
+ mControllerToolbarHeight = 0;
+ mControllerState = eNothingPending;
+ UpdateCompositorToolbarHeight(mControllerToolbarHeight);
+}
+
} // namespace layers
} // namespace mozilla
--- a/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.h
+++ b/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.h
@@ -144,16 +144,17 @@ protected:
void PostToolbarReady();
void UpdateFrameMetrics(ScreenPoint aScrollOffset,
CSSToScreenScale aScale,
CSSRect aCssPageRect);
bool IsEnoughPageToHideToolbar(ScreenIntCoord delta);
void ShowToolbarIfNotVisible(StaticToolbarState aCurrentToolbarState);
void TranslateTouchEvent(MultiTouchInput& aTouchEvent);
ScreenIntCoord GetFixedLayerMarginsBottom();
+ void NotifyControllerSnapshotFailed();
// Read only Compositor and Controller threads after Initialize()
uint64_t mRootLayerTreeId;
// Read/Write Compositor Thread, Read only Controller thread
Atomic<StaticToolbarState> mToolbarState; // Current toolbar state.
Atomic<uint32_t> mPinnedFlags; // The toolbar should not be moved or animated unless no flags are set
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java
@@ -203,16 +203,17 @@ public class LayerView extends FrameLayo
}
/* package */ void handleToolbarAnimatorMessage(int message) {
switch(message) {
case STATIC_TOOLBAR_NEEDS_UPDATE:
// Send updated toolbar image to compositor.
Bitmap bm = mToolbarAnimator.getBitmapOfToolbarChrome();
if (bm == null) {
+ postCompositorMessage(TOOLBAR_SNAPSHOT_FAILED);
break;
}
final int width = bm.getWidth();
final int height = bm.getHeight();
int[] pixels = new int[bm.getByteCount() / 4];
try {
bm.getPixels(pixels, /* offset */ 0, /* stride */ width, /* x */ 0, /* y */ 0, width, height);
mCompositor.sendToolbarPixelsToCompositor(width, height, pixels);