diff --git a/clients/android/NewsBlur/res/menu/context_feed.xml b/clients/android/NewsBlur/res/menu/context_feed.xml index df370a761..49fe7d2fe 100644 --- a/clients/android/NewsBlur/res/menu/context_feed.xml +++ b/clients/android/NewsBlur/res/menu/context_feed.xml @@ -6,5 +6,8 @@ + + \ No newline at end of file diff --git a/clients/android/NewsBlur/res/values/strings.xml b/clients/android/NewsBlur/res/values/strings.xml index 9e18ca84b..081071fa1 100644 --- a/clients/android/NewsBlur/res/values/strings.xml +++ b/clients/android/NewsBlur/res/values/strings.xml @@ -111,6 +111,7 @@ Send to… Mark feed as read Delete feed + Unfollow user Mark folder as read Share this story Adjust text size @@ -129,6 +130,7 @@ Story marked as unread Feed deleted + Unfollowed Are you sure you want to log out? @@ -162,6 +164,7 @@ %d SHARES Unknown User Delete feed \"%s\"? + Unfollow \"%s\"? Default View diff --git a/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java b/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java index 97ed468e6..2c82d3992 100644 --- a/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java +++ b/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java @@ -159,6 +159,13 @@ public class BlurDatabaseHelper { synchronized (RW_MUTEX) {dbRW.delete(DatabaseConstants.STORY_TABLE, DatabaseConstants.STORY_FEED_ID + " = ?", selArgs);} } + public void deleteSocialFeed(String userId) { + String[] selArgs = new String[] {userId}; + synchronized (RW_MUTEX) {dbRW.delete(DatabaseConstants.SOCIALFEED_TABLE, DatabaseConstants.SOCIAL_FEED_ID + " = ?", selArgs);} + synchronized (RW_MUTEX) {dbRW.delete(DatabaseConstants.STORY_TABLE, DatabaseConstants.STORY_FEED_ID + " = ?", selArgs);} + synchronized (RW_MUTEX) {dbRW.delete(DatabaseConstants.SOCIALFEED_STORY_MAP_TABLE, DatabaseConstants.SOCIALFEED_STORY_USER_ID + " = ?", selArgs);} + } + public Feed getFeed(String feedId) { Cursor c = dbRO.query(DatabaseConstants.FEED_TABLE, null, DatabaseConstants.FEED_ID + " = ?", new String[] {feedId}, null, null, null); Feed result = null; diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/DeleteFeedFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/DeleteFeedFragment.java index 559811193..9d5ce7521 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/DeleteFeedFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/DeleteFeedFragment.java @@ -22,13 +22,17 @@ import android.widget.TextView; import android.widget.Toast; public class DeleteFeedFragment extends DialogFragment { + private static final String FEED_TYPE = "feed_type"; private static final String FEED_ID = "feed_id"; private static final String FEED_NAME = "feed_name"; private static final String FOLDER_NAME = "folder_name"; + private static final String NORMAL_FEED = "normal"; + private static final String SOCIAL_FEED = "social"; public static DeleteFeedFragment newInstance(Feed feed, String folderName) { DeleteFeedFragment frag = new DeleteFeedFragment(); Bundle args = new Bundle(); + args.putString(FEED_TYPE, NORMAL_FEED); args.putString(FEED_ID, feed.feedId); args.putString(FEED_NAME, feed.title); args.putString(FOLDER_NAME, folderName); @@ -36,12 +40,12 @@ public class DeleteFeedFragment extends DialogFragment { return frag; } - public static DeleteFeedFragment newInstance(SocialFeed feed, String folderName) { + public static DeleteFeedFragment newInstance(SocialFeed feed) { DeleteFeedFragment frag = new DeleteFeedFragment(); Bundle args = new Bundle(); + args.putString(FEED_TYPE, SOCIAL_FEED); args.putString(FEED_ID, feed.userId); - args.putString(FEED_NAME, feed.feedTitle); - args.putString(FOLDER_NAME, folderName); + args.putString(FEED_NAME, feed.username); frag.setArguments(args); return frag; } @@ -49,11 +53,19 @@ public class DeleteFeedFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(String.format(getResources().getString(R.string.delete_feed_message), getArguments().getString(FEED_NAME))); + if (getArguments().getString(FEED_TYPE).equals(NORMAL_FEED)) { + builder.setMessage(String.format(getResources().getString(R.string.delete_feed_message), getArguments().getString(FEED_NAME))); + } else { + builder.setMessage(String.format(getResources().getString(R.string.unfollow_message), getArguments().getString(FEED_NAME))); + } builder.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - FeedUtils.deleteFeed(getArguments().getString(FEED_ID), getArguments().getString(FOLDER_NAME), getActivity(), new APIManager(getActivity())); + if (getArguments().getString(FEED_TYPE).equals(NORMAL_FEED)) { + FeedUtils.deleteFeed(getArguments().getString(FEED_ID), getArguments().getString(FOLDER_NAME), getActivity(), new APIManager(getActivity())); + } else { + FeedUtils.deleteSocialFeed(getArguments().getString(FEED_ID), getActivity(), new APIManager(getActivity())); + } // if called from main view then refresh otherwise it was // called from the feed view so finish Activity activity = DeleteFeedFragment.this.getActivity(); diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java index 36fe2f82d..14cd8776a 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java @@ -13,6 +13,7 @@ import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Display; import android.view.LayoutInflater; +import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; @@ -195,10 +196,10 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen MenuInflater inflater = getActivity().getMenuInflater(); ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; int type = ExpandableListView.getPackedPositionType(info.packedPosition); - + int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition); + switch(type) { case ExpandableListView.PACKED_POSITION_TYPE_GROUP: - int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition); if (adapter.isRowSavedStories(groupPosition)) break; if (adapter.isRowReadStories(groupPosition)) break; inflater.inflate(R.menu.context_folder, menu); @@ -206,22 +207,27 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen case ExpandableListView.PACKED_POSITION_TYPE_CHILD: inflater.inflate(R.menu.context_feed, menu); + if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) { + menu.removeItem(R.id.menu_delete_feed); + } else { + menu.removeItem(R.id.menu_unfollow); + } break; } } - @Override + @Override public boolean onContextItemSelected(MenuItem item) { ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo(); int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition); int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition); - if (item.getItemId() == R.id.menu_delete_feed) { - String folderName = adapter.getGroup(groupPosition); + if (item.getItemId() == R.id.menu_delete_feed || item.getItemId() == R.id.menu_unfollow) { DialogFragment deleteFeedFragment; if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) { - deleteFeedFragment = DeleteFeedFragment.newInstance(adapter.getSocialFeed(adapter.getChild(groupPosition, childPosition)), folderName); + deleteFeedFragment = DeleteFeedFragment.newInstance(adapter.getSocialFeed(adapter.getChild(groupPosition, childPosition))); } else { + String folderName = adapter.getGroup(groupPosition); deleteFeedFragment = DeleteFeedFragment.newInstance(adapter.getFeed(adapter.getChild(groupPosition, childPosition)), folderName); } deleteFeedFragment.show(getFragmentManager(), "dialog"); diff --git a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java index da26a69c1..fc66f4533 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java @@ -27,6 +27,7 @@ import com.newsblur.domain.SocialFeed; import com.newsblur.domain.Story; import com.newsblur.network.APIManager; import com.newsblur.network.domain.NewsBlurResponse; +import com.newsblur.serialization.BooleanTypeAdapter; import com.newsblur.service.NBSyncService; import com.newsblur.util.AppConstants; @@ -79,6 +80,23 @@ public class FeedUtils { }.execute(); } + public static void deleteSocialFeed(final String userId, final Context context, final APIManager apiManager) { + new AsyncTask() { + @Override + protected Void doInBackground(Void... arg) { + apiManager.unfollowUser(userId); + return null; + } + @Override + protected void onPostExecute(Void result) { + // TODO: we can't check result.isError() because the delete call sets the .message property on all calls. find a better error check + dbHelper.deleteSocialFeed(userId); + NbActivity.updateAllActivities(); + Toast.makeText(context, R.string.toast_unfollowed, Toast.LENGTH_SHORT).show(); + } + }.execute(); + } + public static void clearReadingSession() { new AsyncTask() { @Override