Yuvipanda has uploaded a new change for review.
https://gerrit.wikimedia.org/r/103344
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.
Also need to figure out how to properly let the drawer and
the search bar interact.
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, 171 insertions(+), 26 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/44/103344/1
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..38838c7 100644
--- a/wikipedia/res/layout/activity_main.xml
+++ b/wikipedia/res/layout/activity_main.xml
@@ -1,30 +1,31 @@
-<LinearLayout
+<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/drawer_layout"
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.support.v4.widget.DrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:saveEnabled="false"
- android:layout_height="match_parent">
- <!-- The main content view -->
+ android:saveEnabled="false"
+ android:layout_height="match_parent">
+ <!-- The main content view -->
<FrameLayout
- android:id="@+id/content_frame"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_width="match_parent"
android:layout_height="match_parent">
+ <FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ </FrameLayout>
+ <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>
<!-- The navigation drawer -->
<fragment android:layout_width="wrap_content"
android:layout_height="match_parent"
android:name="org.wikimedia.wikipedia.NavDrawerFragment"
android:layout_gravity="start"
+ android:layout_marginTop="48dp"
+ android:layout_marginBottom="0dp"
/>
- </android.support.v4.widget.DrawerLayout>
-</LinearLayout>
+
+</android.support.v4.widget.DrawerLayout>
diff --git a/wikipedia/res/layout/fragment_navdrawer.xml
b/wikipedia/res/layout/fragment_navdrawer.xml
index 39effa3..c6eff24 100644
--- a/wikipedia/res/layout/fragment_navdrawer.xml
+++ b/wikipedia/res/layout/fragment_navdrawer.xml
@@ -1,9 +1,8 @@
<?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">
<ListView android:layout_width="match_parent"
android:layout_height="match_parent"
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..2e17caf 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
@@ -8,6 +8,7 @@
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 +88,13 @@
startActivity(shareIntent);
}
+ @Subscribe
+ public void onPageStateChange(PageStateChangeEvent event) {
+ if (event.getState() == PageViewFragment.STATE_COMPLETE_FETCH) {
+ new QuickReturnHandler(curPageFragment.getObservableWebView(),
searchAriclesFragment.getView());
+ }
+ }
+
@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: newchange
Gerrit-Change-Id: Ib9c5d33e9b43f6199d767a8d20567623b89a9dd1
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits