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