Location picker tweaks and bug fixes

pull/795/head
Alex Baker 7 years ago
parent 811c6a2a08
commit 15b98fa4d4

@ -48,6 +48,9 @@ public class GoogleMapFragment implements MapFragment, OnMapReadyCallback, OnMar
@Override @Override
public MapPosition getMapPosition() { public MapPosition getMapPosition() {
if (map == null) {
return null;
}
CameraPosition cameraPosition = map.getCameraPosition(); CameraPosition cameraPosition = map.getCameraPosition();
LatLng target = cameraPosition.target; LatLng target = cameraPosition.target;
return new MapPosition(target.latitude, target.longitude, cameraPosition.zoom); return new MapPosition(target.latitude, target.longitude, cameraPosition.zoom);

@ -6,6 +6,7 @@ import static org.tasks.data.Place.newPlace;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.Nullable;
import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.libraries.places.api.Places; import com.google.android.libraries.places.api.Places;
@ -16,6 +17,7 @@ import com.google.android.libraries.places.api.model.RectangularBounds;
import com.google.android.libraries.places.api.net.FetchPlaceRequest; import com.google.android.libraries.places.api.net.FetchPlaceRequest;
import com.google.android.libraries.places.api.net.FetchPlaceResponse; import com.google.android.libraries.places.api.net.FetchPlaceResponse;
import com.google.android.libraries.places.api.net.FindAutocompletePredictionsRequest; import com.google.android.libraries.places.api.net.FindAutocompletePredictionsRequest;
import com.google.android.libraries.places.api.net.FindAutocompletePredictionsRequest.Builder;
import com.google.android.libraries.places.api.net.PlacesClient; import com.google.android.libraries.places.api.net.PlacesClient;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -53,7 +55,7 @@ public class GooglePlacesSearchProvider implements PlaceSearchProvider {
@Override @Override
public void search( public void search(
String query, String query,
MapPosition bias, @Nullable MapPosition bias,
Callback<List<PlaceSearchResult>> onSuccess, Callback<List<PlaceSearchResult>> onSuccess,
Callback<String> onError) { Callback<String> onError) {
if (!Places.isInitialized()) { if (!Places.isInitialized()) {
@ -65,17 +67,17 @@ public class GooglePlacesSearchProvider implements PlaceSearchProvider {
if (token == null) { if (token == null) {
token = AutocompleteSessionToken.newInstance(); token = AutocompleteSessionToken.newInstance();
} }
Builder request =
FindAutocompletePredictionsRequest.builder().setSessionToken(token).setQuery(query);
if (bias != null) {
request.setLocationBias(
RectangularBounds.newInstance(
LatLngBounds.builder()
.include(new LatLng(bias.getLatitude(), bias.getLongitude()))
.build()));
}
placesClient placesClient
.findAutocompletePredictions( .findAutocompletePredictions(request.build())
FindAutocompletePredictionsRequest.builder()
.setSessionToken(token)
.setQuery(query)
.setLocationBias(
RectangularBounds.newInstance(
LatLngBounds.builder()
.include(new LatLng(bias.getLatitude(), bias.getLongitude()))
.build()))
.build())
.addOnSuccessListener( .addOnSuccessListener(
response -> onSuccess.call(toSearchResults(response.getAutocompletePredictions()))) response -> onSuccess.call(toSearchResults(response.getAutocompletePredictions())))
.addOnFailureListener(e -> onError.call(e.getMessage())); .addOnFailureListener(e -> onError.call(e.getMessage()));

@ -22,6 +22,7 @@ import android.view.MenuItem.OnActionExpandListener;
import android.view.View; import android.view.View;
import android.view.View.OnLayoutChangeListener; import android.view.View.OnLayoutChangeListener;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.SearchView.OnQueryTextListener; import androidx.appcompat.widget.SearchView.OnQueryTextListener;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
@ -120,7 +121,7 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
@Inject MapFragment map; @Inject MapFragment map;
private CompositeDisposable disposables; private CompositeDisposable disposables;
private MapPosition mapPosition; @Nullable private MapPosition mapPosition;
private LocationPickerAdapter recentsAdapter = new LocationPickerAdapter(this); private LocationPickerAdapter recentsAdapter = new LocationPickerAdapter(this);
private LocationSearchAdapter searchAdapter; private LocationSearchAdapter searchAdapter;
private List<PlaceUsage> places = Collections.emptyList(); private List<PlaceUsage> places = Collections.emptyList();
@ -174,10 +175,10 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
recentsAdapter.setCurrentPlace(currentPlace); recentsAdapter.setCurrentPlace(currentPlace);
if (savedInstanceState == null) { if (savedInstanceState == null) {
if (currentPlace != null) { mapPosition =
mapPosition = currentPlace.getMapPosition(); currentPlace == null
} ? getIntent().getParcelableExtra(EXTRA_MAP_POSITION)
mapPosition = getIntent().getParcelableExtra(EXTRA_MAP_POSITION); : currentPlace.getMapPosition();
} else { } else {
mapPosition = savedInstanceState.getParcelable(EXTRA_MAP_POSITION); mapPosition = savedInstanceState.getParcelable(EXTRA_MAP_POSITION);
offset = savedInstanceState.getInt(EXTRA_APPBAR_OFFSET); offset = savedInstanceState.getInt(EXTRA_APPBAR_OFFSET);
@ -248,7 +249,8 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
searchAdapter = new LocationSearchAdapter(searchProvider.getAttributionRes(dark), this); searchAdapter = new LocationSearchAdapter(searchProvider.getAttributionRes(dark), this);
recentsAdapter.setHasStableIds(true); recentsAdapter.setHasStableIds(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(search.isActionViewExpanded() ? searchAdapter : recentsAdapter); recyclerView.setAdapter(
search != null && search.isActionViewExpanded() ? searchAdapter : recentsAdapter);
} }
@Override @Override
@ -280,7 +282,7 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
} }
private boolean closeSearch() { private boolean closeSearch() {
return search.isActionViewExpanded() && search.collapseActionView(); return search != null && search.isActionViewExpanded() && search.collapseActionView();
} }
@Override @Override

@ -1,5 +1,6 @@
package org.tasks.location; package org.tasks.location;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import java.util.List; import java.util.List;
import org.tasks.data.Place; import org.tasks.data.Place;
@ -8,7 +9,7 @@ public interface MapFragment {
void init(FragmentManager fragmentManager, MapFragmentCallback callback, boolean dark); void init(FragmentManager fragmentManager, MapFragmentCallback callback, boolean dark);
MapPosition getMapPosition(); @Nullable MapPosition getMapPosition();
void movePosition(MapPosition mapPosition, boolean animate); void movePosition(MapPosition mapPosition, boolean animate);

@ -54,6 +54,9 @@ public class MapboxMapFragment implements MapFragment, OnMapReadyCallback, OnMar
@Override @Override
public MapPosition getMapPosition() { public MapPosition getMapPosition() {
if (map == null) {
return null;
}
CameraPosition cameraPosition = map.getCameraPosition(); CameraPosition cameraPosition = map.getCameraPosition();
LatLng target = cameraPosition.target; LatLng target = cameraPosition.target;
return new MapPosition( return new MapPosition(

@ -5,6 +5,7 @@ import static org.tasks.data.Place.newPlace;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.Nullable;
import com.mapbox.api.geocoding.v5.MapboxGeocoding; import com.mapbox.api.geocoding.v5.MapboxGeocoding;
import com.mapbox.api.geocoding.v5.models.CarmenFeature; import com.mapbox.api.geocoding.v5.models.CarmenFeature;
import com.mapbox.api.geocoding.v5.models.GeocodingResponse; import com.mapbox.api.geocoding.v5.models.GeocodingResponse;
@ -41,17 +42,16 @@ public class MapboxSearchProvider implements PlaceSearchProvider {
@Override @Override
public void search( public void search(
String query, String query,
MapPosition bias, @Nullable MapPosition bias,
Callback<List<PlaceSearchResult>> onSuccess, Callback<List<PlaceSearchResult>> onSuccess,
Callback<String> onError) { Callback<String> onError) {
if (builder == null) { if (builder == null) {
String token = context.getString(R.string.mapbox_key); String token = context.getString(R.string.mapbox_key);
Mapbox.getInstance(context, token); Mapbox.getInstance(context, token);
builder = builder = MapboxGeocoding.builder().autocomplete(true).accessToken(token);
MapboxGeocoding.builder() if (bias != null) {
.autocomplete(true) builder.proximity(Point.fromLngLat(bias.getLongitude(), bias.getLatitude()));
.accessToken(token) }
.proximity(Point.fromLngLat(bias.getLongitude(), bias.getLatitude()));
} }
builder builder
@ -94,7 +94,6 @@ public class MapboxSearchProvider implements PlaceSearchProvider {
place.setAddress(address); place.setAddress(address);
place.setLatitude(feature.center().latitude()); place.setLatitude(feature.center().latitude());
place.setLongitude(feature.center().longitude()); place.setLongitude(feature.center().longitude());
return new PlaceSearchResult( return new PlaceSearchResult(feature.id(), place.getName(), place.getDisplayAddress(), place);
feature.id(), place.getName(), place.getDisplayAddress(), place);
} }
} }

@ -2,6 +2,7 @@ package org.tasks.location;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import java.util.List; import java.util.List;
import org.tasks.Callback; import org.tasks.Callback;
import org.tasks.data.Place; import org.tasks.data.Place;
@ -15,7 +16,7 @@ public interface PlaceSearchProvider {
void search( void search(
String query, String query,
MapPosition bias, @Nullable MapPosition bias,
Callback<List<PlaceSearchResult>> onSuccess, Callback<List<PlaceSearchResult>> onSuccess,
Callback<String> onError); Callback<String> onError);

@ -3,6 +3,7 @@ package org.tasks.location;
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread; import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
@ -42,7 +43,7 @@ public class PlaceSearchViewModel extends ViewModel {
searchProvider.restoreState(savedInstanceState); searchProvider.restoreState(savedInstanceState);
} }
public void query(String query, MapPosition bias) { public void query(String query, @Nullable MapPosition bias) {
assertMainThread(); assertMainThread();
if (Strings.isNullOrEmpty(query)) { if (Strings.isNullOrEmpty(query)) {

@ -13,6 +13,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="@dimen/keyline_first" android:paddingTop="@dimen/keyline_first"
android:paddingBottom="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_content_inset" android:paddingStart="@dimen/keyline_content_inset"
android:paddingEnd="@dimen/keyline_second" android:paddingEnd="@dimen/keyline_second"
android:paddingLeft="@dimen/keyline_content_inset" android:paddingLeft="@dimen/keyline_content_inset"

Loading…
Cancel
Save