jenkins-bot has submitted this change and it was merged.

Change subject: Turn other Activities into Fragments
......................................................................


Turn other Activities into Fragments

- Things launched from the Nav menu are now Fragments that replace each
  other in the PageActivity container, and create a backstack in the
  FragmentManager.
- Made full-text search into a Fragment
- Made the PageActivity have a real ActionBar (to be built out in the next
  patch), into which the actions of the fragments are added.
- Made sure that savedInstanceState preserves the order of the fragment
  backstack.
- Login activity to be dealt with in another patch...

Change-Id: If9c2c11014745e75f3dbde86a724d555470c8f61
---
M wikipedia/AndroidManifest.xml
R wikipedia/res/layout/fragment_history.xml
R wikipedia/res/layout/fragment_nearby.xml
R wikipedia/res/layout/fragment_saved_pages.xml
R wikipedia/res/layout/fragment_search_results.xml
M wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java
R wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
R wikipedia/src/main/java/org/wikipedia/nearby/NearbyFragment.java
M wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
M wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
R wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
R wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java
M wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
13 files changed, 284 insertions(+), 249 deletions(-)

Approvals:
  BearND: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/wikipedia/AndroidManifest.xml b/wikipedia/AndroidManifest.xml
index 94b7da9..488eb9f 100644
--- a/wikipedia/AndroidManifest.xml
+++ b/wikipedia/AndroidManifest.xml
@@ -43,7 +43,6 @@
         <!-- Don't delete the meta-data field above -->
 
         <activity android:name=".page.PageActivity"
-                  android:theme="@style/NoTitle"
                   android:windowSoftInputMode="stateHidden"
                   
android:configChanges="orientation|keyboardHidden|keyboard|screenSize"
                 >
@@ -59,29 +58,6 @@
                 <data android:host="*.wikipedia.org" 
android:pathPrefix="/wiki/" android:scheme="http" />
                 <data android:host="*.wikipedia.org" 
android:pathPrefix="/wiki/" android:scheme="https" />
             </intent-filter>
-        </activity>
-        <activity
-                android:name=".history.HistoryActivity"
-                android:label="@string/history_activity_title"
-                
android:configChanges="orientation|keyboardHidden|keyboard|screenSize"
-                android:windowSoftInputMode="stateHidden|adjustResize"
-                >
-        </activity>
-
-        <activity
-                android:name=".savedpages.SavedPagesActivity"
-                android:label="@string/saved_pages_activity_title"
-                
android:configChanges="orientation|keyboardHidden|keyboard|screenSize"
-                android:windowSoftInputMode="stateHidden|adjustResize"
-                >
-        </activity>
-
-        <activity
-                android:name=".nearby.NearbyActivity"
-                android:label="@string/nearby_activity_title"
-                
android:configChanges="orientation|keyboardHidden|keyboard|screenSize"
-                android:windowSoftInputMode="stateHidden|adjustResize"
-                >
         </activity>
 
         <activity android:name="org.acra.CrashReportDialog"
diff --git a/wikipedia/res/layout/activity_history.xml 
b/wikipedia/res/layout/fragment_history.xml
similarity index 100%
rename from wikipedia/res/layout/activity_history.xml
rename to wikipedia/res/layout/fragment_history.xml
diff --git a/wikipedia/res/layout/activity_nearby.xml 
b/wikipedia/res/layout/fragment_nearby.xml
similarity index 100%
rename from wikipedia/res/layout/activity_nearby.xml
rename to wikipedia/res/layout/fragment_nearby.xml
diff --git a/wikipedia/res/layout/activity_saved_pages.xml 
b/wikipedia/res/layout/fragment_saved_pages.xml
similarity index 100%
rename from wikipedia/res/layout/activity_saved_pages.xml
rename to wikipedia/res/layout/fragment_saved_pages.xml
diff --git a/wikipedia/res/layout/dialog_search_results.xml 
b/wikipedia/res/layout/fragment_search_results.xml
similarity index 100%
rename from wikipedia/res/layout/dialog_search_results.xml
rename to wikipedia/res/layout/fragment_search_results.xml
diff --git a/wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java 
b/wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java
index b133898..e6dda14 100644
--- a/wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/NavDrawerFragment.java
@@ -13,13 +13,13 @@
 import android.widget.TextView;
 import android.widget.Toast;
 import org.wikipedia.analytics.LoginFunnel;
-import org.wikipedia.nearby.NearbyActivity;
-import org.wikipedia.savedpages.SavedPagesActivity;
+import org.wikipedia.history.HistoryFragment;
 import org.wikipedia.events.RequestMainPageEvent;
-import org.wikipedia.history.HistoryActivity;
 import org.wikipedia.login.LoginActivity;
+import org.wikipedia.nearby.NearbyFragment;
 import org.wikipedia.page.PageActivity;
 import org.wikipedia.random.RandomHandler;
+import org.wikipedia.savedpages.SavedPagesFragment;
 import org.wikipedia.settings.SettingsActivity;
 
 public class NavDrawerFragment extends Fragment implements 
View.OnClickListener {
@@ -136,16 +136,13 @@
                 app.getBus().post(new RequestMainPageEvent());
                 break;
             case R.id.nav_item_history:
-                intent.setClass(this.getActivity(), HistoryActivity.class);
-                getActivity().startActivityForResult(intent, 
PageActivity.ACTIVITY_REQUEST_HISTORY);
+                ((PageActivity)getActivity()).pushFragment(new 
HistoryFragment());
                 break;
             case R.id.nav_item_saved_pages:
-                intent.setClass(this.getActivity(), SavedPagesActivity.class);
-                getActivity().startActivityForResult(intent, 
PageActivity.ACTIVITY_REQUEST_SAVEDPAGES);
+                ((PageActivity)getActivity()).pushFragment(new 
SavedPagesFragment());
                 break;
             case R.id.nav_item_nearby:
-                intent.setClass(this.getActivity(), NearbyActivity.class);
-                getActivity().startActivityForResult(intent, 
PageActivity.ACTIVITY_REQUEST_NEARBY);
+                ((PageActivity)getActivity()).pushFragment(new 
NearbyFragment());
                 break;
             case R.id.nav_item_more:
                 intent.setClass(this.getActivity(), SettingsActivity.class);
diff --git a/wikipedia/src/main/java/org/wikipedia/history/HistoryActivity.java 
b/wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
similarity index 75%
rename from wikipedia/src/main/java/org/wikipedia/history/HistoryActivity.java
rename to wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
index 167832c..723dd7d 100644
--- a/wikipedia/src/main/java/org/wikipedia/history/HistoryActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
@@ -3,20 +3,17 @@
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.Intent;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.v4.app.Fragment;
 import android.support.v4.app.LoaderManager;
 import android.support.v4.content.CursorLoader;
 import android.support.v4.content.Loader;
 import android.support.v4.widget.CursorAdapter;
 import android.text.Editable;
 import android.text.TextWatcher;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
+import android.view.*;
 import android.widget.AdapterView;
 import android.widget.EditText;
 import android.widget.ImageView;
@@ -24,17 +21,14 @@
 import android.widget.TextView;
 import com.squareup.picasso.Picasso;
 import org.wikipedia.R;
-import org.wikipedia.ThemedActionBarActivity;
-import org.wikipedia.Utils;
 import org.wikipedia.WikipediaApp;
-import org.wikipedia.page.PageActivity;
+import org.wikipedia.events.NewWikiPageNavigationEvent;
 import org.wikipedia.pageimages.PageImage;
 
 import java.text.DateFormat;
 import java.util.Date;
 
-public class HistoryActivity extends ThemedActionBarActivity implements 
LoaderManager.LoaderCallbacks<Cursor> {
-    public static final int ACTIVITY_RESULT_HISTORY_SELECT = 1;
+public class HistoryFragment extends Fragment implements 
LoaderManager.LoaderCallbacks<Cursor> {
 
     private ListView historyEntryList;
     private View historyEmptyContainer;
@@ -47,16 +41,28 @@
 
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        app = (WikipediaApp)getApplicationContext();
+        app = WikipediaApp.getInstance();
+        setHasOptionsMenu(true);
+    }
 
-        setContentView(R.layout.activity_history);
-        historyEntryList = (ListView) findViewById(R.id.history_entry_list);
-        historyEmptyContainer = findViewById(R.id.history_empty_container);
-        historyEmptyTitle = (TextView) findViewById(R.id.history_empty_title);
-        historyEmptyMessage = (TextView) 
findViewById(R.id.history_empty_message);
-        entryFilter = (EditText) findViewById(R.id.history_search_list);
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.fragment_history, container, 
false);
 
-        adapter = new HistoryEntryAdapter(this, null, true);
+        historyEntryList = (ListView) 
rootView.findViewById(R.id.history_entry_list);
+        historyEmptyContainer = 
rootView.findViewById(R.id.history_empty_container);
+        historyEmptyTitle = (TextView) 
rootView.findViewById(R.id.history_empty_title);
+        historyEmptyMessage = (TextView) 
rootView.findViewById(R.id.history_empty_message);
+        entryFilter = (EditText) 
rootView.findViewById(R.id.history_search_list);
+
+        app.adjustDrawableToTheme(((ImageView) 
rootView.findViewById(R.id.history_empty_image)).getDrawable());
+        return rootView;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        adapter = new HistoryEntryAdapter(getActivity(), null, true);
         historyEntryList.setAdapter(adapter);
         historyEntryList.setEmptyView(historyEmptyContainer);
 
@@ -74,13 +80,11 @@
 
                     @Override
                     public void afterTextChanged(Editable editable) {
-                        getSupportLoaderManager().restartLoader(0, null, 
HistoryActivity.this);
+                        
getActivity().getSupportLoaderManager().restartLoader(0, null, 
HistoryFragment.this);
                         if (editable.length() == 0) {
                             
historyEmptyTitle.setText(R.string.history_empty_title);
                             historyEmptyMessage.setVisibility(View.VISIBLE);
                         } else {
-                            //getString() is now redundant because this 
message no longer has any parameters
-                            //Left in for backwards compatibility until all 
version of this message are translated
                             
historyEmptyTitle.setText(getString(R.string.history_search_empty_message, 
editable.toString()));
                             historyEmptyMessage.setVisibility(View.GONE);
                         }
@@ -92,29 +96,25 @@
                 public void onItemClick(AdapterView<?> parent, View view, int 
position, long id) {
                     HistoryEntry oldEntry = (HistoryEntry) view.getTag();
                     HistoryEntry newEntry = new 
HistoryEntry(oldEntry.getTitle(), HistoryEntry.SOURCE_HISTORY);
-
-                    Intent intent = new Intent();
-                    intent.setClass(HistoryActivity.this, PageActivity.class);
-                    intent.setAction(PageActivity.ACTION_PAGE_FOR_TITLE);
-                    intent.putExtra(PageActivity.EXTRA_PAGETITLE, 
oldEntry.getTitle());
-                    intent.putExtra(PageActivity.EXTRA_HISTORYENTRY, newEntry);
-                    setResult(ACTIVITY_RESULT_HISTORY_SELECT, intent);
-                    finish();
+                    app.getBus().post(new 
NewWikiPageNavigationEvent(oldEntry.getTitle(), newEntry));
                 }
             });
 
-        getSupportLoaderManager().initLoader(0, null, this);
-        app.adjustDrawableToTheme(((ImageView) 
findViewById(R.id.history_empty_image)).getDrawable());
+        getActivity().getSupportLoaderManager().initLoader(0, null, this);
+        getActivity().getSupportLoaderManager().restartLoader(0, null, this);
     }
 
     @Override
-    public void onPause() {
-        Utils.hideSoftKeyboard(this);
-        super.onPause();
+    public void onDestroyView() {
+        getActivity().getSupportLoaderManager().destroyLoader(0);
+        super.onDestroyView();
     }
 
     @Override
     public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
+        if (!isAdded()) {
+            return null;
+        }
         String selection = null;
         String[] selectionArgs = null;
         historyEmptyContainer.setVisibility(View.GONE);
@@ -126,7 +126,7 @@
             selectionArgs = new String[]{"%" + searchStr + "%"};
         }
         return new CursorLoader(
-                this,
+                getActivity(),
                 
Uri.parse(HistoryEntry.PERSISTANCE_HELPER.getBaseContentURI().toString() + "/" 
+ PageImage.PERSISTANCE_HELPER.getTableName()),
                 null,
                 selection,
@@ -136,8 +136,11 @@
 
     @Override
     public void onLoadFinished(Loader<Cursor> cursorLoaderLoader, Cursor 
cursorLoader) {
+        if (!isAdded()) {
+            return;
+        }
         adapter.swapCursor(cursorLoader);
-        supportInvalidateOptionsMenu();
+        getActivity().supportInvalidateOptionsMenu();
     }
 
     @Override
@@ -152,7 +155,7 @@
 
         @Override
         public View newView(Context context, Cursor cursor, ViewGroup 
viewGroup) {
-            return getLayoutInflater().inflate(R.layout.item_history_entry, 
viewGroup, false);
+            return 
getActivity().getLayoutInflater().inflate(R.layout.item_history_entry, 
viewGroup, false);
         }
 
         private String getDateString(Date date) {
@@ -194,7 +197,7 @@
             source.setImageResource(getImageForSource(entry.getSource()));
             view.setTag(entry);
 
-            Picasso.with(HistoryActivity.this)
+            Picasso.with(getActivity())
                     
.load(cursor.getString(HistoryEntryContentProvider.COL_INDEX_IMAGE))
                     .placeholder(R.drawable.ic_pageimage_placeholder)
                     .error(R.drawable.ic_pageimage_placeholder)
@@ -221,28 +224,28 @@
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        getMenuInflater().inflate(R.menu.menu_history, menu);
-        MenuItem clearAllItem = menu.findItem(R.id.menu_clear_all_history);
-        clearAllItem.setVisible(historyEntryList.getCount() > 0);
-        app.adjustDrawableToTheme(clearAllItem.getIcon());
-        return true;
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        inflater.inflate(R.menu.menu_history, menu);
+        
app.adjustDrawableToTheme(menu.findItem(R.id.menu_clear_all_history).getIcon());
     }
 
     @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
+    public void onPrepareOptionsMenu(Menu menu) {
+        if (historyEntryList == null) {
+            // in API10 this may be called before onCreateView...
+            return;
+        }
         
menu.findItem(R.id.menu_clear_all_history).setEnabled(historyEntryList.getCount()
 > 0);
-        return super.onPrepareOptionsMenu(menu);
+        super.onPrepareOptionsMenu(menu);
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case android.R.id.home:
-                finish();
-                return true;
+                return false;
             case R.id.menu_clear_all_history:
-                AlertDialog.Builder builder = new AlertDialog.Builder(this);
+                AlertDialog.Builder builder = new 
AlertDialog.Builder(getActivity());
                 builder.setMessage(R.string.dialog_title_clear_history);
                 builder.setPositiveButton(R.string.yes, new 
DialogInterface.OnClickListener() {
                     @Override
diff --git a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyActivity.java 
b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyFragment.java
similarity index 89%
rename from wikipedia/src/main/java/org/wikipedia/nearby/NearbyActivity.java
rename to wikipedia/src/main/java/org/wikipedia/nearby/NearbyFragment.java
index 4a0bbe4..617f704 100644
--- a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyFragment.java
@@ -3,11 +3,9 @@
 import org.wikipedia.PageTitle;
 import org.wikipedia.R;
 import org.wikipedia.Site;
-import org.wikipedia.ThemedActionBarActivity;
 import org.wikipedia.Utils;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.history.HistoryEntry;
-import org.wikipedia.page.PageActivity;
 import org.mediawiki.api.json.ApiException;
 import com.squareup.picasso.Picasso;
 import de.keyboardsurfer.android.widget.crouton.Crouton;
@@ -31,18 +29,14 @@
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.provider.Settings;
+import android.support.v4.app.Fragment;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.Surface;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
+import android.view.*;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
 import android.widget.TextView;
+import org.wikipedia.events.NewWikiPageNavigationEvent;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -54,8 +48,7 @@
 /**
  * Displays a list of nearby pages.
  */
-public class NearbyActivity extends ThemedActionBarActivity implements 
SensorEventListener {
-    public static final int ACTIVITY_RESULT_NEARBY_SELECT = 1;
+public class NearbyFragment extends Fragment implements SensorEventListener {
     private static final String PREF_KEY_UNITS = "nearbyUnits";
     private static final String NEARBY_LAST_RESULT = "lastRes";
     private static final String NEARBY_LAST_LOCATION = "lastLoc";
@@ -108,17 +101,27 @@
 
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        app = (WikipediaApp) getApplicationContext();
+        app = WikipediaApp.getInstance();
         site = app.getPrimarySite();
+        adapter = new NearbyAdapter(getActivity(), new 
ArrayList<NearbyPage>());
+        setHasOptionsMenu(true);
+    }
 
-        setContentView(R.layout.activity_nearby);
-        nearbyList = (ListView) findViewById(R.id.nearby_list);
-        nearbyLoadingContainer = findViewById(R.id.nearby_loading_container);
-        nearbyEmptyContainer = findViewById(R.id.nearby_empty_container);
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.fragment_nearby, container, 
false);
+
+        nearbyList = (ListView) rootView.findViewById(R.id.nearby_list);
+        nearbyLoadingContainer = 
rootView.findViewById(R.id.nearby_loading_container);
+        nearbyEmptyContainer = 
rootView.findViewById(R.id.nearby_empty_container);
 
         nearbyEmptyContainer.setVisibility(View.GONE);
+        return rootView;
+    }
 
-        adapter = new NearbyAdapter(this, new ArrayList<NearbyPage>());
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
         nearbyList.setAdapter(adapter);
         nearbyList.setEmptyView(nearbyLoadingContainer);
 
@@ -128,14 +131,7 @@
                 NearbyPage nearbyPage = adapter.getItem(position);
                 PageTitle title = new PageTitle(nearbyPage.getTitle(), site, 
nearbyPage.getThumblUrl());
                 HistoryEntry newEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_NEARBY);
-
-                Intent intent = new Intent();
-                intent.setClass(NearbyActivity.this, PageActivity.class);
-                intent.setAction(PageActivity.ACTION_PAGE_FOR_TITLE);
-                intent.putExtra(PageActivity.EXTRA_PAGETITLE, title);
-                intent.putExtra(PageActivity.EXTRA_HISTORYENTRY, newEntry);
-                setResult(ACTIVITY_RESULT_NEARBY_SELECT, intent);
-                finish();
+                app.getBus().post(new NewWikiPageNavigationEvent(title, 
newEntry));
             }
         });
 
@@ -165,7 +161,7 @@
         });
 
         // Acquire a reference to the system Location Manager
-        locationManager = (LocationManager) 
this.getSystemService(Context.LOCATION_SERVICE);
+        locationManager = (LocationManager) 
getActivity().getSystemService(Context.LOCATION_SERVICE);
 
         // Define a listener that responds to location updates
         locationListener = new LocationListener() {
@@ -187,13 +183,17 @@
             }
         };
 
-        mSensorManager = (SensorManager) 
getSystemService(Context.SENSOR_SERVICE);
+        mSensorManager = (SensorManager) 
getActivity().getSystemService(Context.SENSOR_SERVICE);
         mAccelerometer = 
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
         mMagnetometer = 
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
 
         compassViews = new ArrayList<NearbyCompassView>();
 
-        if (savedInstanceState != null) {
+        if (!adapter.isEmpty()) {
+            //we
+            setupGeomagneticField();
+            showNearbyPages(lastResult);
+        } else if (savedInstanceState != null) {
             lastLocation = 
savedInstanceState.getParcelable(NEARBY_LAST_LOCATION);
             nextLocation = 
savedInstanceState.getParcelable(NEARBY_NEXT_LOCATION);
             lastResult = savedInstanceState.getParcelable(NEARBY_LAST_RESULT);
@@ -203,7 +203,7 @@
             setRefreshingState(true);
         }
 
-        SharedPreferences prefs = 
PreferenceManager.getDefaultSharedPreferences(this);
+        SharedPreferences prefs = 
PreferenceManager.getDefaultSharedPreferences(getActivity());
         //do we already have a preference for metric/imperial units?
         if (prefs.contains(PREF_KEY_UNITS)) {
             setImperialUnits(prefs.getBoolean(PREF_KEY_UNITS, false));
@@ -216,7 +216,7 @@
     }
 
     @Override
-    protected void onSaveInstanceState(Bundle outState) {
+    public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         if (lastResult != null) {
             outState.putParcelable(NEARBY_LAST_LOCATION, lastLocation);
@@ -226,7 +226,7 @@
     }
 
     @Override
-    protected void onResume() {
+    public void onResume() {
         super.onResume();
         mSensorManager.registerListener(this, mAccelerometer, 
SensorManager.SENSOR_DELAY_UI);
         mSensorManager.registerListener(this, mMagnetometer, 
SensorManager.SENSOR_DELAY_UI);
@@ -268,7 +268,7 @@
     }
 
     private void showDialogForSettings() {
-        AlertDialog.Builder alert = new AlertDialog.Builder(this);
+        AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
         alert.setMessage(R.string.nearby_dialog_goto_settings);
         alert.setPositiveButton(android.R.string.ok, new 
DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int id) {
@@ -278,7 +278,6 @@
         });
         alert.setNegativeButton(android.R.string.cancel, new 
DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int id) {
-                finish();
             }
         });
         alert.setCancelable(false);
@@ -294,7 +293,7 @@
         setupGeomagneticField();
         if (lastLocation == null || (refreshing && getDistance(lastLocation) 
>= MIN_DISTANCE_METERS)) {
 
-            new NearbyFetchTask(NearbyActivity.this, site, location) {
+            new NearbyFetchTask(getActivity(), site, location) {
                 @Override
                 public void onFinish(NearbyResult result) {
                     lastResult = result;
@@ -303,11 +302,14 @@
 
                 @Override
                 public void onCatch(Throwable caught) {
+                    if (!isAdded()) {
+                        return;
+                    }
                     if (caught instanceof ApiException && caught.getCause() 
instanceof UnknownHostException) {
-                        Crouton.makeText(NearbyActivity.this, 
R.string.nearby_no_network, Style.ALERT).show();
+                        Crouton.makeText(getActivity(), 
R.string.nearby_no_network, Style.ALERT).show();
                     } else if (caught instanceof NearbyFetchException) {
                         Log.e("Wikipedia", "Could not get list of nearby 
places: " + caught.toString());
-                        Crouton.makeText(NearbyActivity.this, 
R.string.nearby_server_error, Style.ALERT).show();
+                        Crouton.makeText(getActivity(), 
R.string.nearby_server_error, Style.ALERT).show();
                     } else {
                         super.onCatch(caught);
                     }
@@ -410,7 +412,7 @@
             nearbyLoadingContainer.setVisibility(View.GONE);
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
-            invalidateOptionsMenu();
+            getActivity().invalidateOptionsMenu();
         }
     }
 
@@ -465,30 +467,28 @@
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        getMenuInflater().inflate(R.menu.menu_nearby, menu);
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        inflater.inflate(R.menu.menu_nearby, menu);
         
app.adjustDrawableToTheme(menu.findItem(R.id.menu_refresh_nearby).getIcon());
         menu.findItem(R.id.menu_metric_imperial).setTitle(showImperial
                 ? getString(R.string.nearby_set_metric)
                 : getString(R.string.nearby_set_imperial));
-        return true;
     }
 
     @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
+    public void onPrepareOptionsMenu(Menu menu) {
         menu.findItem(R.id.menu_refresh_nearby).setEnabled(!refreshing);
         menu.findItem(R.id.menu_metric_imperial).setTitle(showImperial
                 ? getString(R.string.nearby_set_metric)
                 : getString(R.string.nearby_set_imperial));
-        return super.onPrepareOptionsMenu(menu);
+        super.onPrepareOptionsMenu(menu);
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case android.R.id.home:
-                finish();
-                return true;
+                return false;
             case R.id.menu_refresh_nearby:
                 setRefreshingState(true);
                 requestLocationUpdates();
@@ -504,9 +504,9 @@
 
     private void setImperialUnits(boolean imperial) {
         showImperial = imperial;
-        SharedPreferences prefs = 
PreferenceManager.getDefaultSharedPreferences(this);
+        SharedPreferences prefs = 
PreferenceManager.getDefaultSharedPreferences(getActivity());
         prefs.edit().putBoolean(PREF_KEY_UNITS, showImperial).commit();
-        this.supportInvalidateOptionsMenu();
+        getActivity().supportInvalidateOptionsMenu();
     }
 
 
@@ -537,8 +537,8 @@
             if (nearbyPage.getLocation() != null) {
                 // set the calculated angle as the base angle for our compass 
view
                 viewHolder.thumbnail.setAngle((float) 
calculateAngle(nearbyPage.getLocation()));
-                
viewHolder.thumbnail.setMaskColor(getResources().getColor(Utils.getThemedAttributeId(NearbyActivity.this,
 R.attr.page_background_color)));
-                
viewHolder.thumbnail.setTickColor(getResources().getColor(R.color.button_light));
+                
viewHolder.thumbnail.setMaskColor(getResources().getColor(Utils.getThemedAttributeId(getActivity(),
 R.attr.page_background_color)));
+                
viewHolder.thumbnail.setTickColor(getResources().getColor(R.color.blue_progressive));
                 if (!compassViews.contains(viewHolder.thumbnail)) {
                     compassViews.add(viewHolder.thumbnail);
                 }
@@ -553,7 +553,7 @@
                 viewHolder.thumbnail.setEnabled(false);
             }
 
-            Picasso.with(NearbyActivity.this)
+            Picasso.with(getActivity())
                     .load(nearbyPage.getThumblUrl())
                     .placeholder(R.drawable.ic_pageimage_placeholder)
                     .error(R.drawable.ic_pageimage_placeholder)
@@ -633,7 +633,7 @@
         azimuth += declination;
 
         //adjust for device screen rotation
-        int rotation = ((WindowManager) 
getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
+        int rotation = ((WindowManager) 
getActivity().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
         switch (rotation) {
             case Surface.ROTATION_90:
                 azimuth += quarterTurn;
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
index 7ee1192..1371a97 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
@@ -8,38 +8,32 @@
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v4.widget.DrawerLayout;
 import android.text.Html;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.KeyEvent;
+import android.view.View;
 import android.view.Window;
+
 import com.squareup.otto.Bus;
 import com.squareup.otto.Subscribe;
 import de.keyboardsurfer.android.widget.crouton.Crouton;
 import de.keyboardsurfer.android.widget.crouton.Style;
+import org.wikipedia.*;
 import org.wikipedia.events.*;
-import org.wikipedia.nearby.NearbyActivity;
 import org.wikipedia.onboarding.OnboardingActivity;
-import org.wikipedia.savedpages.SavedPagesActivity;
-import org.wikipedia.NavDrawerFragment;
-import org.wikipedia.PageTitle;
-import org.wikipedia.R;
-import org.wikipedia.Site;
-import org.wikipedia.Utils;
-import org.wikipedia.WikipediaApp;
-import org.wikipedia.history.HistoryActivity;
 import org.wikipedia.history.HistoryEntry;
 import org.wikipedia.interlanguage.LangLinksActivity;
 import org.wikipedia.recurring.RecurringTasksExecutor;
+import org.wikipedia.search.FullSearchFragment;
 import org.wikipedia.search.SearchArticlesFragment;
 import org.wikipedia.settings.PrefKeys;
 import org.wikipedia.staticdata.MainPageNameData;
 import org.wikipedia.theme.ThemeChooserDialog;
 
-public class PageActivity extends FragmentActivity {
+public class PageActivity extends ThemedActionBarActivity {
     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";
@@ -48,15 +42,13 @@
     private static final String KEY_LAST_FRAGMENT = "lastFragment";
     private static final String KEY_LAST_FRAGMENT_ARGS = "lastFragmentArgs";
 
-    public static final int ACTIVITY_REQUEST_HISTORY = 0;
-    public static final int ACTIVITY_REQUEST_SAVEDPAGES = 1;
-    public static final int ACTIVITY_REQUEST_LANGLINKS = 2;
-    public static final int ACTIVITY_REQUEST_NEARBY = 3;
-    public static final int ACTIVITY_REQUEST_EDIT_SECTION = 4;
+    public static final int ACTIVITY_REQUEST_LANGLINKS = 0;
+    public static final int ACTIVITY_REQUEST_EDIT_SECTION = 1;
 
     private Bus bus;
     private WikipediaApp app;
 
+    private View fragmentContainerView;
     private SearchArticlesFragment searchArticlesFragment;
     private DrawerLayout drawerLayout;
     private NavDrawerFragment fragmentNavdrawer;
@@ -100,7 +92,6 @@
     public void onCreate(Bundle savedInstanceState) {
         app = (WikipediaApp) getApplicationContext();
         setTheme(app.getCurrentTheme());
-        requestWindowFeature(Window.FEATURE_NO_TITLE);
         requestWindowFeature(Window.FEATURE_ACTION_MODE_OVERLAY);
         super.onCreate(savedInstanceState);
 
@@ -128,6 +119,8 @@
         searchArticlesFragment = (SearchArticlesFragment) 
getSupportFragmentManager().findFragmentById(R.id.search_fragment);
         drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
         fragmentNavdrawer = (NavDrawerFragment) 
getSupportFragmentManager().findFragmentById(R.id.navdrawer);
+
+        fragmentContainerView = findViewById(R.id.content_fragment_container);
 
         searchArticlesFragment.setDrawerLayout(drawerLayout);
 
@@ -229,6 +222,14 @@
      */
     public void popFragment() {
         getSupportFragmentManager().popBackStack();
+    }
+
+    public void searchFullText(final String searchTerm) {
+        if (getTopFragment() instanceof FullSearchFragment) {
+            ((FullSearchFragment)getTopFragment()).newSearch(searchTerm);
+        } else {
+            pushFragment(FullSearchFragment.newInstance(searchTerm));
+        }
     }
 
     private void displayNewPage(final PageTitle title, final HistoryEntry 
entry) {
@@ -523,17 +524,19 @@
     }
 
     @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
+    public void onActivityResult(int requestCode, int resultCode, final Intent 
data) {
         if (bus == null) {
             bus = app.getBus();
             bus.register(this);
             Log.d("Wikipedia", "Registering bus");
         }
-        if ((requestCode == ACTIVITY_REQUEST_HISTORY && resultCode == 
HistoryActivity.ACTIVITY_RESULT_HISTORY_SELECT)
-            || (requestCode == ACTIVITY_REQUEST_SAVEDPAGES && resultCode == 
SavedPagesActivity.ACTIVITY_RESULT_SAVEDPAGE_SELECT)
-            || (requestCode == ACTIVITY_REQUEST_NEARBY && resultCode == 
NearbyActivity.ACTIVITY_RESULT_NEARBY_SELECT)
-            || (requestCode == ACTIVITY_REQUEST_LANGLINKS && resultCode == 
LangLinksActivity.ACTIVITY_RESULT_LANGLINK_SELECT)) {
-            handleIntent(data);
+        if ((requestCode == ACTIVITY_REQUEST_LANGLINKS && resultCode == 
LangLinksActivity.ACTIVITY_RESULT_LANGLINK_SELECT)) {
+            fragmentContainerView.post(new Runnable() {
+                @Override
+                public void run() {
+                    handleIntent(data);
+                }
+            });
         } else {
             super.onActivityResult(requestCode, resultCode, data);
         }
diff --git 
a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
index ffcde70..2ce395d 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
@@ -17,7 +17,8 @@
 import org.mediawiki.api.json.ApiException;
 import org.mediawiki.api.json.ApiResult;
 import org.mediawiki.api.json.RequestBuilder;
-import org.wikipedia.*;
+import org.wikipedia.NightModeHandler;
+import org.wikipedia.Site;
 import org.wikipedia.analytics.ConnectionIssueFunnel;
 import org.wikipedia.editing.EditSectionActivity;
 import org.wikipedia.events.ShowToCEvent;
@@ -25,6 +26,12 @@
 import org.wikipedia.pageimages.PageImagesTask;
 import org.wikipedia.views.ObservableWebView;
 import org.wikipedia.analytics.SavedPagesFunnel;
+import org.wikipedia.PageTitle;
+import org.wikipedia.QuickReturnHandler;
+import org.wikipedia.R;
+import org.wikipedia.Utils;
+import org.wikipedia.ViewAnimations;
+import org.wikipedia.WikipediaApp;
 import org.wikipedia.bridge.CommunicationBridge;
 import org.wikipedia.bridge.StyleLoader;
 import org.wikipedia.concurrency.SaneAsyncTask;
@@ -270,6 +277,7 @@
         searchArticlesFragment.setTocEnabled(false);
 
         savedPagesFunnel = 
app.getFunnelManager().getSavedPagesFunnel(title.getSite());
+
         connectionIssueFunnel = new ConnectionIssueFunnel(app);
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
@@ -287,6 +295,7 @@
 
         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
diff --git 
a/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesActivity.java 
b/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
similarity index 76%
rename from 
wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesActivity.java
rename to 
wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
index 944bc85..37ac331 100644
--- a/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
@@ -3,35 +3,31 @@
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.Intent;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.v4.app.Fragment;
 import android.support.v4.app.LoaderManager;
 import android.support.v4.content.CursorLoader;
 import android.support.v4.content.Loader;
 import android.support.v4.widget.CursorAdapter;
+import android.support.v7.app.ActionBarActivity;
 import android.support.v7.view.ActionMode;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.util.SparseBooleanArray;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
+import android.view.*;
 import android.widget.*;
 import com.squareup.picasso.Picasso;
 import org.wikipedia.R;
-import org.wikipedia.ThemedActionBarActivity;
 import org.wikipedia.WikipediaApp;
+import org.wikipedia.events.NewWikiPageNavigationEvent;
 import org.wikipedia.history.HistoryEntry;
-import org.wikipedia.page.PageActivity;
 import org.wikipedia.pageimages.PageImage;
 
 import java.util.ArrayList;
 
-public class SavedPagesActivity extends ThemedActionBarActivity implements 
LoaderManager.LoaderCallbacks<Cursor> {
-    public static final int ACTIVITY_RESULT_SAVEDPAGE_SELECT = 1;
+public class SavedPagesFragment extends Fragment implements 
LoaderManager.LoaderCallbacks<Cursor> {
 
     private ListView savedPagesList;
     private View savedPagesEmptyContainer;
@@ -48,17 +44,27 @@
 
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        app = (WikipediaApp)getApplicationContext();
+        app = WikipediaApp.getInstance();
+        setHasOptionsMenu(true);
+    }
 
-        setContentView(R.layout.activity_saved_pages);
-        savedPagesList = (ListView) findViewById(R.id.saved_pages_list);
-        savedPagesEmptyContainer = 
findViewById(R.id.saved_pages_empty_container);
-        savedPagesEmptyTitle = (TextView) 
findViewById(R.id.saved_pages_empty_title);
-        savedPagesEmptyMessage = (TextView) 
findViewById(R.id.saved_pages_empty_message);
-        entryFilter = (EditText) findViewById(R.id.saved_pages_search_list);
-        savedPagesEmptyImage = (ImageView) 
findViewById(R.id.saved_pages_empty_image);
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.fragment_saved_pages, 
container, false);
 
-        adapter = new SavedPagesAdapter(this, null, true);
+        savedPagesList = (ListView) 
rootView.findViewById(R.id.saved_pages_list);
+        savedPagesEmptyContainer = 
rootView.findViewById(R.id.saved_pages_empty_container);
+        savedPagesEmptyTitle = (TextView) 
rootView.findViewById(R.id.saved_pages_empty_title);
+        savedPagesEmptyMessage = (TextView) 
rootView.findViewById(R.id.saved_pages_empty_message);
+        entryFilter = (EditText) 
rootView.findViewById(R.id.saved_pages_search_list);
+        savedPagesEmptyImage = (ImageView) 
rootView.findViewById(R.id.saved_pages_empty_image);
+        return rootView;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        adapter = new SavedPagesAdapter(getActivity(), null, true);
         savedPagesList.setAdapter(adapter);
         savedPagesList.setEmptyView(savedPagesEmptyContainer);
 
@@ -69,7 +75,7 @@
                     return false;
                 }
                 savedPagesList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
-                actionMode = startSupportActionMode(new ActionMode.Callback() {
+                actionMode = 
((ActionBarActivity)getActivity()).startSupportActionMode(new 
ActionMode.Callback() {
                     @Override
                     public boolean onCreateActionMode(ActionMode mode, Menu 
menu) {
                         
mode.getMenuInflater().inflate(R.menu.menu_saved_pages_context, menu);
@@ -104,10 +110,10 @@
                         for (int i = 0; i < checkedItems.size(); i++) {
                             if (checkedItems.valueAt(i)) {
                                 final SavedPage page = 
SavedPage.PERSISTANCE_HELPER.fromCursor((Cursor) 
adapter.getItem(checkedItems.keyAt(i)));
-                                new 
DeleteSavedPageTask(SavedPagesActivity.this, page) {
+                                new DeleteSavedPageTask(getActivity(), page) {
                                     @Override
                                     public void onFinish(Boolean result) {
-                                        
Toast.makeText(SavedPagesActivity.this, R.string.toast_saved_page_deleted, 
Toast.LENGTH_SHORT).show();
+                                        Toast.makeText(getActivity(), 
R.string.toast_saved_page_deleted, Toast.LENGTH_SHORT).show();
                                     }
                                 }.execute();
                             }
@@ -143,14 +149,12 @@
 
                     @Override
                     public void afterTextChanged(Editable editable) {
-                        getSupportLoaderManager().restartLoader(0, null, 
SavedPagesActivity.this);
+                        
getActivity().getSupportLoaderManager().restartLoader(0, null, 
SavedPagesFragment.this);
                         if (editable.length() == 0) {
                             
savedPagesEmptyTitle.setText(R.string.saved_pages_empty_title);
                             savedPagesEmptyImage.setVisibility(View.VISIBLE);
                             savedPagesEmptyMessage.setVisibility(View.VISIBLE);
                         } else {
-                            //getString() is now redundant because this 
message no longer has any parameters
-                            //Left in for backwards compatibility until all 
version of this message are translated
                             
savedPagesEmptyTitle.setText(getString(R.string.saved_pages_search_empty_message,
 editable.toString()));
                             savedPagesEmptyImage.setVisibility(View.GONE);
                             savedPagesEmptyMessage.setVisibility(View.GONE);
@@ -165,24 +169,28 @@
                 if (actionMode == null) {
                     SavedPage savedPage = (SavedPage) view.getTag();
                     HistoryEntry newEntry = new 
HistoryEntry(savedPage.getTitle(), HistoryEntry.SOURCE_SAVED_PAGE);
-
-                    Intent intent = new Intent();
-                    intent.setClass(SavedPagesActivity.this, 
PageActivity.class);
-                    intent.setAction(PageActivity.ACTION_PAGE_FOR_TITLE);
-                    intent.putExtra(PageActivity.EXTRA_PAGETITLE, 
savedPage.getTitle());
-                    intent.putExtra(PageActivity.EXTRA_HISTORYENTRY, newEntry);
-                    setResult(ACTIVITY_RESULT_SAVEDPAGE_SELECT, intent);
-                    finish();
+                    app.getBus().post(new 
NewWikiPageNavigationEvent(savedPage.getTitle(), newEntry));
                 }
             }
         });
 
-        getSupportLoaderManager().initLoader(0, null, this);
         app.adjustDrawableToTheme(savedPagesEmptyImage.getDrawable());
+
+        getActivity().getSupportLoaderManager().initLoader(0, null, this);
+        getActivity().getSupportLoaderManager().restartLoader(0, null, this);
+    }
+
+    @Override
+    public void onDestroyView() {
+        getActivity().getSupportLoaderManager().destroyLoader(0);
+        super.onDestroyView();
     }
 
     @Override
     public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
+        if (!isAdded()) {
+            return null;
+        }
         String selection = null;
         String[] selectionArgs = null;
         savedPagesEmptyContainer.setVisibility(View.GONE);
@@ -194,7 +202,7 @@
             selectionArgs = new String[]{"%" + searchStr + "%"};
         }
         return new CursorLoader(
-                this,
+                getActivity(),
                 
Uri.parse(SavedPage.PERSISTANCE_HELPER.getBaseContentURI().toString() + "/" + 
PageImage.PERSISTANCE_HELPER.getTableName()),
                 null,
                 selection,
@@ -204,8 +212,11 @@
 
     @Override
     public void onLoadFinished(Loader<Cursor> cursorLoaderLoader, Cursor 
cursorLoader) {
+        if (!isAdded()) {
+            return;
+        }
         adapter.swapCursor(cursorLoader);
-        supportInvalidateOptionsMenu();
+        getActivity().supportInvalidateOptionsMenu();
     }
 
     @Override
@@ -220,7 +231,7 @@
 
         @Override
         public View newView(Context context, Cursor cursor, ViewGroup 
viewGroup) {
-            return getLayoutInflater().inflate(R.layout.item_saved_page_entry, 
viewGroup, false);
+            return 
getActivity().getLayoutInflater().inflate(R.layout.item_saved_page_entry, 
viewGroup, false);
         }
 
         @Override
@@ -231,7 +242,7 @@
             title.setText(entry.getTitle().getDisplayText());
             view.setTag(entry);
 
-            Picasso.with(SavedPagesActivity.this)
+            Picasso.with(getActivity())
                     
.load(cursor.getString(SavedPageContentProvider.COL_INDEX_IMAGE))
                     .placeholder(R.drawable.ic_pageimage_placeholder)
                     .error(R.drawable.ic_pageimage_placeholder)
@@ -257,26 +268,28 @@
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        getMenuInflater().inflate(R.menu.menu_saved_pages, menu);
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        inflater.inflate(R.menu.menu_saved_pages, menu);
         
app.adjustDrawableToTheme(menu.findItem(R.id.menu_refresh_all_saved_pages).getIcon());
         
app.adjustDrawableToTheme(menu.findItem(R.id.menu_clear_all_saved_pages).getIcon());
-        return true;
     }
 
     @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
-        
menu.findItem(R.id.menu_clear_all_saved_pages).setVisible(savedPagesList.getCount()
 > 0);
-        
menu.findItem(R.id.menu_refresh_all_saved_pages).setVisible(savedPagesList.getCount()
 > 0);
-        return super.onPrepareOptionsMenu(menu);
+    public void onPrepareOptionsMenu(Menu menu) {
+        if (savedPagesList == null) {
+            // in API10 this may be called before onCreateView...
+            return;
+        }
+        
menu.findItem(R.id.menu_clear_all_saved_pages).setEnabled(savedPagesList.getCount()
 > 0);
+        
menu.findItem(R.id.menu_refresh_all_saved_pages).setEnabled(savedPagesList.getCount()
 > 0);
+        super.onPrepareOptionsMenu(menu);
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case android.R.id.home:
-                finish();
-                return true;
+                return false;
             case R.id.menu_refresh_all_saved_pages:
                 promptToRefreshAll();
                 return true;
@@ -289,7 +302,7 @@
     }
 
     private void promptToRefreshAll() {
-        AlertDialog.Builder builder = new AlertDialog.Builder(this);
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         builder.setMessage(R.string.dialog_prompt_refresh_all_saved_pages);
         builder.setPositiveButton(R.string.yes, new 
DialogInterface.OnClickListener() {
             @Override
@@ -302,15 +315,15 @@
     }
 
     private void promptToDeleteAll() {
-        AlertDialog.Builder builder = new AlertDialog.Builder(this);
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         builder.setMessage(R.string.dialog_title_clear_saved_pages);
         builder.setPositiveButton(R.string.yes, new 
DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
-                new DeleteAllSavedPagesTask(SavedPagesActivity.this) {
+                new DeleteAllSavedPagesTask(getActivity()) {
                     @Override
                     public void onFinish(Void v) {
-                        Toast.makeText(SavedPagesActivity.this, 
R.string.toast_saved_page_deleted, Toast.LENGTH_SHORT).show();
+                        Toast.makeText(getActivity(), 
R.string.toast_saved_page_deleted, Toast.LENGTH_SHORT).show();
                     }
                 }.execute();
             }
@@ -328,7 +341,7 @@
                 savedPages.add(page);
             }
         }
-        refreshHandler = new RefreshPagesHandler(SavedPagesActivity.this, 
savedPages);
+        refreshHandler = new RefreshPagesHandler(getActivity(), savedPages);
         refreshHandler.refresh();
     }
 
@@ -338,7 +351,7 @@
             SavedPage page = SavedPage.PERSISTANCE_HELPER.fromCursor((Cursor) 
adapter.getItem(i));
             savedPages.add(page);
         }
-        refreshHandler = new RefreshPagesHandler(SavedPagesActivity.this, 
savedPages);
+        refreshHandler = new RefreshPagesHandler(getActivity(), savedPages);
         refreshHandler.refresh();
     }
 
diff --git a/wikipedia/src/main/java/org/wikipedia/search/FullSearchDialog.java 
b/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java
similarity index 71%
rename from wikipedia/src/main/java/org/wikipedia/search/FullSearchDialog.java
rename to wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java
index c0cb6e7..82d3939 100644
--- a/wikipedia/src/main/java/org/wikipedia/search/FullSearchDialog.java
+++ b/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java
@@ -1,31 +1,33 @@
 package org.wikipedia.search;
 
-import android.app.Dialog;
-import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
 import android.text.Html;
+import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.WindowManager;
 import android.widget.*;
 import com.squareup.picasso.Picasso;
 import org.wikipedia.*;
+import org.wikipedia.events.NewWikiPageNavigationEvent;
+import org.wikipedia.history.HistoryEntry;
 import org.wikipedia.pageimages.PageImagesTask;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-public class FullSearchDialog extends Dialog {
+public class FullSearchFragment extends Fragment {
+    private static final String KEY_SEARCH_TERM = "searchTerm";
 
     private WikipediaApp app;
 
-    private SearchArticlesFragment parentFragment;
     private View searchResultsContainer;
     private ListView searchResultsList;
     private SearchResultAdapter adapter;
     private TextView resultsStatusText;
-    private String searchTerm;
+    private String searchTermCurrent;
     private String searchTermOriginal;
 
     private View searchFailedContainer;
@@ -42,64 +44,90 @@
     private ParcelableLruCache<String> pageImagesCache
             = new ParcelableLruCache<String>(MAX_CACHE_SIZE_IMAGES, 
String.class);
 
-    public FullSearchDialog(SearchArticlesFragment parent, String searchTerm) {
-        super(parent.getActivity());
-        this.parentFragment = parent;
-        this.searchTerm = searchTerm;
-        this.searchTermOriginal = searchTerm;
+    public static FullSearchFragment newInstance(String searchTerm) {
+        FullSearchFragment f = new FullSearchFragment();
+        Bundle args = new Bundle();
+        args.putString(KEY_SEARCH_TERM, searchTerm);
+        f.setArguments(args);
+        return f;
+    }
+
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
         app = WikipediaApp.getInstance();
+        setHasOptionsMenu(true);
+        searchTermOriginal = getArguments().getString(KEY_SEARCH_TERM);
+    }
 
-        LayoutInflater inflater = (LayoutInflater) 
parent.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        View dlgLayout = inflater.inflate(R.layout.dialog_search_results, 
null);
-        setContentView(dlgLayout);
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.fragment_search_results, 
container, false);
 
-        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
-        lp.copyFrom(getWindow().getAttributes());
-        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
-        lp.height = WindowManager.LayoutParams.MATCH_PARENT;
-        getWindow().setAttributes(lp);
-        
//getWindow().setBackgroundDrawableResource(Utils.getThemedAttributeId(parent.getActivity(),
 R.attr.window_background_color));
-
-        setTitle(app.getString(R.string.search_results_title));
-
-        searchResultsContainer = 
dlgLayout.findViewById(R.id.search_results_container);
-        searchResultsList = (ListView) 
dlgLayout.findViewById(R.id.full_search_results_list);
+        searchResultsContainer = 
rootView.findViewById(R.id.search_results_container);
+        searchResultsList = (ListView) 
rootView.findViewById(R.id.full_search_results_list);
 
         searchResultsList.setOnItemClickListener(new 
AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int 
position, long id) {
-                parentFragment.navigateToTitle(((FullSearchResult) 
searchResultsList.getAdapter().getItem(position)).getTitle());
-                dismiss();
+                PageTitle title = ((FullSearchResult) 
searchResultsList.getAdapter().getItem(position)).getTitle();
+                HistoryEntry historyEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_SEARCH);
+                app.getBus().post(new NewWikiPageNavigationEvent(title, 
historyEntry));
             }
         });
 
         adapter = new SearchResultAdapter(inflater);
         searchResultsList.setAdapter(adapter);
 
-        resultsStatusText = (TextView) 
dlgLayout.findViewById(R.id.search_results_status);
-        searchFailedText = (TextView) 
dlgLayout.findViewById(R.id.search_failed_text);
-        searchFailedContainer = 
dlgLayout.findViewById(R.id.search_failed_container);
+        resultsStatusText = (TextView) 
rootView.findViewById(R.id.search_results_status);
+        searchFailedText = (TextView) 
rootView.findViewById(R.id.search_failed_text);
+        searchFailedContainer = 
rootView.findViewById(R.id.search_failed_container);
 
-        searchRetryButton = dlgLayout.findViewById(R.id.search_retry_button);
+        searchRetryButton = rootView.findViewById(R.id.search_retry_button);
         searchRetryButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                doSearch(FullSearchDialog.this.searchTerm, false, 0);
+                doSearch(searchTermCurrent, false, 0);
             }
         });
 
-        searchProgressBar = dlgLayout.findViewById(R.id.search_progress_bar);
+        searchProgressBar = rootView.findViewById(R.id.search_progress_bar);
 
+        return rootView;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
         totalResults = new ArrayList<FullSearchResult>();
         adapter.setResults(totalResults);
 
-        doSearch(searchTerm, false, 0);
+        // if we already have a search term, then we must have been restored 
from state or backstack
+        if (!TextUtils.isEmpty(searchTermOriginal)) {
+            doSearch(searchTermOriginal, false, 0);
+        }
+    }
+
+    public void newSearch(final String searchTerm) {
+        //update this fragment's arguments...
+        getArguments().putString(KEY_SEARCH_TERM, searchTerm);
+        //if we're already attached, then do the search...
+        if (isAdded()) {
+            doSearch(searchTerm, false, 0);
+        }
     }
 
     private void doSearch(final String searchTerm, final boolean 
fromSuggestion, final int continueOffset) {
+        if (!fromSuggestion) {
+            this.searchTermCurrent = searchTerm;
+            this.searchTermOriginal = searchTerm;
+        }
+
         (new FullSearchArticlesTask(app, 
app.getAPIForSite(app.getPrimarySite()), app.getPrimarySite(), searchTerm, 
continueOffset) {
             @Override
             public void onFinish(FullSearchResults results) {
+                if (!isAdded()) {
+                    return;
+                }
                 lastResults = results;
                 totalResults.addAll(lastResults.getResults());
 
@@ -109,7 +137,7 @@
                 if (lastResults.getResults().size() == 0) {
                     searchResultsContainer.setVisibility(View.GONE);
                     searchFailedContainer.setVisibility(View.VISIBLE);
-                    
searchFailedText.setText(app.getString(R.string.search_no_results, 
FullSearchDialog.this.searchTerm));
+                    
searchFailedText.setText(app.getString(R.string.search_no_results, 
searchTermCurrent));
                     searchRetryButton.setVisibility(View.GONE);
                 } else {
                     searchResultsContainer.setVisibility(View.VISIBLE);
@@ -130,10 +158,13 @@
 
             @Override
             public void onCatch(Throwable caught) {
+                if (!isAdded()) {
+                    return;
+                }
                 if (caught instanceof FullSearchSuggestionException) {
                     if (!fromSuggestion) {
-                        FullSearchDialog.this.searchTerm = 
((FullSearchSuggestionException) caught).getSuggestion();
-                        doSearch(FullSearchDialog.this.searchTerm, true, 0);
+                        searchTermCurrent = ((FullSearchSuggestionException) 
caught).getSuggestion();
+                        doSearch(searchTermCurrent, true, 0);
                     }
                 } else {
                     if (continueOffset == 0) {
@@ -143,7 +174,7 @@
                         
searchFailedText.setText(app.getString(R.string.error_network_error));
                         searchRetryButton.setVisibility(View.VISIBLE);
                     } else {
-                        Toast.makeText(parentFragment.getActivity(), 
parentFragment.getString(R.string.error_network_error), 
Toast.LENGTH_SHORT).show();
+                        Toast.makeText(getActivity(), 
getString(R.string.error_network_error), Toast.LENGTH_SHORT).show();
                     }
                 }
             }
@@ -255,7 +286,7 @@
             //...and lastly, if we've scrolled to the last item in the list, 
then
             //continue searching!
             if (position == results.size() - 1 && 
lastResults.getContinueOffset() > 0) {
-                doSearch(searchTerm, false, lastResults.getContinueOffset());
+                doSearch(searchTermCurrent, false, 
lastResults.getContinueOffset());
             }
 
             return convertView;
diff --git 
a/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java 
b/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
index 5cc7be7..541aecd 100644
--- a/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
@@ -35,6 +35,7 @@
 import org.wikipedia.events.WikipediaZeroStateChangeEvent;
 import org.wikipedia.history.HistoryEntry;
 import org.wikipedia.page.PageActionsHandler;
+import org.wikipedia.page.PageActivity;
 import org.wikipedia.page.PopupMenu;
 
 import java.util.List;
@@ -151,7 +152,8 @@
             @Override
             public void onClick(View view) {
                 Utils.hideSoftKeyboard(getActivity());
-                (new FullSearchDialog(SearchArticlesFragment.this, 
searchTermText.getText().toString())).show();
+                hideSearchResults();
+                
((PageActivity)getActivity()).searchFullText(searchTermText.getText().toString());
             }
         });
 
@@ -216,7 +218,8 @@
                             PageTitle title = new 
PageTitle(searchTermText.getText().toString(), app.getPrimarySite());
                             navigateToTitle(title);
                         } else {
-                            (new FullSearchDialog(SearchArticlesFragment.this, 
searchTermText.getText().toString())).show();
+                            hideSearchResults();
+                            
((PageActivity)getActivity()).searchFullText(searchTermText.getText().toString());
                         }
                     } else {
                         hideSearchResults();

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

Gerrit-MessageType: merged
Gerrit-Change-Id: If9c2c11014745e75f3dbde86a724d555470c8f61
Gerrit-PatchSet: 16
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <dbr...@wikimedia.org>
Gerrit-Reviewer: BearND <bsitzm...@wikimedia.org>
Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to