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"
android:title="@string/menu_delete_feed" />
<item android:id="@+id/menu_unfollow"
android:title="@string/menu_unfollow" />
</menu>

View file

@ -111,6 +111,7 @@
<string name="menu_send_story">Send to…</string>
<string name="menu_mark_feed_as_read">Mark feed as read</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_sharenewsblur">Share this story</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_feed_deleted">Feed deleted</string>
<string name="toast_unfollowed">Unfollowed</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="unknown_user">Unknown User</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>

View file

@ -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;

View file

@ -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();

View file

@ -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");

View file

@ -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<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() {
new AsyncTask<Void, Void, Void>() {
@Override