Android widget config list adapter cleanup

This commit is contained in:
Andrei 2020-05-24 20:06:54 -07:00
parent 0f1eb22d10
commit 4323aeb0f9
3 changed files with 236 additions and 394 deletions

View file

@ -1,292 +0,0 @@
package com.newsblur.activity;
import android.content.Context;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;
import com.newsblur.R;
import com.newsblur.domain.Feed;
import com.newsblur.util.AppConstants;
import com.newsblur.util.FeedOrderFilter;
import com.newsblur.util.FeedUtils;
import com.newsblur.util.FolderViewFilter;
import com.newsblur.util.ListOrderFilter;
import com.newsblur.util.PrefsUtils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.TimeZone;
public class WidgetAdapter extends BaseExpandableListAdapter {
private final static int defaultTextSizeChild = 14;
private final static int defaultTextSizeGroup = 13;
private Set<String> feedIds = new HashSet<>();
private ArrayList<String> folderNames = new ArrayList<>();
private ArrayList<ArrayList<Feed>> folderChildren = new ArrayList<>();
private FolderViewFilter folderViewFilter;
private ListOrderFilter listOrderFilter;
private FeedOrderFilter feedOrderFilter;
private float textSize;
WidgetAdapter(Context context) {
folderViewFilter = PrefsUtils.getWidgetConfigFolderView(context);
listOrderFilter = PrefsUtils.getWidgetConfigListOrder(context);
feedOrderFilter = PrefsUtils.getWidgetConfigFeedOrder(context);
textSize = PrefsUtils.getListTextSize(context);
}
@Override
public int getGroupCount() {
return folderNames.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return folderChildren.get(groupPosition).size();
}
@Override
public String getGroup(int groupPosition) {
return folderNames.get(groupPosition);
}
@Override
public Feed getChild(int groupPosition, int childPosition) {
return folderChildren.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return folderNames.get(groupPosition).hashCode();
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return folderChildren.get(groupPosition).get(childPosition).hashCode();
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
String folderName = folderNames.get(groupPosition);
if (folderName.equals(AppConstants.ROOT_FOLDER)) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_widget_config_root_folder, parent, false);
} else {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_widget_config_folder, parent, false);
TextView textName = convertView.findViewById(R.id.text_folder_name);
textName.setTextSize(textSize * defaultTextSizeGroup);
textName.setText(folderName);
}
((ExpandableListView) parent).expandGroup(groupPosition);
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<Feed> folderChild = WidgetAdapter.this.folderChildren.get(groupPosition);
// check all is selected
boolean allSelected = true;
for (Feed feed : folderChild) {
if (!feedIds.contains(feed.feedId)) {
allSelected = false;
break;
}
}
for (Feed feed : folderChild) {
if (allSelected) {
feedIds.remove(feed.feedId);
} else {
feedIds.add(feed.feedId);
}
}
setWidgetFeedIds(parent.getContext());
notifyDataChanged();
}
});
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, final ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_widget_config_feed, parent, false);
}
final Feed feed = folderChildren.get(groupPosition).get(childPosition);
TextView textTitle = convertView.findViewById(R.id.text_title);
TextView textDetails = convertView.findViewById(R.id.text_details);
final CheckBox checkBox = convertView.findViewById(R.id.check_box);
ImageView img = convertView.findViewById(R.id.img);
textTitle.setTextSize(textSize * defaultTextSizeChild);
textDetails.setTextSize(textSize * defaultTextSizeChild);
textTitle.setText(feed.title);
checkBox.setChecked(feedIds.contains(feed.feedId));
if (feedOrderFilter == FeedOrderFilter.NAME || feedOrderFilter == FeedOrderFilter.OPENS) {
textDetails.setText(parent.getContext().getString(R.string.feed_opens, feed.feedOpens));
} else if (feedOrderFilter == FeedOrderFilter.SUBSCRIBERS) {
textDetails.setText(parent.getContext().getString(R.string.feed_subscribers, feed.subscribers));
} else if (feedOrderFilter == FeedOrderFilter.STORIES_MONTH) {
textDetails.setText(parent.getContext().getString(R.string.feed_stories_per_month, feed.storiesPerMonth));
} else {
// FeedOrderFilter.RECENT_STORY
try {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date dateTime = dateFormat.parse(feed.lastStoryDate);
CharSequence relativeTimeString = DateUtils.getRelativeTimeSpanString(dateTime.getTime(), System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
textDetails.setText(relativeTimeString);
} catch (Exception e) {
textDetails.setText(feed.lastStoryDate);
}
}
FeedUtils.iconLoader.displayImage(feed.faviconUrl, img, 0, false, img.getHeight(), true);
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkBox.setChecked(!checkBox.isChecked());
if (checkBox.isChecked()) {
feedIds.add(feed.feedId);
} else {
feedIds.remove(feed.feedId);
}
setWidgetFeedIds(parent.getContext());
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
@Override
public boolean areAllItemsEnabled() {
return super.areAllItemsEnabled();
}
void setData(ArrayList<String> activeFoldersNames, ArrayList<ArrayList<Feed>> activeFolderChildren, ArrayList<Feed> feeds) {
if (folderViewFilter == FolderViewFilter.NESTED) {
this.folderNames = activeFoldersNames;
this.folderChildren = activeFolderChildren;
} else {
this.folderNames = new ArrayList<>(1);
this.folderNames.add(AppConstants.ROOT_FOLDER);
this.folderChildren = new ArrayList<>();
this.folderChildren.add(feeds);
}
this.notifyDataChanged();
}
void replaceFeedOrder(FeedOrderFilter feedOrderFilter) {
this.feedOrderFilter = feedOrderFilter;
notifyDataChanged();
}
void replaceListOrder(ListOrderFilter listOrderFilter) {
this.listOrderFilter = listOrderFilter;
notifyDataChanged();
}
void replaceFolderView(FolderViewFilter folderViewFilter) {
this.folderViewFilter = folderViewFilter;
}
private void notifyDataChanged() {
for (ArrayList<Feed> feedList : this.folderChildren) {
Collections.sort(feedList, getListComparator());
}
this.notifyDataSetChanged();
}
void setFeedIds(Set<String> feedIds) {
this.feedIds.clear();
this.feedIds.addAll(feedIds);
this.notifyDataSetChanged();
}
private void setWidgetFeedIds(Context context) {
PrefsUtils.setWidgetFeedIds(context, feedIds);
}
private Comparator<Feed> getListComparator() {
return new Comparator<Feed>() {
@Override
public int compare(Feed o1, Feed o2) {
if (feedOrderFilter == FeedOrderFilter.NAME && listOrderFilter == ListOrderFilter.ASCENDING) {
return o1.title.compareTo(o2.title);
} else if (feedOrderFilter == FeedOrderFilter.NAME && listOrderFilter == ListOrderFilter.DESCENDING) {
return o2.title.compareTo(o1.title);
} else if (feedOrderFilter == FeedOrderFilter.SUBSCRIBERS && listOrderFilter == ListOrderFilter.ASCENDING) {
return Integer.valueOf(o1.subscribers).compareTo(Integer.valueOf(o2.subscribers));
} else if (feedOrderFilter == FeedOrderFilter.SUBSCRIBERS && listOrderFilter == ListOrderFilter.DESCENDING) {
return Integer.valueOf(o2.subscribers).compareTo(Integer.valueOf(o1.subscribers));
} else if (feedOrderFilter == FeedOrderFilter.OPENS && listOrderFilter == ListOrderFilter.ASCENDING) {
return Integer.compare(o1.feedOpens, o2.feedOpens);
} else if (feedOrderFilter == FeedOrderFilter.OPENS && listOrderFilter == ListOrderFilter.DESCENDING) {
return Integer.compare(o2.feedOpens, o1.feedOpens);
} else if (feedOrderFilter == FeedOrderFilter.RECENT_STORY && listOrderFilter == ListOrderFilter.ASCENDING) {
return compareLastStoryDateTimes(o1.lastStoryDate, o2.lastStoryDate, listOrderFilter);
} else if (feedOrderFilter == FeedOrderFilter.RECENT_STORY && listOrderFilter == ListOrderFilter.DESCENDING) {
return compareLastStoryDateTimes(o1.lastStoryDate, o2.lastStoryDate, listOrderFilter);
} else if (feedOrderFilter == FeedOrderFilter.STORIES_MONTH && listOrderFilter == ListOrderFilter.ASCENDING) {
return Integer.compare(o1.storiesPerMonth, o2.storiesPerMonth);
} else if (feedOrderFilter == FeedOrderFilter.STORIES_MONTH && listOrderFilter == ListOrderFilter.DESCENDING) {
return Integer.compare(o2.storiesPerMonth, o1.storiesPerMonth);
}
return o1.title.compareTo(o2.title);
}
};
}
private int compareLastStoryDateTimes(String firstDateTime, String secondDateTime, ListOrderFilter listOrderFilter) {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
// found null last story date times on feeds
if (TextUtils.isEmpty(firstDateTime)) {
firstDateTime = "2000-01-01 00:00:00";
}
if (TextUtils.isEmpty(secondDateTime)) {
secondDateTime = "2000-01-01 00:00:00";
}
Date firstDate = dateFormat.parse(firstDateTime);
Date secondDate = dateFormat.parse(secondDateTime);
if (listOrderFilter == ListOrderFilter.ASCENDING) {
return firstDate.compareTo(secondDate);
} else {
return secondDate.compareTo(firstDate);
}
} catch (ParseException e) {
e.printStackTrace();
return 0;
}
}
}

View file

@ -40,7 +40,7 @@ public class WidgetConfig extends NbActivity {
@Bind(R.id.text_no_subscriptions)
TextView textNoSubscriptions;
private WidgetAdapter adapter;
private WidgetConfigAdapter adapter;
private ArrayList<Feed> feeds;
private ArrayList<Folder> folders;
private Map<String, Feed> feedMap = new HashMap<>();
@ -141,7 +141,7 @@ public class WidgetConfig extends NbActivity {
selectAllFeeds();
return true;
case R.id.menu_select_none:
setWidgetFeedIds(Collections.<String>emptySet());
replaceWidgetFeedIds(Collections.<String>emptySet());
return true;
default:
return super.onOptionsItemSelected(item);
@ -149,16 +149,8 @@ public class WidgetConfig extends NbActivity {
}
private void setupList() {
adapter = new WidgetAdapter(this);
adapter = new WidgetConfigAdapter(this);
listView.setAdapter(adapter);
Set<String> feedIds = PrefsUtils.getWidgetFeedIds(this);
// by default select all feeds
if (feedIds != null) {
adapter.setFeedIds(feedIds);
} else {
selectAllFeeds();
}
}
private void loadFeeds() {
@ -228,6 +220,7 @@ public class WidgetConfig extends NbActivity {
folderChildren.add(activeFeeds);
}
setSelectedFeeds();
setAdapterData();
}
}
@ -237,12 +230,12 @@ public class WidgetConfig extends NbActivity {
for (Feed feed : this.feeds) {
feedIds.add(feed.feedId);
}
setWidgetFeedIds(feedIds);
replaceWidgetFeedIds(feedIds);
}
private void setWidgetFeedIds(Set<String> feedIds) {
private void replaceWidgetFeedIds(Set<String> feedIds) {
PrefsUtils.setWidgetFeedIds(this, feedIds);
adapter.setFeedIds(feedIds);
adapter.replaceFeedIds(feedIds);
}
private void replaceFeedOrderFilter(FeedOrderFilter feedOrderFilter) {
@ -261,6 +254,18 @@ public class WidgetConfig extends NbActivity {
setAdapterData();
}
private void setSelectedFeeds() {
Set<String> feedIds = PrefsUtils.getWidgetFeedIds(this);
// by default select all feeds
if (feedIds == null) {
feedIds = new HashSet<>(this.feeds.size());
for (Feed feed : this.feeds) {
feedIds.add(feed.feedId);
}
}
adapter.setFeedIds(feedIds);
}
private void setAdapterData() {
adapter.setData(this.folderNames, this.folderChildren, this.feeds);

View file

@ -1,59 +1,157 @@
package com.newsblur.activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;
import com.newsblur.R;
import com.newsblur.domain.Feed;
import com.newsblur.util.AppConstants;
import com.newsblur.util.FeedOrderFilter;
import com.newsblur.util.FeedUtils;
import com.newsblur.util.FolderViewFilter;
import com.newsblur.util.ListOrderFilter;
import com.newsblur.util.PrefsUtils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.TimeZone;
import butterknife.Bind;
import butterknife.ButterKnife;
public class WidgetConfigAdapter extends BaseExpandableListAdapter {
public class WidgetConfigAdapter extends RecyclerView.Adapter<WidgetConfigAdapter.ViewHolder> {
private final static int defaultTextSizeChild = 14;
private final static int defaultTextSizeGroup = 13;
private ArrayList<Feed> feedList = new ArrayList<>();
private Set<String> feedIds = new HashSet<>();
private FeedOrderFilter feedOrderFilter = FeedOrderFilter.NAME;
private ArrayList<String> folderNames = new ArrayList<>();
private ArrayList<ArrayList<Feed>> folderChildren = new ArrayList<>();
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_widget_config_feed, parent, false);
return new ViewHolder(view);
private FolderViewFilter folderViewFilter;
private ListOrderFilter listOrderFilter;
private FeedOrderFilter feedOrderFilter;
private float textSize;
WidgetConfigAdapter(Context context) {
folderViewFilter = PrefsUtils.getWidgetConfigFolderView(context);
listOrderFilter = PrefsUtils.getWidgetConfigListOrder(context);
feedOrderFilter = PrefsUtils.getWidgetConfigFeedOrder(context);
textSize = PrefsUtils.getListTextSize(context);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Feed feed = feedList.get(position);
public int getGroupCount() {
return folderNames.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return folderChildren.get(groupPosition).size();
}
@Override
public String getGroup(int groupPosition) {
return folderNames.get(groupPosition);
}
@Override
public Feed getChild(int groupPosition, int childPosition) {
return folderChildren.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return folderNames.get(groupPosition).hashCode();
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return folderChildren.get(groupPosition).get(childPosition).hashCode();
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
String folderName = folderNames.get(groupPosition);
if (folderName.equals(AppConstants.ROOT_FOLDER)) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_widget_config_root_folder, parent, false);
} else {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_widget_config_folder, parent, false);
TextView textName = convertView.findViewById(R.id.text_folder_name);
textName.setTextSize(textSize * defaultTextSizeGroup);
textName.setText(folderName);
}
((ExpandableListView) parent).expandGroup(groupPosition);
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<Feed> folderChild = WidgetConfigAdapter.this.folderChildren.get(groupPosition);
// check all is selected
boolean allSelected = true;
for (Feed feed : folderChild) {
if (!feedIds.contains(feed.feedId)) {
allSelected = false;
break;
}
}
for (Feed feed : folderChild) {
if (allSelected) {
feedIds.remove(feed.feedId);
} else {
feedIds.add(feed.feedId);
}
}
setWidgetFeedIds(parent.getContext());
notifyDataChanged();
}
});
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, final ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_widget_config_feed, parent, false);
}
final Feed feed = folderChildren.get(groupPosition).get(childPosition);
TextView textTitle = convertView.findViewById(R.id.text_title);
TextView textDetails = convertView.findViewById(R.id.text_details);
final CheckBox checkBox = convertView.findViewById(R.id.check_box);
ImageView img = convertView.findViewById(R.id.img);
textTitle.setTextSize(textSize * defaultTextSizeChild);
textDetails.setTextSize(textSize * defaultTextSizeChild);
textTitle.setText(feed.title);
checkBox.setChecked(feedIds.contains(feed.feedId));
holder.checkBox.setChecked(feedIds.contains(feed.feedId));
holder.textTitle.setText(feed.title);
if (feedOrderFilter == FeedOrderFilter.NAME || feedOrderFilter == FeedOrderFilter.OPENS) {
holder.textDetails.setText(holder.itemView.getContext().getString(R.string.feed_opens, feed.feedOpens));
textDetails.setText(parent.getContext().getString(R.string.feed_opens, feed.feedOpens));
} else if (feedOrderFilter == FeedOrderFilter.SUBSCRIBERS) {
holder.textDetails.setText(holder.itemView.getContext().getString(R.string.feed_subscribers, feed.subscribers));
textDetails.setText(parent.getContext().getString(R.string.feed_subscribers, feed.subscribers));
} else if (feedOrderFilter == FeedOrderFilter.STORIES_MONTH) {
holder.textDetails.setText(holder.itemView.getContext().getString(R.string.feed_stories_per_month, feed.storiesPerMonth));
textDetails.setText(parent.getContext().getString(R.string.feed_stories_per_month, feed.storiesPerMonth));
} else {
// FeedOrderFilter.RECENT_STORY
try {
@ -61,49 +159,80 @@ public class WidgetConfigAdapter extends RecyclerView.Adapter<WidgetConfigAdapte
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date dateTime = dateFormat.parse(feed.lastStoryDate);
CharSequence relativeTimeString = DateUtils.getRelativeTimeSpanString(dateTime.getTime(), System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
holder.textDetails.setText(relativeTimeString);
textDetails.setText(relativeTimeString);
} catch (Exception e) {
holder.textDetails.setText(feed.lastStoryDate);
textDetails.setText(feed.lastStoryDate);
}
}
FeedUtils.iconLoader.displayImage(feed.faviconUrl, holder.img, 0, false);
FeedUtils.iconLoader.displayImage(feed.faviconUrl, img, 0, false, img.getHeight(), true);
holder.itemView.setOnClickListener(new View.OnClickListener() {
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.checkBox.setChecked(!holder.checkBox.isChecked());
if (holder.checkBox.isChecked()) {
checkBox.setChecked(!checkBox.isChecked());
if (checkBox.isChecked()) {
feedIds.add(feed.feedId);
} else {
feedIds.remove(feed.feedId);
}
setWidgetFeedIds(holder.itemView.getContext());
setWidgetFeedIds(parent.getContext());
}
});
return convertView;
}
@Override
public int getItemCount() {
return feedList.size();
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
void diffAll(ArrayList<Feed> feedList, FeedOrderFilter feedOrderFilter) {
boolean hasSameFilter = this.feedOrderFilter == feedOrderFilter;
DiffUtil.Callback diffCallback = new WidgetListDiffCallback(this.feedList, feedList, hasSameFilter);
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
this.feedList.clear();
this.feedList.addAll(feedList);
@Override
public boolean areAllItemsEnabled() {
return super.areAllItemsEnabled();
}
void setData(ArrayList<String> activeFoldersNames, ArrayList<ArrayList<Feed>> activeFolderChildren, ArrayList<Feed> feeds) {
if (folderViewFilter == FolderViewFilter.NESTED) {
this.folderNames = activeFoldersNames;
this.folderChildren = activeFolderChildren;
} else {
this.folderNames = new ArrayList<>(1);
this.folderNames.add(AppConstants.ROOT_FOLDER);
this.folderChildren = new ArrayList<>();
this.folderChildren.add(feeds);
}
this.notifyDataChanged();
}
void replaceFeedOrder(FeedOrderFilter feedOrderFilter) {
this.feedOrderFilter = feedOrderFilter;
diffResult.dispatchUpdatesTo(this);
notifyDataChanged();
}
void replaceAll(Context context, ArrayList<Feed> feedList, Set<String> feedIds) {
this.feedOrderFilter = PrefsUtils.getWidgetConfigFeedOrder(context);
void replaceListOrder(ListOrderFilter listOrderFilter) {
this.listOrderFilter = listOrderFilter;
notifyDataChanged();
}
void replaceFolderView(FolderViewFilter folderViewFilter) {
this.folderViewFilter = folderViewFilter;
}
private void notifyDataChanged() {
for (ArrayList<Feed> feedList : this.folderChildren) {
Collections.sort(feedList, getListComparator());
}
this.notifyDataSetChanged();
}
void setFeedIds(Set<String> feedIds) {
this.feedIds.clear();
this.feedIds.addAll(feedIds);
this.feedList.clear();
this.feedList.addAll(feedList);
}
void replaceFeedIds(Set<String> feedIds) {
setFeedIds(feedIds);
this.notifyDataSetChanged();
}
@ -111,57 +240,57 @@ public class WidgetConfigAdapter extends RecyclerView.Adapter<WidgetConfigAdapte
PrefsUtils.setWidgetFeedIds(context, feedIds);
}
static class ViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.text_title)
TextView textTitle;
@Bind(R.id.text_details)
TextView textDetails;
@Bind(R.id.check_box)
CheckBox checkBox;
@Bind(R.id.img)
ImageView img;
ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
private Comparator<Feed> getListComparator() {
return new Comparator<Feed>() {
@Override
public int compare(Feed o1, Feed o2) {
if (feedOrderFilter == FeedOrderFilter.NAME && listOrderFilter == ListOrderFilter.ASCENDING) {
return o1.title.compareTo(o2.title);
} else if (feedOrderFilter == FeedOrderFilter.NAME && listOrderFilter == ListOrderFilter.DESCENDING) {
return o2.title.compareTo(o1.title);
} else if (feedOrderFilter == FeedOrderFilter.SUBSCRIBERS && listOrderFilter == ListOrderFilter.ASCENDING) {
return Integer.valueOf(o1.subscribers).compareTo(Integer.valueOf(o2.subscribers));
} else if (feedOrderFilter == FeedOrderFilter.SUBSCRIBERS && listOrderFilter == ListOrderFilter.DESCENDING) {
return Integer.valueOf(o2.subscribers).compareTo(Integer.valueOf(o1.subscribers));
} else if (feedOrderFilter == FeedOrderFilter.OPENS && listOrderFilter == ListOrderFilter.ASCENDING) {
return Integer.compare(o1.feedOpens, o2.feedOpens);
} else if (feedOrderFilter == FeedOrderFilter.OPENS && listOrderFilter == ListOrderFilter.DESCENDING) {
return Integer.compare(o2.feedOpens, o1.feedOpens);
} else if (feedOrderFilter == FeedOrderFilter.RECENT_STORY && listOrderFilter == ListOrderFilter.ASCENDING) {
return compareLastStoryDateTimes(o1.lastStoryDate, o2.lastStoryDate, listOrderFilter);
} else if (feedOrderFilter == FeedOrderFilter.RECENT_STORY && listOrderFilter == ListOrderFilter.DESCENDING) {
return compareLastStoryDateTimes(o1.lastStoryDate, o2.lastStoryDate, listOrderFilter);
} else if (feedOrderFilter == FeedOrderFilter.STORIES_MONTH && listOrderFilter == ListOrderFilter.ASCENDING) {
return Integer.compare(o1.storiesPerMonth, o2.storiesPerMonth);
} else if (feedOrderFilter == FeedOrderFilter.STORIES_MONTH && listOrderFilter == ListOrderFilter.DESCENDING) {
return Integer.compare(o2.storiesPerMonth, o1.storiesPerMonth);
}
return o1.title.compareTo(o2.title);
}
};
}
static class WidgetListDiffCallback extends DiffUtil.Callback {
private int compareLastStoryDateTimes(String firstDateTime, String secondDateTime, ListOrderFilter listOrderFilter) {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
// found null last story date times on feeds
if (TextUtils.isEmpty(firstDateTime)) {
firstDateTime = "2000-01-01 00:00:00";
}
if (TextUtils.isEmpty(secondDateTime)) {
secondDateTime = "2000-01-01 00:00:00";
}
private ArrayList<Feed> oldList;
private ArrayList<Feed> newList;
private boolean hasSameFilter;
WidgetListDiffCallback(ArrayList<Feed> oldList, ArrayList<Feed> newList, boolean hasSameFilter) {
this.oldList = oldList;
this.newList = newList;
this.hasSameFilter = hasSameFilter;
}
@Override
public int getOldListSize() {
return oldList.size();
}
@Override
public int getNewListSize() {
return newList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldList.get(oldItemPosition) == newList.get(newItemPosition);
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
if (hasSameFilter) {
Feed oldFeed = oldList.get(oldItemPosition);
Feed newFeed = newList.get(newItemPosition);
return oldFeed.feedId.equals(newFeed.feedId) && oldFeed.title.equals(newFeed.title);
} else return false;
Date firstDate = dateFormat.parse(firstDateTime);
Date secondDate = dateFormat.parse(secondDateTime);
if (listOrderFilter == ListOrderFilter.ASCENDING) {
return firstDate.compareTo(secondDate);
} else {
return secondDate.compareTo(firstDate);
}
} catch (ParseException e) {
e.printStackTrace();
return 0;
}
}
}