From 747236e21e87ca2c7e4030187dcccb5f83b1d7d4 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 17 Apr 2015 16:25:26 -0500 Subject: [PATCH] Enable auto manage for google api client --- .../tasks/dialogs/LocationPickerDialog.java | 10 +- .../tasks/dialogs/LocationPickerDialog.java | 36 +++---- .../java/org/tasks/location/GeofenceApi.java | 41 ++++---- .../GeofenceTransitionsIntentService.java | 16 ++- .../java/org/tasks/location/GoogleApi.java | 76 +++++++++++++++ .../location/GoogleApiClientProvider.java | 51 ---------- .../java/org/tasks/location/LocationApi.java | 84 ---------------- .../org/tasks/location/ManagedGoogleApi.java | 97 +++++++++++++++++++ .../location/PlaceAutocompleteAdapter.java | 8 +- .../astrid/activity/TaskEditFragment.java | 4 +- .../todoroo/astrid/ui/ReminderControlSet.java | 10 +- .../tasks/injection/DialogFragmentModule.java | 27 ++++++ .../org/tasks/injection/FragmentModule.java | 1 - .../injection/InjectingDialogFragment.java | 18 ++++ 14 files changed, 281 insertions(+), 198 deletions(-) create mode 100644 src/googleplay/java/org/tasks/location/GoogleApi.java delete mode 100644 src/googleplay/java/org/tasks/location/GoogleApiClientProvider.java delete mode 100644 src/googleplay/java/org/tasks/location/LocationApi.java create mode 100644 src/googleplay/java/org/tasks/location/ManagedGoogleApi.java create mode 100644 src/main/java/org/tasks/injection/DialogFragmentModule.java create mode 100644 src/main/java/org/tasks/injection/InjectingDialogFragment.java diff --git a/src/generic/java/org/tasks/dialogs/LocationPickerDialog.java b/src/generic/java/org/tasks/dialogs/LocationPickerDialog.java index fa3d83197..2d0837fea 100644 --- a/src/generic/java/org/tasks/dialogs/LocationPickerDialog.java +++ b/src/generic/java/org/tasks/dialogs/LocationPickerDialog.java @@ -1,12 +1,16 @@ package org.tasks.dialogs; -import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; -import org.tasks.location.LocationApi; import org.tasks.location.OnLocationPickedHandler; public class LocationPickerDialog { - public static void pickLocation(LocationApi locationApi, Fragment fragment, OnLocationPickedHandler onLocationPickedHandler) { + + public LocationPickerDialog(OnLocationPickedHandler onLocationPickedHandler) { + + } + + public void show(FragmentManager childFragmentManager, String fragTagLocationPicker) { } } diff --git a/src/googleplay/java/org/tasks/dialogs/LocationPickerDialog.java b/src/googleplay/java/org/tasks/dialogs/LocationPickerDialog.java index 653455563..3703f9b36 100644 --- a/src/googleplay/java/org/tasks/dialogs/LocationPickerDialog.java +++ b/src/googleplay/java/org/tasks/dialogs/LocationPickerDialog.java @@ -2,8 +2,6 @@ package org.tasks.dialogs; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -24,29 +22,33 @@ import com.google.android.gms.maps.model.LatLng; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tasks.R; +import org.tasks.injection.InjectingDialogFragment; import org.tasks.location.Geofence; -import org.tasks.location.LocationApi; +import org.tasks.location.ManagedGoogleApi; import org.tasks.location.OnLocationPickedHandler; import org.tasks.location.PlaceAutocompleteAdapter; -public class LocationPickerDialog extends DialogFragment { +import javax.inject.Inject; + +public class LocationPickerDialog extends InjectingDialogFragment { private static final Logger log = LoggerFactory.getLogger(LocationPickerDialog.class); - private static final String FRAG_TAG_LOCATION_PICKER = "frag_tag_location_picker"; - private LocationApi locationApi; - private FragmentActivity fragmentActivity; - private OnLocationPickedHandler onLocationPickedHandler; private PlaceAutocompleteAdapter mAdapter; - public static void pickLocation(LocationApi locationApi, Fragment fragment, OnLocationPickedHandler onLocationPickedHandler) { - LocationPickerDialog locationPickerDialog = new LocationPickerDialog(); - locationPickerDialog.initialize(locationApi, fragment.getActivity(), onLocationPickedHandler); - locationPickerDialog.show(fragment.getChildFragmentManager(), FRAG_TAG_LOCATION_PICKER); + @Inject ManagedGoogleApi managedGoogleApi; + @Inject FragmentActivity fragmentActivity; + private OnLocationPickedHandler onLocationPickedHandler; + + public LocationPickerDialog(OnLocationPickedHandler onLocationPickedHandler) { + this.onLocationPickedHandler = onLocationPickedHandler; } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + managedGoogleApi.requestGeoData(); + managedGoogleApi.connect(); + View layout = inflater.inflate(R.layout.location_picker_dialog, null); EditText addressEntry = (EditText) layout.findViewById(R.id.address_entry); @@ -62,7 +64,7 @@ public class LocationPickerDialog extends DialogFragment { } }); - mAdapter = new PlaceAutocompleteAdapter(locationApi, fragmentActivity, android.R.layout.simple_list_item_1); + mAdapter = new PlaceAutocompleteAdapter(managedGoogleApi, fragmentActivity, android.R.layout.simple_list_item_1); ListView list = (ListView) layout.findViewById(R.id.list); list.setAdapter(mAdapter); list.setOnItemClickListener(mAutocompleteClickListener); @@ -70,12 +72,6 @@ public class LocationPickerDialog extends DialogFragment { return layout; } - public void initialize(LocationApi locationApi, FragmentActivity fragmentActivity, OnLocationPickedHandler onLocationPickedHandler) { - this.locationApi = locationApi; - this.fragmentActivity = fragmentActivity; - this.onLocationPickedHandler = onLocationPickedHandler; - } - private void error(String text) { log.error(text); Toast.makeText(fragmentActivity, text, Toast.LENGTH_LONG).show(); @@ -88,7 +84,7 @@ public class LocationPickerDialog extends DialogFragment { final PlaceAutocompleteAdapter.PlaceAutocomplete item = mAdapter.getItem(position); final String placeId = String.valueOf(item.placeId); log.info("Autocomplete item selected: " + item.description); - locationApi.getPlaceDetails(placeId, mUpdatePlaceDetailsCallback); + managedGoogleApi.getPlaceDetails(placeId, mUpdatePlaceDetailsCallback); } }; diff --git a/src/googleplay/java/org/tasks/location/GeofenceApi.java b/src/googleplay/java/org/tasks/location/GeofenceApi.java index c196a5c95..ceb7b171c 100644 --- a/src/googleplay/java/org/tasks/location/GeofenceApi.java +++ b/src/googleplay/java/org/tasks/location/GeofenceApi.java @@ -4,7 +4,6 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.PendingResult; import com.google.android.gms.common.api.ResultCallback; @@ -25,19 +24,17 @@ import javax.inject.Inject; import static com.google.android.gms.location.Geofence.NEVER_EXPIRE; import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Lists.newArrayList; -import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; public class GeofenceApi { private static final Logger log = LoggerFactory.getLogger(GeofenceApi.class); private Context context; - private GoogleApiClientProvider googleApiClientProvider; @Inject - public GeofenceApi(@ForApplication Context context, GoogleApiClientProvider googleApiClientProvider) { + public GeofenceApi(@ForApplication Context context) { this.context = context; - this.googleApiClientProvider = googleApiClientProvider; } public void register(final List geofences) { @@ -45,11 +42,11 @@ public class GeofenceApi { return; } - googleApiClientProvider.getApi(new GoogleApiClientProvider.withApi() { + newClient(new GoogleApi.GoogleApiClientConnectionHandler() { @Override - public void doWork(GoogleApiClient googleApiClient) { + public void onConnect(final GoogleApiClient client) { PendingResult result = LocationServices.GeofencingApi.addGeofences( - googleApiClient, + client, getRequests(geofences), PendingIntent.getService(context, 0, new Intent(context, GeofenceTransitionsIntentService.class), PendingIntent.FLAG_UPDATE_CURRENT)); result.setResultCallback(new ResultCallback() { @@ -60,24 +57,21 @@ public class GeofenceApi { } else { log.error("Failed to register {}", geofences); } + + client.disconnect(); } }); } - - @Override - public void onConnectionFailed(ConnectionResult connectionResult) { - log.info("failed to register geofences"); - } }); } public void cancel(final Geofence geofence) { - googleApiClientProvider.getApi(new GoogleApiClientProvider.withApi() { + newClient(new GoogleApi.GoogleApiClientConnectionHandler() { @Override - public void doWork(GoogleApiClient googleApiClient) { + public void onConnect(final GoogleApiClient client) { LocationServices.GeofencingApi.removeGeofences( - googleApiClient, - asList(Long.toString(geofence.getMetadataId()))) + client, + singletonList(Long.toString(geofence.getMetadataId()))) .setResultCallback(new ResultCallback() { @Override public void onResult(Status status) { @@ -86,17 +80,20 @@ public class GeofenceApi { } else { log.error("Failed to remove {}", geofence); } + + client.disconnect(); } }); } - - @Override - public void onConnectionFailed(ConnectionResult connectionResult) { - log.info("failed to cancel geofence"); - } }); } + private void newClient(final GoogleApi.GoogleApiClientConnectionHandler handler) { + new GoogleApi(context) + .requestLocationServices() + .connect(handler); + } + private List getRequests(List geofences) { return newArrayList(transform(geofences, new Function() { @Override diff --git a/src/googleplay/java/org/tasks/location/GeofenceTransitionsIntentService.java b/src/googleplay/java/org/tasks/location/GeofenceTransitionsIntentService.java index 2afbab791..600146a35 100644 --- a/src/googleplay/java/org/tasks/location/GeofenceTransitionsIntentService.java +++ b/src/googleplay/java/org/tasks/location/GeofenceTransitionsIntentService.java @@ -35,15 +35,23 @@ public class GeofenceTransitionsIntentService extends InjectingIntentService { int transitionType = geofencingEvent.getGeofenceTransition(); + List triggeringGeofences = geofencingEvent.getTriggeringGeofences(); + log.info("Received geofence transition: {}, {}", transitionType, triggeringGeofences); if (transitionType == com.google.android.gms.location.Geofence.GEOFENCE_TRANSITION_ENTER) { - List triggeringGeofences = geofencingEvent.getTriggeringGeofences(); - log.info("Received geofence transition: {}, {}", transitionType, triggeringGeofences); for (com.google.android.gms.location.Geofence triggerGeofence : triggeringGeofences) { - Geofence geofence = geofenceService.getGeofenceById(Long.parseLong(triggerGeofence.getRequestId())); - broadcaster.requestNotification(geofence.getMetadataId(), geofence.getTaskId()); + triggerNotification(triggerGeofence); } } else { log.warn("invalid geofence transition type: {}", transitionType); } } + + private void triggerNotification(com.google.android.gms.location.Geofence triggeringGeofence) { + try { + Geofence geofence = geofenceService.getGeofenceById(Long.parseLong(triggeringGeofence.getRequestId())); + broadcaster.requestNotification(geofence.getMetadataId(), geofence.getTaskId()); + } catch(Exception e) { + log.error(e.getMessage(), e); + } + } } \ No newline at end of file diff --git a/src/googleplay/java/org/tasks/location/GoogleApi.java b/src/googleplay/java/org/tasks/location/GoogleApi.java new file mode 100644 index 000000000..796ae084c --- /dev/null +++ b/src/googleplay/java/org/tasks/location/GoogleApi.java @@ -0,0 +1,76 @@ +package org.tasks.location; + +import android.content.Context; +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.location.LocationServices; +import com.google.android.gms.location.places.Places; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tasks.injection.ForApplication; + +import javax.inject.Inject; + +public class GoogleApi implements GoogleApiClient.OnConnectionFailedListener, 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); + } + + @Inject + public GoogleApi(@ForApplication Context context) { + builder = new GoogleApiClient.Builder(context, this, this) + .addConnectionCallbacks(this); + } + + public GoogleApi requestLocationServices() { + builder.addApi(LocationServices.API); + return this; + } + + public GoogleApi requestGeoData() { + builder.addApi(Places.GEO_DATA_API); + return this; + } + + public void connect(final GoogleApiClientConnectionHandler googleApiClientConnectionHandler) { + this.googleApiClientConnectionHandler = googleApiClientConnectionHandler; + googleApiClient = builder.build(); + if (!enableAutoManage) { + googleApiClient.connect(); + } + } + + protected GoogleApi enableAutoManage(FragmentActivity fragmentActivity, GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener) { + enableAutoManage = true; + builder.enableAutoManage(fragmentActivity, 0, onConnectionFailedListener); + return this; + } + + @Override + public void onConnectionFailed(ConnectionResult connectionResult) { + log.error("onConnectionFailed({})", connectionResult); + } + + @Override + public void onConnected(Bundle bundle) { + log.info("onConnected(Bundle)"); + googleApiClientConnectionHandler.onConnect(googleApiClient); + } + + @Override + public void onConnectionSuspended(int i) { + log.info("onConnectionSuspended({})", i); + } +} diff --git a/src/googleplay/java/org/tasks/location/GoogleApiClientProvider.java b/src/googleplay/java/org/tasks/location/GoogleApiClientProvider.java deleted file mode 100644 index 1fd628956..000000000 --- a/src/googleplay/java/org/tasks/location/GoogleApiClientProvider.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.tasks.location; - -import android.content.Context; -import android.os.Bundle; - -import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.location.LocationServices; -import com.google.android.gms.location.places.Places; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.tasks.injection.ForApplication; - -import javax.inject.Inject; - -public class GoogleApiClientProvider { - - private static final Logger log = LoggerFactory.getLogger(GoogleApiClientProvider.class); - - private Context context; - - public interface withApi extends GoogleApiClient.OnConnectionFailedListener { - void doWork(GoogleApiClient googleApiClient); - } - - @Inject - public GoogleApiClientProvider(@ForApplication Context context) { - this.context = context; - } - - public void getApi(final withApi callback) { - final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context) - .addOnConnectionFailedListener(callback) - .addApi(Places.GEO_DATA_API) - .addApi(LocationServices.API) - .build(); - googleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { - @Override - public void onConnected(Bundle bundle) { - log.info("onConnected({})", bundle); - callback.doWork(googleApiClient); - } - - @Override - public void onConnectionSuspended(int i) { - log.info("onConnectionSuspended({})", i); - } - }); - googleApiClient.connect(); - } -} diff --git a/src/googleplay/java/org/tasks/location/LocationApi.java b/src/googleplay/java/org/tasks/location/LocationApi.java deleted file mode 100644 index ba808ea7f..000000000 --- a/src/googleplay/java/org/tasks/location/LocationApi.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.tasks.location; - -import android.location.Location; - -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 java.util.concurrent.TimeUnit; - -import javax.inject.Inject; - -public class LocationApi { - - private static final Logger log = LoggerFactory.getLogger(LocationApi.class); - - private GoogleApiClientProvider googleApiClientProvider; - - @Inject - public LocationApi(GoogleApiClientProvider googleApiClientProvider) { - this.googleApiClientProvider = googleApiClientProvider; - } - - public void getPlaceDetails(final String placeId, final ResultCallback callback) { - googleApiClientProvider.getApi(new GoogleApiClientProvider.withApi() { - @Override - public void doWork(final GoogleApiClient googleApiClient) { - Places.GeoDataApi.getPlaceById(googleApiClient, placeId) - .setResultCallback(new ResultCallback() { - @Override - public void onResult(PlaceBuffer places) { - callback.onResult(places); - googleApiClient.disconnect(); - } - }, 15, TimeUnit.SECONDS); - } - - @Override - public void onConnectionFailed(ConnectionResult connectionResult) { - log.error("onConnectionFailed({})", connectionResult); - } - }); - } - - public void getAutocompletePredictions(final String constraint, final ResultCallback callback) { - googleApiClientProvider.getApi(new GoogleApiClientProvider.withApi() { - @Override - public void doWork(final GoogleApiClient googleApiClient) { - 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); - googleApiClient.disconnect(); - } - }, 15, TimeUnit.SECONDS); - } - - @Override - public void onConnectionFailed(ConnectionResult connectionResult) { - log.error("onConnectionFailed({})", connectionResult); - } - }); - } - - private LatLng getLastKnownLocation(GoogleApiClient googleApiClient) { - try { - Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); - return new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude()); - } catch (Exception e) { - return new LatLng(0, 0); - } - } -} diff --git a/src/googleplay/java/org/tasks/location/ManagedGoogleApi.java b/src/googleplay/java/org/tasks/location/ManagedGoogleApi.java new file mode 100644 index 000000000..41cd0c1ba --- /dev/null +++ b/src/googleplay/java/org/tasks/location/ManagedGoogleApi.java @@ -0,0 +1,97 @@ +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); + } + }, 15, TimeUnit.SECONDS); + } + + 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) { + 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 5e72d3ea8..dee085987 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 List mResultList = new ArrayList<>(); - private LocationApi locationApi; - public PlaceAutocompleteAdapter(LocationApi locationApi, Context context, int resource) { + public PlaceAutocompleteAdapter(ManagedGoogleApi managedGoogleApi, Context context, int resource) { super(context, resource); - this.locationApi = locationApi; + this.managedGoogleApi = managedGoogleApi; } @Override @@ -40,7 +40,7 @@ public class PlaceAutocompleteAdapter } public void getAutocomplete(CharSequence constraint) { - locationApi.getAutocompletePredictions(constraint.toString(), onResults); + managedGoogleApi.getAutocompletePredictions(constraint.toString(), onResults); } private ResultCallback onResults = new ResultCallback() { diff --git a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index f5482a333..064fbaca0 100755 --- a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -80,7 +80,6 @@ import org.slf4j.LoggerFactory; import org.tasks.R; import org.tasks.injection.InjectingFragment; import org.tasks.location.GeofenceService; -import org.tasks.location.LocationApi; import org.tasks.notifications.NotificationManager; import org.tasks.preferences.ActivityPreferences; import org.tasks.preferences.ResourceResolver; @@ -174,7 +173,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { @Inject TagDataDao tagDataDao; @Inject ActFmCameraModule actFmCameraModule; @Inject GeofenceService geofenceService; - @Inject LocationApi locationApi; @Inject ResourceResolver resourceResolver; // --- UI components @@ -383,7 +381,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { controlSetMap.put(getString(R.string.TEA_ctrl_notes_pref), notesControlSet); - ReminderControlSet reminderControlSet = new ReminderControlSet(locationApi, alarmService, geofenceService, this); + ReminderControlSet reminderControlSet = new ReminderControlSet(alarmService, geofenceService, this); controls.add(reminderControlSet); controlSetMap.put(getString(R.string.TEA_ctrl_reminders_pref), reminderControlSet); diff --git a/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java b/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java index 7c6595a84..e3307c1f7 100644 --- a/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java @@ -32,7 +32,6 @@ import org.tasks.dialogs.DateAndTimePickerDialog; import org.tasks.dialogs.LocationPickerDialog; import org.tasks.location.Geofence; import org.tasks.location.GeofenceService; -import org.tasks.location.LocationApi; import org.tasks.location.OnLocationPickedHandler; import java.util.ArrayList; @@ -52,6 +51,7 @@ import static org.tasks.date.DateTimeUtils.newDateTime; public class ReminderControlSet extends TaskEditControlSetBase implements AdapterView.OnItemSelectedListener { private static final Logger log = LoggerFactory.getLogger(ReminderControlSet.class); + private static final String FRAG_TAG_LOCATION_PICKER = "frag_tag_location_picker"; private Spinner mode; private Spinner addSpinner; @@ -61,7 +61,6 @@ public class ReminderControlSet extends TaskEditControlSetBase implements Adapte private LinearLayout alertContainer; private boolean whenDue; private boolean whenOverdue; - private LocationApi locationApi; private AlarmService alarmService; private GeofenceService geofenceService; private TaskEditFragment taskEditFragment; @@ -69,9 +68,8 @@ public class ReminderControlSet extends TaskEditControlSetBase implements Adapte private ArrayAdapter remindAdapter; - public ReminderControlSet(LocationApi locationApi, AlarmService alarmService, GeofenceService geofenceService, TaskEditFragment taskEditFragment) { + public ReminderControlSet(AlarmService alarmService, GeofenceService geofenceService, TaskEditFragment taskEditFragment) { super(taskEditFragment.getActivity(), R.layout.control_set_reminders); - this.locationApi = locationApi; this.alarmService = alarmService; this.geofenceService = geofenceService; this.taskEditFragment = taskEditFragment; @@ -381,12 +379,12 @@ public class ReminderControlSet extends TaskEditControlSetBase implements Adapte } else if (selected.equals(taskEditFragment.getString(R.string.pick_a_date_and_time))) { addNewAlarm(); } else if (selected.equals(taskEditFragment.getString(R.string.pick_a_location))) { - LocationPickerDialog.pickLocation(locationApi, taskEditFragment, new OnLocationPickedHandler() { + new LocationPickerDialog(new OnLocationPickedHandler() { @Override public void onLocationPicked(Geofence geofence) { addGeolocationReminder(geofence); } - }); + }).show(taskEditFragment.getChildFragmentManager(), FRAG_TAG_LOCATION_PICKER); } if (position != 0) { updateSpinner(); diff --git a/src/main/java/org/tasks/injection/DialogFragmentModule.java b/src/main/java/org/tasks/injection/DialogFragmentModule.java new file mode 100644 index 000000000..a194e274b --- /dev/null +++ b/src/main/java/org/tasks/injection/DialogFragmentModule.java @@ -0,0 +1,27 @@ +package org.tasks.injection; + +import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentActivity; + +import org.tasks.dialogs.LocationPickerDialog; + +import dagger.Module; +import dagger.Provides; + +@Module(addsTo = TasksModule.class, + injects = { + LocationPickerDialog.class + }, + library = true) +public class DialogFragmentModule { + private DialogFragment dialogFragment; + + public DialogFragmentModule(DialogFragment dialogFragment) { + this.dialogFragment = dialogFragment; + } + + @Provides + public FragmentActivity getFragmentActivity() { + return dialogFragment.getActivity(); + } +} diff --git a/src/main/java/org/tasks/injection/FragmentModule.java b/src/main/java/org/tasks/injection/FragmentModule.java index c470973bd..972a01e5a 100644 --- a/src/main/java/org/tasks/injection/FragmentModule.java +++ b/src/main/java/org/tasks/injection/FragmentModule.java @@ -3,7 +3,6 @@ package org.tasks.injection; import android.app.Activity; import android.content.Context; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; import com.todoroo.astrid.actfm.TagViewFragment; import com.todoroo.astrid.activity.TaskEditFragment; diff --git a/src/main/java/org/tasks/injection/InjectingDialogFragment.java b/src/main/java/org/tasks/injection/InjectingDialogFragment.java new file mode 100644 index 000000000..6fb87e073 --- /dev/null +++ b/src/main/java/org/tasks/injection/InjectingDialogFragment.java @@ -0,0 +1,18 @@ +package org.tasks.injection; + +import android.app.Activity; +import android.support.v4.app.DialogFragment; + +public class InjectingDialogFragment extends DialogFragment { + private boolean injected; + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + if (!injected) { + ((Injector) activity).getObjectGraph().plus(new DialogFragmentModule(this)).inject(this); + injected = true; + } + } +}