Merge pull request #1066 from dosiecki/master

Android: Make Some Meta-Folders Optional
This commit is contained in:
Samuel Clay 2017-12-14 15:04:00 -08:00 committed by GitHub
commit 220f7de9ca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 159 additions and 112 deletions

View file

@ -236,6 +236,13 @@
</string-array> </string-array>
<string name="default_network_select_value">NOMONONME</string> <string name="default_network_select_value">NOMONONME</string>
<string name="settings_cat_feed_list">Feed List</string>
<string name="settings_enable_row_global_shared">Show Global Shared Stories</string>
<string name="settings_enable_row_global_shared_sum">Show the Global Shared Stories folder</string>
<string name="settings_enable_row_infrequent_stories">Show Infrequent Stories Stories</string>
<string name="settings_enable_row_infrequent_stories_sum">Show the Infrequent Site Stories Stories folder</string>
<string name="settings_cat_story_list">Story List</string> <string name="settings_cat_story_list">Story List</string>
<string name="oldest">Oldest</string> <string name="oldest">Oldest</string>

View file

@ -28,6 +28,22 @@
android:summary="@string/settings_keep_old_stories_sum" /> android:summary="@string/settings_keep_old_stories_sum" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory
android:title="@string/settings_cat_feed_list">
<CheckBoxPreference
android:defaultValue="true"
android:key="enable_row_global_shared"
android:title="@string/settings_enable_row_global_shared"
android:summary="@string/settings_enable_row_global_shared_sum"
/>
<CheckBoxPreference
android:defaultValue="true"
android:key="enable_row_infrequent_stories"
android:title="@string/settings_enable_row_infrequent_stories"
android:summary="@string/settings_enable_row_infrequent_stories_sum"
/>
</PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/settings_cat_story_list"> android:title="@string/settings_cat_story_list">
<ListPreference <ListPreference

View file

@ -40,14 +40,23 @@ import com.newsblur.util.StateFilter;
*/ */
public class FolderListAdapter extends BaseExpandableListAdapter { public class FolderListAdapter extends BaseExpandableListAdapter {
public static final int GLOBAL_SHARED_STORIES_GROUP_POSITION = 0;
public static final int ALL_SHARED_STORIES_GROUP_POSITION = 1;
public static final int ALL_STORIES_GROUP_POSITION = 2;
public static final int INFREQUENT_SITE_STORIES_GROUP_POSITION = 3;
private enum GroupType { GLOBAL_SHARED_STORIES, ALL_SHARED_STORIES, INFREQUENT_STORIES, ALL_STORIES, FOLDER, READ_STORIES, SAVED_STORIES } private enum GroupType { GLOBAL_SHARED_STORIES, ALL_SHARED_STORIES, INFREQUENT_STORIES, ALL_STORIES, FOLDER, READ_STORIES, SAVED_STORIES }
private enum ChildType { SOCIAL_FEED, FEED, SAVED_BY_TAG } private enum ChildType { SOCIAL_FEED, FEED, SAVED_BY_TAG }
// The following keys are used to mark the position of the special meta-folders within
// the folders array. Since the ExpandableListView doesn't handle collapsing of views
// set to View.GONE, we have to totally remove any hidden groups from the group count
// and adjust all folder indicies accordingly. Fake folders are created with these
// very unlikely names and layout methods check against them before assuming a row is
// a normal folder. All the string comparison is a small price to pay to avoid the
// alternative of index-counting in a situation where some rows might be disabled.
private static final String GLOBAL_SHARED_STORIES_GROUP_KEY = "GLOBAL_SHARED_STORIES_GROUP_KEY";
private static final String ALL_SHARED_STORIES_GROUP_KEY = "ALL_SHARED_STORIES_GROUP_KEY";
private static final String ALL_STORIES_GROUP_KEY = "ALL_STORIES_GROUP_KEY";
private static final String INFREQUENT_SITE_STORIES_GROUP_KEY = "INFREQUENT_SITE_STORIES_GROUP_KEY";
private static final String READ_STORIES_GROUP_KEY = "READ_STORIES_GROUP_KEY";
private static final String SAVED_STORIES_GROUP_KEY = "SAVED_STORIES_GROUP_KEY";
private final static float defaultTextSize_childName = 14; private final static float defaultTextSize_childName = 14;
private final static float defaultTextSize_groupName = 13; private final static float defaultTextSize_groupName = 13;
private final static float defaultTextSize_count = 14; private final static float defaultTextSize_count = 14;
@ -101,6 +110,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
/** Flat names of folders explicity closed by the user. */ /** Flat names of folders explicity closed by the user. */
private Set<String> closedFolders = new HashSet<String>(); private Set<String> closedFolders = new HashSet<String>();
private Context context;
private LayoutInflater inflater; private LayoutInflater inflater;
private StateFilter currentState; private StateFilter currentState;
@ -120,6 +130,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
public FolderListAdapter(Context context, StateFilter currentState) { public FolderListAdapter(Context context, StateFilter currentState) {
this.currentState = currentState; this.currentState = currentState;
this.context = context;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
textSize = PrefsUtils.getListTextSize(context); textSize = PrefsUtils.getListTextSize(context);
@ -128,9 +139,9 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
@Override @Override
public synchronized View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, ViewGroup parent) { public synchronized View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, ViewGroup parent) {
View v = convertView; View v = convertView;
if (groupPosition == GLOBAL_SHARED_STORIES_GROUP_POSITION) { if (isRowGlobalSharedStories(groupPosition)) {
if (v == null) v = inflater.inflate(R.layout.row_global_shared_stories, null, false); if (v == null) v = inflater.inflate(R.layout.row_global_shared_stories, null, false);
} else if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) { } else if (isRowAllSharedStories(groupPosition)) {
if (v == null) v = inflater.inflate(R.layout.row_all_shared_stories, null, false); if (v == null) v = inflater.inflate(R.layout.row_all_shared_stories, null, false);
if (currentState == StateFilter.BEST || (totalSocialNeutCount == 0)) { if (currentState == StateFilter.BEST || (totalSocialNeutCount == 0)) {
v.findViewById(R.id.row_foldersumneu).setVisibility(View.GONE); v.findViewById(R.id.row_foldersumneu).setVisibility(View.GONE);
@ -145,9 +156,9 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
((TextView) v.findViewById(R.id.row_foldersumpos)).setText(Integer.toString(totalSocialPosiCount)); ((TextView) v.findViewById(R.id.row_foldersumpos)).setText(Integer.toString(totalSocialPosiCount));
} }
v.findViewById(R.id.row_foldersums).setVisibility(isExpanded ? View.INVISIBLE : View.VISIBLE); v.findViewById(R.id.row_foldersums).setVisibility(isExpanded ? View.INVISIBLE : View.VISIBLE);
} else if (groupPosition == ALL_STORIES_GROUP_POSITION) { } else if (isRowAllStories(groupPosition)) {
if (v == null) v = inflater.inflate(R.layout.row_all_stories, null, false); if (v == null) v = inflater.inflate(R.layout.row_all_stories, null, false);
} else if (groupPosition == INFREQUENT_SITE_STORIES_GROUP_POSITION) { } else if (isRowInfrequentStories(groupPosition)) {
if (v == null) v = inflater.inflate(R.layout.row_infrequent_stories, null, false); if (v == null) v = inflater.inflate(R.layout.row_infrequent_stories, null, false);
} else if (isRowReadStories(groupPosition)) { } else if (isRowReadStories(groupPosition)) {
if (v == null) v = inflater.inflate(R.layout.row_read_stories, null, false); if (v == null) v = inflater.inflate(R.layout.row_read_stories, null, false);
@ -162,11 +173,10 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
} }
} else { } else {
if (v == null) v = inflater.inflate(R.layout.row_folder, parent, false); if (v == null) v = inflater.inflate(R.layout.row_folder, parent, false);
String folderName = activeFolderNames.get(convertGroupPositionToActiveFolderIndex(groupPosition)); String folderName = activeFolderNames.get(groupPosition);
TextView folderTitle = ((TextView) v.findViewById(R.id.row_foldername)); TextView folderTitle = ((TextView) v.findViewById(R.id.row_foldername));
folderTitle.setText(folderName); folderTitle.setText(folderName);
int countPosition = convertGroupPositionToActiveFolderIndex(groupPosition); bindCountViews(v, folderNeutCounts.get(groupPosition), folderPosCounts.get(groupPosition), false);
bindCountViews(v, folderNeutCounts.get(countPosition), folderPosCounts.get(countPosition), false);
v.findViewById(R.id.row_foldersums).setVisibility(isExpanded ? View.INVISIBLE : View.VISIBLE); v.findViewById(R.id.row_foldersums).setVisibility(isExpanded ? View.INVISIBLE : View.VISIBLE);
ImageView folderIconView = ((ImageView) v.findViewById(R.id.row_folder_icon)); ImageView folderIconView = ((ImageView) v.findViewById(R.id.row_folder_icon));
if ( folderIconView != null ) { if ( folderIconView != null ) {
@ -217,7 +227,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
@Override @Override
public synchronized View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { public synchronized View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View v = convertView; View v = convertView;
if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) { if (isRowAllSharedStories(groupPosition)) {
if (v == null) v = inflater.inflate(R.layout.row_socialfeed, parent, false); if (v == null) v = inflater.inflate(R.layout.row_socialfeed, parent, false);
SocialFeed f = socialFeedsActive.get(childPosition); SocialFeed f = socialFeedsActive.get(childPosition);
TextView nameView = ((TextView) v.findViewById(R.id.row_socialfeed_name)); TextView nameView = ((TextView) v.findViewById(R.id.row_socialfeed_name));
@ -260,7 +270,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
savedCounter.setTextSize(textSize * defaultTextSize_count); savedCounter.setTextSize(textSize * defaultTextSize_count);
} else { } else {
if (v == null) v = inflater.inflate(R.layout.row_feed, parent, false); if (v == null) v = inflater.inflate(R.layout.row_feed, parent, false);
Feed f = activeFolderChildren.get(convertGroupPositionToActiveFolderIndex(groupPosition)).get(childPosition); Feed f = activeFolderChildren.get(groupPosition).get(childPosition);
TextView nameView =((TextView) v.findViewById(R.id.row_feedname)); TextView nameView =((TextView) v.findViewById(R.id.row_feedname));
nameView.setText(f.title); nameView.setText(f.title);
nameView.setTextSize(textSize * defaultTextSize_childName); nameView.setTextSize(textSize * defaultTextSize_childName);
@ -349,14 +359,14 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
@Override @Override
public synchronized FeedSet getGroup(int groupPosition) { public synchronized FeedSet getGroup(int groupPosition) {
if (groupPosition == GLOBAL_SHARED_STORIES_GROUP_POSITION) { if (isRowGlobalSharedStories(groupPosition)) {
return FeedSet.globalShared(); return FeedSet.globalShared();
} else if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) { } else if (isRowAllSharedStories(groupPosition)) {
return FeedSet.allSocialFeeds(); return FeedSet.allSocialFeeds();
} else if (groupPosition == ALL_STORIES_GROUP_POSITION) { } else if (isRowAllStories(groupPosition)) {
if (currentState == StateFilter.SAVED) return FeedSet.allSaved(); if (currentState == StateFilter.SAVED) return FeedSet.allSaved();
return FeedSet.allFeeds(); return FeedSet.allFeeds();
} else if (groupPosition == INFREQUENT_SITE_STORIES_GROUP_POSITION) { } else if (isRowInfrequentStories(groupPosition)) {
return FeedSet.infrequentFeeds(); return FeedSet.infrequentFeeds();
} else if (isRowReadStories(groupPosition)) { } else if (isRowReadStories(groupPosition)) {
return FeedSet.allRead(); return FeedSet.allRead();
@ -375,70 +385,43 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
* Supports normal folders only, not special all-type meta-folders. * Supports normal folders only, not special all-type meta-folders.
*/ */
public String getGroupFolderName(int groupPosition) { public String getGroupFolderName(int groupPosition) {
int activeFolderIndex = convertGroupPositionToActiveFolderIndex(groupPosition); if (isRowRootFolder(groupPosition)) return AppConstants.ROOT_FOLDER;
String flatFolderName = activeFolderNames.get(activeFolderIndex); String flatFolderName = activeFolderNames.get(groupPosition);
Folder folder = flatFolders.get(flatFolderName); Folder folder = flatFolders.get(flatFolderName);
return folder.name; return folder.name;
} }
private int convertGroupPositionToActiveFolderIndex(int groupPosition) {
// Global and social feeds are shown above the named folders so the groupPosition
// needs to be adjusted to index into the active folders lists.
return groupPosition - 3;
}
@Override @Override
public synchronized int getGroupCount() { public synchronized int getGroupCount() {
// in addition to the real folders returned by the /reader/feeds API, there are virtual folders
// for global shared stories, social feeds and saved stories
if (activeFolderNames == null) return 0; if (activeFolderNames == null) return 0;
// two types of group (folder and All Stories are represented as folders, and don't count, so -2) return (activeFolderNames.size());
return (activeFolderNames.size() + (GroupType.values().length - 2));
} }
@Override @Override
public synchronized long getGroupId(int groupPosition) { public synchronized long getGroupId(int groupPosition) {
// Global shared, all shared and saved stories don't have IDs so give them a really return activeFolderNames.get(groupPosition).hashCode();
// huge one.
if (groupPosition == GLOBAL_SHARED_STORIES_GROUP_POSITION) {
return Long.MAX_VALUE;
} else if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) {
return Long.MAX_VALUE-1;
} else if (groupPosition == INFREQUENT_SITE_STORIES_GROUP_POSITION) {
return Long.MAX_VALUE-4;
} else if (groupPosition == ALL_STORIES_GROUP_POSITION) {
return Long.MAX_VALUE-5;
} else if (isRowReadStories(groupPosition)) {
return Long.MAX_VALUE-2;
} else if (isRowSavedStories(groupPosition)) {
return Long.MAX_VALUE-3;
} else {
return activeFolderNames.get(convertGroupPositionToActiveFolderIndex(groupPosition)).hashCode();
}
} }
@Override @Override
public synchronized int getChildrenCount(int groupPosition) { public synchronized int getChildrenCount(int groupPosition) {
if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) { if (isRowAllSharedStories(groupPosition)) {
return socialFeedsActive.size(); return socialFeedsActive.size();
} else if (isRowSavedStories(groupPosition)) { } else if (isRowSavedStories(groupPosition)) {
return starredCountsByTag.size(); return starredCountsByTag.size();
} else if (isRowReadStories(groupPosition) || groupPosition == GLOBAL_SHARED_STORIES_GROUP_POSITION || groupPosition == ALL_STORIES_GROUP_POSITION) {
return 0; // these rows never have children
} else { } else {
return activeFolderChildren.get(convertGroupPositionToActiveFolderIndex(groupPosition)).size(); return activeFolderChildren.get(groupPosition).size();
} }
} }
@Override @Override
public synchronized FeedSet getChild(int groupPosition, int childPosition) { public synchronized FeedSet getChild(int groupPosition, int childPosition) {
if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) { if (isRowAllSharedStories(groupPosition)) {
SocialFeed socialFeed = socialFeedsActive.get(childPosition); SocialFeed socialFeed = socialFeedsActive.get(childPosition);
return FeedSet.singleSocialFeed(socialFeed.userId, socialFeed.username); return FeedSet.singleSocialFeed(socialFeed.userId, socialFeed.username);
} else if (isRowSavedStories(groupPosition)) { } else if (isRowSavedStories(groupPosition)) {
return FeedSet.singleSavedTag(starredCountsByTag.get(childPosition).tag); return FeedSet.singleSavedTag(starredCountsByTag.get(childPosition).tag);
} else { } else {
Feed feed = activeFolderChildren.get(convertGroupPositionToActiveFolderIndex(groupPosition)).get(childPosition); Feed feed = activeFolderChildren.get(groupPosition).get(childPosition);
FeedSet fs = FeedSet.singleFeed(feed.feedId); FeedSet fs = FeedSet.singleFeed(feed.feedId);
if (!feed.active) fs.setMuted(true); if (!feed.active) fs.setMuted(true);
if (currentState == StateFilter.SAVED) fs.setFilterSaved(true); if (currentState == StateFilter.SAVED) fs.setFilterSaved(true);
@ -454,49 +437,52 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
public synchronized String getGroupUniqueName(int groupPosition) { public synchronized String getGroupUniqueName(int groupPosition) {
// these "names" aren't actually what is used to render the row, but are used // these "names" aren't actually what is used to render the row, but are used
// by the fragment for tracking row identity to save open/close preferences // by the fragment for tracking row identity to save open/close preferences
if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) { return activeFolderNames.get(groupPosition);
return "[ALL_SHARED_STORIES]";
} else if (groupPosition == GLOBAL_SHARED_STORIES_GROUP_POSITION) {
return "[GLOBAL_SHARED_STORIES]";
} else if (groupPosition == ALL_STORIES_GROUP_POSITION) {
return "[ALL_STORIES]";
} else if (groupPosition == INFREQUENT_SITE_STORIES_GROUP_POSITION) {
return "[INFREQUENT_SITE_STORIES]";
} else if (isRowReadStories(groupPosition)) {
return "[READ_STORIES]";
} else if (isRowSavedStories(groupPosition)) {
return "[SAVED_STORIES]";
} else {
return activeFolderNames.get(convertGroupPositionToActiveFolderIndex(groupPosition));
}
} }
/** public boolean isRowGlobalSharedStories(int groupPosition) {
* Determines if the folder at the specified position is the special "root" folder. This return GLOBAL_SHARED_STORIES_GROUP_KEY.equals(activeFolderNames.get(groupPosition));
* folder is returned by the API in a special way and the APIManager ensures it gets a }
* specific name in the DB so we can find it. However, to match web UI conventions, feeds
* within it are rendered in the Infrequent folder. public boolean isRowAllSharedStories(int groupPosition) {
*/ return ALL_SHARED_STORIES_GROUP_KEY.equals(activeFolderNames.get(groupPosition));
public boolean isFolderRoot(int groupPosition) { }
return (groupPosition == INFREQUENT_SITE_STORIES_GROUP_POSITION);
public boolean isRowAllStories(int groupPosition) {
return ALL_STORIES_GROUP_KEY.equals(activeFolderNames.get(groupPosition));
}
public boolean isRowInfrequentStories(int groupPosition) {
return INFREQUENT_SITE_STORIES_GROUP_KEY.equals(activeFolderNames.get(groupPosition));
} }
/**
* Determines if the row at the specified position is the special "read" folder. This
* row doesn't actually correspond to a row in the DB, much like the social row, but
* it is located at the bottom of the set rather than the top.
*/
public boolean isRowReadStories(int groupPosition) { public boolean isRowReadStories(int groupPosition) {
return ( groupPosition == (activeFolderNames.size() + 3) ); return READ_STORIES_GROUP_KEY.equals(activeFolderNames.get(groupPosition));
}
public boolean isRowSavedStories(int groupPosition) {
return SAVED_STORIES_GROUP_KEY.equals(activeFolderNames.get(groupPosition));
} }
/** /**
* Determines if the row at the specified position is the special "saved" folder. This * Determines if the row at the specified position is last of the special rows, under which
* row doesn't actually correspond to a row in the DB, much like the social row, but * un-foldered "root level" feeds are created as children. These feeds are not in any folder,
* it is located at the bottom of the set rather than the top. * but the UI convention is that they appear below special rows and above folders.
*/ */
public boolean isRowSavedStories(int groupPosition) { public boolean isRowRootFolder(int groupPosition) {
return ( groupPosition == (activeFolderNames.size() + 4) ); // if this is enabled, it is the lowest special folder
if (activeFolderNames.contains(INFREQUENT_SITE_STORIES_GROUP_KEY)) {
return isRowInfrequentStories(groupPosition);
}
// if that row does not exist, then this is the lowest
return isRowAllStories(groupPosition);
}
private int getRootFolderIndex() {
if (activeFolderNames.contains(INFREQUENT_SITE_STORIES_GROUP_KEY)) {
return activeFolderNames.indexOf(INFREQUENT_SITE_STORIES_GROUP_KEY);
}
return activeFolderNames.indexOf(ALL_STORIES_GROUP_KEY);
} }
public synchronized void setSocialFeedCursor(Cursor cursor) { public synchronized void setSocialFeedCursor(Cursor cursor) {
@ -593,6 +579,11 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
activeFolderChildren = new ArrayList<List<Feed>>(); activeFolderChildren = new ArrayList<List<Feed>>();
folderNeutCounts = new ArrayList<Integer>(); folderNeutCounts = new ArrayList<Integer>();
folderPosCounts = new ArrayList<Integer>(); folderPosCounts = new ArrayList<Integer>();
// add the always-present (if enabled) special rows/folders that got at the top of the list
if (PrefsUtils.isEnableRowGlobalShared(context) && (currentState != StateFilter.SAVED)) addSpecialRow(GLOBAL_SHARED_STORIES_GROUP_KEY);
if ((currentState != StateFilter.SAVED)) addSpecialRow(ALL_SHARED_STORIES_GROUP_KEY);
addSpecialRow(ALL_STORIES_GROUP_KEY);
if (PrefsUtils.isEnableRowInfrequent(context) && (currentState != StateFilter.SAVED)) addSpecialRow(INFREQUENT_SITE_STORIES_GROUP_KEY);
// create a sorted list of folder display names // create a sorted list of folder display names
List<String> sortedFolderNames = new ArrayList<String>(flatFolders.keySet()); List<String> sortedFolderNames = new ArrayList<String>(flatFolders.keySet());
Collections.sort(sortedFolderNames, Folder.FolderNameComparator); Collections.sort(sortedFolderNames, Folder.FolderNameComparator);
@ -622,16 +613,35 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
} }
} }
if ((activeFeeds.size() > 0) || (folderName.equals(AppConstants.ROOT_FOLDER)) || folder.name.equals(lastFolderViewed)) { if ((activeFeeds.size() > 0) || (folderName.equals(AppConstants.ROOT_FOLDER)) || folder.name.equals(lastFolderViewed)) {
activeFolderNames.add(folderName);
Collections.sort(activeFeeds); Collections.sort(activeFeeds);
activeFolderChildren.add(activeFeeds); if (folderName.equals(AppConstants.ROOT_FOLDER)) {
folderNeutCounts.add(getFolderNeutralCountRecursive(folder, null)); activeFolderChildren.set(getRootFolderIndex(), activeFeeds);
folderPosCounts.add(getFolderPositiveCountRecursive(folder, null)); } else {
activeFolderNames.add(folderName);
activeFolderChildren.add(activeFeeds);
folderNeutCounts.add(getFolderNeutralCountRecursive(folder, null));
folderPosCounts.add(getFolderPositiveCountRecursive(folder, null));
}
} }
} }
// add the always-present (if enabled) special rows/folders that got at the bottom of the list
addSpecialRow(READ_STORIES_GROUP_KEY);
addSpecialRow(SAVED_STORIES_GROUP_KEY);
recountChildren(); recountChildren();
} }
/**
* Add a special (non-folder) row to activeFolderNames and blank data to all lists indexed
* from said list.
*/
private void addSpecialRow(String specialRowName) {
activeFolderNames.add(specialRowName);
List<Feed> emptyList = Collections.emptyList();
activeFolderChildren.add(emptyList);
folderNeutCounts.add(0);
folderPosCounts.add(0);
}
private void recountChildren() { private void recountChildren() {
if (activeFolderChildren == null) return; if (activeFolderChildren == null) return;
int newFeedCount = 0; int newFeedCount = 0;
@ -734,11 +744,11 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
/** Get the cached Feed object for the feed at the given list location. */ /** Get the cached Feed object for the feed at the given list location. */
public Feed getFeed(int groupPosition, int childPosition) { public Feed getFeed(int groupPosition, int childPosition) {
return activeFolderChildren.get(convertGroupPositionToActiveFolderIndex(groupPosition)).get(childPosition); return activeFolderChildren.get(groupPosition).get(childPosition);
} }
public Set<String> getAllFeedsForFolder(int groupPosition) { public Set<String> getAllFeedsForFolder(int groupPosition) {
String flatFolderName = activeFolderNames.get(convertGroupPositionToActiveFolderIndex(groupPosition)); String flatFolderName = activeFolderNames.get(groupPosition);
Folder folder = flatFolders.get(flatFolderName); Folder folder = flatFolders.get(flatFolderName);
Set<String> feedIds = new HashSet<String>(); Set<String> feedIds = new HashSet<String>();
feedIds.addAll(folder.feedIds); feedIds.addAll(folder.feedIds);
@ -789,13 +799,13 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
@Override @Override
public int getGroupType(int groupPosition) { public int getGroupType(int groupPosition) {
if (groupPosition == GLOBAL_SHARED_STORIES_GROUP_POSITION) { if (isRowGlobalSharedStories(groupPosition)) {
return GroupType.GLOBAL_SHARED_STORIES.ordinal(); return GroupType.GLOBAL_SHARED_STORIES.ordinal();
} else if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) { } else if (isRowAllSharedStories(groupPosition)) {
return GroupType.ALL_SHARED_STORIES.ordinal(); return GroupType.ALL_SHARED_STORIES.ordinal();
} else if (groupPosition == ALL_STORIES_GROUP_POSITION) { } else if (isRowAllStories(groupPosition)) {
return GroupType.ALL_STORIES.ordinal(); return GroupType.ALL_STORIES.ordinal();
} else if (groupPosition == INFREQUENT_SITE_STORIES_GROUP_POSITION) { } else if (isRowInfrequentStories(groupPosition)) {
return GroupType.INFREQUENT_STORIES.ordinal(); return GroupType.INFREQUENT_STORIES.ordinal();
} else if (isRowReadStories(groupPosition)) { } else if (isRowReadStories(groupPosition)) {
return GroupType.READ_STORIES.ordinal(); return GroupType.READ_STORIES.ordinal();
@ -808,7 +818,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
@Override @Override
public int getChildType(int groupPosition, int childPosition) { public int getChildType(int groupPosition, int childPosition) {
if (groupPosition == ALL_SHARED_STORIES_GROUP_POSITION) { if (isRowAllSharedStories(groupPosition)) {
return ChildType.SOCIAL_FEED.ordinal(); return ChildType.SOCIAL_FEED.ordinal();
} else if (isRowSavedStories(groupPosition)) { } else if (isRowSavedStories(groupPosition)) {
return ChildType.SAVED_BY_TAG.ordinal(); return ChildType.SAVED_BY_TAG.ordinal();
@ -819,7 +829,8 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
@Override @Override
public int getGroupTypeCount() { public int getGroupTypeCount() {
return GroupType.values().length; int c = GroupType.values().length;
return c;
} }
@Override @Override

View file

@ -244,12 +244,12 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
if (adapter.isRowSavedStories(groupPosition)) break; if (adapter.isRowSavedStories(groupPosition)) break;
if (currentState == StateFilter.SAVED) break; if (currentState == StateFilter.SAVED) break;
if (adapter.isRowReadStories(groupPosition)) break; if (adapter.isRowReadStories(groupPosition)) break;
if (groupPosition == FolderListAdapter.GLOBAL_SHARED_STORIES_GROUP_POSITION) break; if (adapter.isRowGlobalSharedStories(groupPosition)) break;
if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) break; if (adapter.isRowAllSharedStories(groupPosition)) break;
if (groupPosition == FolderListAdapter.INFREQUENT_SITE_STORIES_GROUP_POSITION) break; if (adapter.isRowInfrequentStories(groupPosition)) break;
inflater.inflate(R.menu.context_folder, menu); inflater.inflate(R.menu.context_folder, menu);
if (groupPosition == FolderListAdapter.ALL_STORIES_GROUP_POSITION) { if (adapter.isRowAllStories(groupPosition)) {
menu.removeItem(R.id.menu_mute_folder); menu.removeItem(R.id.menu_mute_folder);
menu.removeItem(R.id.menu_unmute_folder); menu.removeItem(R.id.menu_unmute_folder);
} }
@ -260,7 +260,7 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
if (adapter.isRowSavedStories(groupPosition)) break; if (adapter.isRowSavedStories(groupPosition)) break;
if (currentState == StateFilter.SAVED) break; if (currentState == StateFilter.SAVED) break;
inflater.inflate(R.menu.context_feed, menu); inflater.inflate(R.menu.context_feed, menu);
if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) { if (adapter.isRowAllSharedStories(groupPosition)) {
menu.removeItem(R.id.menu_delete_feed); menu.removeItem(R.id.menu_delete_feed);
menu.removeItem(R.id.menu_choose_folders); menu.removeItem(R.id.menu_choose_folders);
menu.removeItem(R.id.menu_unmute_feed); menu.removeItem(R.id.menu_unmute_feed);
@ -329,7 +329,7 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
if (item.getItemId() == R.id.menu_delete_feed || item.getItemId() == R.id.menu_unfollow) { if (item.getItemId() == R.id.menu_delete_feed || item.getItemId() == R.id.menu_unfollow) {
DialogFragment deleteFeedFragment; DialogFragment deleteFeedFragment;
if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) { if (adapter.isRowAllSharedStories(groupPosition)) {
deleteFeedFragment = DeleteFeedFragment.newInstance(adapter.getSocialFeed(groupPosition, childPosition)); deleteFeedFragment = DeleteFeedFragment.newInstance(adapter.getSocialFeed(groupPosition, childPosition));
} else { } else {
String folderName = adapter.getGroupFolderName(groupPosition); String folderName = adapter.getGroupFolderName(groupPosition);
@ -417,7 +417,7 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
@Override @Override
public boolean onGroupClick(ExpandableListView list, View group, int groupPosition, long id) { public boolean onGroupClick(ExpandableListView list, View group, int groupPosition, long id) {
Intent i = null; Intent i = null;
if (groupPosition == FolderListAdapter.ALL_STORIES_GROUP_POSITION) { if (adapter.isRowAllStories(groupPosition)) {
if (currentState == StateFilter.SAVED) { if (currentState == StateFilter.SAVED) {
// the existence of this row in saved mode is something of a framework artifact and may // the existence of this row in saved mode is something of a framework artifact and may
// confuse users. redirect them to the activity corresponding to what they will actually see // confuse users. redirect them to the activity corresponding to what they will actually see
@ -425,11 +425,11 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
} else { } else {
i = new Intent(getActivity(), AllStoriesItemsList.class); i = new Intent(getActivity(), AllStoriesItemsList.class);
} }
} else if (groupPosition == FolderListAdapter.GLOBAL_SHARED_STORIES_GROUP_POSITION) { } else if (adapter.isRowGlobalSharedStories(groupPosition)) {
i = new Intent(getActivity(), GlobalSharedStoriesItemsList.class); i = new Intent(getActivity(), GlobalSharedStoriesItemsList.class);
} else if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) { } else if (adapter.isRowAllSharedStories(groupPosition)) {
i = new Intent(getActivity(), AllSharedStoriesItemsList.class); i = new Intent(getActivity(), AllSharedStoriesItemsList.class);
} else if (groupPosition == FolderListAdapter.INFREQUENT_SITE_STORIES_GROUP_POSITION) { } else if (adapter.isRowInfrequentStories(groupPosition)) {
i = new Intent(getActivity(), InfrequentItemsList.class); i = new Intent(getActivity(), InfrequentItemsList.class);
} else if (adapter.isRowReadStories(groupPosition)) { } else if (adapter.isRowReadStories(groupPosition)) {
i = new Intent(getActivity(), ReadStoriesItemsList.class); i = new Intent(getActivity(), ReadStoriesItemsList.class);
@ -456,7 +456,7 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
@Override @Override
public void onGroupExpand(int groupPosition) { public void onGroupExpand(int groupPosition) {
// these shouldn't ever be collapsible // these shouldn't ever be collapsible
if (adapter.isFolderRoot(groupPosition)) return; if (adapter.isRowRootFolder(groupPosition)) return;
if (adapter.isRowReadStories(groupPosition)) return; if (adapter.isRowReadStories(groupPosition)) return;
String flatGroupName = adapter.getGroupUniqueName(groupPosition); String flatGroupName = adapter.getGroupUniqueName(groupPosition);
@ -474,7 +474,7 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
@Override @Override
public void onGroupCollapse(int groupPosition) { public void onGroupCollapse(int groupPosition) {
// these shouldn't ever be collapsible // these shouldn't ever be collapsible
if (adapter.isFolderRoot(groupPosition)) return; if (adapter.isRowRootFolder(groupPosition)) return;
if (adapter.isRowReadStories(groupPosition)) return; if (adapter.isRowReadStories(groupPosition)) return;
String flatGroupName = adapter.getGroupUniqueName(groupPosition); String flatGroupName = adapter.getGroupUniqueName(groupPosition);
@ -490,7 +490,7 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
@Override @Override
public boolean onChildClick(ExpandableListView list, View childView, int groupPosition, int childPosition, long id) { public boolean onChildClick(ExpandableListView list, View childView, int groupPosition, int childPosition, long id) {
FeedSet fs = adapter.getChild(groupPosition, childPosition); FeedSet fs = adapter.getChild(groupPosition, childPosition);
if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) { if (adapter.isRowAllSharedStories(groupPosition)) {
SocialFeed socialFeed = adapter.getSocialFeed(groupPosition, childPosition); SocialFeed socialFeed = adapter.getSocialFeed(groupPosition, childPosition);
Intent intent = new Intent(getActivity(), SocialFeedItemsList.class); Intent intent = new Intent(getActivity(), SocialFeedItemsList.class);
intent.putExtra(ItemsList.EXTRA_FEED_SET, fs); intent.putExtra(ItemsList.EXTRA_FEED_SET, fs);

View file

@ -67,6 +67,9 @@ public class PrefConstants {
public static final String NETWORK_SELECT_NOMO = "NOMO"; public static final String NETWORK_SELECT_NOMO = "NOMO";
public static final String NETWORK_SELECT_NOMONONME = "NOMONONME"; public static final String NETWORK_SELECT_NOMONONME = "NOMONONME";
public static final String ENABLE_ROW_GLOBAL_SHARED = "enable_row_global_shared";
public static final String ENABLE_ROW_INFREQUENT_STORIES = "enable_row_infrequent_stories";
public static final String THEME = "theme"; public static final String THEME = "theme";
public static final String STATE_FILTER = "state_filter"; public static final String STATE_FILTER = "state_filter";

View file

@ -389,6 +389,16 @@ public class PrefsUtils {
return ReadFilter.valueOf(prefs.getString(PrefConstants.DEFAULT_READ_FILTER, ReadFilter.ALL.toString())); return ReadFilter.valueOf(prefs.getString(PrefConstants.DEFAULT_READ_FILTER, ReadFilter.ALL.toString()));
} }
public static boolean isEnableRowGlobalShared(Context context) {
SharedPreferences prefs = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
return prefs.getBoolean(PrefConstants.ENABLE_ROW_GLOBAL_SHARED, true);
}
public static boolean isEnableRowInfrequent(Context context) {
SharedPreferences prefs = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
return prefs.getBoolean(PrefConstants.ENABLE_ROW_INFREQUENT_STORIES, true);
}
public static boolean showPublicComments(Context context) { public static boolean showPublicComments(Context context) {
SharedPreferences prefs = context.getSharedPreferences(PrefConstants.PREFERENCES, 0); SharedPreferences prefs = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
return prefs.getBoolean(PrefConstants.SHOW_PUBLIC_COMMENTS, true); return prefs.getBoolean(PrefConstants.SHOW_PUBLIC_COMMENTS, true);