Dbrant has uploaded a new change for review.

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

Change subject: [WIP] Reuse the same WebView for article navigation.
......................................................................

[WIP] Reuse the same WebView for article navigation.

Change-Id: I40ac4c6f1a0351e7fec7b462d5b950c12fd09122
---
M wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java
M wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java
M wikipedia/src/main/java/org/wikipedia/editing/EditHandler.java
M wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
M wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
D wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
M wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
M wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java
M 
wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
M 
wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandlerOld.java
M wikipedia/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
11 files changed, 167 insertions(+), 357 deletions(-)


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

diff --git a/wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java 
b/wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java
index fd3a948..fba6da3 100644
--- a/wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java
@@ -20,7 +20,7 @@
 import org.wikipedia.login.LoginActivity;
 import org.wikipedia.nearby.NearbyFragment;
 import org.wikipedia.page.PageActivity;
-import org.wikipedia.page.PageViewFragment;
+import org.wikipedia.page.PageViewFragmentInternal;
 import org.wikipedia.random.RandomHandler;
 import org.wikipedia.savedpages.SavedPagesFragment;
 import org.wikipedia.settings.SettingsActivity;
@@ -138,12 +138,14 @@
             highlightItem = R.id.nav_item_saved_pages;
         } else if (activity.getTopFragment() instanceof NearbyFragment) {
             highlightItem = R.id.nav_item_nearby;
-        } else if (activity.getTopFragment() instanceof PageViewFragment) {
-            PageViewFragment fragment = 
(PageViewFragment)activity.getTopFragment();
-            if (fragment.getFragment().getHistoryEntry().getSource() == 
HistoryEntry.SOURCE_MAIN_PAGE) {
-                highlightItem = R.id.nav_item_today;
-            } else if (fragment.getFragment().getHistoryEntry().getSource() == 
HistoryEntry.SOURCE_RANDOM) {
-                highlightItem = R.id.nav_item_random;
+        } else if (activity.getTopFragment() instanceof 
PageViewFragmentInternal) {
+            PageViewFragmentInternal fragment = 
(PageViewFragmentInternal)activity.getTopFragment();
+            if (fragment.getHistoryEntry() != null) {
+                if (fragment.getHistoryEntry().getSource() == 
HistoryEntry.SOURCE_MAIN_PAGE) {
+                    highlightItem = R.id.nav_item_today;
+                } else if (fragment.getHistoryEntry().getSource() == 
HistoryEntry.SOURCE_RANDOM) {
+                    highlightItem = R.id.nav_item_random;
+                }
             }
         }
         if (highlightItem != -1) {
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java
index 91e1f80..b39f51c 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java
@@ -39,12 +39,13 @@
         return eventData;
     }
 
-    protected void log(Object... params) {
+    protected void log(Site site, Object... params) {
         super.log(site, params);
     }
 
     public void logSuggestionsShown(PageTitle currentPageTitle, 
List<PageTitle> suggestedTitles) {
         log(
+                currentPageTitle.getSite(),
                 "action", "shown",
                 "pageTitle", currentPageTitle.getDisplayText(),
                 "readMoreList", TextUtils.join("|", suggestedTitles)
@@ -54,6 +55,7 @@
     public void logSuggestionClicked(PageTitle currentPageTitle, 
List<PageTitle> suggestedTitles,
                                      int clickedIndex) {
         log(
+                currentPageTitle.getSite(),
                 "action", "clicked",
                 "pageTitle", currentPageTitle.getDisplayText(),
                 "readMoreList", TextUtils.join("|", suggestedTitles),
diff --git a/wikipedia/src/main/java/org/wikipedia/editing/EditHandler.java 
b/wikipedia/src/main/java/org/wikipedia/editing/EditHandler.java
index f270cda..bd79530 100644
--- a/wikipedia/src/main/java/org/wikipedia/editing/EditHandler.java
+++ b/wikipedia/src/main/java/org/wikipedia/editing/EditHandler.java
@@ -12,17 +12,17 @@
 import org.wikipedia.history.HistoryEntry;
 import org.wikipedia.page.Page;
 import org.wikipedia.page.PageActivity;
-import org.wikipedia.page.PageViewFragment;
+import org.wikipedia.page.PageViewFragmentInternal;
 import org.wikipedia.page.Section;
 
 public class EditHandler implements CommunicationBridge.JSEventListener {
     public static final int RESULT_REFRESH_PAGE = 1;
 
-    private final PageViewFragment fragment;
+    private final PageViewFragmentInternal fragment;
     private ProtectedEditAttemptFunnel funnel;
     private Page currentPage;
 
-    public EditHandler(PageViewFragment fragment, CommunicationBridge bridge) {
+    public EditHandler(PageViewFragmentInternal fragment, CommunicationBridge 
bridge) {
         this.fragment = fragment;
         bridge.addListener("editSectionClicked", this);
     }
@@ -59,7 +59,7 @@
         }
         if (messageType.equals("editSectionClicked")) {
             final SavedPagesFunnel savedPagesFunnel = 
WikipediaApp.getInstance().getFunnelManager().getSavedPagesFunnel(currentPage.getTitle().getSite());
-            if (fragment.getFragment().getHistoryEntry().getSource() == 
HistoryEntry.SOURCE_SAVED_PAGE) {
+            if (fragment.getHistoryEntry().getSource() == 
HistoryEntry.SOURCE_SAVED_PAGE) {
                 savedPagesFunnel.logEditAttempt();
                 new AlertDialog.Builder(fragment.getActivity())
                         .setCancelable(false)
@@ -67,7 +67,7 @@
                         .setPositiveButton(android.R.string.yes, new 
DialogInterface.OnClickListener() {
                             @Override
                             public void onClick(DialogInterface 
dialogInterface, int i) {
-                                fragment.getFragment().refreshPage(true);
+                                fragment.refreshPage(true);
                                 savedPagesFunnel.logEditRefresh();
                                 wasRefreshed = true;
                             }
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
index 034c576..16198fd 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
@@ -121,8 +121,8 @@
      */
     public PageViewFragmentInternal getCurPageFragment() {
         Fragment f = getTopFragment();
-        if (f instanceof PageViewFragment) {
-            return ((PageViewFragment)f).getFragment();
+        if (f instanceof PageViewFragmentInternal) {
+            return (PageViewFragmentInternal) f;
         } else {
             return null;
         }
@@ -444,6 +444,15 @@
         return searchFragment.isSearchActive();
     }
 
+    private void resetFragments() {
+        while (getTopFragment() != null && !(getTopFragment() instanceof 
PageViewFragmentInternal)) {
+            getSupportFragmentManager().popBackStackImmediate();
+        }
+        if (getTopFragment() == null) {
+            pushFragment(new PageViewFragmentInternal());
+        }
+    }
+
     /**
      * Add a new fragment to the top of the activity's backstack.
      * @param f New fragment to place on top.
@@ -463,36 +472,20 @@
         searchBarHideHandler.setForceNoFade(false);
         searchBarHideHandler.setFadeEnabled(false);
         // if the new fragment is the same class as the current topmost 
fragment,
-        // then just keep the previous fragment there. (unless it's a 
PageViewFragment)
+        // then just keep the previous fragment there.
         // e.g. if the user selected History, and there's already a History 
fragment on top,
         // then there's no need to load a new History fragment.
-        if (getTopFragment() != null
-                && (getTopFragment().getClass() == f.getClass())
-                && !(f instanceof PageViewFragment)) {
+        if (getTopFragment() != null && (getTopFragment().getClass() == 
f.getClass())) {
             return;
         }
-
-        // if the fragment onto which the new fragment is being placed is not 
a PageViewFragment,
-        // then remove it from the backstack (to comply with Google navigation 
guidelines).
-        if (getTopFragment() != null && !(getTopFragment() instanceof 
PageViewFragment)) {
-            getSupportFragmentManager().popBackStackImmediate();
-        }
-
         int totalFragments = 
getSupportFragmentManager().getBackStackEntryCount();
+        if (totalFragments > 0) {
+            resetFragments();
+        }
         FragmentTransaction trans = 
getSupportFragmentManager().beginTransaction();
 
         // do an animation on the new fragment, but only if there was a 
previous one before it.
-        if (getTopFragment() != null) {
-            if (f instanceof PageViewFragment) {
-                // animate page fragments by sliding them in/out
-                trans.setCustomAnimations(R.anim.slide_in_right, 
R.anim.slide_out_left,
-                                          R.anim.slide_in_left, 
R.anim.slide_out_right);
-            } else {
-                // animate other fragments (history/saved/etc) by fading them 
in/out
-                trans.setCustomAnimations(R.anim.abc_fade_in, 
R.anim.abc_fade_out, 0, 0);
-            }
-        }
-
+        trans.setCustomAnimations(R.anim.abc_fade_in, R.anim.abc_fade_out, 0, 
0);
         trans.replace(R.id.content_fragment_container, f, "fragment_" + 
Integer.toString(totalFragments));
         trans.addToBackStack(null);
         if (allowStateLoss) {
@@ -537,7 +530,7 @@
      * @param entry HistoryEntry associated with this page.
      * @param allowStateLoss Whether to allow state loss.
      */
-    public void displayNewPage(PageTitle title, HistoryEntry entry, boolean 
allowStateLoss) {
+    public void displayNewPage(final PageTitle title, final HistoryEntry 
entry, boolean allowStateLoss) {
         ACRA.getErrorReporter().putCustomData("api", 
title.getSite().getApiDomain());
         ACRA.getErrorReporter().putCustomData("title", title.toString());
 
@@ -548,23 +541,25 @@
             Utils.visitInExternalBrowser(this, 
Uri.parse(title.getMobileUri()));
             return;
         }
+        resetFragments();
 
-        //is the new title the same as what's already being displayed?
-        if (getTopFragment() instanceof PageViewFragment) {
-            PageViewFragmentInternal frag = getCurPageFragment();
-            if (frag.getTitle().equals(title)) {
-                //if we have a section to scroll to, then pass it to the 
fragment
-                if (!TextUtils.isEmpty(title.getFragment())) {
-                    frag.scrollToSection(title.getFragment());
+        fragmentContainerView.post(new Runnable() {
+            @Override
+            public void run() {
+                //is the new title the same as what's already being displayed?
+                PageViewFragmentInternal frag = getCurPageFragment();
+                if (frag.getTitle() != null && frag.getTitle().equals(title)) {
+                    //if we have a section to scroll to, then pass it to the 
fragment
+                    if (!TextUtils.isEmpty(title.getFragment())) {
+                        frag.scrollToSection(title.getFragment());
+                    }
+                    return;
                 }
-                return;
+                frag.closeFindInPage();
+                frag.displayNewPage(title, entry);
+                app.getSessionFunnel().pageViewed(entry);
             }
-            frag.closeFindInPage();
-        }
-
-        pushFragment(PageViewFragment.newInstance(title, entry), 
allowStateLoss);
-
-        app.getSessionFunnel().pageViewed(entry);
+        });
     }
 
     /**
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
index 262ca5b..2771df7 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
@@ -14,11 +14,9 @@
  */
 abstract class PageInfoHandler implements CommunicationBridge.JSEventListener {
     private final PageActivity activity;
-    private final Site site;
 
-    PageInfoHandler(PageActivity activity, CommunicationBridge bridge, Site 
site) {
+    PageInfoHandler(PageActivity activity, CommunicationBridge bridge) {
         this.activity = activity;
-        this.site = site;
         bridge.addListener("disambigClicked", this);
         bridge.addListener("issuesClicked", this);
     }
@@ -48,10 +46,11 @@
         DisambigResult[] stringArray = new DisambigResult[array.length()];
         for (int i = 0; i < array.length(); i++) {
             // Decode the href that we got into a PageTitle, and create a 
DisambigResult with it
-            stringArray[i] = new 
DisambigResult(site.titleForInternalLink(array.getString(i)));
+            stringArray[i] = new 
DisambigResult(getSite().titleForInternalLink(array.getString(i)));
         }
         return stringArray;
     }
 
+    abstract Site getSite();
     abstract int getDialogHeight();
 }
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
deleted file mode 100644
index 5bf5050..0000000
--- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package org.wikipedia.page;
-
-import org.wikipedia.PageTitle;
-import org.wikipedia.R;
-import org.wikipedia.history.HistoryEntry;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v7.app.ActionBarActivity;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Fragment that displays a single Page (WebView plus ToC drawer).
- * This is an "empty shell" of a fragment that passes all the actual logic to 
an internal
- * PageViewFragmentInternal class, and here's why:
- *
- * When a fragment is replaced by another fragment, and placed onto the 
backstack, the old
- * fragment's View is destroyed, but the actual Fragment object remains in 
memory (so that
- * the fragment View may be rebuilt if the user goes "back" to it, without 
having to use
- * savedInstanceState).  The problem is that our PageViewFragment is a very 
heavy object
- * (in terms of actual bytecode), and that's what eats up a lot of memory when 
multiple
- * PageViewFragments are stacked on top of each other.
- *
- * So, I've separated all the "heavy" code into a PageViewFragmentInternal 
object, and made
- * an extremely light PageViewFragment object. The heavy object has all the 
same methods expected
- * from a Fragment, and becomes a puppet of the light object.  The crucial 
point comes when the
- * fragment's View is destroyed:  the light object sets its instance of the 
heavy object to null,
- * thus freeing all of that memory.
- *
- * The light fragment maintains a set of arguments, so that the heavy object 
can be recreated
- * if the user goes back to it.
- */
-public class PageViewFragment extends Fragment {
-    private static final String KEY_TITLE = "title";
-    private static final String KEY_CURRENT_HISTORY_ENTRY = 
"currentHistoryEntry";
-    private static final String KEY_SCROLL_Y = "scrollY";
-
-    private PageViewFragmentInternal fragment;
-
-    /**
-     * Access the underlying PageViewFragmentInternal object, for interacting 
with its
-     * WebView and page manipulation functions.
-     * @return Underlying object responsible for rendering the page. May be 
null if this
-     * fragment's View has been destroyed.
-     */
-    public PageViewFragmentInternal getFragment() {
-        return fragment;
-    }
-
-    /**
-     * Factory method for creating new instances of the fragment.
-     * @param title Title of the page to be displayed.
-     * @param entry HistoryEntry associated with this page.
-     * @return New instance of this fragment.
-     */
-    public static PageViewFragment newInstance(PageTitle title, HistoryEntry 
entry) {
-        PageViewFragment f = new PageViewFragment();
-        Bundle args = new Bundle();
-        args.putParcelable(KEY_TITLE, title);
-        args.putParcelable(KEY_CURRENT_HISTORY_ENTRY, entry);
-        args.putInt(KEY_SCROLL_Y, 0);
-        f.setArguments(args);
-        return f;
-    }
-
-    public PageViewFragment() {
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        fragment = new PageViewFragmentInternal(this,
-                (PageTitle)getArguments().getParcelable(KEY_TITLE),
-                
(HistoryEntry)getArguments().getParcelable(KEY_CURRENT_HISTORY_ENTRY),
-                getArguments().getInt(KEY_SCROLL_Y));
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
final Bundle savedInstanceState) {
-        if (fragment == null) {
-            //this implies that we previously disposed of our internal 
fragment object, and
-            //now need to recreate it, based on the state that we kept.
-            fragment = new PageViewFragmentInternal(this,
-                    (PageTitle)getArguments().getParcelable(KEY_TITLE),
-                    
(HistoryEntry)getArguments().getParcelable(KEY_CURRENT_HISTORY_ENTRY),
-                    getArguments().getInt(KEY_SCROLL_Y));
-        }
-        return fragment.onCreateView(inflater, container, savedInstanceState);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        ((ActionBarActivity)getActivity()).getSupportActionBar().setTitle("");
-    }
-
-    @Override
-    public void onDestroyView() {
-        if (fragment != null) {
-            // update our arguments, so that we'll be able to precisely 
recreate
-            // the internal object based on them.
-            getArguments().putInt(KEY_SCROLL_Y, fragment.getScrollY());
-
-            // let the internal object do any cleanup of its own.
-            fragment.onDestroyView();
-
-            // the key to everything: dispose of the internal object, thus 
freeing a whole bunch of memory,
-            // and keeping just a minimal amount of data on the back-stack.
-            fragment = null;
-        }
-        super.onDestroyView();
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        if (fragment == null) {
-            return;
-        }
-        fragment.onActivityCreated(savedInstanceState);
-        setHasOptionsMenu(true);
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
-        super.onActivityResult(requestCode, resultCode, data);
-        if (fragment == null) {
-            return;
-        }
-        fragment.onActivityResult(requestCode, resultCode, data);
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        if (!isAdded() || ((PageActivity)getActivity()).isSearching()) {
-            return;
-        }
-        inflater.inflate(R.menu.menu_page_actions, menu);
-    }
-
-    @Override
-    public void onPrepareOptionsMenu(Menu menu) {
-        super.onPrepareOptionsMenu(menu);
-        if (!isAdded() || ((PageActivity)getActivity()).isSearching()) {
-            return;
-        }
-        fragment.onPrepareOptionsMenu(menu);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (fragment.onOptionsItemSelected(item)) {
-            return true;
-        } else {
-            return super.onOptionsItemSelected(item);
-        }
-    }
-}
diff --git 
a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
index 1e2bb18..6b286ec 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
@@ -31,22 +31,22 @@
 import org.wikipedia.search.SearchBarHideHandler;
 import org.wikipedia.views.DisableableDrawerLayout;
 import org.wikipedia.views.ObservableWebView;
+import org.wikipedia.views.SwipeRefreshLayoutWithScroll;
 import org.mediawiki.api.json.Api;
 import org.mediawiki.api.json.ApiException;
 import org.mediawiki.api.json.ApiResult;
 import org.mediawiki.api.json.RequestBuilder;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.wikipedia.views.SwipeRefreshLayoutWithScroll;
-
 import android.app.AlertDialog;
 import android.content.Intent;
-import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.os.Build;
 import android.os.Bundle;
+import android.support.v4.app.Fragment;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.app.ActionBarActivity;
 import android.support.v7.view.ActionMode;
 import android.text.Html;
 import android.util.Log;
@@ -54,6 +54,7 @@
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
@@ -68,19 +69,9 @@
 import java.util.Locale;
 import java.util.Map;
 
-/**
- * "Fragment" that displays a single Page (WebView plus ToC drawer).
- * Notice that this class has all the methods of a Fragment, but does not 
actually derive
- * from Fragment. This class is instantiated, and becomes a puppet of, the 
PageViewFragment
- * class, which does in fact derive from Fragment.
- *
- * This class handles all of the heavy logic of displaying and interacting 
with a Page, but
- * is also designed to be fully disposable when no longer needed.  This allows 
a large number
- * of PageViewFragments to be in the backstack of the FragmentManager, without 
significantly
- * impacting memory usage.
- */
-public class PageViewFragmentInternal implements BackPressedHandler {
-    private static final String TAG = "PageViewFragmentInt";
+
+public class PageViewFragmentInternal extends Fragment implements 
BackPressedHandler {
+    private static final String TAG = "PageViewFragment";
 
     public static final int STATE_NO_FETCH = 1;
     public static final int STATE_INITIAL_FETCH = 2;
@@ -109,8 +100,6 @@
      * Whether to write the page contents to cache as soon as it's loaded.
      */
     private boolean cacheOnComplete = true;
-
-    private PageViewFragment parentFragment;
 
     private PageTitle title;
     private PageTitle titleOriginal;
@@ -146,34 +135,6 @@
     private SavedPagesFunnel savedPagesFunnel;
     private ConnectionIssueFunnel connectionIssueFunnel;
 
-    public PageViewFragmentInternal(PageViewFragment parentFragment, PageTitle 
title, HistoryEntry historyEntry, int scrollY) {
-        this.parentFragment = parentFragment;
-        this.title = title;
-        this.curEntry = historyEntry;
-        this.scrollY = scrollY;
-    }
-
-    public PageActivity getActivity() {
-        return (PageActivity)parentFragment.getActivity();
-    }
-
-    public boolean isAdded() {
-        return parentFragment.isAdded();
-    }
-
-    private Resources getResources() {
-        return parentFragment.getResources();
-    }
-
-    private String getString(int resId) {
-        return parentFragment.getString(resId);
-    }
-
-    private String getString(int resId, Object... formatArgs) {
-        return parentFragment.getString(resId, formatArgs);
-    }
-
-
     public ObservableWebView getWebView() {
         return webView;
     }
@@ -190,11 +151,14 @@
         return curEntry;
     }
 
+    public PageViewFragmentInternal() {
+    }
+
     private void displayLeadSection() {
         try {
             JSONObject marginPayload = new JSONObject();
             int margin = 
(int)(getResources().getDimension(R.dimen.activity_horizontal_margin)
-                    / getResources().getDisplayMetrics().density);
+                               / getResources().getDisplayMetrics().density);
             marginPayload.put("marginLeft", margin);
             marginPayload.put("marginRight", margin);
             bridge.sendMessage("setMargins", marginPayload);
@@ -213,15 +177,16 @@
             leadSectionPayload.put("apiLevel", Build.VERSION.SDK_INT);
             bridge.sendMessage("displayLeadSection", leadSectionPayload);
 
-            Utils.setupDirectionality(title.getSite().getLanguage(), 
Locale.getDefault().getLanguage(), bridge);
+            Utils.setupDirectionality(title.getSite().getLanguage(),
+                                      Locale.getDefault().getLanguage(), 
bridge);
 
             // Hide edit pencils if anon editing is disabled by remote 
killswitch or if this is a file page
             JSONObject miscPayload = new JSONObject();
             boolean isAnonEditingDisabled = 
app.getRemoteConfig().getConfig().optBoolean("disableAnonEditing", false)
-                    && !app.getUserInfoStorage().isLoggedIn();
+                                            && 
!app.getUserInfoStorage().isLoggedIn();
             miscPayload.put("noedit", (isAnonEditingDisabled
-                    || title.isFilePage()
-                    || page.getPageProperties().isMainPage()));
+                                       || title.isFilePage()
+                                       || 
page.getPageProperties().isMainPage()));
             miscPayload.put("protect", !page.getPageProperties().canEdit());
             bridge.sendMessage("setPageProtected", miscPayload);
         } catch (JSONException e) {
@@ -234,12 +199,12 @@
         }
 
         refreshView.setRefreshing(false);
-        getActivity().updateProgressBar(true, true, 0);
+        ((PageActivity) getActivity()).updateProgressBar(true, true, 0);
     }
 
     private void displayNonLeadSection(int index) {
-        getActivity().updateProgressBar(true, false, 
PageActivity.PROGRESS_BAR_MAX_VALUE
-                / page.getSections().size() * index);
+        ((PageActivity) getActivity()).updateProgressBar(true, false,
+                       PageActivity.PROGRESS_BAR_MAX_VALUE / 
page.getSections().size() * index);
 
         try {
             JSONObject wrapper = new JSONObject();
@@ -303,22 +268,13 @@
     public void onDestroyView() {
         //uninitialize the bridge, so that no further JS events can have any 
effect.
         bridge.cleanup();
+        super.onDestroyView();
     }
 
     public void onActivityCreated(Bundle savedInstanceState) {
-        if (title == null) {
-            throw new RuntimeException("No PageTitle passed in to constructor 
or in instanceState");
-        }
-        titleOriginal = title;
-
-        //save any section-specific link target from the title, since the 
title may be
-        //replaced (normalized)
-        sectionTargetFromTitle = title.getFragment();
-
+        super.onActivityCreated(savedInstanceState);
+        setHasOptionsMenu(true);
         app = (WikipediaApp)getActivity().getApplicationContext();
-
-        savedPagesFunnel = 
app.getFunnelManager().getSavedPagesFunnel(title.getSite());
-
         connectionIssueFunnel = new ConnectionIssueFunnel(app);
 
         updateFontSize();
@@ -331,7 +287,6 @@
         bridge = new CommunicationBridge(webView, 
"file:///android_asset/index.html");
         setupMessageHandlers();
 
-        Utils.setupDirectionality(title.getSite().getLanguage(), 
Locale.getDefault().getLanguage(), bridge);
         linkHandler = new LinkHandler(getActivity(), bridge) {
             @Override
             public void onPageLinkClicked(String anchor) {
@@ -356,7 +311,7 @@
                     referenceDialog.dismiss();
                 }
                 HistoryEntry historyEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_INTERNAL_LINK);
-                getActivity().displayNewPage(title, historyEntry);
+                ((PageActivity) getActivity()).displayNewPage(title, 
historyEntry);
             }
 
             @Override
@@ -369,7 +324,8 @@
             @Override
             protected void onReferenceClicked(String refHtml) {
                 if (!isAdded()) {
-                    Log.d("PageViewFragment", "Detached from activity, so 
stopping reference click.");
+                    Log.d("PageViewFragment",
+                          "Detached from activity, so stopping reference 
click.");
                     return;
                 }
 
@@ -381,7 +337,11 @@
             }
         };
 
-        new PageInfoHandler(getActivity(), bridge, title.getSite()) {
+        new PageInfoHandler(((PageActivity) getActivity()), bridge) {
+            @Override
+            Site getSite() {
+                return title.getSite();
+            }
             @Override
             int getDialogHeight() {
                 // could have scrolled up a bit but the page info links must 
still be visible else they couldn't have been clicked
@@ -409,38 +369,54 @@
             }
         });
 
-        editHandler = new EditHandler(parentFragment, bridge);
+        editHandler = new EditHandler(this, bridge);
+        tocHandler = new ToCHandler(((PageActivity) getActivity()), tocDrawer, 
bridge);
 
-        imagesContainer = (ViewGroup) 
parentFragment.getView().findViewById(R.id.page_images_container);
+        imagesContainer = (ViewGroup) 
getView().findViewById(R.id.page_images_container);
         leadImagesHandler = new LeadImagesHandler(getActivity(), this, bridge, 
webView, imagesContainer);
-        searchBarHideHandler = getActivity().getSearchBarHideHandler();
+        searchBarHideHandler = ((PageActivity) 
getActivity()).getSearchBarHideHandler();
         searchBarHideHandler.setScrollView(webView);
 
         // TODO: remove this A/B toggle when we know which one we want to keep.
         // (and when ready to release to production)
         if (BottomContentHandler.useNewBottomContent(app)) {
             bottomContentHandler = new BottomContentHandler(this, bridge, 
webView, linkHandler,
-                                   (ViewGroup) parentFragment.getView()
-                                   
.findViewById(R.id.bottom_content_container), title);
+                    (ViewGroup) 
getView().findViewById(R.id.bottom_content_container));
         } else {
             bottomContentHandler = new BottomContentHandlerOld(this, bridge, 
webView, linkHandler,
-                                   (ViewGroup) parentFragment.getView()
-                                   
.findViewById(R.id.bottom_content_container), title);
+                    (ViewGroup) 
getView().findViewById(R.id.bottom_content_container));
         }
-
-        if (tocHandler == null) {
-            tocHandler = new ToCHandler(getActivity(),
-                    tocDrawer,
-                    bridge,
-                    title.getSite(),
-                    isFirstPage());
-        }
-
-        loadPageFromCache();
     }
 
-    private void loadPageFromCache() {
-        getActivity().updateProgressBar(true, true, 0);
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        ((ActionBarActivity)getActivity()).getSupportActionBar().setTitle("");
+    }
+
+    public void displayNewPage(PageTitle title, HistoryEntry entry) {
+        state = STATE_NO_FETCH;
+        subState = SUBSTATE_NONE;
+
+        this.title = title;
+        this.curEntry = entry;
+        titleOriginal = title;
+        savedPagesFunnel = 
app.getFunnelManager().getSavedPagesFunnel(title.getSite());
+
+        //save any section-specific link target from the title, since the 
title may be
+        //replaced (normalized)
+        sectionTargetFromTitle = title.getFragment();
+
+        Utils.setupDirectionality(title.getSite().getLanguage(), 
Locale.getDefault().getLanguage(),
+                                  bridge);
+
+        bottomContentHandler.setTitle(title);
+
         //is this page in cache??
         app.getPageCache().get(titleOriginal, new PageCache.CacheGetListener() 
{
             @Override
@@ -448,7 +424,7 @@
                 if (page != null) {
                     Log.d(TAG, "Using page from cache: " + 
titleOriginal.getDisplayText());
                     PageViewFragmentInternal.this.page = page;
-                    title = page.getTitle();
+                    PageViewFragmentInternal.this.title = page.getTitle();
                     state = STATE_COMPLETE_FETCH;
                     // don't re-cache the page after loading.
                     cacheOnComplete = false;
@@ -476,8 +452,7 @@
     }
 
     private boolean isFirstPage() {
-        return parentFragment.getFragmentManager().getBackStackEntryCount() == 0
-                && !webView.canGoBack();
+        return getFragmentManager().getBackStackEntryCount() == 0 && 
!webView.canGoBack();
     }
 
     public Bitmap getLeadImageBitmap() {
@@ -539,7 +514,7 @@
                     return;
                 }
                 // Do any other stuff that should happen upon page load 
completion...
-                getActivity().updateProgressBar(false, true, 0);
+                ((PageActivity) getActivity()).updateProgressBar(false, true, 
0);
 
                 // trigger layout of the bottom content
                 // Check to see if the page title has changed (e.g. due to 
following a redirect),
@@ -585,8 +560,9 @@
     }
 
     public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
+        super.onActivityResult(requestCode, resultCode, data);
         if (requestCode == PageActivity.ACTIVITY_REQUEST_EDIT_SECTION
-                && resultCode == EditHandler.RESULT_REFRESH_PAGE) {
+            && resultCode == EditHandler.RESULT_REFRESH_PAGE) {
             //Retrieve section ID from intent, and find correct section, so 
where know where to scroll to
             sectionTargetFromIntent = 
data.getIntExtra(EditSectionActivity.EXTRA_SECTION_ID, 0);
             //reset our scroll offset, since we have a section scroll target
@@ -606,12 +582,13 @@
         }
         switch (forState) {
             case STATE_NO_FETCH:
-                getActivity().updateProgressBar(true, true, 0);
+                ((PageActivity) getActivity()).updateProgressBar(true, true, 
0);
                 bridge.sendMessage("clearContents", new JSONObject());
 
                 // hide the lead image...
                 leadImagesHandler.hide();
-                getActivity().getSearchBarHideHandler().setFadeEnabled(false);
+                bottomContentHandler.hide();
+                ((PageActivity) 
getActivity()).getSearchBarHideHandler().setFadeEnabled(false);
 
                 if (curEntry.getSource() == HistoryEntry.SOURCE_SAVED_PAGE) {
                     loadSavedPage();
@@ -659,7 +636,7 @@
 
         // FIXME: Move this out into a PageComplete event of sorts
         if (state == STATE_COMPLETE_FETCH) {
-            tocHandler.setupToC(page);
+            tocHandler.setupToC(page, title.getSite(), isFirstPage());
 
             //add the page to cache!
             if (cacheOnComplete) {
@@ -675,11 +652,21 @@
                     }
                 });
             }
-
         }
     }
 
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        if (!isAdded() || ((PageActivity)getActivity()).isSearching()) {
+            return;
+        }
+        inflater.inflate(R.menu.menu_page_actions, menu);
+    }
+
     public void onPrepareOptionsMenu(Menu menu) {
+        super.onPrepareOptionsMenu(menu);
+        if (!isAdded() || ((PageActivity)getActivity()).isSearching()) {
+            return;
+        }
         MenuItem savePageMenu = menu.findItem(R.id.menu_save_page);
         if (savePageMenu == null) {
             return;
@@ -691,24 +678,24 @@
         MenuItem themeChooserMenu = menu.findItem(R.id.menu_themechooser);
 
         switch (state) {
-            case PageViewFragmentInternal.STATE_NO_FETCH:
-            case PageViewFragmentInternal.STATE_INITIAL_FETCH:
+            case STATE_NO_FETCH:
+            case STATE_INITIAL_FETCH:
                 savePageMenu.setEnabled(false);
                 shareMenu.setEnabled(false);
                 otherLangMenu.setEnabled(false);
                 findInPageMenu.setEnabled(false);
                 themeChooserMenu.setEnabled(false);
                 break;
-            case PageViewFragmentInternal.STATE_COMPLETE_FETCH:
+            case STATE_COMPLETE_FETCH:
                 savePageMenu.setEnabled(true);
                 shareMenu.setEnabled(true);
                 otherLangMenu.setEnabled(true);
                 findInPageMenu.setEnabled(true);
                 themeChooserMenu.setEnabled(true);
-                if (subState == PageViewFragmentInternal.SUBSTATE_PAGE_SAVED) {
+                if (subState == SUBSTATE_PAGE_SAVED) {
                     savePageMenu.setEnabled(false);
                     
savePageMenu.setTitle(WikipediaApp.getInstance().getString(R.string.menu_page_saved));
-                } else if (subState == 
PageViewFragmentInternal.SUBSTATE_SAVED_PAGE_LOADED) {
+                } else if (subState == SUBSTATE_SAVED_PAGE_LOADED) {
                     
savePageMenu.setTitle(WikipediaApp.getInstance().getString(R.string.menu_refresh_saved_page));
                 } else {
                     
savePageMenu.setTitle(WikipediaApp.getInstance().getString(R.string.menu_save_page));
@@ -740,7 +727,7 @@
                 }
                 return true;
             case R.id.menu_share_page:
-                getActivity().share(title);
+                ((PageActivity) getActivity()).share(title);
                 return true;
             case R.id.menu_other_languages:
                 Intent langIntent = new Intent();
@@ -753,15 +740,15 @@
                 showFindInPage();
                 return true;
             case R.id.menu_themechooser:
-                getActivity().showThemeChooser();
+                ((PageActivity) getActivity()).showThemeChooser();
                 return true;
             default:
-                return false;
+                return super.onOptionsItemSelected(item);
         }
     }
 
     public void showFindInPage() {
-        final PageActivity pageActivity = getActivity();
+        final PageActivity pageActivity = ((PageActivity) getActivity());
         final FindInPageActionProvider findInPageActionProvider = new 
FindInPageActionProvider(pageActivity);
 
         pageActivity.startSupportActionMode(new ActionMode.Callback() {
@@ -986,7 +973,7 @@
         }
         // in any case, make sure the TOC drawer is closed
         tocDrawer.closeDrawers();
-        getActivity().updateProgressBar(false, true, 0);
+        ((PageActivity) getActivity()).updateProgressBar(false, true, 0);
         refreshView.setRefreshing(false);
 
         if (caught instanceof SectionsFetchException) {
diff --git a/wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java 
b/wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java
index 8526603..2df4878 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/ToCHandler.java
@@ -39,14 +39,9 @@
     private final CommunicationBridge bridge;
     private final DisableableDrawerLayout slidingPane;
     private final TextView headerView;
-    private final ToCInteractionFunnel funnel;
     private final ActionBarActivity parentActivity;
+    private ToCInteractionFunnel funnel;
 
-    /**
-     * We don't want to open the ToC drawer on the first page loaded 
automatically
-     * so the back button sends users back to the previous activity.
-     */
-    private final boolean firstPage;
     /**
      * Flag to track if the drawer is closing because a link was clicked.
      * Used to make sure that we don't track closes that are caused by
@@ -56,13 +51,10 @@
     private boolean openedViaSwipe = true;
 
     public ToCHandler(final ActionBarActivity activity, final 
DisableableDrawerLayout slidingPane,
-                      final CommunicationBridge bridge, final Site site, 
boolean firstPage) {
+                      final CommunicationBridge bridge) {
         this.parentActivity = activity;
         this.bridge = bridge;
         this.slidingPane = slidingPane;
-        this.firstPage = firstPage;
-
-        funnel = new 
ToCInteractionFunnel((WikipediaApp)slidingPane.getContext().getApplicationContext(),
 site);
 
         this.tocList = (ListView) slidingPane.findViewById(R.id.page_toc_list);
         this.tocProgress = (ProgressBar) 
slidingPane.findViewById(R.id.page_toc_in_progress);
@@ -193,7 +185,9 @@
         }
     }
 
-    public void setupToC(final Page page) {
+    public void setupToC(final Page page, Site site, boolean firstPage) {
+        funnel = new 
ToCInteractionFunnel((WikipediaApp)slidingPane.getContext().getApplicationContext(),
 site);
+
         tocProgress.setVisibility(View.GONE);
         tocList.setVisibility(View.VISIBLE);
 
diff --git 
a/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
 
b/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
index c4ebd80..f55caba 100644
--- 
a/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
+++ 
b/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
@@ -46,7 +46,6 @@
     private final CommunicationBridge bridge;
     private final WebView webView;
     private final LinkHandler linkHandler;
-    private PageTitle pageTitle;
     private final PageActivity activity;
     private final WikipediaApp app;
     private float displayDensity;
@@ -62,18 +61,18 @@
     private ImageView imagePlaceholder;
     private ImageViewWithFace image1;
 
+    private PageTitle pageTitle;
     private SuggestedPagesFunnel funnel;
     private SearchResults readMoreItems;
 
     public BottomContentHandler(PageViewFragmentInternal parent, 
CommunicationBridge bridge,
                                 ObservableWebView webview, LinkHandler 
linkHandler,
-                                ViewGroup hidingView, final PageTitle 
pageTitle) {
+                                ViewGroup hidingView) {
         this.parentFragment = parent;
         this.bridge = bridge;
         this.webView = webview;
         this.linkHandler = linkHandler;
-        this.pageTitle = pageTitle;
-        activity = parentFragment.getActivity();
+        activity = ((PageActivity) parentFragment.getActivity());
         app = (WikipediaApp) activity.getApplicationContext();
         displayDensity = activity.getResources().getDisplayMetrics().density;
 
@@ -89,8 +88,6 @@
         imagePlaceholder = (ImageView) 
bottomContentContainer.findViewById(R.id.read_next_image_placeholder);
         image1 = (ImageViewWithFace) 
bottomContentContainer.findViewById(R.id.read_next_image_1);
         image1.setOnImageLoadListener(this);
-
-        funnel = new SuggestedPagesFunnel(app, pageTitle.getSite(), 1);
 
         webview.addOnClickListener(new ObservableWebView.OnClickListener() {
             @Override
@@ -309,6 +306,7 @@
 
     public void setTitle(PageTitle newTitle) {
         pageTitle = newTitle;
+        funnel = new SuggestedPagesFunnel(app, pageTitle.getSite(), 1);
     }
 
     private void setupReadNextSection(final SearchResults results) {
diff --git 
a/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandlerOld.java
 
b/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandlerOld.java
index 1240370..a7f6dcd 100644
--- 
a/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandlerOld.java
+++ 
b/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandlerOld.java
@@ -64,14 +64,13 @@
 
     public BottomContentHandlerOld(PageViewFragmentInternal parentFragment,
                                    CommunicationBridge bridge, 
ObservableWebView webview,
-                                   LinkHandler linkHandler, ViewGroup 
hidingView,
-                                   PageTitle pageTitle) {
+                                   LinkHandler linkHandler, ViewGroup 
hidingView) {
         this.parentFragment = parentFragment;
         this.bridge = bridge;
         this.webView = webview;
         this.linkHandler = linkHandler;
         this.pageTitle = pageTitle;
-        activity = parentFragment.getActivity();
+        activity = (PageActivity) parentFragment.getActivity();
         app = (WikipediaApp) activity.getApplicationContext();
         displayDensity = activity.getResources().getDisplayMetrics().density;
 
@@ -135,8 +134,6 @@
                 return false;
             }
         });
-
-        funnel = new SuggestedPagesFunnel(app, pageTitle.getSite(), 0);
 
         // preload the display density, since it will be used in a lot of 
places
         displayDensity = activity.getResources().getDisplayMetrics().density;
@@ -333,6 +330,7 @@
 
     public void setTitle(PageTitle newTitle) {
         pageTitle = newTitle;
+        funnel = new SuggestedPagesFunnel(app, pageTitle.getSite(), 0);
     }
 
     private void setupReadMoreSection(LayoutInflater layoutInflater, final 
SearchResults results) {
diff --git 
a/wikipedia/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java 
b/wikipedia/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
index 8c69402..e85f244 100644
--- 
a/wikipedia/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
+++ 
b/wikipedia/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
@@ -108,7 +108,7 @@
     }
 
     public LeadImagesHandler(final Context context, final 
PageViewFragmentInternal parentFragment,
-                             CommunicationBridge bridge, final 
ObservableWebView webview,
+                             CommunicationBridge bridge, ObservableWebView 
webview,
                              ViewGroup hidingView) {
         this.context = context;
         this.parentFragment = parentFragment;
@@ -142,7 +142,7 @@
             public void onClick(float x, float y) {
                 // if the click event is within the area of the lead image, 
then the user
                 // must have wanted to click on the lead image!
-                if (leadImagesEnabled && y < imageContainer.getHeight() - 
webview.getScrollY()) {
+                if (leadImagesEnabled && y < imageContainer.getHeight() - 
webView.getScrollY()) {
                     String imageName = 
parentFragment.getPage().getPageProperties()
                                                      .getLeadImageName();
                     if (imageName != null) {
@@ -436,6 +436,8 @@
             // hide the lead image
             image1.setVisibility(View.GONE);
             imagePlaceholder.setVisibility(View.GONE);
+            pageTitleText.setVisibility(View.VISIBLE);
+            pageDescriptionText.setVisibility(View.INVISIBLE);
             // set the color of the title
             pageTitleText.setTextColor(context.getResources()
                     
.getColor(Utils.getThemedAttributeId(parentFragment.getActivity(),
@@ -463,7 +465,8 @@
             // prepare the lead image to be populated
             image1.setVisibility(View.INVISIBLE);
             imagePlaceholder.setVisibility(View.VISIBLE);
-
+            pageTitleText.setVisibility(View.VISIBLE);
+            pageDescriptionText.setVisibility(View.INVISIBLE);
             // set the color of the title
             
pageTitleText.setTextColor(context.getResources().getColor(R.color.lead_text_color));
             final int bottomPaddingNominal = 16;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I40ac4c6f1a0351e7fec7b462d5b950c12fd09122
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>

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

Reply via email to