Use built-in google play services place picker

Closes #299
pull/384/head
Alex Baker 10 years ago
parent 6f9d2ae273
commit 6f6c72faff

@ -1,27 +0,0 @@
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", "UnusedParameters"})
public class LocationPickerDialog extends DialogFragment {
public LocationPickerDialog() {
}
public void show(FragmentManager childFragmentManager, String fragTagLocationPicker) {
}
public void setOnLocationPickedHandler(LocationPickerActivity locationPickerActivity) {
}
public void setOnCancelListener(LocationPickerActivity locationPickerActivity) {
}
}

@ -1,11 +0,0 @@
package org.tasks.location;
import javax.inject.Inject;
public class LocationApi {
@Inject
public LocationApi() {
}
}

@ -0,0 +1,16 @@
package org.tasks.location;
import android.app.Activity;
import android.content.Intent;
import org.tasks.preferences.Preferences;
public class PlacePicker {
public static Intent getIntent(Activity activity) {
return null;
}
public static Geofence getPlace(Activity activity, Intent data, Preferences preferences) {
return null;
}
}

@ -1,154 +0,0 @@
package org.tasks.dialogs;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.IntentSender;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AutoCompleteTextView;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
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;
import com.google.android.gms.maps.model.LatLng;
import org.tasks.R;
import org.tasks.injection.InjectingDialogFragment;
import org.tasks.location.Geofence;
import org.tasks.location.GoogleApi;
import org.tasks.location.OnLocationPickedHandler;
import org.tasks.location.PlaceAutocompleteAdapter;
import org.tasks.preferences.ActivityPreferences;
import javax.inject.Inject;
import timber.log.Timber;
public class LocationPickerDialog extends InjectingDialogFragment implements GoogleApiClient.OnConnectionFailedListener {
private static final int RC_RESOLVE_GPS_ISSUE = 10009;
private PlaceAutocompleteAdapter mAdapter;
@Inject FragmentActivity fragmentActivity;
@Inject GoogleApi googleApi;
@Inject DialogBuilder dialogBuilder;
@Inject ActivityPreferences activityPreferences;
private OnLocationPickedHandler onLocationPickedHandler;
private DialogInterface.OnCancelListener onCancelListener;
private boolean resolvingError;
public void setOnLocationPickedHandler(OnLocationPickedHandler onLocationPickedHandler) {
this.onLocationPickedHandler = onLocationPickedHandler;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
activityPreferences.applyDialogTheme();
googleApi.connect(this);
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
View view = layoutInflater.inflate(R.layout.location_picker_dialog, null);
AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) view.findViewById(R.id.address_entry);
autoCompleteTextView.setOnItemClickListener(mAutocompleteClickListener);
mAdapter = new PlaceAutocompleteAdapter(googleApi, fragmentActivity, android.R.layout.simple_list_item_1);
autoCompleteTextView.setAdapter(mAdapter);
return dialogBuilder.newDialog()
.setView(view)
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (onCancelListener != null) {
onCancelListener.onCancel(dialog);
}
}
})
.show();
}
@Override
public void onDestroyView() {
super.onDestroyView();
googleApi.disconnect();
}
private void error(String text) {
Timber.e(text);
Toast.makeText(fragmentActivity, text, Toast.LENGTH_LONG).show();
}
private AdapterView.OnItemClickListener mAutocompleteClickListener
= new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final PlaceAutocompleteAdapter.PlaceAutocomplete item = mAdapter.getItem(position);
final String placeId = String.valueOf(item.placeId);
Timber.i("Autocomplete item selected: %s", item.description);
googleApi.getPlaceDetails(placeId, mUpdatePlaceDetailsCallback);
}
};
private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback
= new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
if (places.getStatus().isSuccess()) {
final Place place = places.get(0);
LatLng latLng = place.getLatLng();
Geofence geofence = new Geofence(place.getName().toString(), latLng.latitude, latLng.longitude, activityPreferences.getIntegerFromString(R.string.p_geofence_radius, 250));
Timber.i("Picked %s", geofence);
onLocationPickedHandler.onLocationPicked(geofence);
dismiss();
} else {
error("Error looking up location details - " + places.getStatus().toString());
}
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 (resolvingError) {
Timber.i("Ignoring %s, already resolving error", connectionResult);
} else if (connectionResult.hasResolution()) {
try {
resolvingError = true;
connectionResult.startResolutionForResult(fragmentActivity, RC_RESOLVE_GPS_ISSUE);
} catch (IntentSender.SendIntentException e) {
Timber.e(e, e.getMessage());
googleApi.connect(this);
}
} else {
resolvingError = true;
GooglePlayServicesUtil
.getErrorDialog(connectionResult.getErrorCode(), fragmentActivity, RC_RESOLVE_GPS_ISSUE)
.show();
}
}
}

@ -1,117 +0,0 @@
package org.tasks.location;
import android.content.Context;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Toast;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.places.AutocompletePrediction;
import com.google.android.gms.location.places.AutocompletePredictionBuffer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import timber.log.Timber;
public class PlaceAutocompleteAdapter
extends ArrayAdapter<PlaceAutocompleteAdapter.PlaceAutocomplete> {
private final GoogleApi googleApi;
private List<PlaceAutocomplete> mResultList = new ArrayList<>();
public PlaceAutocompleteAdapter(GoogleApi googleApi, Context context, int resource) {
super(context, resource);
this.googleApi = googleApi;
}
@Override
public int getCount() {
return mResultList == null ? 0 : mResultList.size();
}
@Override
public PlaceAutocomplete getItem(int position) {
return mResultList.get(position);
}
public void getAutocomplete(CharSequence constraint) {
googleApi.getAutocompletePredictions(constraint.toString(), onResults);
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
getAutocomplete(constraint);
}
filterResults.values = mResultList;
filterResults.count = mResultList.size();
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
}
};
}
private ResultCallback<AutocompletePredictionBuffer> onResults = new ResultCallback<AutocompletePredictionBuffer>() {
@Override
public void onResult(AutocompletePredictionBuffer autocompletePredictions) {
final Status status = autocompletePredictions.getStatus();
if (!status.isSuccess()) {
Toast.makeText(getContext(), "Error contacting API: " + status.toString(),
Toast.LENGTH_SHORT).show();
Timber.e("Error getting autocomplete prediction API call: %s", status.toString());
autocompletePredictions.release();
return;
}
Timber.i("Query completed. Received %s predictions", autocompletePredictions.getCount());
Iterator<AutocompletePrediction> iterator = autocompletePredictions.iterator();
List<PlaceAutocomplete> resultList = new ArrayList<>(autocompletePredictions.getCount());
while (iterator.hasNext()) {
AutocompletePrediction prediction = iterator.next();
resultList.add(new PlaceAutocomplete(prediction.getPlaceId(),
prediction.getDescription()));
}
setResults(resultList);
autocompletePredictions.release();
}
};
private void setResults(List<PlaceAutocomplete> results) {
mResultList = results;
if (mResultList != null && mResultList.size() > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
public class PlaceAutocomplete {
public CharSequence placeId;
public CharSequence description;
PlaceAutocomplete(CharSequence placeId, CharSequence description) {
this.placeId = placeId;
this.description = description;
}
@Override
public String toString() {
return description.toString();
}
}
}

@ -0,0 +1,41 @@
package org.tasks.location;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.maps.model.LatLng;
import org.tasks.R;
import org.tasks.preferences.Preferences;
import timber.log.Timber;
public class PlacePicker {
public static Intent getIntent(Activity activity) {
com.google.android.gms.location.places.ui.PlacePicker.IntentBuilder builder =
new com.google.android.gms.location.places.ui.PlacePicker.IntentBuilder();
try {
return builder.build(activity);
} catch (GooglePlayServicesRepairableException e) {
Timber.e(e, e.getMessage());
activity.startActivity(e.getIntent());
} catch (GooglePlayServicesNotAvailableException e) {
Timber.e(e, e.getMessage());
Toast.makeText(activity, R.string.common_google_play_services_notification_ticker, Toast.LENGTH_LONG).show();
}
return null;
}
public static Geofence getPlace(Context context, Intent data, Preferences preferences) {
Place place = com.google.android.gms.location.places.ui.PlacePicker.getPlace(context, data);
LatLng latLng = place.getLatLng();
Geofence geofence = new Geofence(place.getName().toString(), latLng.latitude, latLng.longitude, preferences.getIntegerFromString(R.string.p_geofence_radius, 250));
Timber.i("Picked %s", geofence);
return geofence;
}
}

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/horizontal_page_margin"
android:paddingRight="@dimen/horizontal_page_margin"
android:paddingTop="@dimen/vertical_page_margin"
android:paddingBottom="@dimen/vertical_page_margin">
<AutoCompleteTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:layout_gravity="top"
android:inputType="textPostalAddress"
android:imeOptions="flagNoExtractUi"
android:hint="@string/type_a_location"
android:id="@+id/address_entry" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/powered_by_google_light"
android:layout_gravity="end"/>
</LinearLayout>

@ -106,10 +106,6 @@
android:theme="@style/Theme.AppCompat.Dialog"
android:taskAffinity="" />
<activity
android:name=".activities.LocationPickerActivity"
android:theme="@style/TranslucentDialog" />
<activity
android:name=".activities.SortActivity"
android:theme="@style/TranslucentDialog" />

@ -71,12 +71,12 @@ import com.todoroo.astrid.utility.Flags;
import org.tasks.R;
import org.tasks.activities.AddAttachmentActivity;
import org.tasks.activities.LocationPickerActivity;
import org.tasks.activities.TimePickerActivity;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.InjectingFragment;
import org.tasks.location.Geofence;
import org.tasks.location.GeofenceService;
import org.tasks.location.PlacePicker;
import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.preferences.PermissionRequestor;
@ -827,13 +827,15 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
} else {
Timber.e("Invalid timestamp");
}
} else if (requestCode == ReminderControlSet.REQUEST_LOCATION_REMINDER && resultCode == Activity.RESULT_OK) {
Geofence geofence = (Geofence) data.getSerializableExtra(LocationPickerActivity.EXTRA_GEOFENCE);
} else if (requestCode == ReminderControlSet.REQUEST_LOCATION_REMINDER) {
if (resultCode == Activity.RESULT_OK) {
Geofence geofence = PlacePicker.getPlace(getActivity(), data, preferences);
if (geofence != null) {
reminderControlSet.addGeolocationReminder(geofence);
} else {
Timber.e("Invalid geofence");
}
}
} else if (editNotes != null && editNotes.activityResult(requestCode, resultCode, data)) {
return;
} else if (requestCode == REQUEST_CODE_RECORD && resultCode == Activity.RESULT_OK) {

@ -20,7 +20,7 @@ import android.widget.ListView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import com.google.api.client.repackaged.com.google.common.base.Strings;
import com.google.common.base.Strings;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
@ -47,8 +47,6 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;
import static com.google.common.collect.Sets.difference;
@ -136,7 +134,7 @@ public final class TagsControlSet extends PopupControlSet {
newTags.removeViewAt(i);
} else if (!Iterables.any(tags, new Predicate<String>() {
@Override
public boolean apply(@Nullable String input) {
public boolean apply(String input) {
return text.equalsIgnoreCase(input);
}
})) {

@ -28,9 +28,9 @@ import com.todoroo.astrid.helper.TaskEditControlSetBase;
import org.tasks.R;
import org.tasks.activities.DateAndTimePickerActivity;
import org.tasks.activities.LocationPickerActivity;
import org.tasks.location.Geofence;
import org.tasks.location.GeofenceService;
import org.tasks.location.PlacePicker;
import org.tasks.preferences.PermissionRequestor;
import org.tasks.preferences.Preferences;
import org.tasks.time.DateTime;
@ -391,7 +391,10 @@ public class ReminderControlSet extends TaskEditControlSetBase implements Adapte
}
public void pickLocation() {
taskEditFragment.startActivityForResult(new Intent(taskEditFragment.getActivity(), LocationPickerActivity.class), REQUEST_LOCATION_REMINDER);
Intent intent = PlacePicker.getIntent(taskEditFragment.getActivity());
if (intent != null) {
taskEditFragment.startActivityForResult(intent, REQUEST_LOCATION_REMINDER);
}
}
@Override

@ -1,54 +0,0 @@
package org.tasks.activities;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import org.tasks.dialogs.LocationPickerDialog;
import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.location.Geofence;
import org.tasks.location.OnLocationPickedHandler;
import org.tasks.preferences.ActivityPreferences;
import javax.inject.Inject;
public class LocationPickerActivity extends InjectingAppCompatActivity implements OnLocationPickedHandler, DialogInterface.OnCancelListener {
private static final String FRAG_TAG_LOCATION_PICKER = "frag_tag_location_picker";
public static final String EXTRA_GEOFENCE = "extra_geofence";
@Inject ActivityPreferences activityPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityPreferences.applyDialogTheme();
FragmentManager supportFragmentManager = getSupportFragmentManager();
LocationPickerDialog dialog = (LocationPickerDialog) supportFragmentManager.findFragmentByTag(FRAG_TAG_LOCATION_PICKER);
if (dialog == null) {
dialog = new LocationPickerDialog();
dialog.show(supportFragmentManager, FRAG_TAG_LOCATION_PICKER);
}
dialog.setOnCancelListener(this);
dialog.setOnLocationPickedHandler(this);
}
@Override
public void onLocationPicked(final Geofence geofence) {
setResult(RESULT_OK, new Intent() {{
putExtra(EXTRA_GEOFENCE, geofence);
}});
finish();
}
@Override
public void onCancel(DialogInterface dialog) {
setResult(RESULT_CANCELED);
finish();
}
}

@ -34,7 +34,6 @@ import org.tasks.activities.DonationActivity;
import org.tasks.activities.ExportTaskActivity;
import org.tasks.activities.FilterSelectionActivity;
import org.tasks.activities.ImportTaskActivity;
import org.tasks.activities.LocationPickerActivity;
import org.tasks.activities.PurgeDeletedActivity;
import org.tasks.activities.ResetPreferencesActivity;
import org.tasks.activities.SortActivity;
@ -89,7 +88,6 @@ import dagger.Provides;
ReminderPreferences.class,
AppearancePreferences.class,
BackupPreferences.class,
LocationPickerActivity.class,
NotificationActivity.class,
HelpAndFeedbackActivity.class,
DateShortcutPreferences.class,

@ -4,11 +4,9 @@ import android.app.Activity;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import org.tasks.activities.AddAttachmentActivity;
import org.tasks.activities.CalendarSelectionDialog;
import org.tasks.dialogs.AccountSelectionDialog;
import org.tasks.dialogs.AddAttachmentDialog;
import org.tasks.dialogs.LocationPickerDialog;
import org.tasks.reminders.MissedCallDialog;
import org.tasks.reminders.NotificationDialog;
import org.tasks.reminders.SnoozeDialog;
@ -18,7 +16,6 @@ import dagger.Provides;
@Module(addsTo = TasksModule.class,
injects = {
LocationPickerDialog.class,
NotificationDialog.class,
SnoozeDialog.class,
MissedCallDialog.class,

@ -1,5 +0,0 @@
package org.tasks.location;
public interface OnLocationPickedHandler {
void onLocationPicked(Geofence geofence);
}

@ -221,7 +221,6 @@
<string name="randomly">عشوائياً</string>
<string name="pick_a_date_and_time">اختر تاريخ و وقت</string>
<string name="pick_a_location">أختر الموقع</string>
<string name="type_a_location">أدخل الموقع</string>
<string-array name="sync_SPr_interval_entries">
<item>تعطيل</item>
<item>كل 15 دقيقة</item>

@ -369,7 +369,6 @@
<string name="pick_a_time">Избери време</string>
<string name="pick_a_date_and_time">Избери дата и време</string>
<string name="pick_a_location">Избери местоположение</string>
<string name="type_a_location">Въведи местоположение</string>
<string name="when_overdue">След крайния срок</string>
<string name="when_due">При краен срок</string>
<string name="geofence_radius_title">Радиус (метри)</string>

@ -348,7 +348,6 @@
<string name="pick_a_time">Uhrzeit auswählen</string>
<string name="pick_a_date_and_time">Tag und Uhrzeit auswählen</string>
<string name="pick_a_location">Ort auswählen</string>
<string name="type_a_location">Ort festlegen</string>
<string name="when_overdue">Wenn überfällig</string>
<string name="when_due">Wenn fällig</string>
<string name="geofence_radius_title">Radius (Meter)</string>

@ -360,7 +360,6 @@
<string name="pick_a_time">Elegir hora</string>
<string name="pick_a_date_and_time">Elegir fecha y hora</string>
<string name="pick_a_location">Elegir ubicación</string>
<string name="type_a_location">Escribe la ubicación</string>
<string name="when_overdue">Cuando atrasada</string>
<string name="when_due">Cuando vencimiento</string>
<string name="geofence_radius_title">Radio (metros)</string>

@ -351,7 +351,6 @@
<string name="pick_a_time">Choisir une heure</string>
<string name="pick_a_date_and_time">Choisir date et heure</string>
<string name="pick_a_location">Choisir une localisation</string>
<string name="type_a_location">Entrer une localisation</string>
<string name="when_overdue">En cas de retard</string>
<string name="when_due">A l\'échéance</string>
<string name="geofence_radius_title">Rayon (mètres)</string>

@ -363,7 +363,6 @@ Se visualizzi questo errore più volte, ti consigliamo di cancellare tutti i dat
<string name="pick_a_time">Scegli un\'ora</string>
<string name="pick_a_date_and_time">Scegli data e ora</string>
<string name="pick_a_location">Seleziona una posizione</string>
<string name="type_a_location">Inserisci posizione</string>
<string name="when_overdue">Quando scaduta</string>
<string name="when_due">Alla scadenza</string>
<string name="geofence_radius_title">Raggio (metri)</string>

@ -368,7 +368,6 @@
<string name="pick_a_time">時間を選択</string>
<string name="pick_a_date_and_time">日付と時間を選択</string>
<string name="pick_a_location">場所を選択</string>
<string name="type_a_location">場所を入力</string>
<string name="when_overdue">期限を過ぎたとき</string>
<string name="when_due">期限に</string>
<string name="geofence_radius_title">半径 (メートル)</string>

@ -370,7 +370,6 @@ Tasks의 백업에서 당신의 일정을 복구하시기 바랍니다.
<string name="pick_a_time">시간 선택</string>
<string name="pick_a_date_and_time">날짜와 시간 선택</string>
<string name="pick_a_location">위치 선택</string>
<string name="type_a_location">위치 입력</string>
<string name="when_overdue">일정 마감일이 지났을 때</string>
<string name="when_due">일정 마감일에</string>
<string name="geofence_radius_title">반경 (미터 단위)</string>

@ -362,7 +362,6 @@
<string name="pick_a_time">Kies een tijd</string>
<string name="pick_a_date_and_time">Kies een datum en tijd</string>
<string name="pick_a_location">Kies een locatie</string>
<string name="type_a_location">Type een locatie</string>
<string name="when_overdue">Na de einddatum</string>
<string name="when_due">Op de eindtijd</string>
<string name="geofence_responsiveness_title">Antwoord tijd (hogere waarde verbruikt meer batterij)</string>

@ -360,7 +360,6 @@ das tarefas através de um backup em Definições-&gt;Sincronização e backup-&
<string name="pick_a_time">Escolha a hora</string>
<string name="pick_a_date_and_time">Escolha a data e a hora</string>
<string name="pick_a_location">Escolha o local</string>
<string name="type_a_location">Escreva o local</string>
<string name="when_overdue">Se data limite ultrapassada</string>
<string name="when_due">Na data limite</string>
<string name="geofence_radius_title">Raio (metros)</string>

@ -367,7 +367,6 @@
<string name="pick_a_time">Время</string>
<string name="pick_a_date_and_time">Дата и время</string>
<string name="pick_a_location">По местонахождению</string>
<string name="type_a_location">Введите рвсположение</string>
<string name="when_overdue">Когда просрочено</string>
<string name="when_due">В срок</string>
<string name="geofence_radius_title">Радиус (в метрах)</string>

@ -352,7 +352,6 @@
<string name="pick_a_time">Vybrať čas</string>
<string name="pick_a_date_and_time">Vybrať dátum a čas</string>
<string name="pick_a_location">Vybrať lokalitu</string>
<string name="type_a_location">Typ lokalizácie</string>
<string name="when_overdue">Keď po termíne</string>
<string name="when_due">Keď v termíne</string>
<string name="geofence_radius_title">Okruh (v metroch)</string>

@ -91,7 +91,6 @@
<string name="pick_a_time">Pick a time</string>
<string name="pick_a_date_and_time">Pick a date and time</string>
<string name="pick_a_location">Pick a location</string>
<string name="type_a_location">Type a location</string>
<string name="when_overdue">When overdue</string>
<string name="when_due">When due</string>
<string name="geofence_radius_title">Radius (meters)</string>

Loading…
Cancel
Save