Add Places to navigation drawer

pull/996/head
Alex Baker 4 years ago
parent 0b95b11b68
commit bd1aa46d13

File diff suppressed because it is too large Load Diff

@ -86,6 +86,11 @@ public class GoogleMapFragment implements MapFragment, OnMapReadyCallback, OnMar
}
}
@Override
public void disableGestures() {
map.getUiSettings().setAllGesturesEnabled(false);
}
@SuppressLint("MissingPermission")
@Override
public void showMyLocation() {

@ -314,6 +314,10 @@
android:name=".caldav.CaldavCalendarSettingsActivity"
android:theme="@style/Tasks"/>
<activity
android:name=".activities.PlaceSettingsActivity"
android:theme="@style/Tasks" />
<activity
android:name="com.todoroo.astrid.gcal.CalendarReminderActivity"
android:theme="@style/TasksDialog"/>

@ -18,6 +18,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.speech.RecognizerIntent;
import android.view.LayoutInflater;
import android.view.Menu;
@ -79,12 +80,14 @@ import org.tasks.LocalBroadcastManager;
import org.tasks.R;
import org.tasks.activities.FilterSettingsActivity;
import org.tasks.activities.GoogleTaskListSettingsActivity;
import org.tasks.activities.PlaceSettingsActivity;
import org.tasks.activities.RemoteListPicker;
import org.tasks.activities.TagSettingsActivity;
import org.tasks.caldav.CaldavCalendarSettingsActivity;
import org.tasks.data.CaldavAccount;
import org.tasks.data.CaldavCalendar;
import org.tasks.data.CaldavDao;
import org.tasks.data.Place;
import org.tasks.data.TagDataDao;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.SortDialog;
@ -125,11 +128,8 @@ public final class TaskListFragment extends InjectingFragment
private static final String EXTRA_FILTER = "extra_filter";
private static final String FRAG_TAG_REMOTE_LIST_PICKER = "frag_tag_remote_list_picker";
private static final String FRAG_TAG_SORT_DIALOG = "frag_tag_sort_dialog";
private static final int REQUEST_CALDAV_SETTINGS = 10101;
private static final int REQUEST_GTASK_SETTINGS = 10102;
private static final int REQUEST_LIST_SETTINGS = 10101;
private static final int REQUEST_MOVE_TASKS = 10103;
private static final int REQUEST_FILTER_SETTINGS = 10104;
private static final int REQUEST_TAG_SETTINGS = 10105;
private static final int REQUEST_TAG_TASKS = 10106;
private static final int SEARCH_DEBOUNCE_TIMEOUT = 300;
@ -430,7 +430,7 @@ public final class TaskListFragment extends InjectingFragment
case R.id.menu_filter_settings:
Intent filterSettings = new Intent(getActivity(), FilterSettingsActivity.class);
filterSettings.putExtra(FilterSettingsActivity.TOKEN_FILTER, filter);
startActivityForResult(filterSettings, REQUEST_FILTER_SETTINGS);
startActivityForResult(filterSettings, REQUEST_LIST_SETTINGS);
return true;
case R.id.menu_caldav_list_fragment:
CaldavCalendar calendar = ((CaldavFilter) filter).getCalendar();
@ -442,18 +442,27 @@ public final class TaskListFragment extends InjectingFragment
? CaldavCalendarSettingsActivity.class
: EteSyncCalendarSettingsActivity.class);
caldavSettings.putExtra(EXTRA_CALDAV_CALENDAR, calendar);
startActivityForResult(caldavSettings, REQUEST_CALDAV_SETTINGS);
startActivityForResult(caldavSettings, REQUEST_LIST_SETTINGS);
return true;
case R.id.menu_location_settings:
Place place = ((LocationFilter) filter).getPlace();
Intent intent =
new Intent(
getActivity(),
PlaceSettingsActivity.class);
intent.putExtra(PlaceSettingsActivity.EXTRA_PLACE, (Parcelable) place);
startActivityForResult(intent, REQUEST_LIST_SETTINGS);
return true;
case R.id.menu_gtasks_list_settings:
Intent gtasksSettings = new Intent(getActivity(), GoogleTaskListSettingsActivity.class);
gtasksSettings.putExtra(
GoogleTaskListSettingsActivity.EXTRA_STORE_DATA, ((GtasksFilter) filter).getList());
startActivityForResult(gtasksSettings, REQUEST_GTASK_SETTINGS);
startActivityForResult(gtasksSettings, REQUEST_LIST_SETTINGS);
return true;
case R.id.menu_tag_settings:
Intent tagSettings = new Intent(getActivity(), TagSettingsActivity.class);
tagSettings.putExtra(TagSettingsActivity.EXTRA_TAG_DATA, ((TagFilter) filter).getTagData());
startActivityForResult(tagSettings, REQUEST_TAG_SETTINGS);
startActivityForResult(tagSettings, REQUEST_LIST_SETTINGS);
return true;
case R.id.menu_expand_subtasks:
taskDao.setCollapsed(taskListViewModel.getValue(), false);
@ -603,10 +612,7 @@ public final class TaskListFragment extends InjectingFragment
finishActionMode();
}
break;
case REQUEST_FILTER_SETTINGS:
case REQUEST_CALDAV_SETTINGS:
case REQUEST_GTASK_SETTINGS:
case REQUEST_TAG_SETTINGS:
case REQUEST_LIST_SETTINGS:
if (resultCode == Activity.RESULT_OK) {
String action = data.getAction();
if (ACTION_DELETED.equals(action)) {

@ -58,7 +58,7 @@ import org.tasks.notifications.NotificationDao;
CaldavAccount.class,
GoogleTaskAccount.class
},
version = 72)
version = 73)
public abstract class Database extends RoomDatabase {
public static final String NAME = "database";

@ -0,0 +1,108 @@
package org.tasks.activities
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import butterknife.BindView
import butterknife.OnTextChanged
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.activity.TaskListFragment
import org.tasks.R
import org.tasks.data.LocationDao
import org.tasks.data.Place
import org.tasks.filters.LocationFilter
import org.tasks.injection.ActivityComponent
import org.tasks.location.MapFragment
import javax.inject.Inject
class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmentCallback {
companion object {
const val EXTRA_PLACE = "extra_place"
}
@BindView(R.id.name) lateinit var name: TextInputEditText
@BindView(R.id.name_layout) lateinit var nameLayout: TextInputLayout
@Inject lateinit var locationDao: LocationDao
@Inject lateinit var map: MapFragment
private lateinit var place: Place
override fun onCreate(savedInstanceState: Bundle?) {
if (intent?.hasExtra(EXTRA_PLACE) != true) {
finish()
}
place = intent?.getParcelableExtra(EXTRA_PLACE)!!
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
name.setText(place.displayName)
selectedColor = place.color
selectedIcon = place.icon
}
map.init(supportFragmentManager, this, theme.themeBase.isDarkTheme(this))
updateTheme()
}
override fun getLayout() = R.layout.activity_location_settings
override fun hasChanges() = name.text.toString() != place.displayName
|| selectedColor != place.color
|| selectedIcon != place.icon
@OnTextChanged(R.id.name)
fun onNameChanged(text: CharSequence?) {
nameLayout.error = null
}
override fun save() {
val newName: String = name.text.toString()
if (TextUtils.isEmpty(newName)) {
nameLayout.error = getString(R.string.name_cannot_be_empty)
return
}
place.name = newName
place.color = selectedColor
place.icon = selectedIcon
locationDao.update(place)
setResult(
Activity.RESULT_OK,
Intent(TaskListFragment.ACTION_RELOAD)
.putExtra(MainActivity.OPEN_FILTER, LocationFilter(place)))
finish()
}
override fun isNew() = false
override fun getToolbarTitle(): String {
return place.address
}
override fun delete() {
locationDao.getGeofencesByPlace(place.uid).forEach(locationDao::delete)
locationDao.delete(place)
setResult(Activity.RESULT_OK, Intent(TaskListFragment.ACTION_DELETED))
finish()
}
override fun inject(component: ActivityComponent) = component.inject(this)
override fun onMapReady(mapFragment: MapFragment?) {
map = mapFragment!!
map.setMarkers(listOf(place))
map.disableGestures()
map.movePosition(place.mapPosition, false)
}
override fun onPlaceSelected(place: Place?) {}
}

@ -24,7 +24,6 @@ import org.tasks.dialogs.IconLayoutManager
import org.tasks.injection.ActivityComponent
import org.tasks.injection.ThemedInjectingAppCompatActivity
import org.tasks.locale.Locale
import org.tasks.themes.Theme
import timber.log.Timber
import java.lang.String
import javax.inject.Inject
@ -39,7 +38,6 @@ class PurchaseActivity : ThemedInjectingAppCompatActivity(), OnPurchasesUpdated,
@Inject lateinit var billingClient: BillingClient
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var locale: Locale
@Inject lateinit var theme: Theme
private lateinit var binding: ActivityPurchaseBinding
private lateinit var adapter: PurchaseAdapter

@ -57,6 +57,9 @@ public interface LocationDao {
@Query("SELECT * FROM geofences WHERE task = :taskId")
List<Geofence> getGeofencesForTask(long taskId);
@Query("SELECT * FROM geofences WHERE place = :uid")
List<Geofence> getGeofencesByPlace(String uid);
@Query("SELECT * FROM places")
List<Place> getPlaces();

@ -30,6 +30,7 @@ import java.util.regex.Pattern;
import net.fortuna.ical4j.model.property.Geo;
import org.tasks.R;
import org.tasks.location.MapPosition;
import org.tasks.themes.CustomIcons;
@Entity(tableName = TABLE_NAME, indices = @Index(name = "place_uid", value = "uid", unique = true))
public class Place implements Serializable, Parcelable {
@ -81,6 +82,12 @@ public class Place implements Serializable, Parcelable {
@ColumnInfo(name = "longitude")
private double longitude;
@ColumnInfo(name = "place_color")
private int color;
@ColumnInfo(name = "place_icon")
private int icon = -1;
public Place() {}
@Ignore
@ -93,6 +100,8 @@ public class Place implements Serializable, Parcelable {
url = o.url;
latitude = o.latitude;
longitude = o.longitude;
color = o.color;
icon = o.icon;
}
@Ignore
@ -105,6 +114,8 @@ public class Place implements Serializable, Parcelable {
url = parcel.readString();
latitude = parcel.readDouble();
longitude = parcel.readDouble();
color = parcel.readInt();
icon = parcel.readInt();
}
private static String formatCoordinate(double coordinates, boolean latitude) {
@ -130,7 +141,8 @@ public class Place implements Serializable, Parcelable {
return place;
}
@Nullable public static Place newPlace(@Nullable MapPosition mapPosition) {
@Nullable
public static Place newPlace(@Nullable MapPosition mapPosition) {
if (mapPosition == null) {
return null;
}
@ -177,7 +189,8 @@ public class Place implements Serializable, Parcelable {
this.uid = uid;
}
@Nullable public String getName() {
@Nullable
public String getName() {
return name;
}
@ -225,6 +238,22 @@ public class Place implements Serializable, Parcelable {
this.url = url;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public int getIcon() {
return icon == -1 ? CustomIcons.getPLACE() : icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
public String getDisplayName() {
if (!Strings.isNullOrEmpty(name) && !COORDS.matcher(name).matches()) {
return name;
@ -256,9 +285,7 @@ public class Place implements Serializable, Parcelable {
}
private String getGeoUri() {
return String.format(
"geo:%s,%s?q=%s",
latitude, longitude, Uri.encode(getDisplayName()));
return String.format("geo:%s,%s?q=%s", latitude, longitude, Uri.encode(getDisplayName()));
}
public MapPosition getMapPosition() {
@ -270,7 +297,7 @@ public class Place implements Serializable, Parcelable {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
if (!(o instanceof Place)) {
return false;
}
@ -285,6 +312,12 @@ public class Place implements Serializable, Parcelable {
if (Double.compare(place.longitude, longitude) != 0) {
return false;
}
if (color != place.color) {
return false;
}
if (icon != place.icon) {
return false;
}
if (uid != null ? !uid.equals(place.uid) : place.uid != null) {
return false;
}
@ -314,6 +347,8 @@ public class Place implements Serializable, Parcelable {
result = 31 * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(longitude);
result = 31 * result + (int) (temp ^ (temp >>> 32));
result = 31 * result + color;
result = 31 * result + icon;
return result;
}
@ -341,6 +376,10 @@ public class Place implements Serializable, Parcelable {
+ latitude
+ ", longitude="
+ longitude
+ ", color="
+ color
+ ", icon="
+ icon
+ '}';
}
@ -359,5 +398,7 @@ public class Place implements Serializable, Parcelable {
out.writeString(url);
out.writeDouble(latitude);
out.writeDouble(longitude);
out.writeInt(color);
out.writeInt(icon);
}
}

@ -10,6 +10,14 @@ public class PlaceUsage {
return place;
}
public int getColor() {
return place.getColor();
}
public int getIcon() {
return place.getIcon();
}
@Override
public boolean equals(Object o) {
if (this == o) {

@ -402,6 +402,15 @@ public class Migrations {
}
};
private static final Migration MIGRATION_72_73 =
new Migration(72, 73) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE `places` ADD COLUMN `place_color` INTEGER NOT NULL DEFAULT 0");
database.execSQL("ALTER TABLE `places` ADD COLUMN `place_icon` INTEGER NOT NULL DEFAULT -1");
}
};
public static final Migration[] MIGRATIONS =
new Migration[] {
MIGRATION_35_36,
@ -431,7 +440,8 @@ public class Migrations {
MIGRATION_68_69,
MIGRATION_69_70,
MIGRATION_70_71,
MIGRATION_71_72
MIGRATION_71_72,
MIGRATION_72_73
};
private static Migration NOOP(int from, int to) {

@ -151,7 +151,7 @@ public class FilterProvider {
boolean collapsed = preferences.getBoolean(R.string.p_collapse_locations, false);
items.addAll(
getSubmenu(
context.getString(R.string.locations),
context.getString(R.string.places),
false,
collapsed ? Collections.emptyList() : getLocationFilters(),
true,

@ -51,12 +51,18 @@ public class LocationFilter extends Filter {
public LocationFilter(Place place) {
super(place.getDisplayName(), queryTemplate(place), getValuesForNewTask(place));
this.place = place;
tint = place.getColor();
icon = place.getIcon();
}
public Place getPlace() {
return place;
}
public String getUid() {
return place.getUid();
}
private static QueryTemplate queryTemplate(Place place) {
return new QueryTemplate()
.join(Join.inner(Geofence.TABLE, Task.ID.eq(Geofence.TASK)))
@ -76,7 +82,12 @@ public class LocationFilter extends Filter {
@Override
public int getBeginningMenu() {
return R.menu.menu_location_list_settings;
return R.menu.menu_location_actions;
}
@Override
public int getMenu() {
return R.menu.menu_location_list_fragment;
}
@Override

@ -13,6 +13,7 @@ import org.tasks.activities.DateAndTimePickerActivity;
import org.tasks.activities.FilterSelectionActivity;
import org.tasks.activities.FilterSettingsActivity;
import org.tasks.activities.GoogleTaskListSettingsActivity;
import org.tasks.activities.PlaceSettingsActivity;
import org.tasks.activities.TagSettingsActivity;
import org.tasks.billing.PurchaseActivity;
import org.tasks.caldav.CaldavAccountSettingsActivity;
@ -135,4 +136,6 @@ public interface ActivityComponent {
void inject(ManageSpaceActivity manageSpaceActivity);
void inject(SyncPreferences syncPreferences);
void inject(PlaceSettingsActivity placeSettingsActivity);
}

@ -10,7 +10,7 @@ import org.tasks.themes.ThemeColor;
public abstract class ThemedInjectingAppCompatActivity extends AppCompatActivity
implements InjectingActivity {
@Inject Theme theme;
@Inject protected Theme theme;
@Inject protected ThemeColor themeColor;
private ActivityComponent activityComponent;

@ -48,6 +48,8 @@ import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import org.tasks.Event;
import org.tasks.R;
import org.tasks.activities.PlaceSettingsActivity;
import org.tasks.billing.Inventory;
import org.tasks.caldav.GeoUtils;
import org.tasks.data.LocationDao;
import org.tasks.data.Place;
@ -61,6 +63,7 @@ import org.tasks.location.MapFragment.MapFragmentCallback;
import org.tasks.preferences.ActivityPermissionRequestor;
import org.tasks.preferences.PermissionChecker;
import org.tasks.preferences.PermissionRequestor;
import org.tasks.themes.ColorProvider;
import org.tasks.themes.Theme;
import org.tasks.themes.ThemeColor;
import org.tasks.ui.Toaster;
@ -112,10 +115,12 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
@Inject DialogBuilder dialogBuilder;
@Inject MapFragment map;
@Inject Geocoder geocoder;
@Inject Inventory inventory;
@Inject ColorProvider colorProvider;
private CompositeDisposable disposables;
@Nullable private MapPosition mapPosition;
private LocationPickerAdapter recentsAdapter = new LocationPickerAdapter(this);
private LocationPickerAdapter recentsAdapter;
private LocationSearchAdapter searchAdapter;
private List<PlaceUsage> places = Collections.emptyList();
private int offset;
@ -139,8 +144,6 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
}
Place currentPlace = getIntent().getParcelableExtra(EXTRA_PLACE);
recentsAdapter.setCurrentPlace(currentPlace);
if (savedInstanceState == null) {
mapPosition =
currentPlace == null
@ -211,6 +214,7 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
findViewById(map.getMarkerId()).setVisibility(View.VISIBLE);
searchAdapter = new LocationSearchAdapter(searchProvider.getAttributionRes(dark), this);
recentsAdapter = new LocationPickerAdapter(this, inventory, colorProvider, this);
recentsAdapter.setHasStableIds(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(
@ -433,8 +437,10 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
}
@Override
public void delete(org.tasks.data.Place place) {
locationDao.delete(place);
public void settings(org.tasks.data.Place place) {
Intent intent = new Intent(this, PlaceSettingsActivity.class);
intent.putExtra(PlaceSettingsActivity.EXTRA_PLACE, (Parcelable) place);
startActivity(intent);
}
@Override

@ -1,35 +1,49 @@
package org.tasks.location;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.recyclerview.widget.DiffUtil.ItemCallback;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import com.google.common.base.Strings;
import org.tasks.R;
import org.tasks.billing.Inventory;
import org.tasks.data.Place;
import org.tasks.data.PlaceUsage;
import org.tasks.location.LocationPickerAdapter.PlaceViewHolder;
import org.tasks.themes.ColorProvider;
import org.tasks.themes.CustomIcons;
import org.tasks.themes.DrawableUtil;
import org.tasks.themes.ThemeColor;
public class LocationPickerAdapter extends ListAdapter<PlaceUsage, PlaceViewHolder> {
private final Context context;
private final Inventory inventory;
private final ColorProvider colorProvider;
private final OnLocationPicked callback;
private Place currentPlace;
LocationPickerAdapter(OnLocationPicked callback) {
LocationPickerAdapter(
Context context,
Inventory inventory,
ColorProvider colorProvider,
OnLocationPicked callback) {
super(new DiffCallback());
this.context = context;
this.inventory = inventory;
this.colorProvider = colorProvider;
this.callback = callback;
}
void setCurrentPlace(@Nullable Place currentPlace) {
this.currentPlace = currentPlace;
}
@Override
public long getItemId(int position) {
return getItem(position).place.getId();
@ -45,19 +59,40 @@ public class LocationPickerAdapter extends ListAdapter<PlaceUsage, PlaceViewHold
@Override
public void onBindViewHolder(@NonNull PlaceViewHolder holder, int position) {
holder.bind(getItem(position));
PlaceUsage place = getItem(position);
holder.bind(place, getColor(place.getColor()), getIcon(place.getIcon()));
}
private int getColor(int tint) {
if (tint != 0) {
ThemeColor color = colorProvider.getThemeColor(tint, true);
if (color.isFree() || inventory.purchasedThemes()) {
return color.getPrimaryColor();
}
}
return ContextCompat.getColor(context, R.color.text_primary);
}
private int getIcon(int index) {
if (index < 1000 || inventory.hasPro()) {
Integer icon = CustomIcons.getIconResId(index);
if (icon != null) {
return icon;
}
}
return R.drawable.ic_outline_place_24px;
}
public interface OnLocationPicked {
void picked(Place place);
void delete(Place place);
void settings(Place place);
}
public class PlaceViewHolder extends RecyclerView.ViewHolder {
public static class PlaceViewHolder extends RecyclerView.ViewHolder {
private final TextView name;
private final TextView address;
private final View delete;
private final ImageView icon;
private Place place;
PlaceViewHolder(@NonNull View itemView, OnLocationPicked onLocationPicked) {
@ -65,14 +100,19 @@ public class LocationPickerAdapter extends ListAdapter<PlaceUsage, PlaceViewHold
itemView.setOnClickListener(v -> onLocationPicked.picked(place));
name = itemView.findViewById(R.id.name);
address = itemView.findViewById(R.id.address);
delete = itemView.findViewById(R.id.delete);
delete.setOnClickListener(v -> onLocationPicked.delete(place));
icon = itemView.findViewById(R.id.place_icon);
itemView
.findViewById(R.id.location_settings)
.setOnClickListener(v -> onLocationPicked.settings(place));
}
public void bind(PlaceUsage placeUsage) {
public void bind(PlaceUsage placeUsage, int color, int icon) {
place = placeUsage.place;
String name = place.getDisplayName();
String address = place.getDisplayAddress();
Drawable wrapped = DrawableUtil.getWrapped(itemView.getContext(), icon);
this.icon.setImageDrawable(wrapped);
DrawableCompat.setTint(this.icon.getDrawable(), color);
this.name.setText(name);
if (Strings.isNullOrEmpty(address) || address.equals(name)) {
this.address.setVisibility(View.GONE);
@ -80,7 +120,7 @@ public class LocationPickerAdapter extends ListAdapter<PlaceUsage, PlaceViewHold
this.address.setText(address);
this.address.setVisibility(View.VISIBLE);
}
delete.setVisibility(placeUsage.count > 0 || place.equals(currentPlace) ? View.GONE : View.VISIBLE);
}
}

@ -15,6 +15,8 @@ public interface MapFragment {
void setMarkers(List<Place> places);
void disableGestures();
void showMyLocation();
int getMarkerId();

@ -96,6 +96,11 @@ public class MapboxMapFragment implements MapFragment, OnMapReadyCallback, OnMar
}
}
@Override
public void disableGestures() {
map.getUiSettings().setAllGesturesEnabled(false);
}
@SuppressLint("MissingPermission")
@Override
public void showMyLocation() {

@ -26,6 +26,9 @@ import org.tasks.data.CaldavCalendar;
import org.tasks.data.CaldavDao;
import org.tasks.data.GoogleTaskList;
import org.tasks.data.GoogleTaskListDao;
import org.tasks.data.LocationDao;
import org.tasks.data.Place;
import org.tasks.filters.LocationFilter;
import org.tasks.injection.ForApplication;
import timber.log.Timber;
@ -36,6 +39,7 @@ public class DefaultFilterProvider {
private static final int TYPE_TAG = 2;
private static final int TYPE_GOOGLE_TASKS = 3;
private static final int TYPE_CALDAV = 4;
private static final int TYPE_LOCATION = 5;
private static final int FILTER_MY_TASKS = 0;
private static final int FILTER_TODAY = 1;
@ -48,6 +52,7 @@ public class DefaultFilterProvider {
private final TagFilterExposer tagFilterExposer;
private final GoogleTaskListDao googleTaskListDao;
private final CaldavDao caldavDao;
private final LocationDao locationDao;
@Inject
public DefaultFilterProvider(
@ -56,13 +61,15 @@ public class DefaultFilterProvider {
CustomFilterExposer customFilterExposer,
TagFilterExposer tagFilterExposer,
GoogleTaskListDao googleTaskListDao,
CaldavDao caldavDao) {
CaldavDao caldavDao,
LocationDao locationDao) {
this.context = context;
this.preferences = preferences;
this.customFilterExposer = customFilterExposer;
this.tagFilterExposer = tagFilterExposer;
this.googleTaskListDao = googleTaskListDao;
this.caldavDao = caldavDao;
this.locationDao = locationDao;
}
public Filter getDashclockFilter() {
@ -136,6 +143,9 @@ public class DefaultFilterProvider {
case TYPE_CALDAV:
CaldavCalendar caldavCalendar = caldavDao.getCalendarByUuid(split[1]);
return caldavCalendar == null ? null : new CaldavFilter(caldavCalendar);
case TYPE_LOCATION:
Place place = locationDao.getPlace(split[1]);
return place == null ? null : new LocationFilter(place);
default:
return null;
}
@ -161,6 +171,8 @@ public class DefaultFilterProvider {
return getFilterPreference(filterType, ((GtasksFilter) filter).getStoreId());
case TYPE_CALDAV:
return getFilterPreference(filterType, ((CaldavFilter) filter).getUuid());
case TYPE_LOCATION:
return getFilterPreference(filterType, ((LocationFilter) filter).getUid());
}
return null;
}
@ -178,6 +190,8 @@ public class DefaultFilterProvider {
return TYPE_CUSTOM_FILTER;
} else if (filter instanceof CaldavFilter) {
return TYPE_CALDAV;
} else if (filter instanceof LocationFilter) {
return TYPE_LOCATION;
}
return TYPE_FILTER;
}

@ -25,6 +25,9 @@ object CustomIcons {
@kotlin.jvm.JvmStatic
val TODAY = 7
@kotlin.jvm.JvmStatic
val PLACE = 1050
@kotlin.jvm.JvmField
var ICONS = mapOf(
LABEL to R.drawable.ic_outline_label_24px,
@ -89,7 +92,7 @@ object CustomIcons {
1047 to R.drawable.ic_outline_attachment_24px,
1048 to R.drawable.ic_outline_vpn_key_24px,
1049 to R.drawable.ic_outline_event_24px,
1050 to R.drawable.ic_outline_place_24px,
PLACE to R.drawable.ic_outline_place_24px,
1051 to R.drawable.ic_outline_markunread_mailbox_24px,
1052 to R.drawable.ic_outline_label_important_24px,
1053 to R.drawable.ic_outline_android_24px,

@ -115,10 +115,7 @@ public class ChipProvider {
}
if (task.hasLocation() && !(filter instanceof LocationFilter)) {
Location location = task.getLocation();
Chip chip = newChip(new LocationFilter(location.getPlace()));
apply(
chip, R.drawable.ic_outline_place_24px, location.getDisplayName(), 0, showText, showIcon);
chips.add(chip);
chips.add(newChip(new LocationFilter(location.getPlace()), R.drawable.ic_outline_place_24px));
}
if (!isSubtask) {
if (!Strings.isNullOrEmpty(task.getGoogleTaskList()) && !(filter instanceof GtasksFilter)) {

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="vertical">
<include layout="@layout/toolbar"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/name_layout"
style="@style/TagSettingsRow"
android:hint="@string/display_name">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name"
style="@style/TagSettingsEditText"
android:inputType="textCapSentences|textAutoCorrect" />
</com.google.android.material.textfield.TextInputLayout>
<include layout="@layout/list_settings_color"/>
<include layout="@layout/list_settings_icon"/>
<FrameLayout
android:id="@+id/map"
android:padding="@dimen/keyline_first"
android:layout_width="match_parent"
android:layout_height="300dp" />
</LinearLayout>
</ScrollView>
</LinearLayout>

@ -18,11 +18,12 @@
android:paddingEnd="@dimen/keyline_second"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_second"
android:src="@drawable/ic_outline_history_24px"
android:src="@drawable/ic_outline_place_24px"
android:tint="@color/icon_tint"/>
<ImageView
android:id="@+id/delete"
android:contentDescription="@string/place_settings"
android:id="@+id/location_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
@ -31,9 +32,8 @@
android:paddingEnd="@dimen/keyline_first"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"
android:src="@drawable/ic_outline_delete_24px"
android:tint="@color/icon_tint"
android:visibility="gone"/>
android:src="@drawable/ic_outline_edit_24px"
android:tint="@color/icon_tint" />
<TextView
android:id="@+id/name"

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_location_settings"
android:title="@string/place_settings"
app:showAsAction="never"/>
</menu>

@ -566,5 +566,6 @@ File %1$s contained %2$s.\n\n
<string name="desaturate_colors">Desaturate colors</string>
<string name="desaturate_colors_summary_on">Colors will be desaturated in dark themes</string>
<string name="desaturate_colors_summary_off">Colors will not be desaturated in dark themes</string>
<string name="locations">Locations</string>
<string name="places">Places</string>
<string name="place_settings">Place settings</string>
</resources>

Loading…
Cancel
Save