diff --git a/app/src/googleplay/java/org/tasks/location/GeofenceApi.java b/app/src/googleplay/java/org/tasks/location/GeofenceApi.java index d295abecb..c0dc4e6be 100644 --- a/app/src/googleplay/java/org/tasks/location/GeofenceApi.java +++ b/app/src/googleplay/java/org/tasks/location/GeofenceApi.java @@ -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) diff --git a/app/src/googleplay/java/org/tasks/location/PlacePicker.java b/app/src/googleplay/java/org/tasks/location/PlacePicker.java index a8e9007f0..6e3af78a8 100644 --- a/app/src/googleplay/java/org/tasks/location/PlacePicker.java +++ b/app/src/googleplay/java/org/tasks/location/PlacePicker.java @@ -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; } diff --git a/app/src/main/java/com/todoroo/astrid/core/DefaultsPreferences.java b/app/src/main/java/com/todoroo/astrid/core/DefaultsPreferences.java index efcf7f879..8ac22442e 100644 --- a/app/src/main/java/com/todoroo/astrid/core/DefaultsPreferences.java +++ b/app/src/main/java/com/todoroo/astrid/core/DefaultsPreferences.java @@ -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(); + } } diff --git a/app/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java b/app/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java index 77390d8f8..01829814e 100644 --- a/app/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java +++ b/app/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java @@ -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 -> { diff --git a/app/src/main/java/org/tasks/dialogs/LocationDialog.java b/app/src/main/java/org/tasks/dialogs/LocationDialog.java index c1381c3d9..39cd8f8b7 100644 --- a/app/src/main/java/org/tasks/dialogs/LocationDialog.java +++ b/app/src/main/java/org/tasks/dialogs/LocationDialog.java @@ -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); diff --git a/app/src/main/java/org/tasks/dialogs/NativeSeekBarDialog.java b/app/src/main/java/org/tasks/dialogs/NativeSeekBarDialog.java new file mode 100644 index 000000000..9c8c31fb4 --- /dev/null +++ b/app/src/main/java/org/tasks/dialogs/NativeSeekBarDialog.java @@ -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); + } +} diff --git a/app/src/main/java/org/tasks/dialogs/SeekBarDialog.java b/app/src/main/java/org/tasks/dialogs/SeekBarDialog.java index 02bb38976..a86f39fad 100644 --- a/app/src/main/java/org/tasks/dialogs/SeekBarDialog.java +++ b/app/src/main/java/org/tasks/dialogs/SeekBarDialog.java @@ -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); - } } diff --git a/app/src/main/java/org/tasks/injection/DialogFragmentComponent.java b/app/src/main/java/org/tasks/injection/DialogFragmentComponent.java index dd155d5a3..31601986b 100644 --- a/app/src/main/java/org/tasks/injection/DialogFragmentComponent.java +++ b/app/src/main/java/org/tasks/injection/DialogFragmentComponent.java @@ -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); } diff --git a/app/src/main/java/org/tasks/injection/NativeDialogFragmentComponent.java b/app/src/main/java/org/tasks/injection/NativeDialogFragmentComponent.java index ce553d414..33e0c534f 100644 --- a/app/src/main/java/org/tasks/injection/NativeDialogFragmentComponent.java +++ b/app/src/main/java/org/tasks/injection/NativeDialogFragmentComponent.java @@ -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); diff --git a/app/src/main/java/org/tasks/preferences/AppearancePreferences.java b/app/src/main/java/org/tasks/preferences/AppearancePreferences.java index 2fce5f915..9a93e14e8 100644 --- a/app/src/main/java/org/tasks/preferences/AppearancePreferences.java +++ b/app/src/main/java/org/tasks/preferences/AppearancePreferences.java @@ -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"; diff --git a/app/src/main/java/org/tasks/widget/WidgetConfigActivity.java b/app/src/main/java/org/tasks/widget/WidgetConfigActivity.java index 47a03acfd..4cf617406 100644 --- a/app/src/main/java/org/tasks/widget/WidgetConfigActivity.java +++ b/app/src/main/java/org/tasks/widget/WidgetConfigActivity.java @@ -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"; diff --git a/app/src/main/res/layout/dialog_radius_seekbar.xml b/app/src/main/res/layout/dialog_radius_seekbar.xml new file mode 100644 index 000000000..5897c18bc --- /dev/null +++ b/app/src/main/res/layout/dialog_radius_seekbar.xml @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/location_details.xml b/app/src/main/res/layout/location_details.xml index dfb34433b..5674cd90f 100644 --- a/app/src/main/res/layout/location_details.xml +++ b/app/src/main/res/layout/location_details.xml @@ -1,5 +1,6 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index ac3ac24eb..6d76fa3bb 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -330,9 +330,6 @@ Избери дата и време След крайния срок При краен срок - Радиус (метри) - Време за отговор (по-голяма стойност запазва батерията) - Напомняния за геолокация Тагове Филтри За час diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index bc360e980..0b6cdd164 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -108,7 +108,6 @@ Contribuir traduccions Contacta amb el desenvolupador Sense recordatoris durant les hores de silenci - Radi (metres) Filtres Configuració dels filtres Mostra ocultes diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 108c310b2..4fefea69c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -221,9 +221,6 @@ Náhodně Vybrat datum Vybrat čas - Okruh (v metrech) - Doba odezvy (vyšší hodnota šetří baterii) - Geolokační upomínky Tagy Filtry Ráno diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 744ef7f0e..4e37ca047 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -322,9 +322,6 @@ Tag und Uhrzeit auswählen Wenn überfällig Wenn fällig - Radius (Meter) - Antwortzeit (Größere Werte sparen Akkuleistung) - Geo-/Ortsbasierte Erinnerungen Schlagworte Filter Für eine Stunde diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8c4cc57b3..aee5ffd21 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -326,9 +326,6 @@ Elegir fecha y hora Si está atrasada Al vencimiento - Radio (metros) - Tiempo de respuesta (valores altos mejoran autonomía de batería) - Recordatorios de Geolocalización Etiquetas Filtros Por una hora diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index fc2a20214..c4375349d 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -219,9 +219,6 @@ انتخاب یک تاریخ و زمان پس از موعود روز موعود - شعاع (متر) - زمان پاسخگویی (مقدار بالاتر مصرف کمتر باتری) - یادآوری‌های وابسته به مکان برچسب ها فیلترها برای یک ساعت diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 6ca01938e..41c993576 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -323,9 +323,6 @@ Valitse päivä ja aika Kunnes yliajalla Milloin määräaika - Säde (metriä) - Vasteaika (korkeampi arvo kuluttaa enemmän akkua) - Paikannuksen muistutukset Tunnisteet Suodattimet Tunnin verran diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 34c716d31..4ea4d385d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -314,9 +314,6 @@ Choisir date et heure En cas de retard A l\'échéance - Rayon (mètres) - Temps de réponse (les valeurs élevées améliorent l\'autonomie) - Rappels géolocalisés Filtres Pour une heure Matin diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 1b83418c4..ac99b23d6 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -245,9 +245,6 @@ Elegir fecha y hora Si está atrasada Al vencimiento - Radio (metros) - Tiempo de respuesta (valores altos mejoran autonomía de batería) - Recordatorios de Geolocalización Etiquetas Filtros Por una hora diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 33274229d..e6fe0ec87 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -330,9 +330,6 @@ Válasszon dátumot és időpontot Határidő lejárta után Határidő elérésekor - Távolság (méterben) - Válaszidő (magasabb érték kíméli az akkumulátort) - Helyhez kötött Emlékeztetők Címkék Szűrők Egy órára diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 85c137352..672557276 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -327,9 +327,6 @@ Scegli data e ora Quando scaduta Alla scadenza - Raggio (metri) - Tempo di risposta (valore elevato preserva batteria) - Promemoria Geolocalizzazione Etichette Filtri Per un\'ora diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index e76e601e8..19047a556 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -328,9 +328,6 @@ בחר תאריך ושעה לאחר מועד היעד במועד היעד - רדיוס (במטרים) - זמן תגובה (ערך גבוה חוסך בסוללה) - התראות מיקום תגיות פילטרים בעוד שעה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 483573fb3..45d61e0ca 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -320,9 +320,6 @@ 日付と時間を選択 期限を過ぎたとき 期限に - 半径 (メートル) - 応答時間 (大きい値の方がバッテリーを節約します) - 位置情報リマインダー タグ フィルター 1時間 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index b77f42778..0e51ca2b7 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -330,9 +330,6 @@ 날짜와 시간 선택 일정 마감일이 지났을 때 일정 마감일에 - 반경 (미터 단위) - 반응 속도 (높은 수치일수록 배터리 절약) - 위치정보 알림 태그 필터 한 시간동안 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index e64692515..6ec9843c5 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -327,9 +327,6 @@ Pasirinkti datą ir laiką Terminui pasibaigus Atėjus terminui - Spindulys (metrais) - Reakcijos laikas (didesnis taupys bateriją) - Geolokaciniai priminimai Etiketė Filtrai Valandai diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 822ba560c..b22a9242b 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -139,9 +139,6 @@ Kildekode Kontakt utvikler Gi Tasks din vurdering - Radius (meter) - Responstid (høyere verdi bruker mindre batteri) - Geolokasjonsvarsler Tagger Filtere Filtreringsinnstillinger diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 28c6dc4b4..6b2c9438f 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -325,8 +325,6 @@ Kies een datum en tijd Na de einddatum Op de eindtijd - Antwoord tijd (hogere waarde verbruikt meer batterij) - Geolocatie Herinneringen Labels Voor een uur Ochtend diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 9462d58b2..bf9761449 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -311,9 +311,6 @@ Wybierz datę i czas Gdy zaległe Gdy w terminie - Zasięg (metrów) - Czas reakcji (wyższa wartość oszczędza baterię) - Przypomnienie geolokacyjne Tagi Filtry Na godzinę diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b7de8155e..9e77ec725 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -325,9 +325,6 @@ Escolha data e horário Quando vencida Quando vencer - Raio (metros) - Tempo de resposta (valores maiores conservam bateria) - Lembretes com Geolocalização Etiquetas Filtros Por uma hora diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index cd7306807..5efd310a9 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -320,9 +320,6 @@ Escolha a data e a hora Se data limite ultrapassada Na data limite - Raio (metros) - Tempo de resposta (valores maiores poupam bateria) - Lembretes de geolocalização Etiquetas Filtros Por uma hora diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3ed514cb1..2c87f77cc 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -326,9 +326,6 @@ Дата и время Когда просрочено В срок - Радиус (в метрах) - Период отслеживания (чем выше, тем меньше расход батареи) - Напоминания по местонахождению Теги Фильтры На час diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6bc5ed6e2..a3e2ad924 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -320,9 +320,6 @@ Vybrať dátum a čas Keď po termíne Keď v termíne - Okruh (v metroch) - Doba odozvy (vyššia hodnota šetrí batériu) - Pripomienky polohy Štítky Filtre Za hodinu diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7eb6e3ad5..f95288558 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -244,9 +244,6 @@ Ställ in datum och tid Efter förfallotid Vid förfallotid - Radie (meter) - Svarstid (högre värde sparar batteri) - Platsbaserade påminnelser Etiketter Filter En timme diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 46ea26c68..ceb051b51 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -332,9 +332,6 @@ Bir tarih ve zaman seç Geciktiğinde Zamanı geldiğinde - Yarıçap (metre) - Yanıt süresi (yüksek değer pili korur) - Coğrafi Konum Hatırlatmaları Etiketler Süzgeçler Bir saatliğine diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index dc698c46c..041583e79 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -247,9 +247,6 @@ Обрати дату та час Коли прострочено Коли заплановано час - Радіус (метри) - Час відклику (вище значення зберігає заряд батареї) - Геолокаційні нагадування Теги Фільтри На годину diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b7266d29d..cbd6eb7b9 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -327,9 +327,6 @@ 选个日期和时间 过期时 到期时 - 半径(米) - 响应时间(更高的节电值) - 地理位置提醒 标签 过滤器 一个小时 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d7059bdc2..9ab89834c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -197,8 +197,6 @@ 貢獻翻譯 為 Tasks 評分 贊助 - 半徑 (公尺) - 地理位置提醒 標籤 過濾 明天早上 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 73bcb79ac..74da3f307 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,30 +1,6 @@ - - 75 - 125 - 250 - 500 - 1000 - - - - 00:15 - 00:30 - 01:00 - 05:00 - 10:00 - - - - 15 - 30 - 60 - 300 - 600 - - @string/due_date @string/due_time diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 98d4c8370..2b7db78c0 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -140,6 +140,7 @@ p_def_reminders p_def_location_reminders + p_def_location_radius rmd_default_reminder_mode @@ -182,8 +183,6 @@ TEA_ctrl_comments TEA_ctrl_gcal TEA_ctrl_gtask - geolocation_radius - geofence_responsiveness show_hidden_tasks show_completed_tasks reverse_sort diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 92085ee17..385272ed7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -285,6 +285,7 @@ File %1$s contained %2$s.\n\n Default reminders Default location reminders + Default radius Default ring/vibrate type @@ -687,9 +688,8 @@ File %1$s contained %2$s.\n\n Pick a date and time When overdue When due - Radius (meters) - Response time (higher value conserves battery) - Geolocation Reminders + Radius + %s m Tags Filters For an hour diff --git a/app/src/main/res/xml/preferences_defaults.xml b/app/src/main/res/xml/preferences_defaults.xml index ba8fd2fbf..701bbc583 100644 --- a/app/src/main/res/xml/preferences_defaults.xml +++ b/app/src/main/res/xml/preferences_defaults.xml @@ -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" /> + - - - - -