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