Make radius configurable per location

pull/757/head
Alex Baker 7 years ago
parent 49fe296a61
commit b405e87b49

@ -17,9 +17,7 @@ import com.google.android.gms.location.GeofencingRequest;
import com.google.android.gms.location.LocationServices;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.data.Location;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.PermissionChecker;
@ -29,7 +27,6 @@ import timber.log.Timber;
public class GeofenceApi {
private final Context context;
private final Preferences preferences;
private final PermissionChecker permissionChecker;
@Inject
@ -38,7 +35,6 @@ public class GeofenceApi {
Preferences preferences,
PermissionChecker permissionChecker) {
this.context = context;
this.preferences = preferences;
this.permissionChecker = permissionChecker;
}
@ -115,11 +111,6 @@ public class GeofenceApi {
}
private com.google.android.gms.location.Geofence toGoogleGeofence(Location location) {
int radius = preferences.getIntegerFromString(R.string.p_geofence_radius, 250);
int responsiveness =
(int)
TimeUnit.SECONDS.toMillis(
preferences.getIntegerFromString(R.string.p_geofence_responsiveness, 60));
int transitionTypes = 0;
if (location.isArrival()) {
transitionTypes |= GeofencingRequest.INITIAL_TRIGGER_ENTER;
@ -128,8 +119,7 @@ public class GeofenceApi {
transitionTypes |= GeofencingRequest.INITIAL_TRIGGER_EXIT;
}
return new com.google.android.gms.location.Geofence.Builder()
.setCircularRegion(location.getLatitude(), location.getLongitude(), radius)
.setNotificationResponsiveness(responsiveness)
.setCircularRegion(location.getLatitude(), location.getLongitude(), location.getRadius())
.setRequestId(Long.toString(location.getId()))
.setTransitionTypes(transitionTypes)
.setExpirationDuration(NEVER_EXPIRE)

@ -52,7 +52,7 @@ public class PlacePicker {
}
location.setLatitude(latLng.latitude);
location.setLongitude(latLng.longitude);
location.setRadius(preferences.getIntegerFromString(R.string.p_geofence_radius, 250));
location.setRadius(preferences.getInt(R.string.p_default_location_radius, 250));
Timber.i("Picked %s", location);
return location;
}

@ -7,6 +7,7 @@ package com.todoroo.astrid.core;
import static org.tasks.PermissionUtil.verifyPermissions;
import static org.tasks.activities.RemoteListNativePicker.newRemoteListNativePicker;
import static org.tasks.dialogs.NativeSeekBarDialog.newSeekBarDialog;
import android.content.Intent;
import android.os.Bundle;
@ -22,9 +23,11 @@ import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.calendars.AndroidCalendar;
import org.tasks.calendars.CalendarProvider;
import org.tasks.dialogs.NativeSeekBarDialog;
import org.tasks.gtasks.RemoteListSelectionHandler;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.locale.Locale;
import org.tasks.preferences.ActivityPermissionRequestor;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Device;
@ -33,9 +36,10 @@ import org.tasks.preferences.Preferences;
import org.tasks.sync.SyncAdapters;
public class DefaultsPreferences extends InjectingPreferenceActivity
implements RemoteListSelectionHandler {
implements RemoteListSelectionHandler, NativeSeekBarDialog.SeekBarCallback {
private static final String FRAG_TAG_REMOTE_LIST_SELECTION = "frag_tag_remote_list_selection";
private static final String FRAG_TAG_RADIUS_PICKER = "frag_tag_radius_picker";
private static final int REQUEST_CALENDAR_SELECTION = 10412;
@ -45,8 +49,10 @@ public class DefaultsPreferences extends InjectingPreferenceActivity
@Inject Tracker tracker;
@Inject DefaultFilterProvider defaultFilterProvider;
@Inject SyncAdapters syncAdapters;
@Inject Locale locale;
private Preference defaultCalendarPref;
private Preference defaultRadiusPref;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -76,6 +82,19 @@ public class DefaultsPreferences extends InjectingPreferenceActivity
return false;
});
updateRemoteListSummary();
defaultRadiusPref = findPreference(R.string.p_default_location_radius);
defaultRadiusPref.setOnPreferenceClickListener(
preference -> {
newSeekBarDialog(
R.layout.dialog_radius_seekbar,
75,
1000,
preferences.getInt(R.string.p_default_location_radius, 250),
0)
.show(getFragmentManager(), FRAG_TAG_RADIUS_PICKER);
return false;
});
updateRadius();
requires(syncAdapters.isSyncEnabled(), R.string.p_default_remote_list);
requires(Device.SupportsLocationServices(this), R.string.p_default_location_reminder_key);
@ -138,8 +157,20 @@ public class DefaultsPreferences extends InjectingPreferenceActivity
defaultFilter == null ? getString(R.string.dont_sync) : defaultFilter.listingTitle);
}
private void updateRadius() {
String radius =
locale.formatNumber(preferences.getInt(R.string.p_default_location_radius, 250));
defaultRadiusPref.setSummary(getString(R.string.location_radius_meters, radius));
}
@Override
public void inject(ActivityComponent component) {
component.inject(this);
}
@Override
public void valueSelected(int radius, int requestCode) {
preferences.setInt(R.string.p_default_location_radius, radius);
updateRadius();
}
}

@ -27,12 +27,8 @@ import org.tasks.activities.FilterSelectionActivity;
import org.tasks.activities.TimePickerActivity;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.preferences.ActivityPermissionRequestor;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Device;
import org.tasks.preferences.PermissionChecker;
import org.tasks.receivers.Badger;
import org.tasks.scheduling.GeofenceSchedulingIntentService;
import org.tasks.scheduling.NotificationSchedulerIntentService;
import org.tasks.time.DateTime;
import org.tasks.ui.TimePreference;
@ -44,9 +40,6 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
private static final int REQUEST_DEFAULT_REMIND = 10003;
private static final int REQUEST_BADGE_LIST = 10004;
@Inject Device device;
@Inject ActivityPermissionRequestor permissionRequestor;
@Inject PermissionChecker permissionChecker;
@Inject Badger badger;
@Inject DefaultFilterProvider defaultFilterProvider;
@Inject LocalBroadcastManager localBroadcastManager;
@ -63,7 +56,6 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
R.string.p_rmd_quietStart,
R.string.p_rmd_quietEnd,
R.string.p_rmd_persistent);
resetGeofencesOnChange(R.string.p_geofence_radius, R.string.p_geofence_responsiveness);
initializeRingtonePreference();
initializeTimePreference(getDefaultRemindTimePreference(), REQUEST_DEFAULT_REMIND);
@ -109,7 +101,6 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
return true;
});
requires(device.supportsLocationServices(), R.string.geolocation_reminders);
requires(atLeastOreo(), R.string.notification_channel_settings);
requires(atLeastMarshmallow(), R.string.battery_optimization_settings);
requires(
@ -143,17 +134,6 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
}
}
private void resetGeofencesOnChange(int... resIds) {
for (int resId : resIds) {
findPreference(getString(resId))
.setOnPreferenceChangeListener(
(preference, newValue) -> {
GeofenceSchedulingIntentService.enqueueWork(this);
return true;
});
}
}
private void initializeTimePreference(final TimePreference preference, final int requestCode) {
preference.setOnPreferenceClickListener(
ignored -> {

@ -1,6 +1,8 @@
package org.tasks.dialogs;
import android.app.Activity;
import static android.app.Activity.RESULT_OK;
import static org.tasks.dialogs.SeekBarDialog.newSeekBarDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
@ -24,14 +26,19 @@ import org.tasks.data.Location;
import org.tasks.injection.DialogFragmentComponent;
import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingDialogFragment;
import org.tasks.locale.Locale;
public class LocationDialog extends InjectingDialogFragment {
public static final String EXTRA_LOCATION = "extra_location";
public static final String EXTRA_ORIGINAL = "extra_original";
private static final String FRAG_TAG_SEEKBAR = "frag_tag_seekbar";
private static final int REQUEST_RADIUS = 10101;
@Inject DialogBuilder dialogBuilder;
@Inject @ForActivity Context context;
@Inject Locale locale;
@BindView(R.id.location_arrival)
Switch arrivalView;
@ -45,6 +52,9 @@ public class LocationDialog extends InjectingDialogFragment {
@BindView(R.id.location_url)
TextView urlView;
@BindView(R.id.location_radius_value)
TextView radiusValue;
public static LocationDialog newLocationDialog(Location location) {
LocationDialog dialog = new LocationDialog();
Bundle args = new Bundle();
@ -66,6 +76,7 @@ public class LocationDialog extends InjectingDialogFragment {
ButterKnife.bind(this, view);
arrivalView.setChecked(location.isArrival());
departureView.setChecked(location.isDeparture());
updateRadius(location.getRadius());
String phone = location.getPhone();
if (!Strings.isNullOrEmpty(phone)) {
callView.setVisibility(View.VISIBLE);
@ -96,6 +107,7 @@ public class LocationDialog extends InjectingDialogFragment {
Location result = getOriginal();
result.setArrival(arrivalView.isChecked());
result.setDeparture(departureView.isChecked());
result.setRadius((int) radiusValue.getTag());
return result;
}
@ -115,7 +127,7 @@ public class LocationDialog extends InjectingDialogFragment {
Intent data = new Intent();
data.putExtra(EXTRA_ORIGINAL, (Parcelable) getOriginal());
data.putExtra(EXTRA_LOCATION, (Parcelable) result);
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data);
getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_OK, data);
dismiss();
}
@ -126,6 +138,17 @@ public class LocationDialog extends InjectingDialogFragment {
outState.putParcelable(EXTRA_LOCATION, toLocation());
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_RADIUS) {
if (resultCode == RESULT_OK) {
updateRadius(data.getIntExtra(SeekBarDialog.EXTRA_VALUE, 250));
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@OnClick(R.id.location_url)
void openUrl() {
Intent intent = new Intent(Intent.ACTION_VIEW);
@ -140,6 +163,19 @@ public class LocationDialog extends InjectingDialogFragment {
startActivity(intent);
}
@OnClick(R.id.location_radius)
void selectRadius() {
SeekBarDialog seekBarDialog =
newSeekBarDialog(R.layout.dialog_radius_seekbar, 75, 1000, toLocation().getRadius());
seekBarDialog.setTargetFragment(this, REQUEST_RADIUS);
seekBarDialog.show(getFragmentManager(), FRAG_TAG_SEEKBAR);
}
private void updateRadius(int radius) {
radiusValue.setText(getString(R.string.location_radius_meters, locale.formatNumber(radius)));
radiusValue.setTag(radius);
}
@Override
protected void inject(DialogFragmentComponent component) {
component.inject(this);

@ -0,0 +1,109 @@
package org.tasks.dialogs;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.rey.material.widget.Slider;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.injection.InjectingNativeDialogFragment;
import org.tasks.injection.NativeDialogFragmentComponent;
import org.tasks.locale.Locale;
import org.tasks.themes.Theme;
public class NativeSeekBarDialog extends InjectingNativeDialogFragment {
private static final String EXTRA_LAYOUT = "extra_layout";
private static final String EXTRA_INITIAL_VALUE = "extra_initial_value";
private static final String EXTRA_MIN = "extra_min";
private static final String EXTRA_MAX = "extra_max";
private static final String EXTRA_REQUEST_CODE = "extra_request_code";
@BindView(R.id.slider)
Slider slider;
@BindView(R.id.min)
TextView min;
@BindView(R.id.max)
TextView max;
@Inject DialogBuilder dialogBuilder;
@Inject Theme theme;
@Inject Locale locale;
private int requestCode;
private SeekBarCallback callback;
public static NativeSeekBarDialog newSeekBarDialog(
int layout, int min, int max, int initial, int requestCode) {
NativeSeekBarDialog dialog = new NativeSeekBarDialog();
Bundle args = new Bundle();
args.putInt(EXTRA_LAYOUT, layout);
args.putInt(EXTRA_MIN, min);
args.putInt(EXTRA_MAX, max);
args.putInt(EXTRA_INITIAL_VALUE, initial);
args.putInt(EXTRA_REQUEST_CODE, requestCode);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle arguments = getArguments();
requestCode = arguments.getInt(EXTRA_REQUEST_CODE);
int initial =
savedInstanceState == null
? arguments.getInt(EXTRA_INITIAL_VALUE)
: savedInstanceState.getInt(EXTRA_INITIAL_VALUE);
int layout = arguments.getInt(EXTRA_LAYOUT);
LayoutInflater layoutInflater = theme.getLayoutInflater(getActivity());
View view = layoutInflater.inflate(layout, null);
ButterKnife.bind(this, view);
slider.setValueDescriptionProvider(value -> locale.formatNumber(value));
slider.setValueRange(arguments.getInt(EXTRA_MIN), arguments.getInt(EXTRA_MAX), false);
slider.setValue(initial, true);
min.setText(locale.formatNumber(slider.getMinValue()));
max.setText(locale.formatNumber(slider.getMaxValue()));
return dialogBuilder
.newDialog()
.setView(view)
.setPositiveButton(
android.R.string.ok,
(dialogInterface, i) -> callback.valueSelected(slider.getValue(), requestCode))
.setNegativeButton(android.R.string.cancel, null)
.create();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callback = (SeekBarCallback) activity;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_INITIAL_VALUE, slider.getValue());
}
@Override
protected void inject(NativeDialogFragmentComponent component) {
component.inject(this);
}
public interface SeekBarCallback {
void valueSelected(int value, int requestCode);
}
}

@ -2,28 +2,29 @@ package org.tasks.dialogs;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.rey.material.widget.Slider;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.injection.InjectingNativeDialogFragment;
import org.tasks.injection.NativeDialogFragmentComponent;
import org.tasks.injection.DialogFragmentComponent;
import org.tasks.injection.InjectingDialogFragment;
import org.tasks.locale.Locale;
import org.tasks.themes.Theme;
public class SeekBarDialog extends InjectingNativeDialogFragment {
public class SeekBarDialog extends InjectingDialogFragment {
private static final String EXTRA_LAYOUT = "extra_layout";
private static final String EXTRA_INITIAL_VALUE = "extra_initial_value";
public static final String EXTRA_VALUE = "extra_value";
private static final String EXTRA_MIN = "extra_min";
private static final String EXTRA_MAX = "extra_max";
private static final String EXTRA_REQUEST_CODE = "extra_request_code";
@BindView(R.id.slider)
Slider slider;
@ -37,20 +38,15 @@ public class SeekBarDialog extends InjectingNativeDialogFragment {
@Inject DialogBuilder dialogBuilder;
@Inject Theme theme;
@Inject Locale locale;
private int initial;
private int requestCode;
private SeekBarCallback callback;
public static SeekBarDialog newSeekBarDialog(
int layout, int min, int max, int initial, int requestCode) {
static SeekBarDialog newSeekBarDialog(int layout, int min, int max, int initial) {
SeekBarDialog dialog = new SeekBarDialog();
Bundle args = new Bundle();
args.putInt(EXTRA_LAYOUT, layout);
args.putInt(EXTRA_MIN, min);
args.putInt(EXTRA_MAX, max);
args.putInt(EXTRA_VALUE, initial);
dialog.setArguments(args);
dialog.initial = initial;
dialog.requestCode = requestCode;
return dialog;
}
@ -58,53 +54,50 @@ public class SeekBarDialog extends InjectingNativeDialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle arguments = getArguments();
if (savedInstanceState != null) {
initial = savedInstanceState.getInt(EXTRA_INITIAL_VALUE);
requestCode = savedInstanceState.getInt(EXTRA_REQUEST_CODE);
}
int initial =
savedInstanceState == null
? arguments.getInt(EXTRA_VALUE)
: savedInstanceState.getInt(EXTRA_VALUE);
int layout = arguments.getInt(EXTRA_LAYOUT);
LayoutInflater layoutInflater = theme.getLayoutInflater(getActivity());
View view = layoutInflater.inflate(layout, null);
ButterKnife.bind(this, view);
slider.setValue(initial, true);
slider.setValueDescriptionProvider(value -> locale.formatNumber(value));
slider.setValueRange(arguments.getInt(EXTRA_MIN), arguments.getInt(EXTRA_MAX), false);
slider.setValue(initial, true);
min.setText(locale.formatNumber(slider.getMinValue()));
max.setText(locale.formatNumber(slider.getMaxValue()));
return dialogBuilder
.newDialog()
.setView(view)
.setPositiveButton(
android.R.string.ok,
(dialogInterface, i) -> callback.valueSelected(slider.getValue(), requestCode))
.setOnCancelListener(this::sendResult)
.setPositiveButton(android.R.string.ok, this::sendResult)
.setNegativeButton(android.R.string.cancel, null)
.show();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
public void onCancel(DialogInterface dialog) {
sendResult(dialog);
}
callback = (SeekBarCallback) activity;
private void sendResult(DialogInterface d, int... i) {
Intent data = new Intent();
data.putExtra(EXTRA_VALUE, slider.getValue());
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_INITIAL_VALUE, slider.getValue());
outState.putInt(EXTRA_REQUEST_CODE, requestCode);
outState.putInt(EXTRA_VALUE, slider.getValue());
}
@Override
protected void inject(NativeDialogFragmentComponent component) {
protected void inject(DialogFragmentComponent component) {
component.inject(this);
}
public interface SeekBarCallback {
void valueSelected(int value, int requestCode);
}
}

@ -7,6 +7,7 @@ import org.tasks.dialogs.AddAttachmentDialog;
import org.tasks.dialogs.ColorPickerDialog;
import org.tasks.dialogs.LocationDialog;
import org.tasks.dialogs.RecordAudioDialog;
import org.tasks.dialogs.SeekBarDialog;
import org.tasks.dialogs.SortDialog;
import org.tasks.gtasks.CreateListDialog;
import org.tasks.gtasks.DeleteListDialog;
@ -46,4 +47,6 @@ public interface DialogFragmentComponent {
void inject(BasicRecurrenceDialog basicRecurrenceDialog);
void inject(LocationDialog locationDialog);
void inject(SeekBarDialog seekBarDialog);
}

@ -5,8 +5,8 @@ import org.tasks.activities.RemoteListNativePicker;
import org.tasks.dialogs.ExportTasksDialog;
import org.tasks.dialogs.ImportTasksDialog;
import org.tasks.dialogs.NativeDatePickerDialog;
import org.tasks.dialogs.NativeSeekBarDialog;
import org.tasks.dialogs.NativeTimePickerDialog;
import org.tasks.dialogs.SeekBarDialog;
import org.tasks.locale.LocalePickerDialog;
@Subcomponent(modules = NativeDialogFragmentModule.class)
@ -20,7 +20,7 @@ public interface NativeDialogFragmentComponent {
void inject(NativeTimePickerDialog nativeTimePickerDialog);
void inject(SeekBarDialog seekBarDialog);
void inject(NativeSeekBarDialog nativeSeekBarDialog);
void inject(ExportTasksDialog exportTasksDialog);

@ -1,6 +1,6 @@
package org.tasks.preferences;
import static org.tasks.dialogs.SeekBarDialog.newSeekBarDialog;
import static org.tasks.dialogs.NativeSeekBarDialog.newSeekBarDialog;
import android.content.Intent;
import android.os.Bundle;
@ -13,13 +13,13 @@ import org.tasks.R;
import org.tasks.activities.FilterSelectionActivity;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.dialogs.SeekBarDialog;
import org.tasks.dialogs.NativeSeekBarDialog;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.locale.Locale;
public class AppearancePreferences extends InjectingPreferenceActivity
implements SeekBarDialog.SeekBarCallback {
implements NativeSeekBarDialog.SeekBarCallback {
public static final String EXTRA_RESTART = "extra_restart";
private static final String EXTRA_FILTERS_CHANGED = "extra_filters_changed";

@ -1,6 +1,6 @@
package org.tasks.widget;
import static org.tasks.dialogs.SeekBarDialog.newSeekBarDialog;
import static org.tasks.dialogs.NativeSeekBarDialog.newSeekBarDialog;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
@ -15,7 +15,7 @@ import org.tasks.activities.ColorPickerActivity;
import org.tasks.activities.FilterSelectionActivity;
import org.tasks.analytics.Tracker;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.SeekBarDialog;
import org.tasks.dialogs.NativeSeekBarDialog;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.locale.Locale;
@ -26,7 +26,7 @@ import org.tasks.themes.ThemeColor;
import org.tasks.themes.WidgetTheme;
public class WidgetConfigActivity extends InjectingPreferenceActivity
implements SeekBarDialog.SeekBarCallback {
implements NativeSeekBarDialog.SeekBarCallback {
private static final String FRAG_TAG_OPACITY_SEEKBAR = "frag_tag_opacity_seekbar";
private static final String FRAG_TAG_FONT_SIZE_SEEKBAR = "frag_tag_font_size_seekbar";

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.rey.material.widget.Slider xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/slider"
style="@style/Material.Widget.Slider.Discrete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"
android:gravity="center"
android:minHeight="?attr/listPreferredItemHeight"
app:sl_discreteMode="true"
app:sl_stepValue="25"
app:sl_travelAnimDuration="100"/>
<TextView
android:id="@+id/min"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/slider"
android:paddingTop="5dp"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"/>
<TextView
android:id="@+id/max"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_below="@id/slider"
android:paddingTop="5dp"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"/>
</RelativeLayout>

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
@ -60,6 +61,40 @@
android:gravity="center_vertical"
android:text="@string/location_remind_departure"
android:textAppearance="?attr/textAppearanceListItemSmall"/>
<RelativeLayout
android:id="@+id/location_radius"
android:background="?attr/selectableItemBackground"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:paddingStart="@dimen/keyline_second"
android:paddingEnd="@dimen/keyline_second"
android:paddingLeft="@dimen/keyline_second"
android:paddingRight="@dimen/keyline_second">
<TextView
android:id="@+id/location_radius_value"
android:layout_width="wrap_content"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:gravity="center_vertical"
android:text="250"
android:textAppearance="?attr/textAppearanceListItem"
tools:ignore="HardcodedText"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@id/location_radius_value"
android:layout_toStartOf="@id/location_radius_value"
android:ellipsize="end"
android:gravity="center_vertical"
android:text="@string/geofence_radius"
android:textAppearance="?attr/textAppearanceListItem"/>
</RelativeLayout>
</LinearLayout>
</ScrollView>

@ -330,9 +330,6 @@
<string name="pick_a_date_and_time">Избери дата и време</string>
<string name="when_overdue">След крайния срок</string>
<string name="when_due">При краен срок</string>
<string name="geofence_radius_title">Радиус (метри)</string>
<string name="geofence_responsiveness_title">Време за отговор (по-голяма стойност запазва батерията)</string>
<string name="geolocation_reminders">Напомняния за геолокация</string>
<string name="tags">Тагове</string>
<string name="filters">Филтри</string>
<string name="date_shortcut_hour">За час</string>

@ -108,7 +108,6 @@
<string name="translations">Contribuir traduccions</string>
<string name="contact_developer">Contacta amb el desenvolupador</string>
<string name="quiet_hours_summary">Sense recordatoris durant les hores de silenci</string>
<string name="geofence_radius_title">Radi (metres)</string>
<string name="filters">Filtres</string>
<string name="filter_settings">Configuració dels filtres</string>
<string name="show_hidden">Mostra ocultes</string>

@ -221,9 +221,6 @@
<string name="randomly">Náhodně</string>
<string name="pick_a_date">Vybrat datum</string>
<string name="pick_a_time">Vybrat čas</string>
<string name="geofence_radius_title">Okruh (v metrech)</string>
<string name="geofence_responsiveness_title">Doba odezvy (vyšší hodnota šetří baterii)</string>
<string name="geolocation_reminders">Geolokační upomínky</string>
<string name="tags">Tagy</string>
<string name="filters">Filtry</string>
<string name="date_shortcut_morning">Ráno</string>

@ -322,9 +322,6 @@
<string name="pick_a_date_and_time">Tag und Uhrzeit auswählen</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>
<string name="geofence_responsiveness_title">Antwortzeit (Größere Werte sparen Akkuleistung)</string>
<string name="geolocation_reminders">Geo-/Ortsbasierte Erinnerungen</string>
<string name="tags">Schlagworte</string>
<string name="filters">Filter</string>
<string name="date_shortcut_hour">Für eine Stunde</string>

@ -326,9 +326,6 @@
<string name="pick_a_date_and_time">Elegir fecha y hora</string>
<string name="when_overdue">Si está atrasada</string>
<string name="when_due">Al vencimiento</string>
<string name="geofence_radius_title">Radio (metros)</string>
<string name="geofence_responsiveness_title">Tiempo de respuesta (valores altos mejoran autonomía de batería)</string>
<string name="geolocation_reminders">Recordatorios de Geolocalización</string>
<string name="tags">Etiquetas</string>
<string name="filters">Filtros</string>
<string name="date_shortcut_hour">Por una hora</string>

@ -219,9 +219,6 @@
<string name="pick_a_date_and_time">انتخاب یک تاریخ و زمان</string>
<string name="when_overdue">پس از موعود</string>
<string name="when_due">روز موعود</string>
<string name="geofence_radius_title">شعاع (متر)</string>
<string name="geofence_responsiveness_title">زمان پاسخگویی (مقدار بالاتر مصرف کمتر باتری)</string>
<string name="geolocation_reminders">یادآوری‌های وابسته به مکان</string>
<string name="tags">برچسب ها</string>
<string name="filters">فیلترها</string>
<string name="date_shortcut_hour">برای یک ساعت</string>

@ -323,9 +323,6 @@
<string name="pick_a_date_and_time">Valitse päivä ja aika</string>
<string name="when_overdue">Kunnes yliajalla</string>
<string name="when_due">Milloin määräaika</string>
<string name="geofence_radius_title">Säde (metriä)</string>
<string name="geofence_responsiveness_title">Vasteaika (korkeampi arvo kuluttaa enemmän akkua)</string>
<string name="geolocation_reminders">Paikannuksen muistutukset</string>
<string name="tags">Tunnisteet</string>
<string name="filters">Suodattimet</string>
<string name="date_shortcut_hour">Tunnin verran</string>

@ -314,9 +314,6 @@
<string name="pick_a_date_and_time">Choisir date et heure</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>
<string name="geofence_responsiveness_title">Temps de réponse (les valeurs élevées améliorent l\'autonomie)</string>
<string name="geolocation_reminders">Rappels géolocalisés</string>
<string name="filters">Filtres</string>
<string name="date_shortcut_hour">Pour une heure</string>
<string name="date_shortcut_morning">Matin</string>

@ -245,9 +245,6 @@
<string name="pick_a_date_and_time">Elegir fecha y hora</string>
<string name="when_overdue">Si está atrasada</string>
<string name="when_due">Al vencimiento</string>
<string name="geofence_radius_title">Radio (metros)</string>
<string name="geofence_responsiveness_title">Tiempo de respuesta (valores altos mejoran autonomía de batería)</string>
<string name="geolocation_reminders">Recordatorios de Geolocalización</string>
<string name="tags">Etiquetas</string>
<string name="filters">Filtros</string>
<string name="date_shortcut_hour">Por una hora</string>

@ -330,9 +330,6 @@
<string name="pick_a_date_and_time">Válasszon dátumot és időpontot</string>
<string name="when_overdue">Határidő lejárta után</string>
<string name="when_due">Határidő elérésekor</string>
<string name="geofence_radius_title">Távolság (méterben)</string>
<string name="geofence_responsiveness_title">Válaszidő (magasabb érték kíméli az akkumulátort)</string>
<string name="geolocation_reminders">Helyhez kötött Emlékeztetők</string>
<string name="tags">Címkék</string>
<string name="filters">Szűrők</string>
<string name="date_shortcut_hour">Egy órára</string>

@ -327,9 +327,6 @@
<string name="pick_a_date_and_time">Scegli data e ora</string>
<string name="when_overdue">Quando scaduta</string>
<string name="when_due">Alla scadenza</string>
<string name="geofence_radius_title">Raggio (metri)</string>
<string name="geofence_responsiveness_title">Tempo di risposta (valore elevato preserva batteria)</string>
<string name="geolocation_reminders">Promemoria Geolocalizzazione</string>
<string name="tags">Etichette</string>
<string name="filters">Filtri</string>
<string name="date_shortcut_hour">Per un\'ora</string>

@ -328,9 +328,6 @@
<string name="pick_a_date_and_time">בחר תאריך ושעה</string>
<string name="when_overdue">לאחר מועד היעד</string>
<string name="when_due">במועד היעד</string>
<string name="geofence_radius_title">רדיוס (במטרים)</string>
<string name="geofence_responsiveness_title">זמן תגובה (ערך גבוה חוסך בסוללה)</string>
<string name="geolocation_reminders">התראות מיקום</string>
<string name="tags">תגיות</string>
<string name="filters">פילטרים</string>
<string name="date_shortcut_hour">בעוד שעה</string>

@ -320,9 +320,6 @@
<string name="pick_a_date_and_time">日付と時間を選択</string>
<string name="when_overdue">期限を過ぎたとき</string>
<string name="when_due">期限に</string>
<string name="geofence_radius_title">半径 (メートル)</string>
<string name="geofence_responsiveness_title">応答時間 (大きい値の方がバッテリーを節約します)</string>
<string name="geolocation_reminders">位置情報リマインダー</string>
<string name="tags">タグ</string>
<string name="filters">フィルター</string>
<string name="date_shortcut_hour">1時間</string>

@ -330,9 +330,6 @@
<string name="pick_a_date_and_time">날짜와 시간 선택</string>
<string name="when_overdue">일정 마감일이 지났을 때</string>
<string name="when_due">일정 마감일에</string>
<string name="geofence_radius_title">반경 (미터 단위)</string>
<string name="geofence_responsiveness_title">반응 속도 (높은 수치일수록 배터리 절약)</string>
<string name="geolocation_reminders">위치정보 알림</string>
<string name="tags">태그</string>
<string name="filters">필터</string>
<string name="date_shortcut_hour">한 시간동안</string>

@ -327,9 +327,6 @@
<string name="pick_a_date_and_time">Pasirinkti datą ir laiką</string>
<string name="when_overdue">Terminui pasibaigus</string>
<string name="when_due">Atėjus terminui</string>
<string name="geofence_radius_title">Spindulys (metrais)</string>
<string name="geofence_responsiveness_title">Reakcijos laikas (didesnis taupys bateriją)</string>
<string name="geolocation_reminders">Geolokaciniai priminimai</string>
<string name="tags">Etiketė</string>
<string name="filters">Filtrai</string>
<string name="date_shortcut_hour">Valandai</string>

@ -139,9 +139,6 @@
<string name="source_code">Kildekode</string>
<string name="contact_developer">Kontakt utvikler</string>
<string name="rate_tasks">Gi Tasks din vurdering</string>
<string name="geofence_radius_title">Radius (meter)</string>
<string name="geofence_responsiveness_title">Responstid (høyere verdi bruker mindre batteri)</string>
<string name="geolocation_reminders">Geolokasjonsvarsler</string>
<string name="tags">Tagger</string>
<string name="filters">Filtere</string>
<string name="filter_settings">Filtreringsinnstillinger</string>

@ -325,8 +325,6 @@
<string name="pick_a_date_and_time">Kies een datum en tijd</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>
<string name="geolocation_reminders">Geolocatie Herinneringen</string>
<string name="tags">Labels</string>
<string name="date_shortcut_hour">Voor een uur</string>
<string name="date_shortcut_morning">Ochtend</string>

@ -311,9 +311,6 @@
<string name="pick_a_date_and_time">Wybierz datę i czas</string>
<string name="when_overdue">Gdy zaległe</string>
<string name="when_due">Gdy w terminie</string>
<string name="geofence_radius_title">Zasięg (metrów)</string>
<string name="geofence_responsiveness_title">Czas reakcji (wyższa wartość oszczędza baterię)</string>
<string name="geolocation_reminders">Przypomnienie geolokacyjne</string>
<string name="tags">Tagi</string>
<string name="filters">Filtry</string>
<string name="date_shortcut_hour">Na godzinę</string>

@ -325,9 +325,6 @@
<string name="pick_a_date_and_time">Escolha data e horário</string>
<string name="when_overdue">Quando vencida</string>
<string name="when_due">Quando vencer</string>
<string name="geofence_radius_title">Raio (metros)</string>
<string name="geofence_responsiveness_title">Tempo de resposta (valores maiores conservam bateria)</string>
<string name="geolocation_reminders">Lembretes com Geolocalização</string>
<string name="tags">Etiquetas</string>
<string name="filters">Filtros</string>
<string name="date_shortcut_hour">Por uma hora</string>

@ -320,9 +320,6 @@
<string name="pick_a_date_and_time">Escolha a data e a hora</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>
<string name="geofence_responsiveness_title">Tempo de resposta (valores maiores poupam bateria)</string>
<string name="geolocation_reminders">Lembretes de geolocalização</string>
<string name="tags">Etiquetas</string>
<string name="filters">Filtros</string>
<string name="date_shortcut_hour">Por uma hora</string>

@ -326,9 +326,6 @@
<string name="pick_a_date_and_time">Дата и время</string>
<string name="when_overdue">Когда просрочено</string>
<string name="when_due">В срок</string>
<string name="geofence_radius_title">Радиус (в метрах)</string>
<string name="geofence_responsiveness_title">Период отслеживания (чем выше, тем меньше расход батареи)</string>
<string name="geolocation_reminders">Напоминания по местонахождению</string>
<string name="tags">Теги</string>
<string name="filters">Фильтры</string>
<string name="date_shortcut_hour">На час</string>

@ -320,9 +320,6 @@
<string name="pick_a_date_and_time">Vybrať dátum a čas</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>
<string name="geofence_responsiveness_title">Doba odozvy (vyššia hodnota šetrí batériu)</string>
<string name="geolocation_reminders">Pripomienky polohy</string>
<string name="tags">Štítky</string>
<string name="filters">Filtre</string>
<string name="date_shortcut_hour">Za hodinu</string>

@ -244,9 +244,6 @@
<string name="pick_a_date_and_time">Ställ in datum och tid</string>
<string name="when_overdue">Efter förfallotid</string>
<string name="when_due">Vid förfallotid</string>
<string name="geofence_radius_title">Radie (meter)</string>
<string name="geofence_responsiveness_title">Svarstid (högre värde sparar batteri)</string>
<string name="geolocation_reminders">Platsbaserade påminnelser</string>
<string name="tags">Etiketter</string>
<string name="filters">Filter</string>
<string name="date_shortcut_hour">En timme</string>

@ -332,9 +332,6 @@
<string name="pick_a_date_and_time">Bir tarih ve zaman seç</string>
<string name="when_overdue">Geciktiğinde</string>
<string name="when_due">Zamanı geldiğinde</string>
<string name="geofence_radius_title">Yarıçap (metre)</string>
<string name="geofence_responsiveness_title">Yanıt süresi (yüksek değer pili korur)</string>
<string name="geolocation_reminders">Coğrafi Konum Hatırlatmaları</string>
<string name="tags">Etiketler</string>
<string name="filters">Süzgeçler</string>
<string name="date_shortcut_hour">Bir saatliğine</string>

@ -247,9 +247,6 @@
<string name="pick_a_date_and_time">Обрати дату та час</string>
<string name="when_overdue">Коли прострочено</string>
<string name="when_due">Коли заплановано час</string>
<string name="geofence_radius_title">Радіус (метри)</string>
<string name="geofence_responsiveness_title">Час відклику (вище значення зберігає заряд батареї)</string>
<string name="geolocation_reminders">Геолокаційні нагадування</string>
<string name="tags">Теги</string>
<string name="filters">Фільтри</string>
<string name="date_shortcut_hour">На годину</string>

@ -327,9 +327,6 @@
<string name="pick_a_date_and_time">选个日期和时间</string>
<string name="when_overdue">过期时</string>
<string name="when_due">到期时</string>
<string name="geofence_radius_title">半径(米)</string>
<string name="geofence_responsiveness_title">响应时间(更高的节电值)</string>
<string name="geolocation_reminders">地理位置提醒</string>
<string name="tags">标签</string>
<string name="filters">过滤器</string>
<string name="date_shortcut_hour">一个小时</string>

@ -197,8 +197,6 @@
<string name="translations">貢獻翻譯</string>
<string name="rate_tasks">為 Tasks 評分</string>
<string name="TLA_menu_donate">贊助</string>
<string name="geofence_radius_title">半徑 (公尺)</string>
<string name="geolocation_reminders">地理位置提醒</string>
<string name="tags">標籤</string>
<string name="filters">過濾</string>
<string name="date_shortcut_tomorrow_morning">明天早上</string>

@ -1,30 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="geofence_radius_values">
<item>75</item>
<item>125</item>
<item>250</item>
<item>500</item>
<item>1000</item>
</string-array>
<string-array name="geofence_responsiveness">
<item>00:15</item>
<item>00:30</item>
<item>01:00</item>
<item>05:00</item>
<item>10:00</item>
</string-array>
<string-array name="geofence_responsiveness_values">
<item>15</item>
<item>30</item>
<item>60</item>
<item>300</item>
<item>600</item>
</string-array>
<string-array name="TEA_hideUntil_spinner">
<item>@string/due_date</item>
<item>@string/due_time</item>

@ -140,6 +140,7 @@
<!-- default reminders setting (corresponds to reminder flags) -->
<string name="p_default_reminders_key">p_def_reminders</string>
<string name="p_default_location_reminder_key">p_def_location_reminders</string>
<string name="p_default_location_radius">p_def_location_radius</string>
<!-- default reminder mode setting (corresponds to entry in TEA_reminder_mode_once, TEA_reminder_mode_five, TEA_reminder_mode_nonstop) -->
<string name="p_default_reminders_mode_key">rmd_default_reminder_mode</string>
@ -182,8 +183,6 @@
<string name="TEA_ctrl_comments">TEA_ctrl_comments</string>
<string name="TEA_ctrl_gcal">TEA_ctrl_gcal</string>
<string name="TEA_ctrl_google_task_list">TEA_ctrl_gtask</string>
<string name="p_geofence_radius">geolocation_radius</string>
<string name="p_geofence_responsiveness">geofence_responsiveness</string>
<string name="p_show_hidden_tasks">show_hidden_tasks</string>
<string name="p_show_completed_tasks">show_completed_tasks</string>
<string name="p_reverse_sort">reverse_sort</string>

@ -285,6 +285,7 @@ File %1$s contained %2$s.\n\n
<!-- slide 43e: Preference: Default Reminders Title -->
<string name="EPr_default_reminders_title">Default reminders</string>
<string name="EPr_default_location_reminder_title">Default location reminders</string>
<string name="EPr_default_location_radius">Default radius</string>
<!-- slide 45d: Reminder Mode Preference: Default Reminders Duration -->
<string name="EPr_default_reminders_mode_title">Default ring/vibrate type</string>
@ -687,9 +688,8 @@ File %1$s contained %2$s.\n\n
<string name="pick_a_date_and_time">Pick a date and time</string>
<string name="when_overdue">When overdue</string>
<string name="when_due">When due</string>
<string name="geofence_radius_title">Radius (meters)</string>
<string name="geofence_responsiveness_title">Response time (higher value conserves battery)</string>
<string name="geolocation_reminders">Geolocation Reminders</string>
<string name="geofence_radius">Radius</string>
<string name="location_radius_meters">%s m</string>
<string name="tags">Tags</string>
<string name="filters">Filters</string>
<string name="date_shortcut_hour">For an hour</string>

@ -38,6 +38,10 @@
android:entryValues="@array/EPR_default_location_reminder_values"
android:key="@string/p_default_location_reminder_key"
android:title="@string/EPr_default_location_reminder_title" />
<com.todoroo.astrid.ui.MultilinePreference
android:defaultValue="250"
android:key="@string/p_default_location_radius"
android:title="@string/EPr_default_location_radius" />
<com.todoroo.astrid.ui.MultilineListPreference
android:defaultValue="0"
android:entries="@array/EPr_reminder_random"

@ -71,25 +71,6 @@
android:title="@string/list"/>
</PreferenceCategory>
<PreferenceCategory
android:key="@string/geolocation_reminders"
android:title="@string/geolocation_reminders">
<com.todoroo.astrid.ui.MultilineListPreference
android:defaultValue="250"
android:dependency="@string/p_rmd_enabled"
android:entries="@array/geofence_radius_values"
android:entryValues="@array/geofence_radius_values"
android:key="@string/p_geofence_radius"
android:title="@string/geofence_radius_title"/>
<com.todoroo.astrid.ui.MultilineListPreference
android:defaultValue="60"
android:dependency="@string/p_rmd_enabled"
android:entries="@array/geofence_responsiveness"
android:entryValues="@array/geofence_responsiveness_values"
android:key="@string/p_geofence_responsiveness"
android:title="@string/geofence_responsiveness_title"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/quiet_hours">
<CheckBoxPreference
android:defaultValue="false"

Loading…
Cancel
Save