From 17de785c12f2edd7947f7c3c2ee93f3cb7d7abbb Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Mon, 10 Apr 2017 13:39:28 -0300
Subject: [PATCH] Remove blog as well when removing RSS feed

This also adds a confirmation dialog to the removal process.
---
 .../android/blog/RssFeedManageActivity.java   | 55 ++++++++++++-------
 briar-android/src/main/res/values/strings.xml |  3 +
 .../briar/api/blog/BlogManager.java           |  5 ++
 .../briar/api/feed/FeedManager.java           |  2 +-
 .../briar/blog/BlogManagerImpl.java           |  5 ++
 .../briar/feed/FeedManagerImpl.java           |  8 +--
 6 files changed, 51 insertions(+), 27 deletions(-)

diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java
index 8e60677299..56f948f4b7 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java
@@ -1,15 +1,16 @@
 package org.briarproject.briar.android.blog;
 
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.design.widget.Snackbar;
+import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.LinearLayoutManager;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 
 import org.briarproject.bramble.api.db.DbException;
-import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.android.activity.BriarActivity;
@@ -34,7 +35,6 @@ public class RssFeedManageActivity extends BriarActivity
 
 	private BriarRecyclerView list;
 	private RssFeedAdapter adapter;
-	private GroupId groupId;
 
 	@Inject
 	@SuppressWarnings("WeakerAccess")
@@ -44,12 +44,6 @@ public class RssFeedManageActivity extends BriarActivity
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 
-		// GroupId from Intent
-		Intent i = getIntent();
-		byte[] b = i.getByteArrayExtra(GROUP_ID);
-		if (b == null) throw new IllegalStateException("No Group in intent.");
-		groupId = new GroupId(b);
-
 		setContentView(R.layout.activity_rss_feed_manage);
 
 		adapter = new RssFeedAdapter(this, this);
@@ -101,19 +95,22 @@ public class RssFeedManageActivity extends BriarActivity
 
 	@Override
 	public void onDeleteClick(final Feed feed) {
-		runOnDbThread(new Runnable() {
-			@Override
-			public void run() {
-				try {
-					feedManager.removeFeed(feed.getUrl());
-					onFeedDeleted(feed);
-				} catch (DbException e) {
-					if (LOG.isLoggable(WARNING))
-						LOG.log(WARNING, e.toString(), e);
-					onDeleteError();
-				}
-			}
-		});
+		DialogInterface.OnClickListener okListener =
+				new DialogInterface.OnClickListener() {
+					@Override
+					public void onClick(DialogInterface dialog, int which) {
+						deleteFeed(feed);
+					}
+				};
+		AlertDialog.Builder builder = new AlertDialog.Builder(this,
+				R.style.BriarDialogTheme);
+		builder.setTitle(getString(R.string.blogs_rss_remove_feed));
+		builder.setMessage(
+				getString(R.string.blogs_rss_remove_feed_dialog_message));
+		builder.setPositiveButton(R.string.cancel, null);
+		builder.setNegativeButton(R.string.blogs_rss_remove_feed_ok,
+				okListener);
+		builder.show();
 	}
 
 	private void loadFeeds() {
@@ -148,6 +145,22 @@ public class RssFeedManageActivity extends BriarActivity
 		});
 	}
 
+	private void deleteFeed(final Feed feed) {
+		runOnDbThread(new Runnable() {
+			@Override
+			public void run() {
+				try {
+					feedManager.removeFeed(feed);
+					onFeedDeleted(feed);
+				} catch (DbException e) {
+					if (LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+					onDeleteError();
+				}
+			}
+		});
+	}
+
 	private void onLoadError() {
 		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index 99e86b60e6..5103e596b7 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -304,6 +304,9 @@
 	<string name="blogs_rss_feeds_manage_imported">Imported:</string>
 	<string name="blogs_rss_feeds_manage_author">Author:</string>
 	<string name="blogs_rss_feeds_manage_updated">Last Updated:</string>
+	<string name="blogs_rss_remove_feed">Remove Feed</string>
+	<string name="blogs_rss_remove_feed_dialog_message">Are you sure that you want to remove this feed and all its posts?\nNote that this will not remove the feed\'s blog from other people\'s devices.</string>
+	<string name="blogs_rss_remove_feed_ok">Remove Feed</string>
 	<string name="blogs_rss_feeds_manage_delete_error">The feed could not be deleted!</string>
 	<string name="blogs_rss_feeds_manage_empty_state">You haven\'t imported any RSS feeds.\n\nWhy don\'t you click the plus in the top right screen corner to add your first?</string>
 	<string name="blogs_rss_feeds_manage_error">There was a problem loading your feeds. Please try again later.</string>
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java
index 20ffb991ca..041d474a4e 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java
@@ -41,6 +41,11 @@ public interface BlogManager {
 	 */
 	void removeBlog(Blog b) throws DbException;
 
+	/**
+	 * Removes and deletes a blog with the given {@link Transaction}.
+	 */
+	void removeBlog(Transaction txn, Blog b) throws DbException;
+
 	/**
 	 * Stores a local blog post.
 	 */
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java
index 74a762eaf9..7d83b22c15 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java
@@ -23,7 +23,7 @@ public interface FeedManager {
 	/**
 	 * Removes an RSS feed.
 	 */
-	void removeFeed(String url) throws DbException;
+	void removeFeed(Feed feed) throws DbException;
 
 	/**
 	 * Returns a list of all added RSS feeds
diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
index 496b308fb5..22b8009167 100644
--- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
@@ -224,6 +224,11 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
 		}
 	}
 
+	@Override
+	public void removeBlog(Transaction txn, Blog b) throws DbException {
+		removeBlog(txn, b, false);
+	}
+
 	private void removeBlog(Transaction txn, Blog b, boolean forced)
 			throws DbException {
 		if (!forced && !canBeRemoved(txn, b.getId()))
diff --git a/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java
index 8168d58b19..8db542e8b9 100644
--- a/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java
@@ -203,22 +203,20 @@ class FeedManagerImpl implements FeedManager, Client, EventListener {
 	}
 
 	@Override
-	public void removeFeed(String url) throws DbException {
+	public void removeFeed(Feed feed) throws DbException {
 		LOG.info("Removing RSS feed...");
 		Transaction txn = db.startTransaction(false);
 		try {
 			List<Feed> feeds = getFeeds(txn);
-			Feed feed = null;
 			for (Feed f : feeds) {
-				if (f.getUrl().equals(url)) {
+				if (f.getBlogId().equals(feed.getBlogId())) {
 					feed = f;
 					feeds.remove(f);
 					break;
 				}
 			}
-			if (feed == null) throw new DbException();
 			storeFeeds(txn, feeds);
-			// TODO blogManager.removeBlog(txn, feed.getBlog());
+			blogManager.removeBlog(txn, feed.getBlog());
 			db.commitTransaction(txn);
 		} finally {
 			db.endTransaction(txn);
-- 
GitLab