Fix unfollowing a user from the long press menu (#710)

This commit is contained in:
Mark Anderson 2015-07-01 21:44:00 +01:00
parent e6b3e4a419
commit 219d321ff9
6 changed files with 60 additions and 11 deletions

View file

@ -6,5 +6,8 @@
<item android:id="@+id/menu_delete_feed" <item android:id="@+id/menu_delete_feed"
android:title="@string/menu_delete_feed" /> android:title="@string/menu_delete_feed" />
<item android:id="@+id/menu_unfollow"
android:title="@string/menu_unfollow" />
</menu> </menu>

View file

@ -111,6 +111,7 @@
<string name="menu_send_story">Send to…</string> <string name="menu_send_story">Send to…</string>
<string name="menu_mark_feed_as_read">Mark feed as read</string> <string name="menu_mark_feed_as_read">Mark feed as read</string>
<string name="menu_delete_feed">Delete feed</string> <string name="menu_delete_feed">Delete feed</string>
<string name="menu_unfollow">Unfollow user</string>
<string name="menu_mark_folder_as_read">Mark folder as read</string> <string name="menu_mark_folder_as_read">Mark folder as read</string>
<string name="menu_sharenewsblur">Share this story</string> <string name="menu_sharenewsblur">Share this story</string>
<string name="menu_textsize">Adjust text size</string> <string name="menu_textsize">Adjust text size</string>
@ -129,6 +130,7 @@
<string name="toast_story_unread">Story marked as unread</string> <string name="toast_story_unread">Story marked as unread</string>
<string name="toast_feed_deleted">Feed deleted</string> <string name="toast_feed_deleted">Feed deleted</string>
<string name="toast_unfollowed">Unfollowed</string>
<string name="logout_warning">Are you sure you want to log out?</string> <string name="logout_warning">Are you sure you want to log out?</string>
@ -162,6 +164,7 @@
<string name="friends_shares_count">%d SHARES</string> <string name="friends_shares_count">%d SHARES</string>
<string name="unknown_user">Unknown User</string> <string name="unknown_user">Unknown User</string>
<string name="delete_feed_message">Delete feed \&quot;%s\&quot;?</string> <string name="delete_feed_message">Delete feed \&quot;%s\&quot;?</string>
<string name="unfollow_message">Unfollow \&quot;%s\&quot;?</string>
<string name="menu_default_view">Default View</string> <string name="menu_default_view">Default View</string>

View file

@ -159,6 +159,13 @@ public class BlurDatabaseHelper {
synchronized (RW_MUTEX) {dbRW.delete(DatabaseConstants.STORY_TABLE, DatabaseConstants.STORY_FEED_ID + " = ?", selArgs);} 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) { public Feed getFeed(String feedId) {
Cursor c = dbRO.query(DatabaseConstants.FEED_TABLE, null, DatabaseConstants.FEED_ID + " = ?", new String[] {feedId}, null, null, null); Cursor c = dbRO.query(DatabaseConstants.FEED_TABLE, null, DatabaseConstants.FEED_ID + " = ?", new String[] {feedId}, null, null, null);
Feed result = null; Feed result = null;

View file

@ -22,13 +22,17 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
public class DeleteFeedFragment extends DialogFragment { 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_ID = "feed_id";
private static final String FEED_NAME = "feed_name"; private static final String FEED_NAME = "feed_name";
private static final String FOLDER_NAME = "folder_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) { public static DeleteFeedFragment newInstance(Feed feed, String folderName) {
DeleteFeedFragment frag = new DeleteFeedFragment(); DeleteFeedFragment frag = new DeleteFeedFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(FEED_TYPE, NORMAL_FEED);
args.putString(FEED_ID, feed.feedId); args.putString(FEED_ID, feed.feedId);
args.putString(FEED_NAME, feed.title); args.putString(FEED_NAME, feed.title);
args.putString(FOLDER_NAME, folderName); args.putString(FOLDER_NAME, folderName);
@ -36,12 +40,12 @@ public class DeleteFeedFragment extends DialogFragment {
return frag; return frag;
} }
public static DeleteFeedFragment newInstance(SocialFeed feed, String folderName) { public static DeleteFeedFragment newInstance(SocialFeed feed) {
DeleteFeedFragment frag = new DeleteFeedFragment(); DeleteFeedFragment frag = new DeleteFeedFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(FEED_TYPE, SOCIAL_FEED);
args.putString(FEED_ID, feed.userId); args.putString(FEED_ID, feed.userId);
args.putString(FEED_NAME, feed.feedTitle); args.putString(FEED_NAME, feed.username);
args.putString(FOLDER_NAME, folderName);
frag.setArguments(args); frag.setArguments(args);
return frag; return frag;
} }
@ -49,11 +53,19 @@ public class DeleteFeedFragment extends DialogFragment {
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 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() { builder.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { 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 // if called from main view then refresh otherwise it was
// called from the feed view so finish // called from the feed view so finish
Activity activity = DeleteFeedFragment.this.getActivity(); Activity activity = DeleteFeedFragment.this.getActivity();

View file

@ -13,6 +13,7 @@ import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextMenu.ContextMenuInfo;
import android.view.Display; import android.view.Display;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -195,10 +196,10 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
MenuInflater inflater = getActivity().getMenuInflater(); MenuInflater inflater = getActivity().getMenuInflater();
ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
int type = ExpandableListView.getPackedPositionType(info.packedPosition); int type = ExpandableListView.getPackedPositionType(info.packedPosition);
int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
switch(type) { switch(type) {
case ExpandableListView.PACKED_POSITION_TYPE_GROUP: case ExpandableListView.PACKED_POSITION_TYPE_GROUP:
int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
if (adapter.isRowSavedStories(groupPosition)) break; if (adapter.isRowSavedStories(groupPosition)) break;
if (adapter.isRowReadStories(groupPosition)) break; if (adapter.isRowReadStories(groupPosition)) break;
inflater.inflate(R.menu.context_folder, menu); inflater.inflate(R.menu.context_folder, menu);
@ -206,22 +207,27 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
case ExpandableListView.PACKED_POSITION_TYPE_CHILD: case ExpandableListView.PACKED_POSITION_TYPE_CHILD:
inflater.inflate(R.menu.context_feed, menu); 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; break;
} }
} }
@Override @Override
public boolean onContextItemSelected(MenuItem item) { public boolean onContextItemSelected(MenuItem item) {
ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo(); ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition); int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition);
int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition); int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
if (item.getItemId() == R.id.menu_delete_feed) { if (item.getItemId() == R.id.menu_delete_feed || item.getItemId() == R.id.menu_unfollow) {
String folderName = adapter.getGroup(groupPosition);
DialogFragment deleteFeedFragment; DialogFragment deleteFeedFragment;
if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) { 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 { } else {
String folderName = adapter.getGroup(groupPosition);
deleteFeedFragment = DeleteFeedFragment.newInstance(adapter.getFeed(adapter.getChild(groupPosition, childPosition)), folderName); deleteFeedFragment = DeleteFeedFragment.newInstance(adapter.getFeed(adapter.getChild(groupPosition, childPosition)), folderName);
} }
deleteFeedFragment.show(getFragmentManager(), "dialog"); deleteFeedFragment.show(getFragmentManager(), "dialog");

View file

@ -27,6 +27,7 @@ import com.newsblur.domain.SocialFeed;
import com.newsblur.domain.Story; import com.newsblur.domain.Story;
import com.newsblur.network.APIManager; import com.newsblur.network.APIManager;
import com.newsblur.network.domain.NewsBlurResponse; import com.newsblur.network.domain.NewsBlurResponse;
import com.newsblur.serialization.BooleanTypeAdapter;
import com.newsblur.service.NBSyncService; import com.newsblur.service.NBSyncService;
import com.newsblur.util.AppConstants; import com.newsblur.util.AppConstants;
@ -79,6 +80,23 @@ public class FeedUtils {
}.execute(); }.execute();
} }
public static void deleteSocialFeed(final String userId, final Context context, final APIManager apiManager) {
new AsyncTask<Void, Void, Void>() {
@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() { public static void clearReadingSession() {
new AsyncTask<Void, Void, Void>() { new AsyncTask<Void, Void, Void>() {
@Override @Override