commit
152129ec78
4 changed files with 145 additions and 16 deletions
20
OsmAnd/res/layout/track_groups_card.xml
Normal file
20
OsmAnd/res/layout/track_groups_card.xml
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/bottom_sheet_list_item_height"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recycler_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/bottom_sheet_list_item_height"
|
||||
android:background="?attr/bg_color"
|
||||
android:orientation="horizontal"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:clipToPadding="false"
|
||||
android:scrollbars="none" />
|
||||
|
||||
</LinearLayout>
|
79
OsmAnd/src/net/osmand/plus/track/PointsGroupsCard.java
Normal file
79
OsmAnd/src/net/osmand/plus/track/PointsGroupsCard.java
Normal file
|
@ -0,0 +1,79 @@
|
|||
package net.osmand.plus.track;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter;
|
||||
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter.HorizontalSelectionAdapterListener;
|
||||
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter.HorizontalSelectionItem;
|
||||
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PointsGroupsCard extends BaseCard {
|
||||
|
||||
public static final int SELECT_GROUP_INDEX = 0;
|
||||
|
||||
private GpxDisplayGroup selectedGroup;
|
||||
private final List<GpxDisplayGroup> displayGroups = new ArrayList<>();
|
||||
|
||||
public PointsGroupsCard(@NonNull MapActivity mapActivity, @NonNull List<GpxDisplayGroup> groups) {
|
||||
super(mapActivity);
|
||||
displayGroups.addAll(groups);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCardLayoutId() {
|
||||
return R.layout.track_groups_card;
|
||||
}
|
||||
|
||||
public GpxDisplayGroup getSelectedGroup() {
|
||||
return selectedGroup;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateContent() {
|
||||
ArrayList<HorizontalSelectionItem> items = new ArrayList<>();
|
||||
items.add(new HorizontalSelectionItem(app.getString(R.string.shared_string_all), null));
|
||||
for (GpxDisplayGroup group : displayGroups) {
|
||||
String categoryName = group.getName();
|
||||
if (Algorithms.isEmpty(categoryName)) {
|
||||
categoryName = app.getString(R.string.shared_string_gpx_points);
|
||||
}
|
||||
items.add(new HorizontalSelectionItem(categoryName, group));
|
||||
}
|
||||
final HorizontalSelectionAdapter selectionAdapter = new HorizontalSelectionAdapter(app, nightMode);
|
||||
selectionAdapter.setItems(items);
|
||||
selectionAdapter.setListener(new HorizontalSelectionAdapterListener() {
|
||||
@Override
|
||||
public void onItemSelected(HorizontalSelectionItem item) {
|
||||
selectedGroup = (GpxDisplayGroup) item.getObject();
|
||||
CardListener listener = getListener();
|
||||
if (listener != null) {
|
||||
listener.onCardButtonPressed(PointsGroupsCard.this, SELECT_GROUP_INDEX);
|
||||
}
|
||||
selectionAdapter.notifyDataSetChanged();
|
||||
}
|
||||
});
|
||||
if (selectedGroup != null) {
|
||||
String categoryName = selectedGroup.getName();
|
||||
if (Algorithms.isEmpty(categoryName)) {
|
||||
categoryName = app.getString(R.string.shared_string_gpx_points);
|
||||
}
|
||||
selectionAdapter.setSelectedItemByTitle(categoryName);
|
||||
} else {
|
||||
selectionAdapter.setSelectedItemByTitle(app.getString(R.string.shared_string_all));
|
||||
}
|
||||
|
||||
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
|
||||
recyclerView.setAdapter(selectionAdapter);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(app, RecyclerView.HORIZONTAL, false));
|
||||
selectionAdapter.notifyDataSetChanged();
|
||||
}
|
||||
}
|
|
@ -136,6 +136,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
private DescriptionCard descriptionCard;
|
||||
private OverviewCard overviewCard;
|
||||
private TrackPointsCard pointsCard;
|
||||
private PointsGroupsCard groupsCard;
|
||||
|
||||
private TextView headerTitle;
|
||||
private ImageView headerIcon;
|
||||
|
@ -373,6 +374,21 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
blocksBuilder.runUpdatingStatBlocksIfNeeded();
|
||||
}
|
||||
} else {
|
||||
if (menuType == TrackMenuType.POINTS && !Algorithms.isEmpty(pointsCard.getGroups())) {
|
||||
if (groupsCard != null && groupsCard.getView() != null) {
|
||||
ViewGroup parent = ((ViewGroup) groupsCard.getView().getParent());
|
||||
if (parent != null) {
|
||||
parent.removeView(groupsCard.getView());
|
||||
}
|
||||
headerContainer.addView(groupsCard.getView());
|
||||
} else {
|
||||
groupsCard = new PointsGroupsCard(getMapActivity(), pointsCard.getGroups());
|
||||
groupsCard.setListener(this);
|
||||
headerContainer.addView(groupsCard.build(getMapActivity()));
|
||||
}
|
||||
} else if (groupsCard != null && groupsCard.getView() != null) {
|
||||
headerContainer.removeView(groupsCard.getView());
|
||||
}
|
||||
if (overviewCard != null && overviewCard.getView() != null) {
|
||||
overviewCard.getBlockStatisticsBuilder().stopUpdatingStatBlocks();
|
||||
headerContainer.removeView(overviewCard.getView());
|
||||
|
@ -869,6 +885,13 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
|
|||
} else if (buttonIndex == OPEN_WAYPOINT_INDEX) {
|
||||
dismiss();
|
||||
}
|
||||
} else if (card instanceof PointsGroupsCard) {
|
||||
PointsGroupsCard groupsCard = (PointsGroupsCard) card;
|
||||
GpxDisplayGroup group = groupsCard.getSelectedGroup();
|
||||
if (pointsCard != null) {
|
||||
pointsCard.setSelectedGroup(group);
|
||||
pointsCard.updateContent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
|
|||
private final TrackDisplayHelper displayHelper;
|
||||
private final GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_POINTS, GpxDisplayItemType.TRACK_ROUTE_POINTS};
|
||||
|
||||
private GpxDisplayGroup selectedGroup;
|
||||
private final Set<Integer> selectedGroups = new LinkedHashSet<>();
|
||||
private final LinkedHashMap<GpxDisplayItemType, Set<GpxDisplayItem>> selectedItems = new LinkedHashMap<>();
|
||||
private boolean selectionMode;
|
||||
|
@ -97,7 +98,7 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
|
|||
listView.setOnChildClickListener(this);
|
||||
|
||||
adapter.setFilterResults(null);
|
||||
adapter.synchronizeGroups(getOriginalGroups());
|
||||
adapter.synchronizeGroups(getDisplayGroups());
|
||||
if (listView.getAdapter() == null) {
|
||||
listView.setAdapter(adapter);
|
||||
}
|
||||
|
@ -109,6 +110,14 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
|
|||
expandAllGroups();
|
||||
}
|
||||
|
||||
public void setSelectedGroup(GpxDisplayGroup selectedGroup) {
|
||||
this.selectedGroup = selectedGroup;
|
||||
}
|
||||
|
||||
public List<GpxDisplayGroup> getGroups() {
|
||||
return adapter.groups;
|
||||
}
|
||||
|
||||
private void addActions(LayoutInflater inflater) {
|
||||
View view = inflater.inflate(R.layout.preference_category_with_descr, listView, false);
|
||||
TextView title = view.findViewById(android.R.id.title);
|
||||
|
@ -174,6 +183,10 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
|
|||
return displayHelper.getOriginalGroups(filterTypes);
|
||||
}
|
||||
|
||||
private List<GpxDisplayGroup> getDisplayGroups() {
|
||||
return selectedGroup != null ? Collections.singletonList(selectedGroup) : getOriginalGroups();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
|
||||
GpxDisplayItem item = adapter.getChild(groupPosition, childPosition);
|
||||
|
@ -246,7 +259,7 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
|
|||
public void onPointsDeleted() {
|
||||
selectedItems.clear();
|
||||
selectedGroups.clear();
|
||||
adapter.synchronizeGroups(getOriginalGroups());
|
||||
adapter.synchronizeGroups(getDisplayGroups());
|
||||
}
|
||||
|
||||
public void filter(String text) {
|
||||
|
@ -618,16 +631,13 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
|
|||
} else {
|
||||
Set<Object> filter = new HashSet<>();
|
||||
String cs = constraint.toString().toLowerCase();
|
||||
List<GpxDisplayGroup> groups = getOriginalGroups();
|
||||
if (groups != null) {
|
||||
for (GpxDisplayGroup g : groups) {
|
||||
for (GpxDisplayItem i : g.getModifiableList()) {
|
||||
if (i.name.toLowerCase().contains(cs)) {
|
||||
filter.add(i);
|
||||
} else if (i.locationStart != null && !TextUtils.isEmpty(i.locationStart.category)
|
||||
&& i.locationStart.category.toLowerCase().contains(cs)) {
|
||||
filter.add(i.locationStart.category);
|
||||
}
|
||||
for (GpxDisplayGroup g : getDisplayGroups()) {
|
||||
for (GpxDisplayItem i : g.getModifiableList()) {
|
||||
if (i.name.toLowerCase().contains(cs)) {
|
||||
filter.add(i);
|
||||
} else if (i.locationStart != null && !TextUtils.isEmpty(i.locationStart.category)
|
||||
&& i.locationStart.category.toLowerCase().contains(cs)) {
|
||||
filter.add(i.locationStart.category);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -641,10 +651,7 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
|
|||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
||||
synchronized (adapter) {
|
||||
adapter.setFilterResults((Set<?>) results.values);
|
||||
List<GpxDisplayGroup> groups = getOriginalGroups();
|
||||
if (groups != null) {
|
||||
adapter.synchronizeGroups(groups);
|
||||
}
|
||||
adapter.synchronizeGroups(getDisplayGroups());
|
||||
}
|
||||
adapter.notifyDataSetChanged();
|
||||
expandAllGroups();
|
||||
|
|
Loading…
Reference in a new issue