diff --git a/src/generic/java/org/tasks/dialogs/LocationPickerDialog.java b/src/generic/java/org/tasks/dialogs/LocationPickerDialog.java index 04dad55ad..63b784dae 100644 --- a/src/generic/java/org/tasks/dialogs/LocationPickerDialog.java +++ b/src/generic/java/org/tasks/dialogs/LocationPickerDialog.java @@ -1,17 +1,27 @@ package org.tasks.dialogs; +import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; +import org.tasks.activities.LocationPickerActivity; import org.tasks.location.OnLocationPickedHandler; -@SuppressWarnings("EmptyMethod") -public class LocationPickerDialog { +@SuppressWarnings({"EmptyMethod", "UnusedParameters"}) +public class LocationPickerDialog extends DialogFragment { - public LocationPickerDialog(OnLocationPickedHandler onLocationPickedHandler) { + public LocationPickerDialog() { } public void show(FragmentManager childFragmentManager, String fragTagLocationPicker) { } + + public void setOnLocationPickedHandler(LocationPickerActivity locationPickerActivity) { + + } + + public void setOnCancelListener(LocationPickerActivity locationPickerActivity) { + + } } diff --git a/src/googleplay/java/org/tasks/dialogs/LocationPickerDialog.java b/src/googleplay/java/org/tasks/dialogs/LocationPickerDialog.java index 70432bfbd..aa0bac7d7 100644 --- a/src/googleplay/java/org/tasks/dialogs/LocationPickerDialog.java +++ b/src/googleplay/java/org/tasks/dialogs/LocationPickerDialog.java @@ -1,5 +1,7 @@ package org.tasks.dialogs; +import android.content.DialogInterface; +import android.content.IntentSender; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; @@ -14,6 +16,8 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.location.places.Place; import com.google.android.gms.location.places.PlaceBuffer; @@ -24,29 +28,31 @@ import org.slf4j.LoggerFactory; import org.tasks.R; import org.tasks.injection.InjectingDialogFragment; import org.tasks.location.Geofence; -import org.tasks.location.ManagedGoogleApi; +import org.tasks.location.GoogleApi; import org.tasks.location.OnLocationPickedHandler; import org.tasks.location.PlaceAutocompleteAdapter; import javax.inject.Inject; -public class LocationPickerDialog extends InjectingDialogFragment { +public class LocationPickerDialog extends InjectingDialogFragment implements GoogleApiClient.OnConnectionFailedListener { private static final Logger log = LoggerFactory.getLogger(LocationPickerDialog.class); + private static final int RC_RESOLVE_GPS_ISSUE = 10009; private PlaceAutocompleteAdapter mAdapter; - @Inject ManagedGoogleApi managedGoogleApi; @Inject FragmentActivity fragmentActivity; + @Inject GoogleApi googleApi; private OnLocationPickedHandler onLocationPickedHandler; + private DialogInterface.OnCancelListener onCancelListener; - public LocationPickerDialog(OnLocationPickedHandler onLocationPickedHandler) { + public void setOnLocationPickedHandler(OnLocationPickedHandler onLocationPickedHandler) { this.onLocationPickedHandler = onLocationPickedHandler; } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - managedGoogleApi.connect(); + googleApi.connect(this); View layout = inflater.inflate(R.layout.location_picker_dialog, null); EditText addressEntry = (EditText) layout.findViewById(R.id.address_entry); @@ -63,7 +69,7 @@ public class LocationPickerDialog extends InjectingDialogFragment { } }); - mAdapter = new PlaceAutocompleteAdapter(managedGoogleApi, fragmentActivity, android.R.layout.simple_list_item_1); + mAdapter = new PlaceAutocompleteAdapter(googleApi, fragmentActivity, android.R.layout.simple_list_item_1); ListView list = (ListView) layout.findViewById(R.id.list); list.setAdapter(mAdapter); list.setOnItemClickListener(mAutocompleteClickListener); @@ -71,6 +77,13 @@ public class LocationPickerDialog extends InjectingDialogFragment { return layout; } + @Override + public void onDestroyView() { + super.onDestroyView(); + + googleApi.disconnect(); + } + private void error(String text) { log.error(text); Toast.makeText(fragmentActivity, text, Toast.LENGTH_LONG).show(); @@ -83,7 +96,7 @@ public class LocationPickerDialog extends InjectingDialogFragment { final PlaceAutocompleteAdapter.PlaceAutocomplete item = mAdapter.getItem(position); final String placeId = String.valueOf(item.placeId); log.info("Autocomplete item selected: " + item.description); - managedGoogleApi.getPlaceDetails(placeId, mUpdatePlaceDetailsCallback); + googleApi.getPlaceDetails(placeId, mUpdatePlaceDetailsCallback); } }; @@ -104,4 +117,33 @@ public class LocationPickerDialog extends InjectingDialogFragment { places.release(); } }; + + public void setOnCancelListener(DialogInterface.OnCancelListener onCancelListener) { + this.onCancelListener = onCancelListener; + } + + @Override + public void onCancel(DialogInterface dialog) { + super.onCancel(dialog); + + if (onCancelListener != null) { + onCancelListener.onCancel(dialog); + } + } + + @Override + public void onConnectionFailed(ConnectionResult connectionResult) { + if (connectionResult.hasResolution()) { + try { + connectionResult.startResolutionForResult(fragmentActivity, RC_RESOLVE_GPS_ISSUE); + } catch (IntentSender.SendIntentException e) { + log.error(e.getMessage(), e); + } + } else { + Toast.makeText(fragmentActivity, String.format("%s: %s\n%s", + fragmentActivity.getString(R.string.app_name), + fragmentActivity.getString(R.string.common_google_play_services_notification_ticker), + connectionResult.getErrorCode()), Toast.LENGTH_LONG).show(); + } + } } diff --git a/src/googleplay/java/org/tasks/location/GoogleApi.java b/src/googleplay/java/org/tasks/location/GoogleApi.java index 4ac1245aa..70b32b879 100644 --- a/src/googleplay/java/org/tasks/location/GoogleApi.java +++ b/src/googleplay/java/org/tasks/location/GoogleApi.java @@ -1,28 +1,34 @@ package org.tasks.location; import android.content.Context; +import android.location.Location; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.location.LocationServices; +import com.google.android.gms.location.places.AutocompletePredictionBuffer; +import com.google.android.gms.location.places.PlaceBuffer; import com.google.android.gms.location.places.Places; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tasks.injection.ForApplication; +import java.util.concurrent.TimeUnit; + import javax.inject.Inject; -public class GoogleApi implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks { +public class GoogleApi implements GoogleApiClient.ConnectionCallbacks { private static final Logger log = LoggerFactory.getLogger(GoogleApi.class); private GoogleApiClient.Builder builder; private GoogleApiClient googleApiClient; private GoogleApiClientConnectionHandler googleApiClientConnectionHandler; - private boolean enableAutoManage; public interface GoogleApiClientConnectionHandler { void onConnect(GoogleApiClient client); @@ -30,29 +36,70 @@ public class GoogleApi implements GoogleApiClient.OnConnectionFailedListener, Go @Inject public GoogleApi(@ForApplication Context context) { - builder = new GoogleApiClient.Builder(context, this, this) + builder = new GoogleApiClient.Builder(context) .addApi(LocationServices.API) .addApi(Places.GEO_DATA_API) .addConnectionCallbacks(this); } - public void connect(final GoogleApiClientConnectionHandler googleApiClientConnectionHandler) { - this.googleApiClientConnectionHandler = googleApiClientConnectionHandler; - googleApiClient = builder.build(); - if (!enableAutoManage) { - googleApiClient.connect(); + public void getPlaceDetails(final String placeId, final ResultCallback callback) { + Places.GeoDataApi.getPlaceById(googleApiClient, placeId).setResultCallback(new ResultCallback() { + @Override + public void onResult(PlaceBuffer places) { + callback.onResult(places); + } + }); + } + + public void getAutocompletePredictions(final String constraint, final ResultCallback callback) { + final LatLngBounds bounds = LatLngBounds.builder().include(getLastKnownLocation(googleApiClient)).build(); + Places.GeoDataApi.getAutocompletePredictions(googleApiClient, constraint, bounds, null) + .setResultCallback(new ResultCallback() { + @Override + public void onResult(AutocompletePredictionBuffer autocompletePredictions) { + callback.onResult(autocompletePredictions); + } + }, 15, TimeUnit.SECONDS); + } + + private LatLng getLastKnownLocation(GoogleApiClient googleApiClient) { + try { + Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); + return new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude()); + } catch (Exception e) { + log.error(e.getMessage(), e); + return new LatLng(0, 0); } } - protected GoogleApi enableAutoManage(FragmentActivity fragmentActivity, GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener) { - enableAutoManage = true; - builder.enableAutoManage(fragmentActivity, hashCode(), onConnectionFailedListener); - return this; + public void connect(final GoogleApiClientConnectionHandler googleApiClientConnectionHandler) { + connect(googleApiClientConnectionHandler, new GoogleApiClient.OnConnectionFailedListener() { + @Override + public void onConnectionFailed(ConnectionResult connectionResult) { + log.error("onConnectionFailed({})", connectionResult); + } + }); } - @Override - public void onConnectionFailed(ConnectionResult connectionResult) { - log.error("onConnectionFailed({})", connectionResult); + public void connect(final GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener) { + connect(new GoogleApiClientConnectionHandler() { + @Override + public void onConnect(GoogleApiClient client) { + log.info("onConnect({})", client); + } + }, onConnectionFailedListener); + } + + private void connect(final GoogleApiClientConnectionHandler googleApiClientConnectionHandler, GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener) { + this.googleApiClientConnectionHandler = googleApiClientConnectionHandler; + googleApiClient = builder + .addOnConnectionFailedListener(onConnectionFailedListener) + .build(); + googleApiClient.connect(); + } + + public void disconnect() { + googleApiClient.disconnect(); } @Override diff --git a/src/googleplay/java/org/tasks/location/ManagedGoogleApi.java b/src/googleplay/java/org/tasks/location/ManagedGoogleApi.java deleted file mode 100644 index 00f1f5993..000000000 --- a/src/googleplay/java/org/tasks/location/ManagedGoogleApi.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.tasks.location; - -import android.content.IntentSender; -import android.location.Location; -import android.support.v4.app.FragmentActivity; -import android.widget.Toast; - -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.common.api.ResultCallback; -import com.google.android.gms.location.LocationServices; -import com.google.android.gms.location.places.AutocompletePredictionBuffer; -import com.google.android.gms.location.places.PlaceBuffer; -import com.google.android.gms.location.places.Places; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.tasks.R; - -import java.util.concurrent.TimeUnit; - -import javax.inject.Inject; - -public class ManagedGoogleApi extends GoogleApi implements GoogleApi.GoogleApiClientConnectionHandler { - private static final int RC_RESOLVE_GPS_ISSUE = 10009; - - private static final Logger log = LoggerFactory.getLogger(ManagedGoogleApi.class); - private FragmentActivity fragmentActivity; - private GoogleApiClient googleApiClient; - - @Inject - public ManagedGoogleApi(FragmentActivity fragmentActivity) { - super(fragmentActivity); - - this.fragmentActivity = fragmentActivity; - enableAutoManage(fragmentActivity, this); - } - - public void connect() { - if (googleApiClient == null) { - super.connect(this); - } - } - - @Override - public void onConnectionFailed(ConnectionResult connectionResult) { - if (connectionResult.hasResolution()) { - try { - connectionResult.startResolutionForResult(fragmentActivity, RC_RESOLVE_GPS_ISSUE); - } catch (IntentSender.SendIntentException e) { - log.error(e.getMessage(), e); - } - } else { - Toast.makeText(fragmentActivity, String.format("%s: %s\n%s", - fragmentActivity.getString(R.string.app_name), - fragmentActivity.getString(R.string.common_google_play_services_notification_ticker), - connectionResult.getErrorCode()), Toast.LENGTH_LONG).show(); - } - } - - @Override - public void onConnect(GoogleApiClient googleApiClient) { - this.googleApiClient = googleApiClient; - } - - public void getPlaceDetails(final String placeId, final ResultCallback callback) { - Places.GeoDataApi.getPlaceById(googleApiClient, placeId).setResultCallback(new ResultCallback() { - @Override - public void onResult(PlaceBuffer places) { - callback.onResult(places); - } - }); - } - - public void getAutocompletePredictions(final String constraint, final ResultCallback callback) { - final LatLngBounds bounds = LatLngBounds.builder().include(getLastKnownLocation(googleApiClient)).build(); - Places.GeoDataApi.getAutocompletePredictions(googleApiClient, constraint, bounds, null) - .setResultCallback(new ResultCallback() { - @Override - public void onResult(AutocompletePredictionBuffer autocompletePredictions) { - callback.onResult(autocompletePredictions); - } - }, 15, TimeUnit.SECONDS); - } - - private LatLng getLastKnownLocation(GoogleApiClient googleApiClient) { - try { - Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); - return new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude()); - } catch (Exception e) { - log.error(e.getMessage(), e); - return new LatLng(0, 0); - } - } -} diff --git a/src/googleplay/java/org/tasks/location/PlaceAutocompleteAdapter.java b/src/googleplay/java/org/tasks/location/PlaceAutocompleteAdapter.java index dee085987..26ace6725 100644 --- a/src/googleplay/java/org/tasks/location/PlaceAutocompleteAdapter.java +++ b/src/googleplay/java/org/tasks/location/PlaceAutocompleteAdapter.java @@ -20,13 +20,13 @@ public class PlaceAutocompleteAdapter extends ArrayAdapter { private static final Logger log = LoggerFactory.getLogger(PlaceAutocompleteAdapter.class); - private final ManagedGoogleApi managedGoogleApi; + private final GoogleApi googleApi; private List mResultList = new ArrayList<>(); - public PlaceAutocompleteAdapter(ManagedGoogleApi managedGoogleApi, Context context, int resource) { + public PlaceAutocompleteAdapter(GoogleApi googleApi, Context context, int resource) { super(context, resource); - this.managedGoogleApi = managedGoogleApi; + this.googleApi = googleApi; } @Override @@ -40,7 +40,7 @@ public class PlaceAutocompleteAdapter } public void getAutocomplete(CharSequence constraint) { - managedGoogleApi.getAutocompletePredictions(constraint.toString(), onResults); + googleApi.getAutocompletePredictions(constraint.toString(), onResults); } private ResultCallback onResults = new ResultCallback() { diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 568701f03..58f584e51 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -111,6 +111,10 @@ android:name=".activities.DateAndTimePickerActivity" android:theme="@style/Tasks.Dialog" /> + +