Brion VIBBER has submitted this change and it was merged.

Change subject: Implement a continuous version of 'Quick Return'
......................................................................


Implement a continuous version of 'Quick Return'

This is a 'continuous' version of QuickReturn. QuickReturn
itself is rather discrete - you can never actually be stuck with
the bar in an 'inbetween' state. This is a much simpler version
that just continuously slides it around. The discrete version
requires some statekeeping mechanics.

Change-Id: Ib9c5d33e9b43f6199d767a8d20567623b89a9dd1
---
M wikipedia/assets/pagestyles.css
M wikipedia/res/layout/activity_main.xml
M wikipedia/res/layout/fragment_navdrawer.xml
M wikipedia/res/layout/fragment_page.xml
M wikipedia/res/layout/fragment_search.xml
A wikipedia/src/main/java/org/wikimedia/wikipedia/ObservableWebView.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
A wikipedia/src/main/java/org/wikimedia/wikipedia/QuickReturnHandler.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/SearchArticlesFragment.java
10 files changed, 181 insertions(+), 21 deletions(-)

Approvals:
  Brion VIBBER: Verified; Looks good to me, approved



diff --git a/wikipedia/assets/pagestyles.css b/wikipedia/assets/pagestyles.css
index 737ff50..5cad7d0 100644
--- a/wikipedia/assets/pagestyles.css
+++ b/wikipedia/assets/pagestyles.css
@@ -6,6 +6,7 @@
     font-family: sans-serif;
     font-size: 16px;
     line-height: 24px;
+    margin-top: 48px;
 }
 
 a {
diff --git a/wikipedia/res/layout/activity_main.xml 
b/wikipedia/res/layout/activity_main.xml
index 5bc2924..f20ba1f 100644
--- a/wikipedia/res/layout/activity_main.xml
+++ b/wikipedia/res/layout/activity_main.xml
@@ -1,15 +1,6 @@
-<LinearLayout
+<FrameLayout
         xmlns:android="http://schemas.android.com/apk/res/android";
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical"
-        >
-    <fragment
-            android:id="@+id/search_fragment"
-            android:name="org.wikimedia.wikipedia.SearchArticlesFragment"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            />
+        android:layout_width="match_parent" 
android:layout_height="match_parent">
     <android.support.v4.widget.DrawerLayout
             android:id="@+id/drawer_layout"
             android:layout_width="match_parent"
@@ -22,9 +13,18 @@
                 android:layout_height="match_parent">
         </FrameLayout>
         <!-- The navigation drawer -->
+        <!-- Don't set marginTop here, it somehow also affects marginBottom. 
wtf?! -->
         <fragment android:layout_width="wrap_content" 
android:layout_height="match_parent"
                   android:name="org.wikimedia.wikipedia.NavDrawerFragment"
                   android:layout_gravity="start"
                 />
+
     </android.support.v4.widget.DrawerLayout>
-</LinearLayout>
+    <fragment
+            android:id="@+id/search_fragment"
+            android:name="org.wikimedia.wikipedia.SearchArticlesFragment"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:layout_gravity="top"
+            />
+</FrameLayout>
diff --git a/wikipedia/res/layout/fragment_navdrawer.xml 
b/wikipedia/res/layout/fragment_navdrawer.xml
index 39effa3..0b8228c 100644
--- a/wikipedia/res/layout/fragment_navdrawer.xml
+++ b/wikipedia/res/layout/fragment_navdrawer.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
-              android:layout_width="match_parent"
+              android:layout_width="196dp"
               android:layout_height="match_parent"
-              android:minWidth="196dp"
-              android:orientation="vertical"
-              android:background="#111">
+              android:orientation="vertical" >
+    <!-- Match marginTop with height of Search Fragment -->
     <ListView android:layout_width="match_parent" 
android:layout_height="match_parent"
-              android:id="@+id/nav_list">
-
+              android:layout_marginTop="48dp"
+              android:id="@+id/nav_list"
+              android:background="#111">
     </ListView>
 </LinearLayout>
\ No newline at end of file
diff --git a/wikipedia/res/layout/fragment_page.xml 
b/wikipedia/res/layout/fragment_page.xml
index 7465dd3..f7b146b 100644
--- a/wikipedia/res/layout/fragment_page.xml
+++ b/wikipedia/res/layout/fragment_page.xml
@@ -11,7 +11,7 @@
         android:layout_height="wrap_content"
         android:indeterminate="true"
         />
-    <WebView
+    <org.wikimedia.wikipedia.ObservableWebView
         android:id="@+id/pageWebView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
diff --git a/wikipedia/res/layout/fragment_search.xml 
b/wikipedia/res/layout/fragment_search.xml
index 9073a41..90ca9a8 100644
--- a/wikipedia/res/layout/fragment_search.xml
+++ b/wikipedia/res/layout/fragment_search.xml
@@ -4,6 +4,7 @@
               android:orientation="vertical"
               android:layout_width="match_parent"
               android:layout_height="48dp"
+              android:background="@android:color/background_light"
         >
     <LinearLayout
             android:orientation="horizontal"
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/ObservableWebView.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/ObservableWebView.java
new file mode 100644
index 0000000..f2bebdd
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/ObservableWebView.java
@@ -0,0 +1,88 @@
+package org.wikimedia.wikipedia;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.webkit.WebView;
+
+public class ObservableWebView extends WebView {
+    private OnScrollChangeListener onScrollChangeListener;
+    private OnDownMotionEventListener onDownMotionEventListener;
+    private OnUpOrCancelMotionEventListener onUpOrCancelMotionEventListener;
+
+    public OnScrollChangeListener getOnScrollChangeListener() {
+        return onScrollChangeListener;
+    }
+
+    public void setOnScrollChangeListener(OnScrollChangeListener 
onScrollChangeListener) {
+        this.onScrollChangeListener = onScrollChangeListener;
+    }
+
+    public OnDownMotionEventListener getOnDownMotionEventListener() {
+        return onDownMotionEventListener;
+    }
+
+    public void setOnDownMotionEventListener(OnDownMotionEventListener 
onDownMotionEventListener) {
+        this.onDownMotionEventListener = onDownMotionEventListener;
+    }
+
+    public OnUpOrCancelMotionEventListener 
getOnUpOrCancelMotionEventListener() {
+        return onUpOrCancelMotionEventListener;
+    }
+
+    public void 
setOnUpOrCancelMotionEventListener(OnUpOrCancelMotionEventListener 
onUpOrCancelMotionEventListener) {
+        this.onUpOrCancelMotionEventListener = onUpOrCancelMotionEventListener;
+    }
+
+    public static interface OnScrollChangeListener {
+        public void onScrollChanged(int oldScrollY, int scrollY);
+    }
+
+    public static interface  OnDownMotionEventListener {
+        public void onDownMotionEvent();
+    }
+
+    public static interface OnUpOrCancelMotionEventListener {
+        public void onUpOrCancelMotionEvent();
+    }
+
+    public ObservableWebView(Context context) {
+        super(context);
+    }
+
+    public ObservableWebView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public ObservableWebView(Context context, AttributeSet attrs, int 
defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public ObservableWebView(Context context, AttributeSet attrs, int 
defStyle, boolean privateBrowsing) {
+        super(context, attrs, defStyle, privateBrowsing);
+    }
+
+    @Override
+    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
+        super.onScrollChanged(l, t, oldl, oldt);
+        if (onScrollChangeListener != null) {
+            onScrollChangeListener.onScrollChanged(oldt, t);
+        }
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        if (onDownMotionEventListener != null && 
onUpOrCancelMotionEventListener != null) {
+            switch (event.getActionMasked()) {
+                case MotionEvent.ACTION_DOWN:
+                    onDownMotionEventListener.onDownMotionEvent();
+                    break;
+                case MotionEvent.ACTION_UP:
+                case MotionEvent.ACTION_CANCEL:
+                    onUpOrCancelMotionEventListener.onUpOrCancelMotionEvent();
+                    break;
+            }
+        }
+        return super.onTouchEvent(event);
+    }
+}
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
index 4572877..4a0fc7c 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
@@ -2,12 +2,15 @@
 
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.widget.DrawerLayout;
 import android.view.Gravity;
 import com.squareup.otto.Bus;
 import com.squareup.otto.Subscribe;
 import org.wikimedia.wikipedia.events.NewWikiPageNavigationEvent;
+import org.wikimedia.wikipedia.events.PageStateChangeEvent;
 import org.wikimedia.wikipedia.events.SavePageEvent;
 import org.wikimedia.wikipedia.events.SharePageEvent;
 import org.wikimedia.wikipedia.history.HistoryEntry;
@@ -87,6 +90,26 @@
         startActivity(shareIntent);
     }
 
+    @Subscribe
+    public void onPageStateChange(PageStateChangeEvent event) {
+        if (event.getState() == PageViewFragment.STATE_COMPLETE_FETCH) {
+            // This could potentially be called *before* onCreateView of the 
PageViewFragment is done
+            // And for *some* reason, that causes all the internal variables 
to be null
+            // That is super weird and makes no sense to me - I verified they 
are the same objects
+            // Using the debugger. But expanding them has all member variables 
that were not set in the
+            // constructor to be null.
+            // So this 'hack' works around it by delaying the setup by 100ms.
+            // FIXME: Find out if this is a WTF Java or a WTF Android
+            new Handler(new Handler.Callback() {
+                @Override
+                public boolean handleMessage(Message msg) {
+                    new 
QuickReturnHandler(curPageFragment.getObservableWebView(), 
searchAriclesFragment.getView());
+                    return true;
+                }
+            }).sendEmptyMessageDelayed(0, 100);
+        }
+    }
+
     @Override
     public void onBackPressed() {
         if (!searchAriclesFragment.handleBackPressed()) {
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
index c872cae..9241ecf 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
@@ -37,7 +37,7 @@
     private int state = STATE_NO_FETCH;
 
     private PageTitle title;
-    private WebView webView;
+    private ObservableWebView webView;
     private ProgressBar loadProgress;
     private View networkError;
     private View retryButton;
@@ -116,7 +116,7 @@
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
final Bundle savedInstanceState) {
         FrameLayout parentView = (FrameLayout) 
inflater.inflate(R.layout.fragment_page, container, false);
 
-        webView = (WebView) parentView.findViewById(R.id.pageWebView);
+        webView = (ObservableWebView) 
parentView.findViewById(R.id.pageWebView);
         loadProgress = (ProgressBar) 
parentView.findViewById(R.id.pageLoadProgress);
         networkError = parentView.findViewById(R.id.pageError);
         retryButton = parentView.findViewById(R.id.pageErrorRetry);
@@ -260,4 +260,8 @@
             }
         }.execute();
     }
+
+    public ObservableWebView getObservableWebView() {
+        return webView;
+    }
 }
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/QuickReturnHandler.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/QuickReturnHandler.java
new file mode 100644
index 0000000..dc5bc66
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/QuickReturnHandler.java
@@ -0,0 +1,39 @@
+package org.wikimedia.wikipedia;
+
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+
+public class QuickReturnHandler implements  
ObservableWebView.OnScrollChangeListener {
+    private final ObservableWebView webview;
+    private final View quickReturnView;
+
+    public QuickReturnHandler(ObservableWebView webview, View quickReturnView) 
{
+        this.webview = webview;
+        this.quickReturnView =  quickReturnView;
+
+        webview.setOnScrollChangeListener(this);
+    }
+
+    @Override
+    public void onScrollChanged(int oldScrollY, int scrollY) {
+        int animMargin;
+        if (oldScrollY > scrollY) {
+            int minMargin = 0;
+            int scrollDelta = (oldScrollY - scrollY) / 2;
+            int newMargin = (int)quickReturnView.getTranslationY() + 
scrollDelta;
+            animMargin = Math.min(minMargin, newMargin);
+        } else {
+            // scroll downn!
+            int minMargin = -quickReturnView.getHeight();
+            int scrollDelta = (scrollY - oldScrollY) / 2;
+            int newMargin = (int)quickReturnView.getTranslationY() - 
scrollDelta;
+            animMargin = Math.max(minMargin, newMargin);
+        }
+        quickReturnView.setTranslationY(animMargin);
+    }
+}
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/SearchArticlesFragment.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/SearchArticlesFragment.java
index bcc7c63..c20e7ab 100644
--- 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/SearchArticlesFragment.java
+++ 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/SearchArticlesFragment.java
@@ -250,6 +250,10 @@
         drawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() 
{
             @Override
             public void onDrawerSlide(View drawerView, float slideOffset) {
+                // Make sure that the entire search bar is visible
+                if (getView().getTranslationY() != 0) {
+                    
getView().animate().translationY(0).setDuration(WikipediaApp.SHORT_ANIMATION_DURATION).start();
+                }
                 // Animation for sliding drawer open and close
                 // -4dp seems to match how much farther GMail's indicator 
goes, so sticking with it
                 // Shift left and right margins appropriately to make sure 
that the rest of the layout does not shift

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ib9c5d33e9b43f6199d767a8d20567623b89a9dd1
Gerrit-PatchSet: 4
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to