Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Zatsepin <az@mapswithme.com>2018-04-26 12:20:32 +0300
committerRoman Kuznetsov <r.kuznetsow@gmail.com>2018-04-26 14:43:08 +0300
commit485845c4cfcd241ba505bc31d96fa934277f276f (patch)
tree864fdcabbb2652cf106c25378b7758739fc86ef9
parent45a629e3e579391a245a979166df7668188bb4e9 (diff)
[andorid] Refactored bookmark list ui to recycler view
-rw-r--r--android/res/layout/fragment_bookmark_list.xml7
-rw-r--r--android/res/layout/simple_list.xml6
-rw-r--r--android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java246
-rw-r--r--android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java143
-rw-r--r--android/src/com/mapswithme/maps/bookmarks/Holders.java184
5 files changed, 335 insertions, 251 deletions
diff --git a/android/res/layout/fragment_bookmark_list.xml b/android/res/layout/fragment_bookmark_list.xml
new file mode 100644
index 0000000000..4667abb269
--- /dev/null
+++ b/android/res/layout/fragment_bookmark_list.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.RecyclerView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/recycler"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:divider="@null"/>
diff --git a/android/res/layout/simple_list.xml b/android/res/layout/simple_list.xml
deleted file mode 100644
index 964b50ad8b..0000000000
--- a/android/res/layout/simple_list.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/list"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:divider="@null"/> \ No newline at end of file
diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java b/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java
index 328fda4773..c5510144c8 100644
--- a/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java
+++ b/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java
@@ -1,29 +1,25 @@
package com.mapswithme.maps.bookmarks;
import android.app.Activity;
-import android.graphics.drawable.Drawable;
import android.location.Location;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
-import android.view.View;
import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
import android.widget.TextView;
-import java.util.ArrayList;
-import java.util.List;
-
import com.mapswithme.maps.R;
-import com.mapswithme.maps.bookmarks.data.Bookmark;
import com.mapswithme.maps.bookmarks.data.BookmarkManager;
-import com.mapswithme.maps.bookmarks.data.DistanceAndAzimut;
-import com.mapswithme.maps.bookmarks.data.Track;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.location.LocationListener;
-import com.mapswithme.util.Graphics;
+import com.mapswithme.maps.widget.recycler.RecyclerClickListener;
+import com.mapswithme.maps.widget.recycler.RecyclerLongClickListener;
+import static com.mapswithme.maps.bookmarks.Holders.BaseBookmarkHolder.SECTION_BMKS;
+import static com.mapswithme.maps.bookmarks.Holders.BaseBookmarkHolder.SECTION_TRACKS;
+import static com.mapswithme.maps.bookmarks.Holders.BaseBookmarkHolder.getTracksSectionPosition;
-public class BookmarkListAdapter extends BaseAdapter
+public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookmarkHolder>
{
private final Activity mActivity;
private final long mCategoryId;
@@ -33,9 +29,6 @@ public class BookmarkListAdapter extends BaseAdapter
static final int TYPE_BOOKMARK = 1;
static final int TYPE_SECTION = 2;
- private static final int SECTION_TRACKS = 0;
- private static final int SECTION_BMKS = 1;
-
private final LocationListener mLocationListener = new LocationListener.Simple()
{
@Override
@@ -45,12 +38,27 @@ public class BookmarkListAdapter extends BaseAdapter
}
};
- public BookmarkListAdapter(Activity activity, long catId)
+ @Nullable
+ private RecyclerLongClickListener mLongClickListener;
+ @Nullable
+ private RecyclerClickListener mClickListener;
+
+ BookmarkListAdapter(Activity activity, long catId)
{
mActivity = activity;
mCategoryId = catId;
}
+ public void setOnClickListener(@Nullable RecyclerClickListener listener)
+ {
+ mClickListener = listener;
+ }
+
+ void setOnLongClickListener(@Nullable RecyclerLongClickListener listener)
+ {
+ mLongClickListener = listener;
+ }
+
public void startLocationUpdate()
{
LocationHelper.INSTANCE.addListener(mLocationListener, true);
@@ -62,78 +70,71 @@ public class BookmarkListAdapter extends BaseAdapter
}
@Override
- public int getViewTypeCount()
+ public Holders.BaseBookmarkHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
- return 3; // bookmark + track + section
+ LayoutInflater inflater = LayoutInflater.from(mActivity);
+ Holders.BaseBookmarkHolder holder = null;
+ switch (viewType)
+ {
+ case TYPE_TRACK:
+ holder = new Holders.TrackViewHolder(inflater.inflate(R.layout.item_track,
+ parent, false), mCategoryId);
+ break;
+ case TYPE_BOOKMARK:
+ holder = new Holders.BookmarkViewHolder(inflater.inflate(R.layout.item_bookmark,
+ parent,false), mCategoryId);
+ break;
+ case TYPE_SECTION:
+ holder = new Holders.SectionViewHolder((TextView) inflater.inflate(R.layout.item_category_title,
+ parent, false), mCategoryId);
+ break;
+ }
+
+ if (holder == null)
+ throw new AssertionError("Unsupported view type: " + viewType);
+
+ holder.setOnClickListener(mClickListener);
+ holder.setOnLongClickListener(mLongClickListener);
+ return holder;
+ }
+
+ @Override
+ public void onBindViewHolder(Holders.BaseBookmarkHolder holder, int position)
+ {
+ holder.bind(position);
}
@Override
public int getItemViewType(int position)
{
- final int bmkPos = getBookmarksSectionPosition();
- final int trackPos = getTracksSectionPosition();
+ final int bmkPos = Holders.BaseBookmarkHolder.getBookmarksSectionPosition(mCategoryId);
+ final int trackPos = getTracksSectionPosition(mCategoryId);
if (position == bmkPos || position == trackPos)
return TYPE_SECTION;
- if (position > bmkPos && !isSectionEmpty(SECTION_BMKS))
+ if (position > bmkPos && !Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_BMKS))
return TYPE_BOOKMARK;
- else if (position > trackPos && !isSectionEmpty(SECTION_TRACKS))
+ else if (position > trackPos && !Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_TRACKS))
return TYPE_TRACK;
throw new IllegalArgumentException("Position not found: " + position);
}
@Override
- public boolean isEnabled(int position)
- {
- return getItemViewType(position) != TYPE_SECTION;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent)
+ public long getItemId(int position)
{
- final int type = getItemViewType(position);
-
- if (type == TYPE_SECTION)
- {
- TextView sectionView;
-
- if (convertView == null)
- sectionView = (TextView) LayoutInflater.from(mActivity).inflate(R.layout.item_category_title, parent, false);
- else
- sectionView = (TextView) convertView;
-
- final int sectionIndex = getSectionForPosition(position);
- sectionView.setText(getSections().get(sectionIndex));
- return sectionView;
- }
-
- if (convertView == null)
- {
- final int id = (type == TYPE_BOOKMARK) ? R.layout.item_bookmark : R.layout.item_track;
- convertView = LayoutInflater.from(mActivity).inflate(id, parent, false);
- convertView.setTag(new PinHolder(convertView));
- }
-
- final PinHolder holder = (PinHolder) convertView.getTag();
- if (type == TYPE_BOOKMARK)
- holder.set((Bookmark) getItem(position));
- else
- holder.set((Track) getItem(position));
-
- return convertView;
+ return position;
}
@Override
- public int getCount()
+ public int getItemCount()
{
return BookmarkManager.INSTANCE.getCategorySize(mCategoryId)
- + (isSectionEmpty(SECTION_TRACKS) ? 0 : 1)
- + (isSectionEmpty(SECTION_BMKS) ? 0 : 1);
+ + (Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_TRACKS) ? 0 : 1)
+ + (Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_BMKS) ? 0 : 1);
}
- @Override
public Object getItem(int position)
{
if (getItemViewType(position) == TYPE_TRACK)
@@ -144,126 +145,11 @@ public class BookmarkListAdapter extends BaseAdapter
else
{
final int pos = position - 1
- - (isSectionEmpty(SECTION_TRACKS) ? 0 : BookmarkManager.INSTANCE.getTracksCount(mCategoryId) + 1);
+ - (Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_TRACKS)
+ ? 0 : BookmarkManager.INSTANCE.getTracksCount(mCategoryId) + 1);
final long bookmarkId = BookmarkManager.INSTANCE.getBookmarkIdByPosition(mCategoryId, pos);
return BookmarkManager.INSTANCE.getBookmark(bookmarkId);
}
}
- @Override
- public long getItemId(int position)
- {
- return position;
- }
-
- private class PinHolder
- {
- ImageView icon;
- TextView name;
- TextView distance;
-
- public PinHolder(View convertView)
- {
- icon = (ImageView) convertView.findViewById(R.id.iv__bookmark_color);
- name = (TextView) convertView.findViewById(R.id.tv__bookmark_name);
- distance = (TextView) convertView.findViewById(R.id.tv__bookmark_distance);
- }
-
- void setName(Bookmark bmk)
- {
- name.setText(bmk.getTitle());
- }
-
- void setName(Track trk)
- {
- name.setText(trk.getName());
- }
-
- void setDistance(Bookmark bmk)
- {
- final Location loc = LocationHelper.INSTANCE.getSavedLocation();
- if (loc != null)
- {
- final DistanceAndAzimut daa = bmk.getDistanceAndAzimuth(loc.getLatitude(), loc.getLongitude(), 0.0);
- distance.setText(daa.getDistance());
- }
- else
- distance.setText(null);
- }
-
- void setDistance(Track trk)
- {
- distance.setText(mActivity.getString(R.string.length) + " " + trk.getLengthString());
- }
-
- void setIcon(Bookmark bookmark)
- {
- icon.setImageResource(bookmark.getIcon().getSelectedResId());
- }
-
- void setIcon(Track trk)
- {
- final Drawable circle = Graphics.drawCircle(trk.getColor(), R.dimen.track_circle_size, mActivity.getResources());
- icon.setImageDrawable(circle);
- }
-
- void set(Bookmark bmk)
- {
- setName(bmk);
- setDistance(bmk);
- setIcon(bmk);
- }
-
- void set(Track track)
- {
- setName(track);
- setDistance(track);
- setIcon(track);
- }
- }
-
- private int getTracksSectionPosition()
- {
- if (isSectionEmpty(SECTION_TRACKS))
- return -1;
-
- return 0;
- }
-
- private int getBookmarksSectionPosition()
- {
- if (isSectionEmpty(SECTION_BMKS))
- return -1;
-
- return BookmarkManager.INSTANCE.getTracksCount(mCategoryId)
- + (isSectionEmpty(SECTION_TRACKS) ? 0 : 1);
- }
-
- private List<String> getSections()
- {
- final List<String> sections = new ArrayList<>();
- sections.add(mActivity.getString(R.string.tracks));
- sections.add(mActivity.getString(R.string.bookmarks));
- return sections;
- }
-
- private int getSectionForPosition(int position)
- {
- if (position == getTracksSectionPosition())
- return SECTION_TRACKS;
- if (position == getBookmarksSectionPosition())
- return SECTION_BMKS;
-
- throw new IllegalArgumentException("There is no section in position " + position);
- }
-
- private boolean isSectionEmpty(int section)
- {
- if (section == SECTION_TRACKS)
- return BookmarkManager.INSTANCE.getTracksCount(mCategoryId) == 0;
- if (section == SECTION_BMKS)
- return BookmarkManager.INSTANCE.getBookmarksCount(mCategoryId) == 0;
-
- throw new IllegalArgumentException("There is no section with index " + section);
- }
}
diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java
index db43f02c99..c53001150d 100644
--- a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java
+++ b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java
@@ -7,40 +7,39 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ListView;
import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.R;
-import com.mapswithme.maps.base.BaseMwmListFragment;
+import com.mapswithme.maps.base.BaseMwmRecyclerFragment;
import com.mapswithme.maps.bookmarks.data.Bookmark;
import com.mapswithme.maps.bookmarks.data.BookmarkManager;
import com.mapswithme.maps.bookmarks.data.BookmarkSharingResult;
import com.mapswithme.maps.bookmarks.data.Track;
import com.mapswithme.maps.widget.placepage.EditBookmarkFragment;
import com.mapswithme.maps.widget.placepage.Sponsored;
+import com.mapswithme.maps.widget.recycler.RecyclerClickListener;
+import com.mapswithme.maps.widget.recycler.RecyclerLongClickListener;
import com.mapswithme.util.BottomSheetHelper;
import com.mapswithme.util.sharing.ShareOption;
import com.mapswithme.util.sharing.SharingHelper;
-public class BookmarksListFragment extends BaseMwmListFragment
- implements AdapterView.OnItemLongClickListener,
- MenuItem.OnMenuItemClickListener,
- BookmarkManager.BookmarksSharingListener
+public class BookmarksListFragment extends BaseMwmRecyclerFragment
+ implements RecyclerLongClickListener, RecyclerClickListener,
+ MenuItem.OnMenuItemClickListener,
+ BookmarkManager.BookmarksSharingListener
{
public static final String TAG = BookmarksListFragment.class.getSimpleName();
private int mCategoryPosition;
private long mCategoryId;
private int mSelectedPosition;
- @Nullable
- private BookmarkListAdapter mAdapter;
@CallSuper
@Override
@@ -52,9 +51,15 @@ public class BookmarksListFragment extends BaseMwmListFragment
}
@Override
+ protected RecyclerView.Adapter createAdapter()
+ {
+ return new BookmarkListAdapter(getActivity(), mCategoryId);
+ }
+
+ @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
- return inflater.inflate(R.layout.simple_list, container, false);
+ return inflater.inflate(R.layout.fragment_bookmark_list, container, false);
}
@CallSuper
@@ -80,11 +85,12 @@ public class BookmarksListFragment extends BaseMwmListFragment
public void onResume()
{
super.onResume();
- if (mAdapter == null)
+ BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter();
+ if (adapter == null)
return;
- mAdapter.startLocationUpdate();
- mAdapter.notifyDataSetChanged();
+ adapter.startLocationUpdate();
+ adapter.notifyDataSetChanged();
}
@Override
@@ -92,8 +98,9 @@ public class BookmarksListFragment extends BaseMwmListFragment
{
super.onPause();
- if (mAdapter != null)
- mAdapter.stopLocationUpdate();
+ BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter();
+ if (adapter != null)
+ adapter.stopLocationUpdate();
}
@Override
@@ -105,30 +112,35 @@ public class BookmarksListFragment extends BaseMwmListFragment
private void initList()
{
- mAdapter = new BookmarkListAdapter(getActivity(), mCategoryId);
- mAdapter.startLocationUpdate();
- setListAdapter(mAdapter);
- getListView().setOnItemLongClickListener(this);
+ BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter();
+ if (adapter != null)
+ {
+ adapter.startLocationUpdate();
+ adapter.setOnClickListener(this);
+ adapter.setOnLongClickListener(this);
+ }
}
@Override
- public void onListItemClick(ListView l, View v, int position, long id)
+ public void onItemClick(View v, int position)
{
final Intent i = new Intent(getActivity(), MwmActivity.class);
- if (mAdapter != null)
+ BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter();
+
+ if (adapter != null)
{
- switch (mAdapter.getItemViewType(position))
+ switch (adapter.getItemViewType(position))
{
case BookmarkListAdapter.TYPE_SECTION:
return;
case BookmarkListAdapter.TYPE_BOOKMARK:
- final Bookmark bookmark = (Bookmark) mAdapter.getItem(position);
+ final Bookmark bookmark = (Bookmark) adapter.getItem(position);
i.putExtra(MwmActivity.EXTRA_TASK,
new MwmActivity.ShowBookmarkTask(bookmark.getCategoryId(), bookmark.getBookmarkId()));
break;
case BookmarkListAdapter.TYPE_TRACK:
- final Track track = (Track) mAdapter.getItem(position);
+ final Track track = (Track) adapter.getItem(position);
i.putExtra(MwmActivity.EXTRA_TASK,
new MwmActivity.ShowTrackTask(track.getCategoryId(), track.getTrackId()));
break;
@@ -140,53 +152,53 @@ public class BookmarksListFragment extends BaseMwmListFragment
}
@Override
- public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
+ public void onLongItemClick(View v, int position)
{
- if (mAdapter == null)
- return false;
+ BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter();
+ if (adapter == null)
+ return;
mSelectedPosition = position;
- final Object item = mAdapter.getItem(mSelectedPosition);
- int type = mAdapter.getItemViewType(mSelectedPosition);
+ final Object item = adapter.getItem(mSelectedPosition);
+ int type = adapter.getItemViewType(mSelectedPosition);
switch (type)
{
- case BookmarkListAdapter.TYPE_SECTION:
- // Do nothing here?
- break;
-
- case BookmarkListAdapter.TYPE_BOOKMARK:
- BottomSheetHelper.Builder bs = BottomSheetHelper.create(getActivity(), ((Bookmark) item).getTitle())
- .sheet(R.menu.menu_bookmarks)
- .listener(this);
- if (!ShareOption.SMS.isSupported(getActivity()))
- bs.getMenu().removeItem(R.id.share_message);
-
- if (!ShareOption.EMAIL.isSupported(getActivity()))
- bs.getMenu().removeItem(R.id.share_email);
-
- bs.tint().show();
- break;
-
- case BookmarkListAdapter.TYPE_TRACK:
- BottomSheetHelper.create(getActivity(), ((Track) item).getName())
- .sheet(Menu.NONE, R.drawable.ic_delete, R.string.delete)
- .listener(new MenuItem.OnMenuItemClickListener()
- {
- @Override
- public boolean onMenuItemClick(MenuItem menuItem)
+ case BookmarkListAdapter.TYPE_SECTION:
+ // Do nothing here?
+ break;
+
+ case BookmarkListAdapter.TYPE_BOOKMARK:
+ BottomSheetHelper.Builder bs = BottomSheetHelper.create(getActivity(), ((Bookmark) item).getTitle())
+ .sheet(R.menu.menu_bookmarks)
+ .listener(this);
+ if (!ShareOption.SMS.isSupported(getActivity()))
+ bs.getMenu().removeItem(R.id.share_message);
+
+ if (!ShareOption.EMAIL.isSupported(getActivity()))
+ bs.getMenu().removeItem(R.id.share_email);
+
+ bs.tint().show();
+ break;
+
+ case BookmarkListAdapter.TYPE_TRACK:
+ BottomSheetHelper.create(getActivity(), ((Track) item).getName())
+ .sheet(Menu.NONE, R.drawable.ic_delete, R.string.delete)
+ .listener(new MenuItem.OnMenuItemClickListener()
{
- BookmarkManager.INSTANCE.deleteTrack(((Track) item).getTrackId());
- mAdapter.notifyDataSetChanged();
- return false;
- }
- }).tint().show();
- break;
+ @Override
+ public boolean onMenuItemClick(MenuItem menuItem)
+ {
+ BookmarkManager.INSTANCE.deleteTrack(((Track) item).getTrackId());
+ adapter.notifyDataSetChanged();
+ return false;
+ }
+ }).tint().show();
+ break;
}
-
- return true;
}
+
@Override
public void onPreparedFileForSharing(@NonNull BookmarkSharingResult result)
{
@@ -196,10 +208,11 @@ public class BookmarksListFragment extends BaseMwmListFragment
@Override
public boolean onMenuItemClick(MenuItem menuItem)
{
- if (mAdapter == null)
+ BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter();
+ if (adapter == null)
return false;
- Bookmark item = (Bookmark) mAdapter.getItem(mSelectedPosition);
+ Bookmark item = (Bookmark) adapter.getItem(mSelectedPosition);
switch (menuItem.getItemId())
{
@@ -222,14 +235,14 @@ public class BookmarksListFragment extends BaseMwmListFragment
@Override
public void onBookmarkSaved(long bookmarkId)
{
- mAdapter.notifyDataSetChanged();
+ adapter.notifyDataSetChanged();
}
});
break;
case R.id.delete:
BookmarkManager.INSTANCE.deleteBookmark(item.getBookmarkId());
- mAdapter.notifyDataSetChanged();
+ adapter.notifyDataSetChanged();
break;
}
return false;
diff --git a/android/src/com/mapswithme/maps/bookmarks/Holders.java b/android/src/com/mapswithme/maps/bookmarks/Holders.java
index e32e126d93..f9495c1369 100644
--- a/android/src/com/mapswithme/maps/bookmarks/Holders.java
+++ b/android/src/com/mapswithme/maps/bookmarks/Holders.java
@@ -1,15 +1,29 @@
package com.mapswithme.maps.bookmarks;
+import android.graphics.drawable.Drawable;
+import android.location.Location;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.CheckBox;
+import android.widget.ImageView;
import android.widget.TextView;
import com.mapswithme.maps.R;
+import com.mapswithme.maps.bookmarks.data.Bookmark;
+import com.mapswithme.maps.bookmarks.data.BookmarkManager;
+import com.mapswithme.maps.bookmarks.data.DistanceAndAzimut;
+import com.mapswithme.maps.bookmarks.data.Track;
+import com.mapswithme.maps.location.LocationHelper;
+import com.mapswithme.maps.widget.recycler.RecyclerClickListener;
+import com.mapswithme.maps.widget.recycler.RecyclerLongClickListener;
+import com.mapswithme.util.Graphics;
import com.mapswithme.util.UiUtils;
+import java.util.ArrayList;
+import java.util.List;
+
public class Holders
{
static class GeneralViewHolder extends RecyclerView.ViewHolder
@@ -104,4 +118,174 @@ public class Holders
mSize.setText(mSize.getResources().getQuantityString(R.plurals.bookmarks_places, size, size));
}
}
+
+ static abstract class BaseBookmarkHolder extends RecyclerView.ViewHolder
+ {
+ static final int SECTION_TRACKS = 0;
+ static final int SECTION_BMKS = 1;
+ final long mCategoryId;
+ @NonNull
+ private final View mView;
+
+ BaseBookmarkHolder(@NonNull View itemView, long categoryId)
+ {
+ super(itemView);
+ mCategoryId = categoryId;
+ mView = itemView;
+ }
+
+ abstract void bind(int position);
+
+ static boolean isSectionEmpty(long categoryId, int section)
+ {
+ if (section == SECTION_TRACKS)
+ return BookmarkManager.INSTANCE.getTracksCount(categoryId) == 0;
+ if (section == SECTION_BMKS)
+ return BookmarkManager.INSTANCE.getBookmarksCount(categoryId) == 0;
+
+ throw new IllegalArgumentException("There is no section with index " + section);
+ }
+
+ static int getSectionForPosition(long categoryId, int position)
+ {
+ if (position == getTracksSectionPosition(categoryId))
+ return SECTION_TRACKS;
+ if (position == getBookmarksSectionPosition(categoryId))
+ return SECTION_BMKS;
+
+ throw new IllegalArgumentException("There is no section in position " + position);
+ }
+
+ static int getTracksSectionPosition(long categoryId)
+ {
+ if (isSectionEmpty(categoryId, SECTION_TRACKS))
+ return -1;
+
+ return 0;
+ }
+
+ static int getBookmarksSectionPosition(long categoryId)
+ {
+ if (isSectionEmpty(categoryId, SECTION_BMKS))
+ return -1;
+
+ return BookmarkManager.INSTANCE.getTracksCount(categoryId)
+ + (isSectionEmpty(categoryId, SECTION_TRACKS) ? 0 : 1);
+ }
+
+ void setOnClickListener(@Nullable RecyclerClickListener listener)
+ {
+ mView.setOnClickListener(v -> {
+ if (listener != null)
+ listener.onItemClick(v, getAdapterPosition());
+ });
+ }
+
+ void setOnLongClickListener(@Nullable RecyclerLongClickListener listener)
+ {
+ mView.setOnLongClickListener(v -> {
+ if (listener != null)
+ listener.onLongItemClick(v, getAdapterPosition());
+ return true;
+ });
+ }
+ }
+
+ static class BookmarkViewHolder extends BaseBookmarkHolder
+ {
+ @NonNull
+ private final ImageView mIcon;
+ @NonNull
+ private final TextView mName;
+ @NonNull
+ private final TextView mDistance;
+
+ BookmarkViewHolder(@NonNull View itemView, long categoryId)
+ {
+ super(itemView, categoryId);
+ mIcon = itemView.findViewById(R.id.iv__bookmark_color);
+ mName = itemView.findViewById(R.id.tv__bookmark_name);
+ mDistance = itemView.findViewById(R.id.tv__bookmark_distance);
+ }
+
+ @Override
+ void bind(int position)
+ {
+ int pos = position - 1 - (isSectionEmpty(mCategoryId, SECTION_TRACKS)
+ ? 0 : BookmarkManager.INSTANCE.getTracksCount(mCategoryId) + 1);
+ final long bookmarkId = BookmarkManager.INSTANCE.getBookmarkIdByPosition(mCategoryId, pos);
+ Bookmark bookmark = BookmarkManager.INSTANCE.getBookmark(bookmarkId);
+ mName.setText(bookmark.getTitle());
+ final Location loc = LocationHelper.INSTANCE.getSavedLocation();
+ if (loc != null)
+ {
+ final DistanceAndAzimut daa = bookmark.getDistanceAndAzimuth(loc.getLatitude(),
+ loc.getLongitude(), 0.0);
+ mDistance.setText(daa.getDistance());
+ }
+ else
+ mDistance.setText(null);
+ mIcon.setImageResource(bookmark.getIcon().getSelectedResId());
+ }
+ }
+
+ static class TrackViewHolder extends BaseBookmarkHolder
+ {
+ @NonNull
+ private final ImageView mIcon;
+ @NonNull
+ private final TextView mName;
+ @NonNull
+ private final TextView mDistance;
+
+ TrackViewHolder(@NonNull View itemView, long categoryId)
+ {
+ super(itemView, categoryId);
+ mIcon = itemView.findViewById(R.id.iv__bookmark_color);
+ mName = itemView.findViewById(R.id.tv__bookmark_name);
+ mDistance = itemView.findViewById(R.id.tv__bookmark_distance);
+ }
+
+ @Override
+ void bind(int position)
+ {
+ final long trackId = BookmarkManager.INSTANCE.getTrackIdByPosition(mCategoryId,
+ position - 1);
+ Track track = BookmarkManager.INSTANCE.getTrack(trackId);
+ mName.setText(track.getName());
+ mDistance.setText(mDistance.getContext().getString(R.string.length)
+ + " " + track.getLengthString());
+ Drawable circle = Graphics.drawCircle(track.getColor(), R.dimen.track_circle_size,
+ mIcon.getContext().getResources());
+ mIcon.setImageDrawable(circle);
+ }
+ }
+
+ static class SectionViewHolder extends BaseBookmarkHolder
+ {
+ @NonNull
+ private final TextView mView;
+
+ SectionViewHolder(@NonNull TextView itemView, long categoryId)
+ {
+ super(itemView, categoryId);
+ mView = itemView;
+ }
+
+ @Override
+ void bind(int position)
+ {
+ final int sectionIndex = getSectionForPosition(mCategoryId, position);
+ mView.setText(getSections().get(sectionIndex));
+ mView.setText(getSections().get(sectionIndex));
+ }
+
+ private List<String> getSections()
+ {
+ final List<String> sections = new ArrayList<>();
+ sections.add(mView.getContext().getString(R.string.tracks));
+ sections.add(mView.getContext().getString(R.string.bookmarks));
+ return sections;
+ }
+ }
}