BearND has uploaded a new change for review.
https://gerrit.wikimedia.org/r/162170
Change subject: Save nearby results between activity restores
......................................................................
Save nearby results between activity restores
When the Nearby activity resumes we still have the same
results, even if it was destroyed because of low memory.
This will make navigation easier since we don't automatically
change the list of results when the location changes.
If the user explicitly presses the refresh button or restarts
the activity then a new list of results will be retrieved.
NearbyResult is an object now, and parcelable.
Together with the locations (prev/next), it is stored in
a Bundle during onSaveInstanceSate;
to be used if the activity has to be recreated.
Change-Id: I3aba3f2202c9d2f08de88384ca450fee322dfc13
---
M wikipedia/src/main/java/org/wikipedia/nearby/NearbyActivity.java
M wikipedia/src/main/java/org/wikipedia/nearby/NearbyFetchTask.java
M wikipedia/src/main/java/org/wikipedia/nearby/NearbyPage.java
A wikipedia/src/main/java/org/wikipedia/nearby/NearbyResult.java
4 files changed, 150 insertions(+), 34 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/70/162170/1
diff --git a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyActivity.java
b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyActivity.java
index fd05893..ca01153 100644
--- a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyActivity.java
@@ -52,6 +52,9 @@
*/
public class NearbyActivity extends ThemedActionBarActivity implements
SensorEventListener {
public static final int ACTIVITY_RESULT_NEARBY_SELECT = 1;
+ private static final String NEARBY_LAST_RESULT = "lastRes";
+ private static final String NEARBY_LAST_LOCATION = "lastLoc";
+ private static final String NEARBY_NEXT_LOCATION = "curLoc";
private static final int MIN_TIME_MILLIS = 5000;
private static final int MIN_DISTANCE_METERS = 2;
private static final int ONE_KM = 1000;
@@ -69,6 +72,7 @@
private boolean refreshing;
private Location lastLocation;
private Location nextLocation;
+ private NearbyResult lastResult;
private SensorManager mSensorManager;
private Sensor mAccelerometer;
@@ -153,14 +157,34 @@
mMagnetometer =
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
compassViews = new ArrayList<NearbyCompassView>();
+
+ if (savedInstanceState != null) {
+ lastLocation =
savedInstanceState.getParcelable(NEARBY_LAST_LOCATION);
+ nextLocation =
savedInstanceState.getParcelable(NEARBY_NEXT_LOCATION);
+ lastResult = savedInstanceState.getParcelable(NEARBY_LAST_RESULT);
+ setupGeomagneticField();
+ showNearbyPages(lastResult);
+ } else {
+ setRefreshingState(true);
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ if (lastResult != null) {
+ outState.putParcelable(NEARBY_LAST_LOCATION, lastLocation);
+ outState.putParcelable(NEARBY_NEXT_LOCATION, nextLocation);
+ outState.putParcelable(NEARBY_LAST_RESULT, lastResult);
+ }
}
@Override
protected void onResume() {
super.onResume();
- requestLocationUpdates();
mSensorManager.registerListener(this, mAccelerometer,
SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, mMagnetometer,
SensorManager.SENSOR_DELAY_UI);
+ requestLocationUpdates();
}
@Override
@@ -177,8 +201,6 @@
}
private void requestLocationUpdates() {
- setRefreshingState(true);
-
boolean atLeastOneEnabled = false;
if
(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
requestLocation(LocationManager.NETWORK_PROVIDER);
@@ -223,14 +245,13 @@
return;
}
nextLocation = location;
+ setupGeomagneticField();
if (lastLocation == null || (refreshing && getDistance(lastLocation)
>= MIN_DISTANCE_METERS)) {
-
- //update geomagnetic field data, to give us our precise
declination from true north.
- geomagneticField = new
GeomagneticField((float)nextLocation.getLatitude(),
(float)nextLocation.getLongitude(), 0, (new Date()).getTime());
new NearbyFetchTask(NearbyActivity.this, site, location) {
@Override
- public void onFinish(List<NearbyPage> result) {
+ public void onFinish(NearbyResult result) {
+ lastResult = result;
showNearbyPages(result);
}
@@ -250,6 +271,11 @@
} else {
updateDistances();
}
+ }
+
+ /** Updates geomagnetic field data, to give us our precise declination
from true north. */
+ private void setupGeomagneticField() {
+ geomagneticField = new
GeomagneticField((float)nextLocation.getLatitude(),
(float)nextLocation.getLongitude(), 0, (new Date()).getTime());
}
/** Determines whether one Location reading is better than the current
Location fix.
@@ -309,11 +335,18 @@
return provider1.equals(provider2);
}
- private void showNearbyPages(List<NearbyPage> result) {
+ private void showNearbyPages(NearbyResult result) {
nearbyList.setEmptyView(nearbyEmptyContainer);
lastLocation = nextLocation;
- sortByDistance(result);
+ sortByDistance(result.getList());
adapter.clear();
+ addResultsToAdapter(result.getList());
+ compassViews.clear();
+
+ setRefreshingState(false);
+ }
+
+ private void addResultsToAdapter(List<NearbyPage> result) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
adapter.addAll(result);
} else {
@@ -321,9 +354,6 @@
adapter.add(page);
}
}
- compassViews.clear();
-
- setRefreshingState(false);
}
private void setRefreshingState(boolean newState) {
@@ -396,6 +426,7 @@
finish();
return true;
case R.id.menu_refresh_nearby:
+ setRefreshingState(true);
requestLocationUpdates();
return true;
default:
diff --git a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyFetchTask.java
b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyFetchTask.java
index c9bc32f..1fae085 100644
--- a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyFetchTask.java
+++ b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyFetchTask.java
@@ -12,15 +12,12 @@
import org.wikipedia.Utils;
import org.wikipedia.WikipediaApp;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
import java.util.Locale;
/**
* Actual work to search for nearby pages.
*/
-public class NearbyFetchTask extends ApiTask<List<NearbyPage>> {
+public class NearbyFetchTask extends ApiTask<NearbyResult> {
/** search radius in meters. 10 km is the maximum the API allows. */
private static final String RADIUS = "10000";
/** max number of results */
@@ -99,33 +96,28 @@
@Override
- public List<NearbyPage> processResult(ApiResult result) throws Throwable {
- ArrayList<NearbyPage> list = new ArrayList<NearbyPage>();
+ public NearbyResult processResult(ApiResult result) throws Throwable {
try {
- if (result.asObject().has("error")) {
- JSONObject errorJSON =
result.asObject().optJSONObject("error");
+ JSONObject jsonObject = result.asObject();
+
+ if (jsonObject.has("error")) {
+ JSONObject errorJSON = jsonObject.optJSONObject("error");
throw new NearbyFetchException(errorJSON.optString("code"),
errorJSON.optString("info"));
}
- final JSONObject pagesMap =
result.asObject().optJSONObject("query").optJSONObject("pages");
- Iterator iterator = pagesMap.keys();
-
- while (iterator.hasNext()) {
- NearbyPage newPage = new
NearbyPage(pagesMap.getJSONObject((String) iterator.next()));
- list.add(newPage);
+ if (WikipediaApp.isWikipediaZeroDevmodeOn()) {
+ Utils.processHeadersForZero(app, result);
}
+
+ return new NearbyResult(jsonObject);
} catch (ApiException e) {
// TODO: find a better way to deal with empty results
- if (!e.getCause().getMessage().startsWith("Value []")) {
+ if (e.getCause().getMessage().startsWith("Value []")) {
+ return new NearbyResult();
+ } else {
throw e;
}
}
-
- if (WikipediaApp.isWikipediaZeroDevmodeOn()) {
- Utils.processHeadersForZero(app, result);
- }
-
- return list;
}
}
diff --git a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyPage.java
b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyPage.java
index e2791dc..2a73c99 100644
--- a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyPage.java
+++ b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyPage.java
@@ -6,7 +6,24 @@
import org.json.JSONObject;
/**
- * Data object holding information about a nearby page
+ * Data object holding information about a nearby page.
+ * The JSONObject is expected to be formatted as follows:
+ *
+ * <pre>
+ * {@code
+ * {
+ * "pageid": 44175,
+ * "ns": 0,
+ * "title": "San Francisco",
+ * "coordinates": [{
+ * "lat": 37.7793,
+ * "lon": -122.419,
+ * "primary": "",
+ * "globe": "earth"
+ * }]
+ * }
+ * }
+ * </pre>
*/
class NearbyPage {
diff --git a/wikipedia/src/main/java/org/wikipedia/nearby/NearbyResult.java
b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyResult.java
new file mode 100644
index 0000000..fb28670
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/nearby/NearbyResult.java
@@ -0,0 +1,76 @@
+package org.wikipedia.nearby;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Data object for the nearby results. Contains the list of nearby pages the
API has returned to us.
+ */
+class NearbyResult implements Parcelable {
+ private final JSONObject jsonObject;
+ private final ArrayList<NearbyPage> list;
+
+ /** empty result */
+ public NearbyResult() {
+ jsonObject = new JSONObject();
+ list = new ArrayList<NearbyPage>();
+ }
+
+ /** non-empty result */
+ NearbyResult(JSONObject jsonObject) throws JSONException {
+ this.jsonObject = jsonObject;
+ list = new ArrayList<NearbyPage>();
+ final JSONObject pagesMap =
jsonObject.optJSONObject("query").optJSONObject("pages");
+ Iterator iterator = pagesMap.keys();
+
+ while (iterator.hasNext()) {
+ NearbyPage newPage = new
NearbyPage(pagesMap.getJSONObject((String) iterator.next()));
+ list.add(newPage);
+ }
+ }
+
+ public JSONObject toJSON() {
+ return jsonObject;
+ }
+
+ public ArrayList<NearbyPage> getList() {
+ return list;
+ }
+
+ // Parcelable start
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(jsonObject.toString());
+ }
+
+ private NearbyResult(Parcel in) throws JSONException {
+ this(new JSONObject(in.readString()));
+ }
+
+ public static final Parcelable.Creator<NearbyResult> CREATOR = new
Parcelable.Creator<NearbyResult>() {
+ public NearbyResult createFromParcel(Parcel in) {
+ try {
+ return new NearbyResult(in);
+ } catch (JSONException e) {
+ return new NearbyResult();
+ }
+ }
+
+ public NearbyResult[] newArray(int size) {
+ return new NearbyResult[size];
+ }
+ };
+
+ // Parcelable end
+}
--
To view, visit https://gerrit.wikimedia.org/r/162170
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3aba3f2202c9d2f08de88384ca450fee322dfc13
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: BearND <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits