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