Dbrant has uploaded a new change for review.

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

Change subject: Rip out MainActivity.
......................................................................

Rip out MainActivity.

This removes the old MainActivity, and delegates any of its remaining
references to either PageActivity or OverhaulActivity.

In the next patch, we'll rename OverhaulActivity to MainActivity and
remove any other "overhaul" designations.

And in the patch after that, we'll start solidifying which types of
intents will be sent to which activity.

Bug: T143441
Change-Id: Ibb6003b6bcca2fe4298df3c8e2e7e578fa2de2d8
---
M app/src/androidTest/java/org/wikipedia/page/BasePageLoadTest.java
M app/src/androidTest/java/org/wikipedia/test/TranslationTests.java
M app/src/dev/AndroidManifest.xml
M app/src/main/AndroidManifest.xml
D app/src/main/java/org/wikipedia/MainActivity.java
D app/src/main/java/org/wikipedia/MainActivityToolbarCoordinator.java
D app/src/main/java/org/wikipedia/page/NavDrawerHelper.java
M app/src/main/java/org/wikipedia/page/PageActivity.java
M app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java
D app/src/main/java/org/wikipedia/random/RandomArticleIdTask.java
D app/src/main/java/org/wikipedia/random/RandomHandler.java
M app/src/main/java/org/wikipedia/util/FeedbackUtil.java
M app/src/main/java/org/wikipedia/widgets/WidgetProviderSearch.java
13 files changed, 21 insertions(+), 1,996 deletions(-)


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

diff --git a/app/src/androidTest/java/org/wikipedia/page/BasePageLoadTest.java 
b/app/src/androidTest/java/org/wikipedia/page/BasePageLoadTest.java
index b2eb659..9dfa851 100644
--- a/app/src/androidTest/java/org/wikipedia/page/BasePageLoadTest.java
+++ b/app/src/androidTest/java/org/wikipedia/page/BasePageLoadTest.java
@@ -15,7 +15,6 @@
 import org.junit.Rule;
 import org.junit.runner.RunWith;
 import org.wikipedia.Site;
-import org.wikipedia.MainActivity;
 import org.wikipedia.history.HistoryEntry;
 import org.wikipedia.page.tabs.TabsProvider;
 
@@ -27,7 +26,7 @@
 
     @Rule
     @NonNull
-    public final ActivityTestRule<MainActivity> activityRule = new 
ActivityTestRule<>(MainActivity.class);
+    public final ActivityTestRule<PageActivity> activityRule = new 
ActivityTestRule<>(PageActivity.class);
 
     protected void loadPageSync(String title) {
         loadPage(title);
@@ -89,7 +88,7 @@
         InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable);
     }
 
-    protected MainActivity getActivity() {
+    protected PageActivity getActivity() {
         return activityRule.getActivity();
     }
 
diff --git a/app/src/androidTest/java/org/wikipedia/test/TranslationTests.java 
b/app/src/androidTest/java/org/wikipedia/test/TranslationTests.java
index 1f60266..436865f 100644
--- a/app/src/androidTest/java/org/wikipedia/test/TranslationTests.java
+++ b/app/src/androidTest/java/org/wikipedia/test/TranslationTests.java
@@ -8,8 +8,8 @@
 import android.util.Log;
 //import org.wikimedia.wikipedia.test.R;
 import org.wikipedia.R;
-import org.wikipedia.MainActivity;
 import org.wikipedia.model.BaseModel;
+import org.wikipedia.page.PageActivity;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
@@ -25,17 +25,17 @@
  *
  * TODO: check content_license_html is valid HTML
  */
-public class TranslationTests extends 
ActivityInstrumentationTestCase2<MainActivity> {
+public class TranslationTests extends 
ActivityInstrumentationTestCase2<PageActivity> {
     private static final String TAG = "TrTest";
 
     /** Add more if needed, but then also add some tests. */
     private static final String[] POSSIBLE_PARAMS = new String[] {"%s", 
"%1$s", "%2$s", "%d", "%.2f"};
 
-    private MainActivity activity;
+    private PageActivity activity;
     private final StringBuilder mismatches = new StringBuilder();
 
     public TranslationTests() {
-        super(MainActivity.class);
+        super(PageActivity.class);
     }
 
     @Override
diff --git a/app/src/dev/AndroidManifest.xml b/app/src/dev/AndroidManifest.xml
index 9ec8b19..bfa4828 100644
--- a/app/src/dev/AndroidManifest.xml
+++ b/app/src/dev/AndroidManifest.xml
@@ -1,25 +1,7 @@
 <manifest
-    xmlns:android="http://schemas.android.com/apk/res/android";
-    xmlns:tools="http://schemas.android.com/tools";>
+    xmlns:android="http://schemas.android.com/apk/res/android";>
 
     <!-- For recording OEM preload channel ID prior to app upgrades. -->
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" 
/>
 
-    <application>
-        <activity
-            android:name="org.wikipedia.overhaul.OverhaulActivity"
-            android:theme="@style/OverhaulTheme">
-            <intent-filter >
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-        <activity android:name="org.wikipedia.MainActivity">
-            <intent-filter tools:node="remove">
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
 </manifest>
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7865961..0092c03 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -54,7 +54,7 @@
         <meta-data android:name="net.hockeyapp.android.appIdentifier"
             android:value="@string/hockeyapp_app_id" />
 
-        <activity android:name=".MainActivity"
+        <activity android:name=".overhaul.OverhaulActivity"
                   android:theme="@style/PageTheme"
                   android:windowSoftInputMode="stateHidden"
                   android:configChanges="orientation|screenSize"
diff --git a/app/src/main/java/org/wikipedia/MainActivity.java 
b/app/src/main/java/org/wikipedia/MainActivity.java
deleted file mode 100644
index f9ea641..0000000
--- a/app/src/main/java/org/wikipedia/MainActivity.java
+++ /dev/null
@@ -1,1508 +0,0 @@
-package org.wikipedia;
-
-import android.annotation.TargetApi;
-import android.app.SearchManager;
-import android.appwidget.AppWidgetManager;
-import android.content.ActivityNotFoundException;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.graphics.Bitmap;
-import android.location.Location;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.speech.RecognizerIntent;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
-import android.support.design.widget.BottomSheetDialog;
-import android.support.design.widget.BottomSheetDialogFragment;
-import android.support.design.widget.NavigationView;
-import android.support.design.widget.Snackbar;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.preference.PreferenceManager;
-import android.support.v7.view.ActionMode;
-import android.support.v7.widget.Toolbar;
-import android.text.Html;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.squareup.otto.Bus;
-import com.squareup.otto.Subscribe;
-
-import net.hockeyapp.android.metrics.MetricsManager;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.wikipedia.activity.ActivityUtil;
-import org.wikipedia.activity.ThemedActionBarActivity;
-import org.wikipedia.analytics.GalleryFunnel;
-import org.wikipedia.analytics.IntentFunnel;
-import org.wikipedia.analytics.LinkPreviewFunnel;
-import org.wikipedia.analytics.WikipediaZeroUsageFunnel;
-import org.wikipedia.events.ChangeTextSizeEvent;
-import org.wikipedia.events.ThemeChangeEvent;
-import org.wikipedia.events.WikipediaZeroStateChangeEvent;
-import org.wikipedia.feed.FeedFragment;
-import org.wikipedia.feed.image.FeaturedImage;
-import org.wikipedia.feed.image.FeaturedImageCard;
-import org.wikipedia.feed.news.NewsItemCard;
-import org.wikipedia.history.HistoryEntry;
-import org.wikipedia.history.HistoryFragment;
-import org.wikipedia.interlanguage.LangLinksActivity;
-import org.wikipedia.login.LoginActivity;
-import org.wikipedia.nearby.NearbyFragment;
-import org.wikipedia.news.NewsActivity;
-import org.wikipedia.page.ExclusiveBottomSheetPresenter;
-import org.wikipedia.page.NavDrawerHelper;
-import org.wikipedia.page.PageFragment;
-import org.wikipedia.page.PageLoadCallbacks;
-import org.wikipedia.page.PageLoadStrategy;
-import org.wikipedia.page.PageTitle;
-import org.wikipedia.page.gallery.GalleryActivity;
-import org.wikipedia.page.gallery.ImagePipelineBitmapGetter;
-import org.wikipedia.page.gallery.MediaDownloadReceiver;
-import org.wikipedia.page.linkpreview.LinkPreviewDialog;
-import org.wikipedia.page.snippet.CompatActionMode;
-import org.wikipedia.page.tabs.TabsProvider;
-import org.wikipedia.random.RandomHandler;
-import org.wikipedia.readinglist.AddToReadingListDialog;
-import org.wikipedia.readinglist.ReadingListsFragment;
-import org.wikipedia.recurring.RecurringTasksExecutor;
-import org.wikipedia.search.MainSearchBarHideHandler;
-import org.wikipedia.search.SearchArticlesFragment;
-import org.wikipedia.search.SearchBarHideHandler;
-import org.wikipedia.search.SearchResultsFragment;
-import org.wikipedia.settings.Prefs;
-import org.wikipedia.settings.SettingsActivity;
-import org.wikipedia.staticdata.MainPageNameData;
-import org.wikipedia.page.tabs.TabsProvider.TabPosition;
-import org.wikipedia.theme.ThemeChooserDialog;
-import org.wikipedia.tooltip.ToolTipUtil;
-import org.wikipedia.useroption.sync.UserOptionContentResolver;
-import org.wikipedia.util.ClipboardUtil;
-import org.wikipedia.util.DateUtil;
-import org.wikipedia.util.DeviceUtil;
-import org.wikipedia.util.FeedbackUtil;
-import org.wikipedia.util.PermissionUtil;
-import org.wikipedia.util.ShareUtil;
-import org.wikipedia.util.log.L;
-import org.wikipedia.views.WikiDrawerLayout;
-import org.wikipedia.widgets.WidgetProviderFeaturedPage;
-import org.wikipedia.wiktionary.WiktionaryDialog;
-import org.wikipedia.zero.ZeroConfig;
-
-import java.io.File;
-import java.util.concurrent.TimeUnit;
-
-import static org.wikipedia.util.DeviceUtil.isBackKeyUp;
-import static 
org.wikipedia.util.PermissionUtil.hasWriteExternalStoragePermission;
-import static 
org.wikipedia.util.PermissionUtil.requestWriteStorageRuntimePermissions;
-import static org.wikipedia.util.UriUtil.visitInExternalBrowser;
-
-public class MainActivity extends ThemedActionBarActivity implements 
PageFragment.Callback,
-        FeedFragment.Callback, NearbyFragment.Callback, 
HistoryFragment.Callback,
-        ReadingListsFragment.Callback, LinkPreviewDialog.Callback, 
SearchArticlesFragment.Callback,
-        SearchResultsFragment.Callback, AddToReadingListDialog.Callback, 
WiktionaryDialog.Callback {
-    public static final String ACTION_PAGE_FOR_TITLE = 
"org.wikipedia.page_for_title";
-    public static final String EXTRA_PAGETITLE = "org.wikipedia.pagetitle";
-    public static final String EXTRA_HISTORYENTRY  = 
"org.wikipedia.history.historyentry";
-    public static final String EXTRA_SEARCH_FROM_WIDGET = "searchFromWidget";
-    public static final String EXTRA_FEATURED_ARTICLE_FROM_WIDGET = 
"featuredArticleFromWidget";
-
-    private static final String LANGUAGE_CODE_BUNDLE_KEY = "language";
-    private static final String PLAIN_TEXT_MIME_TYPE = "text/plain";
-
-    private Bus bus;
-    private EventBusMethods busMethods;
-    private WikipediaApp app;
-    private View fragmentContainerView;
-    private View tabsContainerView;
-    private WikiDrawerLayout drawerLayout;
-    private Menu navMenu;
-    private SearchArticlesFragment searchFragment;
-    private TextView searchHintText;
-    private ProgressBar progressBar;
-    private View toolbarContainer;
-    private CompatActionMode currentActionMode;
-    private ActionBarDrawerToggle mDrawerToggle;
-    private SearchBarHideHandler searchBarHideHandler;
-    private boolean isZeroEnabled;
-    private ZeroConfig currentZeroConfig;
-    private RandomHandler randomHandler;
-    private NavDrawerHelper navDrawerHelper;
-    private boolean navItemSelected;
-    private WikipediaZeroUsageFunnel zeroFunnel;
-    private ExclusiveBottomSheetPresenter bottomSheetPresenter = new 
ExclusiveBottomSheetPresenter(this.getSupportFragmentManager());
-    private MainActivityToolbarCoordinator toolbarCoordinator;
-    @Nullable private PageLoadCallbacks pageLoadCallbacks;
-
-    // The permissions request API doesn't take a callback, so in the event we 
have to
-    // ask for permission to download a featured image from the feed, we'll 
have to hold
-    // the image we're waiting for permission to download as a bit of state 
here. :(
-    @Nullable private FeaturedImage pendingDownloadImage;
-
-    private DialogInterface.OnDismissListener listDialogDismissListener = new 
DialogInterface.OnDismissListener() {
-        @Override
-        public void onDismiss(DialogInterface dialogInterface) {
-            if (getCurPageFragment() != null) {
-                getCurPageFragment().updateBookmark();
-            }
-        }
-    };
-
-    public View getContentView() {
-        return fragmentContainerView;
-    }
-
-    public ActionBarDrawerToggle getDrawerToggle() {
-        return mDrawerToggle;
-    }
-
-    public Menu getNavMenu() {
-        return navMenu;
-    }
-
-    public RandomHandler getRandomHandler() {
-        return randomHandler;
-    }
-
-    /**
-     * Get the Fragment that is currently at the top of the Activity's 
backstack.
-     * This activity's fragment container will hold multiple fragments stacked 
onto
-     * each other using FragmentManager, and this function will return the 
current
-     * topmost Fragment. It's up to the caller to cast the result to a more 
specific
-     * fragment class, and perform actions on it.
-     * @return Fragment at the top of the backstack.
-     */
-    @Nullable
-    public Fragment getTopFragment() {
-        return 
getSupportFragmentManager().findFragmentById(R.id.content_fragment_container);
-    }
-
-    /**
-     * Get the PageViewFragment that is currently at the top of the Activity's 
backstack.
-     * If the current topmost fragment is not a PageViewFragment, return null.
-     * @return The PageViewFragment at the top of the backstack, or null if 
the current
-     * top fragment is not a PageViewFragment.
-     */
-    @Nullable
-    public PageFragment getCurPageFragment() {
-        Fragment f = getTopFragment();
-        if (f instanceof PageFragment) {
-            return (PageFragment) f;
-        } else {
-            return null;
-        }
-    }
-
-    public void setNavItemSelected(boolean wasSelected) {
-        navItemSelected = wasSelected;
-    }
-
-    private boolean wasNavItemSelected() {
-        return navItemSelected;
-    }
-
-    @Override
-    @TargetApi(17)
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        app = (WikipediaApp) getApplicationContext();
-        MetricsManager.register(app, app);
-        app.checkCrashes(this);
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, 
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-        }
-
-        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
-        setContentView(R.layout.activity_main);
-
-        toolbarContainer = findViewById(R.id.main_toolbar_container);
-        toolbarCoordinator = new MainActivityToolbarCoordinator(this, 
toolbarContainer, (Toolbar) findViewById(R.id.main_toolbar));
-        getSupportFragmentManager()
-                .addOnBackStackChangedListener(new 
FragmentManager.OnBackStackChangedListener() {
-                    @Override
-                    public void onBackStackChanged() {
-                        updateToolbarForFragment();
-                    }
-                });
-
-        busMethods = new EventBusMethods();
-        registerBus();
-
-        fragmentContainerView = findViewById(R.id.content_fragment_container);
-        tabsContainerView = findViewById(R.id.tabs_container);
-        progressBar = (ProgressBar)findViewById(R.id.main_progressbar);
-        progressBar.setMax(Constants.PROGRESS_BAR_MAX_VALUE);
-        updateProgressBar(false, true, 0);
-
-        drawerLayout = (WikiDrawerLayout) findViewById(R.id.drawer_layout);
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
-            drawerLayout.setDrawerShadow(R.drawable.nav_drawer_shadow, 
GravityCompat.START);
-        }
-        NavigationView navDrawer = (NavigationView) 
findViewById(R.id.navdrawer);
-        navMenu = navDrawer.getMenu();
-        navDrawerHelper = new NavDrawerHelper(this, 
navDrawer.getHeaderView(0));
-        
navDrawer.setNavigationItemSelectedListener(navDrawerHelper.getNewListener());
-
-        randomHandler = navDrawerHelper.getNewRandomHandler();
-
-        searchFragment = (SearchArticlesFragment) 
getSupportFragmentManager().findFragmentById(R.id.search_fragment);
-        searchHintText = (TextView) findViewById(R.id.main_search_bar_text);
-        searchHintText.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                
searchFragment.setInvokeSource(SearchArticlesFragment.InvokeSource.TOOLBAR);
-                searchFragment.openSearch();
-            }
-        });
-
-        mDrawerToggle = new MainDrawerToggle(
-                this,                  /* host Activity */
-                drawerLayout,          /* DrawerLayout object */
-                R.string.app_name,     /* "open drawer" description */
-                R.string.app_name      /* "close drawer" description */
-        );
-
-        // Set the drawer toggle as the DrawerListener
-        drawerLayout.setDrawerListener(mDrawerToggle);
-        drawerLayout.setDragEdgeWidth(
-                
getResources().getDimensionPixelSize(R.dimen.drawer_drag_margin));
-        getSupportActionBar().setTitle("");
-
-        searchBarHideHandler = new MainSearchBarHideHandler(this, 
toolbarContainer);
-
-        boolean languageChanged = false;
-
-        zeroFunnel = app.getWikipediaZeroHandler().getZeroFunnel();
-        if (savedInstanceState != null) {
-            isZeroEnabled = 
savedInstanceState.getBoolean("pausedZeroEnabledState");
-            currentZeroConfig = 
savedInstanceState.getParcelable("pausedZeroConfig");
-            if (savedInstanceState.getBoolean("isSearching")) {
-                searchFragment.openSearch();
-            }
-            String language = 
savedInstanceState.getString(LANGUAGE_CODE_BUNDLE_KEY);
-            languageChanged = 
!app.getAppOrSystemLanguageCode().equals(language);
-
-            // Note: when system language is enabled, and the system language 
is changed outside of
-            // the app, MRU languages are not updated. There's no harm in 
doing that here but since
-            // the user didin't choose that language in app, it may be 
unexpected.
-        }
-        searchHintText.setText(getString(isZeroEnabled ? 
R.string.zero_search_hint : R.string.search_hint));
-
-        if (languageChanged) {
-            app.resetSite();
-            loadMainPageInForegroundTab();
-        }
-
-        if (savedInstanceState == null) {
-            // if there's no savedInstanceState, and we're not coming back 
from a Theme change,
-            // then we must have been launched with an Intent, so... handle it!
-            handleIntent(getIntent());
-        }
-
-        // Conditionally execute all recurring tasks
-        new RecurringTasksExecutor(app).run();
-
-        UserOptionContentResolver.requestManualSync();
-    }
-
-    private void finishActionMode() {
-        currentActionMode.finish();
-    }
-
-    private void nullifyActionMode() {
-        currentActionMode = null;
-    }
-
-    private class MainDrawerToggle extends ActionBarDrawerToggle {
-        private boolean oncePerSlideLock = false;
-
-        MainDrawerToggle(android.app.Activity activity,
-                         android.support.v4.widget.DrawerLayout drawerLayout,
-                         int openDrawerContentDescRes, int 
closeDrawerContentDescRes) {
-            super(activity, drawerLayout, openDrawerContentDescRes, 
closeDrawerContentDescRes);
-        }
-
-        @Override
-        public void onDrawerClosed(View view) {
-            super.onDrawerClosed(view);
-            // if we want to change the title upon closing:
-            //getSupportActionBar().setTitle("");
-            if (!wasNavItemSelected()) {
-                navDrawerHelper.getFunnel().logCancel();
-            }
-            navDrawerHelper.clearTempExplicitHighlight();
-            setNavItemSelected(false);
-        }
-
-        @Override
-        public void onDrawerOpened(View drawerView) {
-            super.onDrawerOpened(drawerView);
-            // if we want to change the title upon opening:
-            //getSupportActionBar().setTitle("");
-            // If we're in the search state, then get out of it.
-            if (isSearching()) {
-                searchFragment.closeSearch();
-            }
-            // also make sure we're not inside an action mode
-            if (isCabOpen()) {
-                finishActionMode();
-            }
-            updateNavDrawerSelection(getTopFragment());
-            navDrawerHelper.getFunnel().logOpen();
-        }
-
-        @Override
-        public void onDrawerSlide(View drawerView, float slideOffset) {
-            super.onDrawerSlide(drawerView, 0);
-            if (!oncePerSlideLock) {
-                // Hide the keyboard when the drawer is opened
-                hideSoftKeyboard();
-                //also make sure ToC is hidden
-                if (getCurPageFragment() != null) {
-                    
getCurPageFragment().toggleToC(PageFragment.TOC_ACTION_HIDE);
-                }
-                //and make sure to update dynamic items and highlights
-                navDrawerHelper.setupDynamicNavDrawerItems();
-                oncePerSlideLock = true;
-            }
-            // and make sure the Toolbar is showing
-            showToolbar();
-        }
-
-        @Override
-        public void onDrawerStateChanged(int newState) {
-            super.onDrawerStateChanged(newState);
-            if (newState == DrawerLayout.STATE_IDLE) {
-                oncePerSlideLock = false;
-            }
-        }
-    }
-
-    public void hideSoftKeyboard() {
-        DeviceUtil.hideSoftKeyboard(this);
-    }
-
-    @Override
-    protected void onPostCreate(Bundle savedInstanceState) {
-        super.onPostCreate(savedInstanceState);
-        // Sync the toggle state after onRestoreInstanceState has occurred.
-        mDrawerToggle.syncState();
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        mDrawerToggle.onConfigurationChanged(newConfig);
-    }
-
-    // Note: this method is invoked even when in CAB mode.
-    @Override
-    public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
-        return isBackKeyUp(event) && ToolTipUtil.dismissToolTip(this)
-                || super.dispatchKeyEvent(event);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        // Pass the event to ActionBarDrawerToggle, if it returns
-        // true, then it has handled the app icon touch event
-        if (mDrawerToggle.onOptionsItemSelected(item)) {
-            return true;
-        }
-        // Handle other action bar items...
-        return ActivityUtil.defaultOnOptionsItemSelected(this, item)
-                || super.onOptionsItemSelected(item);
-    }
-
-    @Override
-    public boolean onSearchRequested() {
-        showToolbar();
-        searchFragment.openSearch();
-        return true;
-    }
-
-    public void setSearchMode(boolean enabled) {
-        // invalidate our ActionBar, so that all action items are removed, and
-        // we can fill up the whole width of the ActionBar with our SearchView.
-        supportInvalidateOptionsMenu();
-        toolbarCoordinator.setSearchMode(enabled);
-        searchBarHideHandler.setForceNoFade(enabled);
-        getDrawerToggle().setDrawerIndicatorEnabled(!enabled);
-    }
-
-    public void showToolbar() {
-        ViewAnimations.ensureTranslationY(toolbarContainer, 0);
-    }
-
-    public void setNavMenuItemRandomEnabled(boolean enabled) {
-        navMenu.findItem(R.id.nav_item_random).setEnabled(enabled);
-    }
-
-    /** @return True if the contextual action bar is open. */
-    public boolean isCabOpen() {
-        return currentActionMode != null;
-    }
-
-    @NonNull
-    public static Intent newIntent(@NonNull Context context,
-                                   @NonNull HistoryEntry entry,
-                                   @NonNull PageTitle title) {
-        return new Intent(MainActivity.ACTION_PAGE_FOR_TITLE)
-                .setClass(context, MainActivity.class)
-                .putExtra(MainActivity.EXTRA_HISTORYENTRY, entry)
-                .putExtra(MainActivity.EXTRA_PAGETITLE, title);
-    }
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        setIntent(intent);
-        handleIntent(intent);
-    }
-
-    private void handleIntent(Intent intent) {
-        if (Intent.ACTION_VIEW.equals(intent.getAction()) && intent.getData() 
!= null) {
-            Site site = new Site(intent.getData().getAuthority());
-            PageTitle title = site.titleForUri(intent.getData());
-            HistoryEntry historyEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_EXTERNAL_LINK);
-            loadPageInForegroundTab(title, historyEntry);
-        } else if (ACTION_PAGE_FOR_TITLE.equals(intent.getAction())) {
-            PageTitle title = intent.getParcelableExtra(EXTRA_PAGETITLE);
-            HistoryEntry historyEntry = 
intent.getParcelableExtra(EXTRA_HISTORYENTRY);
-            loadPage(title, historyEntry);
-        } else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
-            String query = intent.getStringExtra(SearchManager.QUERY);
-            PageTitle title = new PageTitle(query, app.getSite());
-            HistoryEntry historyEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_SEARCH);
-            loadPageInForegroundTab(title, historyEntry);
-        } else if (Intent.ACTION_SEND.equals(intent.getAction())
-                && PLAIN_TEXT_MIME_TYPE.equals(intent.getType())) {
-            new IntentFunnel(app).logShareIntent();
-            handleShareIntent(intent);
-        } else if (Intent.ACTION_PROCESS_TEXT.equals(intent.getAction())
-                && PLAIN_TEXT_MIME_TYPE.equals(intent.getType())) {
-            new IntentFunnel(app).logProcessTextIntent();
-            handleProcessTextIntent(intent);
-        } else if (intent.hasExtra(EXTRA_SEARCH_FROM_WIDGET)) {
-            new IntentFunnel(app).logSearchWidgetTap();
-            openSearchFromIntent(null, 
SearchArticlesFragment.InvokeSource.WIDGET);
-        } else if (intent.hasExtra(EXTRA_FEATURED_ARTICLE_FROM_WIDGET)) {
-            new IntentFunnel(app).logFeaturedArticleWidgetTap();
-            loadMainPageInForegroundTab();
-        } else if (TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis() - 
Prefs.pageLastShown()) == 0) {
-            loadMainPageIfNoTabs();
-        } else {
-            showFeed();
-        }
-    }
-
-    private void handleShareIntent(Intent intent) {
-        String text = intent.getStringExtra(Intent.EXTRA_TEXT);
-        openSearchFromIntent(text == null ? null : text.trim(),
-                SearchArticlesFragment.InvokeSource.INTENT_SHARE);
-    }
-
-    @TargetApi(Build.VERSION_CODES.M)
-    private void handleProcessTextIntent(Intent intent) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
-            return;
-        }
-        String text = intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT);
-        openSearchFromIntent(text == null ? null : text.trim(),
-                SearchArticlesFragment.InvokeSource.INTENT_PROCESS_TEXT);
-    }
-
-    private void openSearchFromIntent(@Nullable final CharSequence query,
-                                      final 
SearchArticlesFragment.InvokeSource source) {
-        fragmentContainerView.post(new Runnable() {
-            @Override
-            public void run() {
-                searchFragment.setInvokeSource(source);
-                searchFragment.openSearch();
-                if (query != null) {
-                    searchFragment.setSearchText(query);
-                }
-            }
-        });
-    }
-
-    /**
-     * Update the state of the main progress bar that is shown inside the 
ActionBar of the activity.
-     * @param visible Whether the progress bar is visible.
-     * @param indeterminate Whether the progress bar is indeterminate.
-     * @param value Value of the progress bar (may be between 0 and 10000). 
Ignored if the
-     *              progress bar is indeterminate.
-     */
-    public void updateProgressBar(boolean visible, boolean indeterminate, int 
value) {
-        progressBar.setIndeterminate(indeterminate);
-        if (!indeterminate) {
-            progressBar.setProgress(value);
-        }
-        progressBar.setVisibility(visible ? View.VISIBLE : View.GONE);
-    }
-
-    /**
-     * Returns whether we're currently in a "searching" state (i.e. the search 
fragment is shown).
-     * @return True if currently searching, false otherwise.
-     */
-    public boolean isSearching() {
-        return searchFragment != null && searchFragment.isSearchActive();
-    }
-
-    public void closeNavDrawer() {
-        drawerLayout.closeDrawer(GravityCompat.START);
-    }
-
-    public void showFeed() {
-        if (getTopFragment() instanceof FeedFragment) {
-            ((FeedFragment) getTopFragment()).scrollToTop();
-        } else {
-
-            popTopFragmentsExcept(FeedFragment.class);
-            pushFragment(FeedFragment.newInstance());
-        }
-    }
-
-    /**
-     * Add a new fragment to the top of the activity's backstack.
-     * @param f New fragment to place on top.
-     */
-    public void pushFragment(Fragment f) {
-        pushFragment(f, false);
-    }
-
-    /**
-     * Add a new fragment to the top of the activity's backstack, and 
optionally  allow state loss.
-     * Useful for cases where we might push a fragment from an AsyncTask 
result.
-     * @param f New fragment to place on top.
-     * @param allowStateLoss Whether to allow state loss.
-     */
-    public void pushFragment(Fragment f, boolean allowStateLoss) {
-        beforeFragmentChanged();
-        // if the new fragment is the same class as the current topmost 
fragment,
-        // 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())) {
-            return;
-        }
-
-        popTopFragmentsExcept(FeedFragment.class, PageFragment.class);
-        if (getTopFragment() == null || (getTopFragment().getClass() != 
f.getClass())) {
-            FragmentTransaction trans = 
getSupportFragmentManager().beginTransaction();
-            trans.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, 
R.anim.fade_in, R.anim.fade_out);
-            trans.add(R.id.content_fragment_container, f);
-            trans.addToBackStack(null);
-            if (allowStateLoss) {
-                trans.commitAllowingStateLoss();
-            } else {
-                trans.commit();
-            }
-        }
-        afterFragmentChanged();
-    }
-
-    public void resetAfterClearHistory() {
-        Prefs.clearTabs();
-        showFeed();
-    }
-
-    private void beforeFragmentChanged() {
-        closeNavDrawer();
-        searchBarHideHandler.setForceNoFade(false);
-        searchBarHideHandler.setFadeEnabled(false);
-    }
-
-    private void afterFragmentChanged() {
-        //make sure the ActionBar is visible
-        showToolbar();
-        //also make sure the progress bar is not showing
-        updateProgressBar(false, true, 0);
-    }
-
-    private void updateToolbarForFragment() {
-        if (getTopFragment() instanceof MainActivityToolbarProvider) {
-            
toolbarCoordinator.setOverrideToolbar(((MainActivityToolbarProvider) 
getTopFragment()).getToolbar());
-        } else {
-            toolbarCoordinator.removeOverrideToolbar();
-        }
-    }
-
-    /**
-     * Load a new page, and put it on top of the backstack.
-     * @param title Title of the page to load.
-     * @param entry HistoryEntry associated with this page.
-     */
-    public void loadPage(PageTitle title, HistoryEntry entry) {
-        loadPage(title, entry, TabPosition.CURRENT_TAB, false);
-    }
-
-    public void loadPage(PageTitle title,
-                         HistoryEntry entry,
-                         TabPosition position,
-                         boolean allowStateLoss) {
-        loadPage(title, entry, position, allowStateLoss, false);
-    }
-
-    /**
-     * Load a new page, and put it on top of the backstack, optionally 
allowing state loss of the
-     * fragment manager. Useful for when this function is called from an 
AsyncTask result.
-     * @param title Title of the page to load.
-     * @param entry HistoryEntry associated with this page.
-     * @param position Whether to open this page in the current tab, a new 
background tab, or new
-     *                 foreground tab.
-     * @param allowStateLoss Whether to allow state loss.
-     * @param mustBeEmpty If true, and a tab exists already, do nothing.
-     */
-    @TargetApi(17)
-    public void loadPage(final PageTitle title,
-                         final HistoryEntry entry,
-                         final TabPosition position,
-                         boolean allowStateLoss,
-                         final boolean mustBeEmpty) {
-        if (isDestroyed()) {
-            return;
-        }
-
-        if (entry.getSource() != HistoryEntry.SOURCE_INTERNAL_LINK || 
!app.isLinkPreviewEnabled()) {
-            new LinkPreviewFunnel(app, entry.getSource()).logNavigate();
-        }
-
-        // Close the link preview, if one is open.
-        hideLinkPreview();
-
-        app.putCrashReportProperty("api", title.getSite().authority());
-        app.putCrashReportProperty("title", title.toString());
-
-        if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
-            closeNavDrawer();
-        }
-        if (title.isSpecial()) {
-            visitInExternalBrowser(this, Uri.parse(title.getMobileUri()));
-            return;
-        }
-
-        pushFragment(new PageFragment(), allowStateLoss);
-
-        fragmentContainerView.post(new Runnable() {
-            @Override
-            public void run() {
-                PageFragment frag = getCurPageFragment();
-                if (frag == null) {
-                    return;
-                }
-                //is the new title the same as what's already being displayed?
-                if (position == TabPosition.CURRENT_TAB
-                        && !frag.getCurrentTab().getBackStack().isEmpty()
-                        && frag.getCurrentTab().getBackStack()
-                        .get(frag.getCurrentTab().getBackStack().size() - 
1).getTitle()
-                        .equals(title) || mustBeEmpty && 
!frag.getCurrentTab().getBackStack().isEmpty()) {
-                    //if we have a section to scroll to, then pass it to the 
fragment
-                    if (!TextUtils.isEmpty(title.getFragment())) {
-                        frag.scrollToSection(title.getFragment());
-                    }
-                    return;
-                }
-                frag.closeFindInPage();
-                if (position == TabPosition.CURRENT_TAB) {
-                    frag.loadPage(title, entry, 
PageLoadStrategy.Cache.FALLBACK, true);
-                } else if (position == TabPosition.NEW_TAB_BACKGROUND) {
-                    frag.openInNewBackgroundTabFromMenu(title, entry);
-                } else {
-                    frag.openInNewForegroundTabFromMenu(title, entry);
-                }
-                app.getSessionFunnel().pageViewed(entry);
-            }
-        });
-    }
-
-    public void loadPageInForegroundTab(PageTitle title, HistoryEntry entry) {
-        loadPage(title, entry, TabPosition.NEW_TAB_FOREGROUND, false);
-    }
-
-    public void loadMainPageInForegroundTab() {
-        loadMainPage(true, TabPosition.NEW_TAB_FOREGROUND, false);
-    }
-
-    /**
-     * Go directly to the Main Page of the current Wiki, optionally allowing 
state loss of the
-     * fragment manager. Useful for when this function is called from an 
AsyncTask result.
-     * @param allowStateLoss Allows the {@link 
android.support.v4.app.FragmentManager} commit to be
-     *                       executed after an activity's state is saved.  
This is dangerous because
-     *                       the commit can be lost if the activity needs to 
later be restored from
-     *                       its state, so this should only be used for cases 
where it is okay for
-     *                       the UI state to change unexpectedly on the user.
-     * @param mustBeEmpty If true, and a tab exists already, do nothing.
-     */
-    public void loadMainPage(boolean allowStateLoss, TabPosition position, 
boolean mustBeEmpty) {
-        PageTitle title = new 
PageTitle(MainPageNameData.valueFor(app.getAppOrSystemLanguageCode()), 
app.getSite());
-        HistoryEntry historyEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_MAIN_PAGE);
-        loadPage(title, historyEntry, position, allowStateLoss, mustBeEmpty);
-    }
-
-    @TargetApi(17)
-    private void showTabList() {
-        if (isDestroyed()) {
-            return;
-        }
-        pushFragment(new PageFragment());
-        fragmentContainerView.post(new Runnable() {
-            @Override
-            public void run() {
-                PageFragment frag = getCurPageFragment();
-                if (frag != null) {
-                    frag.showTabList();
-                }
-            }
-        });
-    }
-
-    public void showLinkPreview(PageTitle title, int entrySource) {
-        showLinkPreview(title, entrySource, null);
-    }
-
-    public void showLinkPreview(PageTitle title, int entrySource, @Nullable 
Location location) {
-        bottomSheetPresenter.show(LinkPreviewDialog.newInstance(title, 
entrySource, location));
-    }
-
-    @Override public void onLoading() {
-        updateProgressBar(true, true, 0);
-    }
-
-    @Override public void onLoaded() {
-        updateProgressBar(false, true, 0);
-    }
-
-    @Override public void onLoadPage(PageTitle title, int entrySource, 
@Nullable Location location) {
-        showLinkPreview(title, entrySource, location);
-    }
-
-    @Override public void onLoadPage(PageTitle title, HistoryEntry entry) {
-        loadPage(title, entry);
-    }
-
-    @Override public void onClearHistory() {
-        resetAfterClearHistory();
-    }
-
-    @Override public boolean isMenuAllowed() {
-        return !isSearching();
-    }
-
-    private void hideLinkPreview() {
-        bottomSheetPresenter.dismiss();
-    }
-
-    public void showAddToListDialog(PageTitle title, 
AddToReadingListDialog.InvokeSource source) {
-        FeedbackUtil.showAddToListDialog(title, source, bottomSheetPresenter, 
listDialogDismissListener);
-    }
-
-    @Override
-    public void showReadingListAddedMessage(@NonNull String message, final 
boolean isOnboarding) {
-        Snackbar snackbar = FeedbackUtil.makeSnackbar(fragmentContainerView, 
message,
-                FeedbackUtil.LENGTH_DEFAULT);
-        snackbar.setAction(R.string.reading_list_added_view_button, new 
View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (isOnboarding) {
-                    
navDrawerHelper.setTempExplicitHighlight(ReadingListsFragment.class);
-                    drawerLayout.openDrawer(GravityCompat.START);
-                } else {
-                    pushFragment(ReadingListsFragment.newInstance());
-                }
-            }
-        });
-        snackbar.show();
-    }
-
-    // Note: back button first handled in {@link #onOptionsItemSelected()};
-    @Override
-    public void onBackPressed() {
-        if (ToolTipUtil.dismissToolTip(this)) {
-            return;
-        }
-        if (isCabOpen()) {
-            finishActionMode();
-            return;
-        }
-        if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
-            closeNavDrawer();
-            return;
-        }
-        if (searchFragment.onBackPressed()) {
-            if (searchFragment.isLaunchedFromIntent()) {
-                finish();
-            }
-            return;
-        }
-        app.getSessionFunnel().backPressed();
-        if (getTopFragment() instanceof BackPressedHandler
-                && ((BackPressedHandler) getTopFragment()).onBackPressed()) {
-            return;
-        }
-        popFragment();
-    }
-
-    @Override
-    public void onPagePopFragment() {
-        popFragment();
-    }
-
-    @Override
-    public void onFeedTabListRequested() {
-        showTabList();
-    }
-
-    @Override
-    public void onFeedSearchRequested() {
-        
searchFragment.setInvokeSource(SearchArticlesFragment.InvokeSource.FEED_BAR);
-        onSearchRequested();
-    }
-
-    @Override
-    public void onFeedVoiceSearchRequested() {
-        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
-        try {
-            startActivityForResult(intent, 
Constants.ACTIVITY_REQUEST_VOICE_SEARCH);
-        } catch (ActivityNotFoundException a) {
-            FeedbackUtil.showMessage(this, 
R.string.error_voice_search_not_available);
-        }
-    }
-
-    @Override
-    public void onFeedSelectPage(HistoryEntry entry) {
-        loadPage(entry.getTitle(), entry);
-    }
-
-    @Override
-    public void onFeedAddPageToList(HistoryEntry entry) {
-        showAddToListDialog(entry.getTitle(), 
AddToReadingListDialog.InvokeSource.FEED);
-    }
-
-    @Override
-    public void onFeedSharePage(HistoryEntry entry) {
-        ShareUtil.shareText(this, entry.getTitle());
-    }
-
-    @Override
-    public void onFeedNewsItemSelected(NewsItemCard card) {
-        startActivity(NewsActivity.newIntent(app, card.item(), card.site()));
-    }
-
-    @Override
-    public void onFeedShareImage(final FeaturedImageCard card) {
-        final String thumbUrl = 
card.baseImage().thumbnail().source().toString();
-        final String fullSizeUrl = 
card.baseImage().image().source().toString();
-        new ImagePipelineBitmapGetter(this, thumbUrl) {
-            @Override
-            public void onSuccess(@Nullable Bitmap bitmap) {
-                if (bitmap != null) {
-                    ShareUtil.shareImage(MainActivity.this,
-                            bitmap,
-                            new File(thumbUrl).getName(),
-                            
getString(R.string.feed_featured_image_share_subject) + " | "
-                                    + 
DateUtil.getFeedCardDateString(card.date().baseCalendar()),
-                            fullSizeUrl);
-                } else {
-                    FeedbackUtil.showMessage(MainActivity.this, 
getString(R.string.gallery_share_error, card.baseImage().title()));
-                }
-            }
-        }.get();
-    }
-
-    @Override
-    public void onFeaturedImageSelected(@NonNull FeaturedImageCard card) {
-        GalleryActivity.showGallery(this, card.baseImage(), card.filename(), 
card.site(),
-                GalleryFunnel.SOURCE_FEED_FEATURED_IMAGE);
-    }
-
-    @Override
-    public void onFeedDownloadImage(@NonNull FeaturedImage image) {
-        if (!(hasWriteExternalStoragePermission(this))) {
-            setPendingDownload(image);
-            requestWriteExternalStoragePermission();
-        } else {
-            download(image);
-        }
-    }
-
-    @Override
-    public void onPageShowBottomSheet(@NonNull BottomSheetDialog dialog) {
-        bottomSheetPresenter.show(dialog);
-    }
-
-    @Override
-    public void onPageShowBottomSheet(@NonNull BottomSheetDialogFragment 
dialog) {
-        bottomSheetPresenter.show(dialog);
-    }
-
-    @Override
-    public void onPageDismissBottomSheet() {
-        bottomSheetPresenter.dismiss();
-    }
-
-    @Nullable
-    @Override
-    public SearchBarHideHandler onPageGetSearchBarHideHandler() {
-        return searchBarHideHandler;
-    }
-
-    @Override
-    public void onPageLoadPage(@NonNull PageTitle title, @NonNull HistoryEntry 
entry) {
-        loadPage(title, entry);
-    }
-
-    @Override
-    public void onPageShowLinkPreview(@NonNull PageTitle title, int source) {
-        showLinkPreview(title, source);
-    }
-
-    @Override
-    public void onPageLoadMainPageInForegroundTab() {
-        loadMainPageInForegroundTab();
-    }
-
-    @Override
-    public void onPageUpdateProgressBar(boolean visible, boolean 
indeterminate, int value) {
-        updateProgressBar(visible, indeterminate, value);
-    }
-
-    @Override
-    public boolean onPageIsSearching() {
-        return isSearching();
-    }
-
-    @Nullable
-    @Override
-    public Fragment onPageGetTopFragment() {
-        return getTopFragment();
-    }
-
-    @Override
-    public void onPageShowThemeChooser() {
-        bottomSheetPresenter.show(new ThemeChooserDialog());
-    }
-
-    @Nullable
-    @Override
-    public ActionMode onPageStartSupportActionMode(@NonNull 
ActionMode.Callback callback) {
-        return startSupportActionMode(callback);
-    }
-
-    @Override
-    public void onPageShowToolbar() {
-        showToolbar();
-    }
-
-    @Override
-    public void onPageHideSoftKeyboard() {
-        hideSoftKeyboard();
-    }
-
-    @Nullable
-    @Override
-    public PageLoadCallbacks onPageGetPageLoadCallbacks() {
-        return pageLoadCallbacks;
-    }
-
-    @Override
-    public void onPageLoadPage(@NonNull PageTitle title, @NonNull HistoryEntry 
entry,
-                               @NonNull TabPosition tabPosition) {
-        loadPage(title, entry, tabPosition, false);
-    }
-
-    @Override
-    public void onPageAddToReadingList(@NonNull PageTitle title,
-                                @NonNull AddToReadingListDialog.InvokeSource 
source) {
-        showAddToListDialog(title, source);
-    }
-
-    @Nullable
-    @Override
-    public View onPageGetContentView() {
-        return getContentView();
-    }
-
-    @Nullable
-    @Override
-    public View onPageGetTabsContainerView() {
-        return tabsContainerView;
-    }
-
-    @Override
-    public void onPageUpdateNavDrawerSelection(@NonNull Fragment fragment) {
-        updateNavDrawerSelection(fragment);
-    }
-
-    @Override
-    public void onPageInvalidateOptionsMenu() {
-        supportInvalidateOptionsMenu();
-    }
-
-    @Override
-    public void onPageSearchRequested() {
-    }
-
-    @Override
-    public void onSearchSelectPage(@NonNull HistoryEntry entry, boolean 
inNewTab) {
-        loadPage(entry.getTitle(), entry, inNewTab ? 
TabsProvider.TabPosition.NEW_TAB_BACKGROUND
-                : TabsProvider.TabPosition.CURRENT_TAB, false);
-    }
-
-    @Override
-    public void onSearchOpen() {
-        setSearchMode(true);
-    }
-
-    @Override
-    public void onSearchClose() {
-        setSearchMode(false);
-        hideSoftKeyboard();
-    }
-
-    @Override
-    public View getSearchToolbarView() {
-        return toolbarContainer;
-    }
-
-    @Override
-    public void onSearchResultAddToList(@NonNull PageTitle title, @NonNull 
AddToReadingListDialog.InvokeSource source) {
-        showAddToListDialog(title, source);
-    }
-
-    @Override
-    public void onSearchResultShareLink(@NonNull PageTitle title) {
-        ShareUtil.shareText(this, title);
-    }
-
-    @Override
-    public void onSearchProgressBar(boolean enabled) {
-        updateProgressBar(enabled, true, 0);
-    }
-
-    @Override
-    public void onLinkPreviewLoadPage(@NonNull PageTitle title, @NonNull 
HistoryEntry entry, boolean inNewTab) {
-        loadPage(title, entry, inNewTab ? TabPosition.NEW_TAB_BACKGROUND : 
TabPosition.CURRENT_TAB, false);
-    }
-
-    @Override
-    public void onLinkPreviewCopyLink(@NonNull PageTitle title) {
-        copyLink(title.getCanonicalUri());
-        showCopySuccessMessage();
-    }
-
-    @Override
-    public void onLinkPreviewAddToList(@NonNull PageTitle title) {
-        showAddToListDialog(title, 
AddToReadingListDialog.InvokeSource.LINK_PREVIEW_MENU);
-    }
-
-    @Override
-    public void onLinkPreviewShareLink(@NonNull PageTitle title) {
-        ShareUtil.shareText(this, title);
-    }
-
-    @Override
-    public void onSearchResultCopyLink(@NonNull PageTitle title) {
-        copyLink(title.getCanonicalUri());
-        showCopySuccessMessage();
-    }
-
-    @Override
-    public void wiktionaryShowDialogForTerm(@NonNull String term) {
-        if (getCurPageFragment() != null) {
-            
getCurPageFragment().getShareHandler().showWiktionaryDefinition(term);
-        }
-    }
-
-    private void copyLink(@NonNull String url) {
-        ClipboardUtil.setPlainText(this, null, url);
-    }
-
-    private void showCopySuccessMessage() {
-        FeedbackUtil.showMessage(this, R.string.address_copied);
-    }
-
-    @Nullable
-    @Override
-    public AppCompatActivity getActivity() {
-        return this;
-    }
-
-    private void popFragment() {
-        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
-            beforeFragmentChanged();
-            getSupportFragmentManager().popBackStackImmediate();
-            afterFragmentChanged();
-            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
-                return;
-            }
-        }
-        finish();
-    }
-
-    private void download(@NonNull FeaturedImage image) {
-        setPendingDownload(null);
-        new MediaDownloadReceiver(MainActivity.this).download(image);
-    }
-
-    private void requestWriteExternalStoragePermission() {
-        requestWriteStorageRuntimePermissions(this,
-                Constants.ACTIVITY_REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION);
-    }
-
-    private void loadMainPageIfNoTabs() {
-        loadMainPage(false, TabPosition.CURRENT_TAB, true);
-    }
-
-    private class EventBusMethods {
-        @Subscribe
-        public void onChangeTextSize(ChangeTextSizeEvent event) {
-            if (getCurPageFragment() != null && 
getCurPageFragment().getWebView() != null) {
-                getCurPageFragment().updateFontSize();
-            }
-        }
-
-        @Subscribe
-        public void onChangeTheme(ThemeChangeEvent event) {
-            MainActivity.this.recreate();
-        }
-
-        @Subscribe
-        public void 
onWikipediaZeroStateChangeEvent(WikipediaZeroStateChangeEvent event) {
-            boolean latestZeroEnabledState = 
app.getWikipediaZeroHandler().isZeroEnabled();
-            ZeroConfig latestZeroConfig = 
app.getWikipediaZeroHandler().getZeroConfig();
-
-            if (leftZeroRatedNetwork(latestZeroEnabledState)) {
-                
app.getWikipediaZeroHandler().showZeroOffBanner(MainActivity.this,
-                        getString(R.string.zero_charged_verbiage),
-                        ContextCompat.getColor(MainActivity.this, 
R.color.foundation_red),
-                        ContextCompat.getColor(MainActivity.this, 
android.R.color.white));
-                navDrawerHelper.setupDynamicNavDrawerItems();
-            }
-
-            if (enteredNewZeroRatedNetwork(latestZeroConfig, 
latestZeroEnabledState)) {
-                
app.getWikipediaZeroHandler().showZeroBanner(MainActivity.this, 
latestZeroConfig);
-                if (Prefs.isShowZeroInfoDialogEnabled()) {
-                    showZeroInfoDialog(latestZeroConfig);
-                    Prefs.setShowZeroInfoDialogEnable(false);
-                }
-                navDrawerHelper.setupDynamicNavDrawerItems();
-            }
-
-            isZeroEnabled = latestZeroEnabledState;
-            currentZeroConfig = latestZeroConfig;
-            searchHintText.setText(getString(
-                    latestZeroEnabledState
-                            ? R.string.zero_search_hint
-                            : R.string.search_hint));
-        }
-    }
-
-    private void showZeroInfoDialog(ZeroConfig zeroConfig) {
-        AlertDialog.Builder alert = new AlertDialog.Builder(this)
-                .setMessage(buildZeroDialogMessage(zeroConfig.getMessage(), 
getString(R.string.zero_learn_more)))
-                
.setPositiveButton(getString(R.string.zero_learn_more_learn_more), 
getZeroMoreInfoListener())
-                
.setNegativeButton(getString(R.string.zero_learn_more_dismiss), 
getDismissClickListener());
-        AlertDialog dialog = alert.create();
-        dialog.show();
-    }
-
-    private CharSequence buildZeroDialogMessage(String title, String warning) {
-        return Html.fromHtml("<b>" + title + "</b><br/><br/>" + warning);
-    }
-
-    private DialogInterface.OnClickListener getZeroMoreInfoListener() {
-        return new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int id) {
-                visitInExternalBrowser(MainActivity.this, 
(Uri.parse(getString(R.string.zero_webpage_url))));
-                zeroFunnel.logExtLinkMore();
-            }
-        };
-    }
-
-    private DialogInterface.OnClickListener getDismissClickListener() {
-        return new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int id) {
-                dialog.dismiss();
-            }
-        };
-    }
-
-    private boolean leftZeroRatedNetwork(boolean newZeroEnabledState) {
-        return !newZeroEnabledState && isZeroEnabled;
-    }
-
-    private boolean enteredNewZeroRatedNetwork(ZeroConfig newZeroConfig, 
boolean newZeroEnabledState) {
-        return newZeroEnabledState && (!isZeroEnabled || 
zeroConfigChanged(newZeroConfig));
-    }
-
-    private boolean zeroConfigChanged(ZeroConfig newConfig) {
-        return !currentZeroConfig.equals(newConfig);
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        app.resetSite();
-        app.getSessionFunnel().touchSession();
-        boolean latestWikipediaZeroDisposition = 
app.getWikipediaZeroHandler().isZeroEnabled();
-        if (isZeroEnabled && !latestWikipediaZeroDisposition) {
-            bus.post(new WikipediaZeroStateChangeEvent());
-        }
-        navDrawerHelper.setupDynamicNavDrawerItems();
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        isZeroEnabled = app.getWikipediaZeroHandler().isZeroEnabled();
-        currentZeroConfig = app.getWikipediaZeroHandler().getZeroConfig();
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        saveState(outState);
-    }
-
-    public void updateNavDrawerSelection(Fragment fragment) {
-        navDrawerHelper.updateItemSelection(fragment);
-    }
-
-    private void saveState(Bundle outState) {
-        outState.putBoolean("pausedZeroEnabledState", isZeroEnabled);
-        outState.putParcelable("pausedZeroConfig", currentZeroConfig);
-        outState.putBoolean("isSearching", isSearching());
-        outState.putString(LANGUAGE_CODE_BUNDLE_KEY, 
app.getAppOrSystemLanguageCode());
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, final Intent 
data) {
-        if (settingsActivityRequested(requestCode)) {
-            handleSettingsActivityResult(resultCode);
-        } else if (loginActivityRequested(requestCode)) {
-            handleLoginActivityResult(resultCode);
-        } else if (newArticleLanguageSelected(requestCode, resultCode) || 
galleryFilePageSelected(requestCode, resultCode)) {
-            handleLangLinkOrFilePageResult(data);
-        } else if (voiceSearchRequested(requestCode)) {
-            handleVoiceSearchResult(resultCode, data);
-        } else {
-            super.onActivityResult(requestCode, resultCode, data);
-        }
-    }
-
-    private void handleLangLinkOrFilePageResult(final Intent data) {
-        fragmentContainerView.post(new Runnable() {
-            @Override
-            public void run() {
-                handleIntent(data);
-            }
-        });
-    }
-
-    @Override
-    protected void onStop() {
-        app.getSessionFunnel().persistSession();
-        super.onStop();
-    }
-
-    @Override
-    public void onDestroy() {
-        unregisterBus();
-        super.onDestroy();
-    }
-
-    /**
-     * ActionMode that is invoked when the user long-presses inside the 
WebView.
-     * @param mode ActionMode under which this context is starting.
-     */
-    @Override
-    public void onSupportActionModeStarted(ActionMode mode) {
-        if (!isCabOpen()) {
-            conditionallyInjectCustomCabMenu(mode);
-        }
-        freezeToolbar();
-        super.onSupportActionModeStarted(mode);
-    }
-
-    @Override
-    public void onSupportActionModeFinished(ActionMode mode) {
-        super.onSupportActionModeFinished(mode);
-        nullifyActionMode();
-        searchBarHideHandler.setForceNoFade(false);
-    }
-
-    @Override
-    public void onActionModeStarted(android.view.ActionMode mode) {
-        if (!isCabOpen()) {
-            conditionallyInjectCustomCabMenu(mode);
-        }
-        freezeToolbar();
-        super.onActionModeStarted(mode);
-    }
-
-    @Override
-    public void onActionModeFinished(android.view.ActionMode mode) {
-        super.onActionModeFinished(mode);
-        nullifyActionMode();
-        searchBarHideHandler.setForceNoFade(false);
-    }
-
-    @Override
-    public void onRequestPermissionsResult(int requestCode,
-                                           @NonNull String[] permissions,
-                                           @NonNull int[] grantResults) {
-        switch (requestCode) {
-            case Constants.ACTIVITY_REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION:
-                if (PermissionUtil.isPermitted(grantResults)) {
-                    if (pendingDownloadImage != null) {
-                        download(pendingDownloadImage);
-                    }
-                } else {
-                    setPendingDownload(null);
-                    L.i("Write permission was denied by user");
-                    FeedbackUtil.showMessage(this,
-                            
R.string.gallery_save_image_write_permission_rationale);
-                }
-                break;
-            default:
-                super.onRequestPermissionsResult(requestCode, permissions, 
grantResults);
-        }
-    }
-
-    private <T> void conditionallyInjectCustomCabMenu(T mode) {
-        currentActionMode = new CompatActionMode(mode);
-        if (currentActionMode.shouldInjectCustomMenu(MainActivity.this)) {
-            currentActionMode.injectCustomMenu(MainActivity.this);
-        }
-    }
-
-    private void freezeToolbar() {
-        searchBarHideHandler.setForceNoFade(true);
-    }
-
-    private void registerBus() {
-        bus = app.getBus();
-        bus.register(busMethods);
-        L.d("Registered bus.");
-    }
-
-    private void unregisterBus() {
-        bus.unregister(busMethods);
-        bus = null;
-        L.d("Unregistered bus.");
-    }
-
-    private void handleSettingsActivityResult(int resultCode) {
-        if (languageChanged(resultCode)) {
-            loadNewLanguageMainPage();
-        }
-    }
-
-    private boolean settingsActivityRequested(int requestCode) {
-        return requestCode == SettingsActivity.ACTIVITY_REQUEST_SHOW_SETTINGS;
-    }
-
-    private void handleLoginActivityResult(int resultCode) {
-        if (resultCode == LoginActivity.RESULT_LOGIN_SUCCESS) {
-            FeedbackUtil.showMessage(this, R.string.login_success_toast);
-        }
-    }
-
-    private boolean loginActivityRequested(int requestCode) {
-        return requestCode == LoginActivity.REQUEST_LOGIN;
-    }
-
-    private boolean newArticleLanguageSelected(int requestCode, int 
resultCode) {
-        return requestCode == Constants.ACTIVITY_REQUEST_LANGLINKS && 
resultCode == LangLinksActivity.ACTIVITY_RESULT_LANGLINK_SELECT;
-    }
-
-    private boolean galleryFilePageSelected(int requestCode, int resultCode) {
-        return requestCode == Constants.ACTIVITY_REQUEST_GALLERY && resultCode 
== GalleryActivity.ACTIVITY_RESULT_FILEPAGE_SELECT;
-    }
-
-    private boolean languageChanged(int resultCode) {
-        return resultCode == SettingsActivity.ACTIVITY_RESULT_LANGUAGE_CHANGED;
-    }
-
-    private boolean voiceSearchRequested(int requestCode) {
-        return requestCode == Constants.ACTIVITY_REQUEST_VOICE_SEARCH;
-    }
-
-    private void handleVoiceSearchResult(int resultCode, Intent data) {
-        if (resultCode == RESULT_OK && data != null
-                && 
data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) != null) {
-            String searchQuery = 
data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS).get(0);
-            openSearchFromIntent(searchQuery, 
SearchArticlesFragment.InvokeSource.VOICE);
-        }
-    }
-
-    /**
-     * Reload the main page in the new language, after delaying for one second 
in order to:
-     * (1) Make sure that onStart in MainActivity gets called, thus 
registering the activity for the bus.
-     * (2) Ensure a smooth transition, which is very jarring without a delay.
-     */
-    private void loadNewLanguageMainPage() {
-        Handler uiThread = new Handler(Looper.getMainLooper());
-        uiThread.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                loadMainPageInForegroundTab();
-                updateFeaturedPageWidget();
-            }
-        }, DateUtils.SECOND_IN_MILLIS);
-    }
-
-    /**
-     * Update any instances of our Featured Page widget, since it will change 
with the currently selected language.
-     */
-    private void updateFeaturedPageWidget() {
-        Intent widgetIntent = new Intent(this, 
WidgetProviderFeaturedPage.class);
-        widgetIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
-        int[] ids = 
AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(
-                new ComponentName(this, WidgetProviderFeaturedPage.class));
-        widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
-        sendBroadcast(widgetIntent);
-    }
-
-    private void setPendingDownload(@Nullable FeaturedImage image) {
-        pendingDownloadImage = image;
-    }
-
-    private void popTopFragmentsExcept(Class<?>... frags) {
-        while (getSupportFragmentManager().getBackStackEntryCount() > 0
-                && !ArrayUtils.contains(frags, getTopFragment().getClass())) {
-            getSupportFragmentManager().popBackStackImmediate();
-        }
-    }
-
-    @VisibleForTesting
-    public void setPageLoadCallbacks(@Nullable PageLoadCallbacks 
pageLoadCallbacks) {
-        this.pageLoadCallbacks = pageLoadCallbacks;
-    }
-}
diff --git 
a/app/src/main/java/org/wikipedia/MainActivityToolbarCoordinator.java 
b/app/src/main/java/org/wikipedia/MainActivityToolbarCoordinator.java
deleted file mode 100644
index 2fbc083..0000000
--- a/app/src/main/java/org/wikipedia/MainActivityToolbarCoordinator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.wikipedia;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
-import android.view.View;
-
-public class MainActivityToolbarCoordinator {
-    @NonNull private AppCompatActivity activity;
-    @NonNull private View toolbarContainerView;
-    @NonNull private Toolbar defaultToolbar;
-    @Nullable private Toolbar overrideToolbar;
-
-    public MainActivityToolbarCoordinator(@NonNull AppCompatActivity activity,
-                                          @NonNull View toolbarContainerView,
-                                          @NonNull Toolbar defaultToolbar) {
-        this.activity = activity;
-        this.toolbarContainerView = toolbarContainerView;
-        this.defaultToolbar = defaultToolbar;
-        setActivityToolbar(defaultToolbar);
-    }
-
-    public void setOverrideToolbar(@NonNull Toolbar toolbar) {
-        overrideToolbar = toolbar;
-        defaultToolbar.getMenu().clear();
-        toolbarContainerView.setVisibility(View.GONE);
-        setActivityToolbar(overrideToolbar);
-    }
-
-    public void removeOverrideToolbar() {
-        overrideToolbar = null;
-        toolbarContainerView.setVisibility(View.VISIBLE);
-        setActivityToolbar(defaultToolbar);
-    }
-
-    public void setSearchMode(boolean enabled) {
-        if (overrideToolbar != null) {
-            toolbarContainerView.setVisibility(enabled ? View.VISIBLE : 
View.GONE);
-        }
-    }
-
-    private void setActivityToolbar(@Nullable Toolbar toolbar) {
-        activity.setSupportActionBar(toolbar);
-        if (activity.getSupportActionBar() != null) {
-            activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
-            
activity.getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp);
-        }
-    }
-}
diff --git a/app/src/main/java/org/wikipedia/page/NavDrawerHelper.java 
b/app/src/main/java/org/wikipedia/page/NavDrawerHelper.java
deleted file mode 100644
index 09e6e76..0000000
--- a/app/src/main/java/org/wikipedia/page/NavDrawerHelper.java
+++ /dev/null
@@ -1,275 +0,0 @@
-package org.wikipedia.page;
-
-import android.content.Intent;
-import android.net.Uri;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.design.widget.NavigationView;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import org.wikipedia.BuildConfig;
-import org.wikipedia.MainActivity;
-import org.wikipedia.R;
-import org.wikipedia.WikipediaApp;
-import org.wikipedia.analytics.LoginFunnel;
-import org.wikipedia.analytics.NavMenuFunnel;
-import org.wikipedia.feed.FeedFragment;
-import org.wikipedia.history.HistoryEntry;
-import org.wikipedia.history.HistoryFragment;
-import org.wikipedia.login.LoginActivity;
-import org.wikipedia.nearby.NearbyFragment;
-import org.wikipedia.overhaul.OverhaulActivity;
-import org.wikipedia.page.tabs.TabsProvider;
-import org.wikipedia.random.RandomHandler;
-import org.wikipedia.readinglist.ReadingListsFragment;
-import org.wikipedia.settings.SettingsActivity;
-import org.wikipedia.util.FeedbackUtil;
-import org.wikipedia.util.ReleaseUtil;
-import org.wikipedia.util.UriUtil;
-
-public class NavDrawerHelper {
-
-    private final WikipediaApp app = WikipediaApp.getInstance();
-    private final MainActivity activity;
-    private NavMenuFunnel funnel;
-    private TextView accountNameView;
-    private ImageView accountNameArrow;
-    private boolean accountToggle;
-    private boolean isTempExplicitHighlight;
-
-    public NavDrawerHelper(@NonNull MainActivity activity, View 
navDrawerHeader) {
-        this.funnel = new NavMenuFunnel();
-        this.activity = activity;
-        activity.getSupportFragmentManager()
-                .addOnBackStackChangedListener(new 
FragmentManager.OnBackStackChangedListener() {
-                    @Override
-                    public void onBackStackChanged() {
-                        
updateItemSelection(NavDrawerHelper.this.activity.getTopFragment());
-                    }
-                });
-        accountNameView = (TextView) 
navDrawerHeader.findViewById(R.id.nav_account_text);
-        accountNameArrow = (ImageView) 
navDrawerHeader.findViewById(R.id.nav_account_arrow);
-        
setLoginOnClick(navDrawerHeader.findViewById(R.id.nav_account_container));
-        updateMenuGroupToggle();
-    }
-
-    public NavMenuFunnel getFunnel() {
-        return funnel;
-    }
-
-    public void setupDynamicNavDrawerItems() {
-        updateLoginButtonStatus();
-        updateWikipediaZeroStatus();
-        accountToggle = false;
-        updateMenuGroupToggle();
-    }
-
-    public NavigationView.OnNavigationItemSelectedListener getNewListener() {
-        return new NavigationView.OnNavigationItemSelectedListener() {
-            @Override
-            public boolean onNavigationItemSelected(MenuItem menuItem) {
-                switch (menuItem.getItemId()) {
-                    case R.id.nav_item_nav:
-                        launchOverhaulActivity();
-                        break;
-                    case R.id.nav_item_feed:
-                        activity.showFeed();
-                        funnel.logFeed();
-                        break;
-                    case R.id.nav_item_history:
-                        activity.pushFragment(HistoryFragment.newInstance());
-                        funnel.logHistory();
-                        break;
-                    case R.id.nav_item_reading_lists:
-                        
activity.pushFragment(ReadingListsFragment.newInstance());
-                        funnel.logReadingLists();
-                        break;
-                    case R.id.nav_item_nearby:
-                        activity.pushFragment(NearbyFragment.newInstance());
-                        funnel.logNearby();
-                        break;
-                    case R.id.nav_item_more:
-                        launchSettingsActivity();
-                        funnel.logMore();
-                        break;
-                    case R.id.nav_item_logout:
-                        logOut();
-                        break;
-                    case R.id.nav_item_random:
-                        activity.getRandomHandler().doVisitRandomArticle();
-                        activity.closeNavDrawer();
-                        funnel.logRandom();
-                        break;
-                    case R.id.nav_item_donate:
-                        openDonatePage();
-                        break;
-                    default:
-                        return false;
-                }
-                clearItemHighlighting();
-                menuItem.setChecked(true);
-                activity.setNavItemSelected(true);
-                return true;
-            }
-        };
-    }
-
-    public RandomHandler getNewRandomHandler() {
-        return new RandomHandler(activity, new RandomHandler.RandomListener() {
-                    @Override
-                    public void onRandomPageReceived(@Nullable PageTitle 
title) {
-                        HistoryEntry historyEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_RANDOM);
-                        activity.loadPage(title, historyEntry, 
TabsProvider.TabPosition.CURRENT_TAB, true);
-                    }
-
-                    @Override
-                    public void onRandomPageFailed(Throwable caught) {
-                        FeedbackUtil.showError(activity.getContentView(), 
caught);
-                    }
-                });
-    }
-
-    public void updateItemSelection(@Nullable Fragment fragment) {
-        @IdRes Integer id = fragment == null ? null : 
fragmentToMenuId(fragment.getClass());
-        if (id != null && !isTempExplicitHighlight) {
-            setMenuItemSelection(id);
-        }
-    }
-
-    public void setTempExplicitHighlight(Class<? extends Fragment> 
fragmentClass) {
-        @IdRes Integer id = fragmentToMenuId(fragmentClass);
-        if (id != null) {
-            setMenuItemSelection(id);
-        }
-        isTempExplicitHighlight = true;
-    }
-
-    public void clearTempExplicitHighlight() {
-        isTempExplicitHighlight = false;
-    }
-
-    private void setMenuItemSelection(@IdRes int id) {
-        clearItemHighlighting();
-        activity.getNavMenu().findItem(id).setChecked(true);
-    }
-
-    private void toggleAccountMenu() {
-        accountToggle = !accountToggle;
-        updateMenuGroupToggle();
-    }
-
-    private void updateMenuGroupToggle() {
-        activity.getNavMenu().setGroupVisible(R.id.group_main, !accountToggle);
-        activity.getNavMenu().setGroupVisible(R.id.group_user, accountToggle);
-        accountNameArrow.setVisibility(app.getUserInfoStorage().isLoggedIn() ? 
View.VISIBLE : View.INVISIBLE);
-        accountNameArrow.setImageResource(accountToggle ? 
R.drawable.ic_arrow_drop_up_white_24dp
-                : R.drawable.ic_arrow_drop_down_white_24dp);
-
-        if (!ReleaseUtil.isDevRelease()) {
-            
activity.getNavMenu().findItem(R.id.nav_item_nav).setVisible(false);
-        }
-    }
-
-    private void setLoginOnClick(View view) {
-        view.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (app.getUserInfoStorage().isLoggedIn()) {
-                    toggleAccountMenu();
-                } else {
-                    launchLoginActivity();
-                    funnel.logLogin();
-                }
-            }
-        });
-    }
-
-    @Nullable @IdRes private Integer fragmentToMenuId(Class<? extends 
Fragment> fragment) {
-        if (fragment == FeedFragment.class) {
-            return R.id.nav_item_feed;
-        } else if (fragment == HistoryFragment.class) {
-            return R.id.nav_item_history;
-        } else if (fragment == ReadingListsFragment.class) {
-            return R.id.nav_item_reading_lists;
-        } else if (fragment == NearbyFragment.class) {
-            return R.id.nav_item_nearby;
-        }
-        return null;
-    }
-
-    /**
-     * Update login menu item to reflect login status.
-     */
-    private void updateLoginButtonStatus() {
-        if (app.getUserInfoStorage().isLoggedIn()) {
-            
accountNameView.setText(app.getUserInfoStorage().getUser().getUsername());
-        } else {
-            
accountNameView.setText(app.getResources().getString(R.string.nav_item_login));
-        }
-    }
-
-    /**
-     * Add Wikipedia Zero entry to nav menu if W0 is active.
-     */
-    private void updateWikipediaZeroStatus() {
-        MenuItem wikipediaZeroText = 
activity.getNavMenu().findItem(R.id.nav_item_zero);
-        if (app.getWikipediaZeroHandler().isZeroEnabled()) {
-            
wikipediaZeroText.setTitle(app.getWikipediaZeroHandler().getZeroConfig().getMessage());
-            wikipediaZeroText.setVisible(true);
-        } else {
-            wikipediaZeroText.setVisible(false);
-        }
-    }
-
-    /**
-     * Un-highlight all nav menu entries.
-     */
-    private void clearItemHighlighting() {
-        for (int i = 0; i < activity.getNavMenu().size(); i++) {
-            activity.getNavMenu().getItem(i).setChecked(false);
-        }
-    }
-
-    private void launchOverhaulActivity() {
-        startActivity(OverhaulActivity.newIntent(app));
-    }
-
-    private void launchSettingsActivity() {
-        startActivityForResult(SettingsActivity.newIntent(app),
-                SettingsActivity.ACTIVITY_REQUEST_SHOW_SETTINGS);
-    }
-
-    private void launchLoginActivity() {
-        startActivityForResult(LoginActivity.newIntent(app, 
LoginFunnel.SOURCE_NAV),
-                LoginActivity.REQUEST_LOGIN);
-    }
-
-    private void startActivity(@NonNull Intent intent) {
-        activity.closeNavDrawer();
-        activity.startActivity(intent);
-    }
-
-    private void startActivityForResult(@NonNull Intent intent, int reqCode) {
-        activity.closeNavDrawer();
-        activity.startActivityForResult(intent, reqCode);
-    }
-
-    private void logOut() {
-        app.logOut();
-        activity.closeNavDrawer();
-        FeedbackUtil.showMessage(activity, R.string.toast_logout_complete);
-    }
-
-    private void openDonatePage() {
-        activity.closeNavDrawer();
-        UriUtil.visitInExternalBrowser(activity,
-                
Uri.parse(String.format(activity.getString(R.string.donate_url),
-                        BuildConfig.VERSION_NAME, 
app.getSystemLanguageCode())));
-    }
-}
diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.java 
b/app/src/main/java/org/wikipedia/page/PageActivity.java
index 249b631..db5fd4d 100644
--- a/app/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/app/src/main/java/org/wikipedia/page/PageActivity.java
@@ -931,10 +931,9 @@
 
     private <T> void conditionallyInjectCustomCabMenu(T mode) {
         currentActionMode = new CompatActionMode(mode);
-        // TODO: make action modes work
-        //if (currentActionMode.shouldInjectCustomMenu(PageActivity.this)) {
-        //    currentActionMode.injectCustomMenu(PageActivity.this);
-        //}
+        if (currentActionMode.shouldInjectCustomMenu()) {
+            currentActionMode.injectCustomMenu(pageFragment);
+        }
     }
 
     private void freezeToolbar() {
diff --git a/app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java 
b/app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java
index dede9db..e70df23 100644
--- a/app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java
+++ b/app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java
@@ -7,7 +7,7 @@
 import android.webkit.WebView;
 
 import org.wikipedia.R;
-import org.wikipedia.MainActivity;
+import org.wikipedia.page.PageFragment;
 import org.wikipedia.util.log.L;
 
 import static org.wikipedia.views.ViewUtil.getOriginatingView;
@@ -31,13 +31,13 @@
         }
     }
 
-    public boolean shouldInjectCustomMenu(MainActivity activity) {
-        return !isTagged() && isOriginatedByWebViewOnMarshmallow() && 
activity.getCurPageFragment() != null;
+    public boolean shouldInjectCustomMenu() {
+        return !isTagged() && isOriginatedByWebViewOnMarshmallow();
     }
 
-    public void injectCustomMenu(MainActivity activity) {
+    public void injectCustomMenu(PageFragment fragment) {
         replaceTextSelectMenu();
-        activity.getCurPageFragment().onActionModeShown(this);
+        fragment.onActionModeShown(this);
     }
 
     public Menu getMenu() {
diff --git a/app/src/main/java/org/wikipedia/random/RandomArticleIdTask.java 
b/app/src/main/java/org/wikipedia/random/RandomArticleIdTask.java
deleted file mode 100644
index 2e5d73c..0000000
--- a/app/src/main/java/org/wikipedia/random/RandomArticleIdTask.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.wikipedia.random;
-
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.mediawiki.api.json.Api;
-import org.mediawiki.api.json.ApiResult;
-import org.mediawiki.api.json.RequestBuilder;
-import org.wikipedia.ApiTask;
-import org.wikipedia.page.PageTitle;
-import org.wikipedia.Site;
-
-public class RandomArticleIdTask extends ApiTask<PageTitle> {
-    private Site site;
-
-    public RandomArticleIdTask(Api api, Site site) {
-        super(api);
-        this.site = site;
-    }
-
-    @Override
-    public RequestBuilder buildRequest(Api api) {
-        return api.action("query")
-                .param("list", "random")
-                .param("rnnamespace", "0")
-                .param("rnlimit", "1") // maybe we grab 10 in the future and 
persist it somewhere
-                .param("continue", ""); // to avoid warning about new 
continuation syntax
-    }
-
-    @Override
-    public PageTitle processResult(ApiResult result) throws Throwable {
-        JSONArray results = 
result.asObject().optJSONObject("query").optJSONArray("random");
-        JSONObject random = (JSONObject)results.get(0);
-        return new PageTitle(null, random.getString("title"), site);
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/wikipedia/random/RandomHandler.java 
b/app/src/main/java/org/wikipedia/random/RandomHandler.java
deleted file mode 100644
index 2b0df85..0000000
--- a/app/src/main/java/org/wikipedia/random/RandomHandler.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.wikipedia.random;
-
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-
-import org.wikipedia.MainActivity;
-import org.wikipedia.page.PageTitle;
-import org.wikipedia.WikipediaApp;
-
-public class RandomHandler {
-    private WikipediaApp app;
-    private RandomArticleIdTask curRandomArticleIdTask;
-    private static final int MESSAGE_RND = 1;
-
-    private MainActivity activity;
-    private RandomListener listener;
-
-    public interface RandomListener {
-        void onRandomPageReceived(PageTitle title);
-        void onRandomPageFailed(Throwable caught);
-    }
-
-    public RandomHandler(MainActivity activity, RandomListener listener) {
-        this.activity = activity;
-        this.listener = listener;
-        this.app = WikipediaApp.getInstance();
-
-        //set initial state...
-        setProgressBarLoading(false);
-        setNavMenuItemEnabled(true);
-    }
-
-    private void setNavMenuItemEnabled(boolean enabled) {
-        activity.setNavMenuItemRandomEnabled(enabled);
-    }
-
-    private void setProgressBarLoading(boolean loading) {
-        activity.updateProgressBar(loading, true, 0);
-    }
-
-    public void doVisitRandomArticle() {
-        Handler randomHandler = new Handler(new Handler.Callback() {
-            @Override
-            public boolean handleMessage(Message msg) {
-                RandomArticleIdTask randomTask = new 
RandomArticleIdTask(app.getAPIForSite(app.getSite()), app.getSite()) {
-
-                    @Override
-                    public void onBeforeExecute() {
-                        setProgressBarLoading(true);
-                        setNavMenuItemEnabled(false);
-                    }
-
-                    @Override
-                    public void onFinish(PageTitle title) {
-                        setProgressBarLoading(false);
-                        setNavMenuItemEnabled(true);
-                        Log.d("Wikipedia", "Random article title pulled: " + 
title);
-                        listener.onRandomPageReceived(title);
-                    }
-
-                    @Override
-                    public void onCatch(Throwable caught) {
-                        setProgressBarLoading(false);
-                        setNavMenuItemEnabled(true);
-                        Log.d("Wikipedia", "Random article ID retrieval 
failed");
-                        curRandomArticleIdTask = null;
-                        listener.onRandomPageFailed(caught);
-                    }
-                };
-                if (curRandomArticleIdTask != null) {
-                    // if this connection was hung, clean up a bit
-                    curRandomArticleIdTask.cancel();
-                }
-                curRandomArticleIdTask = randomTask;
-                curRandomArticleIdTask.execute();
-                return true;
-            }
-        });
-        randomHandler.removeMessages(MESSAGE_RND);
-        Message randomMessage = Message.obtain();
-        randomMessage.what = MESSAGE_RND;
-        randomMessage.obj = "random";
-        randomHandler.sendMessage(randomMessage);
-    }
-}
diff --git a/app/src/main/java/org/wikipedia/util/FeedbackUtil.java 
b/app/src/main/java/org/wikipedia/util/FeedbackUtil.java
index d9fcaf3..50d0964 100644
--- a/app/src/main/java/org/wikipedia/util/FeedbackUtil.java
+++ b/app/src/main/java/org/wikipedia/util/FeedbackUtil.java
@@ -15,11 +15,11 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import org.wikipedia.MainActivity;
 import org.wikipedia.R;
 import org.wikipedia.analytics.ReadingListsFunnel;
 import org.wikipedia.overhaul.OverhaulActivity;
 import org.wikipedia.page.ExclusiveBottomSheetPresenter;
+import org.wikipedia.page.PageActivity;
 import org.wikipedia.page.PageTitle;
 import org.wikipedia.readinglist.AddToReadingListDialog;
 
@@ -129,8 +129,7 @@
     }
 
     private static View findBestView(Activity activity) {
-        if (activity instanceof MainActivity
-                && ((MainActivity) activity).getCurPageFragment() != null) {
+        if (activity instanceof PageActivity) {
             return activity.findViewById(R.id.page_contents_container);
         } else if (activity instanceof OverhaulActivity) {
             return 
activity.findViewById(R.id.fragment_overhaul_view_pager_container);
diff --git a/app/src/main/java/org/wikipedia/widgets/WidgetProviderSearch.java 
b/app/src/main/java/org/wikipedia/widgets/WidgetProviderSearch.java
index e1e11db..2c69a36 100644
--- a/app/src/main/java/org/wikipedia/widgets/WidgetProviderSearch.java
+++ b/app/src/main/java/org/wikipedia/widgets/WidgetProviderSearch.java
@@ -1,7 +1,7 @@
 package org.wikipedia.widgets;
 
 import org.wikipedia.R;
-import org.wikipedia.MainActivity;
+import org.wikipedia.page.PageActivity;
 
 import android.app.PendingIntent;
 import android.appwidget.AppWidgetManager;
@@ -24,9 +24,9 @@
             RemoteViews remoteViews = new 
RemoteViews(context.getPackageName(), R.layout.widget_search);
 
             // Create a PendingIntent to act as the onClickListener
-            Intent intent = new Intent(context, MainActivity.class);
+            Intent intent = new Intent(context, PageActivity.class);
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            intent.putExtra(MainActivity.EXTRA_SEARCH_FROM_WIDGET, true);
+            intent.putExtra(PageActivity.EXTRA_SEARCH_FROM_WIDGET, true);
             PendingIntent pendingIntent = PendingIntent.getActivity(context, 
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
 
             // If we want to update the widget itself from the click event, 
then do something like this:

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibb6003b6bcca2fe4298df3c8e2e7e578fa2de2d8
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <dbr...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to