#1299 Android saved searches delete option

This commit is contained in:
Andrei 2020-06-26 16:09:37 -07:00
parent 71b36b9706
commit 613f0d0313
10 changed files with 89 additions and 5 deletions

View file

@ -44,4 +44,7 @@
<item android:id="@+id/menu_intel"
android:title="@string/menu_intel" />
<item android:id="@+id/menu_delete_saved_search"
android:title="@string/menu_delete_saved_search" />
</menu>

View file

@ -133,6 +133,7 @@
<string name="menu_send_story_full">Send story 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_delete_saved_search">Delete saved search</string>
<string name="menu_unfollow">Unfollow user</string>
<string name="menu_choose_folders">Choose folders</string>
<string name="menu_notifications_choose">Notifications…</string>
@ -235,6 +236,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="delete_saved_search_message">Delete saved search %s?</string>
<string name="unfollow_message">Unfollow \&quot;%s\&quot;?</string>
<string name="feed_subscribers">%s subscribers</string>
<string name="feed_opens">%d opens</string>

View file

@ -195,6 +195,13 @@ public class BlurDatabaseHelper {
synchronized (RW_MUTEX) {dbRW.delete(DatabaseConstants.SOCIALFEED_STORY_MAP_TABLE, DatabaseConstants.SOCIALFEED_STORY_USER_ID + " = ?", selArgs);}
}
public void deleteSavedSearch(String feedId, String query) {
String q = "DELETE FROM " + DatabaseConstants.SAVED_SEARCH_TABLE +
" WHERE " + DatabaseConstants.SAVED_SEARCH_FEED_ID + " = '" + feedId + "'" +
" AND " + DatabaseConstants.SAVED_SEARCH_QUERY + " = '" + query + "'";
synchronized (RW_MUTEX) {dbRW.execSQL(q);}
}
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

@ -596,6 +596,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter {
SavedSearch savedSearch = SavedSearch.fromCursor(cursor);
savedSearches.add(savedSearch);
}
Collections.sort(savedSearches, SavedSearch.SavedSearchComparatorByTitle);
notifyDataSetChanged();
}

View file

@ -8,6 +8,8 @@ import com.newsblur.database.DatabaseConstants;
import com.newsblur.util.FeedSet;
import com.newsblur.util.FeedUtils;
import java.util.Comparator;
public class SavedSearch {
@SerializedName("query")
@ -110,4 +112,11 @@ public class SavedSearch {
}
return url;
}
public final static Comparator<SavedSearch> SavedSearchComparatorByTitle = new Comparator<SavedSearch>() {
@Override
public int compare(SavedSearch ss1, SavedSearch ss2) {
return String.CASE_INSENSITIVE_ORDER.compare(ss1.feedTitle, ss2.feedTitle);
}
};
}

View file

@ -4,9 +4,11 @@ import com.newsblur.R;
import com.newsblur.activity.ItemsList;
import com.newsblur.activity.NbActivity;
import com.newsblur.domain.Feed;
import com.newsblur.domain.SavedSearch;
import com.newsblur.domain.SocialFeed;
import com.newsblur.network.APIManager;
import com.newsblur.util.FeedUtils;
import com.newsblur.util.UIUtils;
import android.app.Activity;
import android.app.AlertDialog;
@ -22,7 +24,9 @@ public class DeleteFeedFragment extends DialogFragment {
private static final String FOLDER_NAME = "folder_name";
private static final String NORMAL_FEED = "normal";
private static final String SOCIAL_FEED = "social";
private static final String SAVED_SEARCH_FEED = "saved_search";
private static final String QUERY = "query";
public static DeleteFeedFragment newInstance(Feed feed, String folderName) {
DeleteFeedFragment frag = new DeleteFeedFragment();
Bundle args = new Bundle();
@ -44,11 +48,25 @@ public class DeleteFeedFragment extends DialogFragment {
return frag;
}
public static DeleteFeedFragment newInstance(SavedSearch savedSearch) {
DeleteFeedFragment frag = new DeleteFeedFragment();
Bundle args = new Bundle();
args.putString(FEED_TYPE, SAVED_SEARCH_FEED);
args.putString(FEED_ID, savedSearch.feedId);
args.putString(FEED_NAME, savedSearch.feedTitle);
args.putString(QUERY, savedSearch.query);
frag.setArguments(args);
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
if (getArguments().getString(FEED_TYPE).equals(NORMAL_FEED)) {
builder.setMessage(String.format(getResources().getString(R.string.delete_feed_message), getArguments().getString(FEED_NAME)));
} else if (getArguments().getString(FEED_TYPE).equals(SAVED_SEARCH_FEED)) {
String message = String.format(getResources().getString(R.string.delete_saved_search_message), getArguments().getString(FEED_NAME));
builder.setMessage(UIUtils.fromHtml(message));
} else {
builder.setMessage(String.format(getResources().getString(R.string.unfollow_message), getArguments().getString(FEED_NAME)));
}
@ -57,6 +75,8 @@ public class DeleteFeedFragment extends DialogFragment {
public void onClick(DialogInterface dialogInterface, int i) {
if (getArguments().getString(FEED_TYPE).equals(NORMAL_FEED)) {
FeedUtils.deleteFeed(getArguments().getString(FEED_ID), getArguments().getString(FOLDER_NAME), getActivity(), new APIManager(getActivity()));
} else if (getArguments().getString(FEED_TYPE).equals(SAVED_SEARCH_FEED)) {
FeedUtils.deleteSavedSearch(getArguments().getString(FEED_ID), getArguments().getString(QUERY), getActivity(), new APIManager(getActivity()));
} else {
FeedUtils.deleteSocialFeed(getArguments().getString(FEED_ID), getActivity(), new APIManager(getActivity()));
}

View file

@ -4,7 +4,6 @@ import java.lang.ref.WeakReference;
import java.util.HashSet;
import java.util.Set;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
@ -41,7 +40,6 @@ import com.newsblur.activity.ItemsList;
import com.newsblur.activity.Main;
import com.newsblur.activity.NbActivity;
import com.newsblur.activity.ReadStoriesItemsList;
import com.newsblur.activity.SavedSearchesItemList;
import com.newsblur.activity.SavedStoriesItemsList;
import com.newsblur.activity.SocialFeedItemsList;
import com.newsblur.database.FolderListAdapter;
@ -272,7 +270,6 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
case ExpandableListView.PACKED_POSITION_TYPE_CHILD:
if (adapter.isRowSavedStories(groupPosition)) break;
if (adapter.isRowSavedSearches(groupPosition)) break;
if (currentState == StateFilter.SAVED) break;
inflater.inflate(R.menu.context_feed, menu);
if (adapter.isRowAllSharedStories(groupPosition)) {
@ -285,9 +282,22 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
menu.removeItem(R.id.menu_instafetch_feed);
menu.removeItem(R.id.menu_intel);
menu.removeItem(R.id.menu_rename_feed);
menu.removeItem(R.id.menu_delete_saved_search);
} else if (adapter.isRowSavedSearches(groupPosition)) {
menu.removeItem(R.id.menu_mark_feed_as_read);
menu.removeItem(R.id.menu_delete_feed);
menu.removeItem(R.id.menu_unfollow);
menu.removeItem(R.id.menu_choose_folders);
menu.removeItem(R.id.menu_rename_feed);
menu.removeItem(R.id.menu_notifications);
menu.removeItem(R.id.menu_mute_feed);
menu.removeItem(R.id.menu_unmute_feed);
menu.removeItem(R.id.menu_instafetch_feed);
menu.removeItem(R.id.menu_intel);
} else {
// normal feeds
menu.removeItem(R.id.menu_unfollow);
menu.removeItem(R.id.menu_delete_saved_search);
Feed feed = adapter.getFeed(groupPosition, childPosition);
if (feed.active) {
@ -392,7 +402,13 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen
} else if (item.getItemId() == R.id.menu_intel) {
FeedIntelTrainerFragment intelFrag = FeedIntelTrainerFragment.newInstance(adapter.getFeed(groupPosition, childPosition), adapter.getChild(groupPosition, childPosition));
intelFrag.show(getFragmentManager(), FeedIntelTrainerFragment.class.getName());
}
} else if (item.getItemId() == R.id.menu_delete_saved_search) {
SavedSearch savedSearch = adapter.getSavedSearch(childPosition);
if (savedSearch != null) {
DialogFragment deleteFeedFragment = DeleteFeedFragment.newInstance(savedSearch);
deleteFeedFragment.show(getFragmentManager(), "dialog");
}
}
return super.onContextItemSelected(item);
}

View file

@ -71,6 +71,7 @@ public class APIConstants {
public static final String PATH_SET_NOTIFICATIONS = "/notifications/feed/";
public static final String PATH_INSTA_FETCH = "/rss_feeds/exception_retry";
public static final String PATH_RENAME_FEED = "/reader/rename_feed";
public static final String PATH_DELETE_SEARCH = "/reader/delete_search";
public static String buildUrl(String path) {
return CurrentUrlBase + path;

View file

@ -579,6 +579,14 @@ public class APIManager {
return response.getResponse(gson, NewsBlurResponse.class);
}
public NewsBlurResponse deleteSavedSearch(String feedId, String query) {
ContentValues values = new ContentValues();
values.put(APIConstants.PARAMETER_FEEDID, feedId);
values.put(APIConstants.PARAMETER_QUERY, query);
APIResponse response = post(buildUrl(APIConstants.PATH_DELETE_SEARCH), values);
return response.getResponse(gson, NewsBlurResponse.class);
}
public NewsBlurResponse saveFeedChooser(Set<String> feeds) {
ValueMultimap values = new ValueMultimap();
for (String feed : feeds) {

View file

@ -111,6 +111,23 @@ public class FeedUtils {
}.execute();
}
public static void deleteSavedSearch(final String feedId, final String query, final Context context, final APIManager apiManager) {
new AsyncTask<Void, Void, NewsBlurResponse>() {
@Override
protected NewsBlurResponse doInBackground(Void... voids) {
return apiManager.deleteSavedSearch(feedId, query);
}
@Override
protected void onPostExecute(NewsBlurResponse newsBlurResponse) {
if (!newsBlurResponse.isError()) {
dbHelper.deleteSavedSearch(feedId, query);
NbActivity.updateAllActivities(NbActivity.UPDATE_METADATA);
}
}
}.execute();
}
public static void deleteFeed(final String feedId, final String folderName, final Context context, final APIManager apiManager) {
new AsyncTask<Void, Void, NewsBlurResponse>() {
@Override