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