Niedzielski has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/252589

Change subject: Hygiene: refactor lead image parallax scrolling
......................................................................

Hygiene: refactor lead image parallax scrolling

The parallax effect used in the lead image requires the coordination of
views internal to ArticleHeaderView. Move this logic from
LeadImagesHandler into ArticleHeaderView and replace MarginLayoutParams
offsetting with translations which are simpler and available in all
ViewGroups.

Possible tangential fix for T116006.

Bug: T116122
Bug: T116006
Change-Id: I4dead75193f80d1355848aba15e187f73cd301bc
---
M app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
M app/src/main/java/org/wikipedia/views/ArticleHeaderView.java
M app/src/main/java/org/wikipedia/views/ObservableWebView.java
3 files changed, 35 insertions(+), 41 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/89/252589/1

diff --git 
a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java 
b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
index 0c2f85d..4d23b31 100755
--- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
+++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
@@ -90,10 +90,8 @@
     private ImageViewWithFace image;
 
     private int displayHeightDp;
-    private int imageBaseYOffset;
     private float faceYOffsetNormalized;
     private float displayDensity;
-    @NonNull private final WebViewScrollListener webViewScrollListener = new 
WebViewScrollListener();
 
     public LeadImagesHandler(@NonNull final PageFragment parentFragment,
                              @NonNull CommunicationBridge bridge,
@@ -293,8 +291,6 @@
 
         // tell our listener that it's ok to start loading the rest of the 
WebView content
         listener.onLayoutComplete(sequence);
-
-        forceRefreshWebView();
     }
 
     private void setWebViewPaddingTop(int padding) {
@@ -353,6 +349,7 @@
     private void loadLeadImage(@Nullable String url) {
         if (!isMainPage() && !TextUtils.isEmpty(url) && leadImagesEnabled) {
             String fullUrl = WikipediaApp.getInstance().getNetworkProtocol() + 
":" + url;
+            articleHeaderView.setImageYOffset(0);
             articleHeaderView.loadImage(fullUrl);
         }
     }
@@ -371,12 +368,8 @@
         image.startAnimation(anim);
     }
 
-    private void forceRefreshWebView() {
-        webViewScrollListener.onScrollChanged(webView.getScrollY(), 
webView.getScrollY());
-    }
-
     private void initWebView() {
-        webView.addOnScrollChangeListener(webViewScrollListener);
+        webView.addOnScrollChangeListener(articleHeaderView);
 
         webView.addOnClickListener(new ObservableWebView.OnClickListener() {
             @Override
@@ -427,28 +420,6 @@
         return parentFragment.getActivity();
     }
 
-    private class WebViewScrollListener implements 
ObservableWebView.OnScrollChangeListener {
-        @Override
-        public void onScrollChanged(int oldScrollY, int scrollY) {
-            CoordinatorLayout.LayoutParams contParams = 
(CoordinatorLayout.LayoutParams) articleHeaderView
-                    .getLayoutParams();
-            FrameLayout.LayoutParams imgParams = (FrameLayout.LayoutParams) 
image.getLayoutParams();
-            if (scrollY > articleHeaderView.getHeight()) {
-                if (contParams.topMargin != -articleHeaderView.getHeight()) {
-                    contParams.topMargin = -articleHeaderView.getHeight();
-                    imgParams.topMargin = 0;
-                    articleHeaderView.setLayoutParams(contParams);
-                    image.setLayoutParams(imgParams);
-                }
-            } else {
-                contParams.topMargin = -scrollY;
-                imgParams.topMargin = imageBaseYOffset + scrollY / 2; 
//parallax, baby
-                articleHeaderView.setLayoutParams(contParams);
-                image.setLayoutParams(imgParams);
-            }
-        }
-    }
-
     private class ImageLoadListener implements 
ImageViewWithFace.OnImageLoadListener {
         @Override
         public void onImageLoaded(Bitmap bitmap, @Nullable final PointF 
faceLocation) {
@@ -476,6 +447,7 @@
             // give our image an offset based on the location of the face,
             // relative to the image container
             float scale = (float) newHeight / (float) bmpHeight;
+            int imageBaseYOffset;
             if (faceLocation != null) {
                 int faceY = (int) (faceLocation.y * scale);
                 // if we have a face, then offset to the face location
@@ -508,7 +480,7 @@
                 setImageLayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, 
newHeight);
             }
 
-            forceRefreshWebView();
+            articleHeaderView.setImageYOffset(imageBaseYOffset);
 
             // fade in the new image!
             ViewAnimations.crossFade(imagePlaceholder, image);
diff --git a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java 
b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java
index c898cc9..71e2d9b 100644
--- a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java
+++ b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java
@@ -49,7 +49,7 @@
 
 import static org.wikipedia.util.ResourceUtil.getThemedAttributeId;
 
-public class ArticleHeaderView extends FrameLayout {
+public class ArticleHeaderView extends FrameLayout implements 
ObservableWebView.OnScrollChangeListener {
     @Bind(R.id.image) ImageViewWithFace image;
     @Bind(R.id.placeholder) ImageView placeholder;
     @Bind(R.id.text) AppTextView text;
@@ -57,6 +57,8 @@
     @NonNull private CharSequence title = "";
     @NonNull private CharSequence subtitle = "";
     @Nullable private String pronunciationUrl;
+
+    private int imageYOffset;
 
     @NonNull private final AvPlayer avPlayer = new DefaultAvPlayer(new 
MediaPlayerImplementation());
 
@@ -146,6 +148,11 @@
         return returnedBitmap;
     }
 
+    public void setImageYOffset(int offset) {
+        imageYOffset = offset;
+        updateParallaxScroll();
+    }
+
     // TODO: remove.
     public ImageView getPlaceholder() {
         return placeholder;
@@ -199,6 +206,11 @@
     }
 
     @Override
+    public void onScrollChanged(int oldScrollY, int scrollY) {
+        updateParallaxScroll(scrollY);
+    }
+
+    @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
         avPlayer.init();
@@ -208,6 +220,16 @@
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
         avPlayer.deinit();
+    }
+
+    private void updateParallaxScroll() {
+        updateParallaxScroll((int) -getTranslationY());
+    }
+
+    private void updateParallaxScroll(int scrollY) {
+        int offset = Math.min(getHeight(), scrollY);
+        setTranslationY(-offset);
+        image.setTranslationY(imageYOffset + offset / 2);
     }
 
     private void updateText() {
@@ -242,13 +264,13 @@
         final float leadingScalar = 
DimenUtil.getFloat(R.dimen.lead_subtitle_leading_scalar);
         final float paragraphScalar = 
DimenUtil.getFloat(R.dimen.lead_subtitle_paragraph_scalar);
         return RichTextUtil.setSpans(new SpannableString(subtitle),
-                                     0,
-                                     subtitle.length(),
-                                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE,
-                                     new 
AbsoluteSizeSpan(getDimensionPixelSize(R.dimen.descriptionTextSize),
-                                             false),
-                                     new LeadingSpan(leadingScalar),
-                                     new ParagraphSpan(paragraphScalar));
+                0,
+                subtitle.length(),
+                Spannable.SPAN_INCLUSIVE_EXCLUSIVE,
+                new 
AbsoluteSizeSpan(getDimensionPixelSize(R.dimen.descriptionTextSize),
+                        false),
+                new LeadingSpan(leadingScalar),
+                new ParagraphSpan(paragraphScalar));
     }
 
     private void setTextDropShadow() {
diff --git a/app/src/main/java/org/wikipedia/views/ObservableWebView.java 
b/app/src/main/java/org/wikipedia/views/ObservableWebView.java
index 7197b6b..98be260 100755
--- a/app/src/main/java/org/wikipedia/views/ObservableWebView.java
+++ b/app/src/main/java/org/wikipedia/views/ObservableWebView.java
@@ -80,7 +80,7 @@
         void onScrollChanged(int oldScrollY, int scrollY);
     }
 
-    public interface  OnDownMotionEventListener {
+    public interface OnDownMotionEventListener {
         void onDownMotionEvent();
     }
 

-- 
To view, visit https://gerrit.wikimedia.org/r/252589
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4dead75193f80d1355848aba15e187f73cd301bc
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to