mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-16 04:39:54 +01:00
Anticipate review feedback for blog view models after re-basing
This commit is contained in:
@@ -127,41 +127,34 @@ abstract class BaseViewModel extends DbViewModel implements EventListener {
|
|||||||
LiveData<LiveResult<BlogPostItem>> loadBlogPost(GroupId g, MessageId m) {
|
LiveData<LiveResult<BlogPostItem>> loadBlogPost(GroupId g, MessageId m) {
|
||||||
MutableLiveData<LiveResult<BlogPostItem>> result =
|
MutableLiveData<LiveResult<BlogPostItem>> result =
|
||||||
new MutableLiveData<>();
|
new MutableLiveData<>();
|
||||||
runOnDbThread(() -> {
|
runOnDbThread(true, txn -> {
|
||||||
try {
|
long start = now();
|
||||||
long start = now();
|
BlogPostHeader header = blogManager.getPostHeader(txn, g, m);
|
||||||
BlogPostHeader header = blogManager.getPostHeader(g, m);
|
BlogPostItem item = getItem(txn, header);
|
||||||
BlogPostItem item = db.transactionWithResult(true, txn ->
|
logDuration(LOG, "Loading post", start);
|
||||||
getItem(txn, header)
|
result.postValue(new LiveResult<>(item));
|
||||||
);
|
}, e -> {
|
||||||
logDuration(LOG, "Loading post", start);
|
logException(LOG, WARNING, e);
|
||||||
result.postValue(new LiveResult<>(item));
|
result.postValue(new LiveResult<>(e));
|
||||||
} catch (DbException e) {
|
|
||||||
logException(LOG, WARNING, e);
|
|
||||||
result.postValue(new LiveResult<>(e));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onBlogPostAdded(BlogPostHeader header, boolean local) {
|
protected void onBlogPostAdded(BlogPostHeader header, boolean local) {
|
||||||
runOnDbThread(() -> {
|
runOnDbThread(true, txn -> {
|
||||||
try {
|
BlogPostItem item = getItem(txn, header);
|
||||||
db.transaction(true, txn -> {
|
txn.attach(() -> onBlogPostItemAdded(item, local));
|
||||||
BlogPostItem item = getItem(txn, header);
|
}, e -> logException(LOG, WARNING, e));
|
||||||
txn.attach(() -> {
|
}
|
||||||
List<BlogPostItem> items = addListItem(blogPosts, item);
|
|
||||||
if (items != null) {
|
@UiThread
|
||||||
Collections.sort(items);
|
private void onBlogPostItemAdded(BlogPostItem item, boolean local) {
|
||||||
postAddedWasLocal = local;
|
List<BlogPostItem> items = addListItem(blogPosts, item);
|
||||||
blogPosts.setValue(new LiveResult<>(items));
|
if (items != null) {
|
||||||
}
|
Collections.sort(items);
|
||||||
});
|
postAddedWasLocal = local;
|
||||||
});
|
blogPosts.setValue(new LiveResult<>(items));
|
||||||
} catch (DbException e) {
|
}
|
||||||
logException(LOG, WARNING, e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void repeatPost(BlogPostItem item, @Nullable String comment) {
|
void repeatPost(BlogPostItem item, @Nullable String comment) {
|
||||||
|
|||||||
@@ -106,8 +106,7 @@ public class BlogFragment extends BaseFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
viewModel.blockNotifications();
|
viewModel.blockAndClearNotifications();
|
||||||
viewModel.clearBlogPostNotifications();
|
|
||||||
list.startPeriodicUpdate();
|
list.startPeriodicUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,23 +133,22 @@ public class BlogFragment extends BaseFragment
|
|||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
int itemId = item.getItemId();
|
int itemId = item.getItemId();
|
||||||
if (itemId == R.id.action_write_blog_post) {
|
if (itemId == R.id.action_write_blog_post) {
|
||||||
Intent i = new Intent(getActivity(),
|
Intent i = new Intent(getActivity(), WriteBlogPostActivity.class);
|
||||||
WriteBlogPostActivity.class);
|
|
||||||
i.putExtra(GROUP_ID, groupId.getBytes());
|
i.putExtra(GROUP_ID, groupId.getBytes());
|
||||||
startActivityForResult(i, REQUEST_WRITE_BLOG_POST);
|
startActivityForResult(i, REQUEST_WRITE_BLOG_POST);
|
||||||
return true;
|
return true;
|
||||||
} else if (itemId == R.id.action_blog_share) {
|
} else if (itemId == R.id.action_blog_share) {
|
||||||
Intent i2 = new Intent(getActivity(), ShareBlogActivity.class);
|
Intent i = new Intent(getActivity(), ShareBlogActivity.class);
|
||||||
i2.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
i2.putExtra(GROUP_ID, groupId.getBytes());
|
i.putExtra(GROUP_ID, groupId.getBytes());
|
||||||
startActivityForResult(i2, REQUEST_SHARE_BLOG);
|
startActivityForResult(i, REQUEST_SHARE_BLOG);
|
||||||
return true;
|
return true;
|
||||||
} else if (itemId == R.id.action_blog_sharing_status) {
|
} else if (itemId == R.id.action_blog_sharing_status) {
|
||||||
Intent i3 = new Intent(getActivity(),
|
Intent i =
|
||||||
BlogSharingStatusActivity.class);
|
new Intent(getActivity(), BlogSharingStatusActivity.class);
|
||||||
i3.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
i3.putExtra(GROUP_ID, groupId.getBytes());
|
i.putExtra(GROUP_ID, groupId.getBytes());
|
||||||
startActivity(i3);
|
startActivity(i);
|
||||||
return true;
|
return true;
|
||||||
} else if (itemId == R.id.action_blog_delete) {
|
} else if (itemId == R.id.action_blog_delete) {
|
||||||
showDeleteDialog();
|
showDeleteDialog();
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import java.util.logging.Logger;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.annotation.CallSuper;
|
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
import androidx.lifecycle.LifecycleOwner;
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
@@ -36,7 +35,6 @@ import static java.util.logging.Logger.getLogger;
|
|||||||
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.MIN_DATE_RESOLUTION;
|
import static org.briarproject.briar.android.util.UiUtils.MIN_DATE_RESOLUTION;
|
||||||
|
|
||||||
@UiThread
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
@ParametersNotNullByDefault
|
||||||
public class BlogPostFragment extends BaseFragment
|
public class BlogPostFragment extends BaseFragment
|
||||||
@@ -82,7 +80,8 @@ public class BlogPostFragment extends BaseFragment
|
|||||||
Bundle args = requireArguments();
|
Bundle args = requireArguments();
|
||||||
GroupId groupId =
|
GroupId groupId =
|
||||||
new GroupId(requireNonNull(args.getByteArray(GROUP_ID)));
|
new GroupId(requireNonNull(args.getByteArray(GROUP_ID)));
|
||||||
MessageId postId = new MessageId(args.getByteArray(POST_ID));
|
MessageId postId =
|
||||||
|
new MessageId(requireNonNull(args.getByteArray(POST_ID)));
|
||||||
|
|
||||||
View view = inflater.inflate(R.layout.fragment_blog_post, container,
|
View view = inflater.inflate(R.layout.fragment_blog_post, container,
|
||||||
false);
|
false);
|
||||||
@@ -97,14 +96,12 @@ public class BlogPostFragment extends BaseFragment
|
|||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@CallSuper
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
startPeriodicUpdate();
|
startPeriodicUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@CallSuper
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
super.onStop();
|
super.onStop();
|
||||||
@@ -128,7 +125,7 @@ public class BlogPostFragment extends BaseFragment
|
|||||||
Intent i = new Intent(requireContext(), BlogActivity.class);
|
Intent i = new Intent(requireContext(), BlogActivity.class);
|
||||||
i.putExtra(GROUP_ID, post.getGroupId().getBytes());
|
i.putExtra(GROUP_ID, post.getGroupId().getBytes());
|
||||||
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
getContext().startActivity(i);
|
requireContext().startActivity(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.sync.MessageId;
|
import org.briarproject.bramble.api.sync.MessageId;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.view.AuthorView;
|
import org.briarproject.briar.android.view.AuthorView;
|
||||||
@@ -17,7 +18,6 @@ import org.briarproject.briar.api.blog.BlogPostHeader;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
@@ -36,6 +36,7 @@ import static org.briarproject.briar.android.view.AuthorView.RSS_FEED_REBLOGGED;
|
|||||||
import static org.briarproject.briar.api.blog.MessageType.POST;
|
import static org.briarproject.briar.api.blog.MessageType.POST;
|
||||||
|
|
||||||
@UiThread
|
@UiThread
|
||||||
|
@NotNullByDefault
|
||||||
class BlogPostViewHolder extends RecyclerView.ViewHolder {
|
class BlogPostViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private final Context ctx;
|
private final Context ctx;
|
||||||
@@ -47,11 +48,10 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
|
|||||||
private final ViewGroup commentContainer;
|
private final ViewGroup commentContainer;
|
||||||
private final boolean fullText;
|
private final boolean fullText;
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final OnBlogPostClickListener listener;
|
private final OnBlogPostClickListener listener;
|
||||||
|
|
||||||
BlogPostViewHolder(View v, boolean fullText,
|
BlogPostViewHolder(View v, boolean fullText,
|
||||||
@NonNull OnBlogPostClickListener listener) {
|
OnBlogPostClickListener listener) {
|
||||||
super(v);
|
super(v);
|
||||||
this.fullText = fullText;
|
this.fullText = fullText;
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
|
|||||||
@@ -15,12 +15,10 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
|||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.sync.GroupId;
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
import org.briarproject.bramble.api.sync.MessageId;
|
|
||||||
import org.briarproject.bramble.api.sync.event.GroupRemovedEvent;
|
import org.briarproject.bramble.api.sync.event.GroupRemovedEvent;
|
||||||
import org.briarproject.bramble.api.system.AndroidExecutor;
|
import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||||
import org.briarproject.briar.android.sharing.SharingController;
|
import org.briarproject.briar.android.sharing.SharingController;
|
||||||
import org.briarproject.briar.android.sharing.SharingController.SharingInfo;
|
import org.briarproject.briar.android.sharing.SharingController.SharingInfo;
|
||||||
import org.briarproject.briar.android.viewmodel.LiveResult;
|
|
||||||
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
||||||
import org.briarproject.briar.api.blog.Blog;
|
import org.briarproject.briar.api.blog.Blog;
|
||||||
import org.briarproject.briar.api.blog.BlogInvitationResponse;
|
import org.briarproject.briar.api.blog.BlogInvitationResponse;
|
||||||
@@ -37,6 +35,7 @@ import java.util.logging.Logger;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import androidx.annotation.UiThread;
|
||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
@@ -136,11 +135,8 @@ class BlogViewModel extends BaseViewModel {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockNotifications() {
|
void blockAndClearNotifications() {
|
||||||
notificationManager.blockNotification(groupId);
|
notificationManager.blockNotification(groupId);
|
||||||
}
|
|
||||||
|
|
||||||
void clearBlogPostNotifications() {
|
|
||||||
notificationManager.clearBlogPostNotification(groupId);
|
notificationManager.clearBlogPostNotification(groupId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,18 +149,18 @@ class BlogViewModel extends BaseViewModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void loadSharingContacts(GroupId groupId) {
|
private void loadSharingContacts(GroupId groupId) {
|
||||||
runOnDbThread(() -> {
|
runOnDbThread(true, txn -> {
|
||||||
try {
|
Collection<Contact> contacts =
|
||||||
Collection<Contact> contacts =
|
blogSharingManager.getSharedWith(txn, groupId);
|
||||||
blogSharingManager.getSharedWith(groupId);
|
txn.attach(() -> onSharingContactsLoaded(contacts));
|
||||||
Collection<ContactId> contactIds =
|
}, e -> logException(LOG, WARNING, e));
|
||||||
new ArrayList<>(contacts.size());
|
}
|
||||||
for (Contact c : contacts) contactIds.add(c.getId());
|
|
||||||
sharingController.addAll(contactIds);
|
@UiThread
|
||||||
} catch (DbException e) {
|
private void onSharingContactsLoaded(Collection<Contact> contacts) {
|
||||||
logException(LOG, WARNING, e);
|
Collection<ContactId> contactIds = new ArrayList<>(contacts.size());
|
||||||
}
|
for (Contact c : contacts) contactIds.add(c.getId());
|
||||||
});
|
sharingController.addAll(contactIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
void deleteBlog() {
|
void deleteBlog() {
|
||||||
@@ -180,10 +176,6 @@ class BlogViewModel extends BaseViewModel {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
LiveData<LiveResult<BlogPostItem>> loadBlogPost(MessageId m) {
|
|
||||||
return loadBlogPost(groupId, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
LiveData<BlogItem> getBlog() {
|
LiveData<BlogItem> getBlog() {
|
||||||
return blog;
|
return blog;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import java.util.List;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.UiThread;
|
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
|
||||||
@@ -32,7 +31,6 @@ import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
|||||||
import static com.google.android.material.snackbar.Snackbar.LENGTH_LONG;
|
import static com.google.android.material.snackbar.Snackbar.LENGTH_LONG;
|
||||||
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
||||||
|
|
||||||
@UiThread
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
@ParametersNotNullByDefault
|
||||||
public class FeedFragment extends BaseFragment
|
public class FeedFragment extends BaseFragment
|
||||||
@@ -82,8 +80,7 @@ public class FeedFragment extends BaseFragment
|
|||||||
list.setEmptyAction(R.string.blogs_feed_empty_state_action);
|
list.setEmptyAction(R.string.blogs_feed_empty_state_action);
|
||||||
|
|
||||||
viewModel.getBlogPosts().observe(getViewLifecycleOwner(), result ->
|
viewModel.getBlogPosts().observe(getViewLifecycleOwner(), result ->
|
||||||
result
|
result.onError(this::handleException)
|
||||||
.onError(this::handleException)
|
|
||||||
.onSuccess(this::onBlogPostsLoaded)
|
.onSuccess(this::onBlogPostsLoaded)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -93,8 +90,7 @@ public class FeedFragment extends BaseFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
viewModel.blockAllBlogPostNotifications();
|
viewModel.blockAndClearAllBlogPostNotifications();
|
||||||
viewModel.clearAllBlogPostNotifications();
|
|
||||||
list.startPeriodicUpdate();
|
list.startPeriodicUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import android.app.Application;
|
|||||||
|
|
||||||
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||||
import org.briarproject.bramble.api.db.DbException;
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
import org.briarproject.bramble.api.db.NoSuchMessageException;
|
|
||||||
import org.briarproject.bramble.api.db.Transaction;
|
import org.briarproject.bramble.api.db.Transaction;
|
||||||
import org.briarproject.bramble.api.db.TransactionManager;
|
import org.briarproject.bramble.api.db.TransactionManager;
|
||||||
import org.briarproject.bramble.api.event.Event;
|
import org.briarproject.bramble.api.event.Event;
|
||||||
@@ -31,6 +30,7 @@ import java.util.logging.Logger;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import androidx.annotation.UiThread;
|
||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
@@ -87,11 +87,8 @@ class FeedViewModel extends BaseViewModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockAllBlogPostNotifications() {
|
void blockAndClearAllBlogPostNotifications() {
|
||||||
notificationManager.blockAllBlogPostNotifications();
|
notificationManager.blockAllBlogPostNotifications();
|
||||||
}
|
|
||||||
|
|
||||||
void clearAllBlogPostNotifications() {
|
|
||||||
notificationManager.clearAllBlogPostNotifications();
|
notificationManager.clearAllBlogPostNotifications();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,11 +124,7 @@ class FeedViewModel extends BaseViewModel {
|
|||||||
long start = now();
|
long start = now();
|
||||||
List<BlogPostItem> posts = new ArrayList<>();
|
List<BlogPostItem> posts = new ArrayList<>();
|
||||||
for (GroupId g : blogManager.getBlogIds(txn)) {
|
for (GroupId g : blogManager.getBlogIds(txn)) {
|
||||||
try {
|
posts.addAll(loadBlogPosts(txn, g));
|
||||||
posts.addAll(loadBlogPosts(txn, g));
|
|
||||||
} catch (NoSuchMessageException e) {
|
|
||||||
logException(LOG, WARNING, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Collections.sort(posts);
|
Collections.sort(posts);
|
||||||
logDuration(LOG, "Loading all posts", start);
|
logDuration(LOG, "Loading all posts", start);
|
||||||
@@ -139,23 +132,19 @@ class FeedViewModel extends BaseViewModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onBlogAdded(GroupId g) {
|
private void onBlogAdded(GroupId g) {
|
||||||
runOnDbThread(() -> {
|
runOnDbThread(true, txn -> {
|
||||||
try {
|
List<BlogPostItem> posts = loadBlogPosts(txn, g);
|
||||||
db.transaction(true, txn -> {
|
txn.attach(() -> onBlogPostItemsAdded(posts));
|
||||||
List<BlogPostItem> posts = loadBlogPosts(txn, g);
|
}, e -> logException(LOG, WARNING, e));
|
||||||
txn.attach(() -> {
|
}
|
||||||
List<BlogPostItem> items =
|
|
||||||
addListItems(blogPosts, posts);
|
@UiThread
|
||||||
if (items != null) {
|
private void onBlogPostItemsAdded(List<BlogPostItem> posts) {
|
||||||
Collections.sort(items);
|
List<BlogPostItem> items = addListItems(blogPosts, posts);
|
||||||
blogPosts.setValue(new LiveResult<>(items));
|
if (items != null) {
|
||||||
}
|
Collections.sort(items);
|
||||||
});
|
blogPosts.setValue(new LiveResult<>(items));
|
||||||
});
|
}
|
||||||
} catch (DbException e) {
|
|
||||||
logException(LOG, WARNING, e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onBlogRemoved(GroupId g) {
|
private void onBlogRemoved(GroupId g) {
|
||||||
|
|||||||
@@ -107,7 +107,8 @@ public interface BlogManager {
|
|||||||
/**
|
/**
|
||||||
* Returns the header of the blog post with the given ID.
|
* Returns the header of the blog post with the given ID.
|
||||||
*/
|
*/
|
||||||
BlogPostHeader getPostHeader(GroupId g, MessageId m) throws DbException;
|
BlogPostHeader getPostHeader(Transaction txn, GroupId g, MessageId m)
|
||||||
|
throws DbException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the text of the blog post with the given ID.
|
* Returns the text of the blog post with the given ID.
|
||||||
|
|||||||
@@ -454,19 +454,14 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlogPostHeader getPostHeader(GroupId g, MessageId m)
|
public BlogPostHeader getPostHeader(Transaction txn, GroupId g, MessageId m)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
Transaction txn = db.startTransaction(true);
|
|
||||||
try {
|
try {
|
||||||
BdfDictionary meta =
|
BdfDictionary meta =
|
||||||
clientHelper.getMessageMetadataAsDictionary(txn, m);
|
clientHelper.getMessageMetadataAsDictionary(txn, m);
|
||||||
BlogPostHeader h = getPostHeaderFromMetadata(txn, g, m, meta);
|
return getPostHeaderFromMetadata(txn, g, m, meta);
|
||||||
db.commitTransaction(txn);
|
|
||||||
return h;
|
|
||||||
} catch (FormatException e) {
|
} catch (FormatException e) {
|
||||||
throw new DbException(e);
|
throw new DbException(e);
|
||||||
} finally {
|
|
||||||
db.endTransaction(txn);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,15 @@ package org.briarproject.briar.headless.blogs
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
import io.javalin.http.BadRequestResponse
|
import io.javalin.http.BadRequestResponse
|
||||||
import io.javalin.http.Context
|
import io.javalin.http.Context
|
||||||
|
import org.briarproject.bramble.api.db.DbException
|
||||||
|
import org.briarproject.bramble.api.db.TransactionManager
|
||||||
import org.briarproject.bramble.api.identity.IdentityManager
|
import org.briarproject.bramble.api.identity.IdentityManager
|
||||||
import org.briarproject.bramble.api.system.Clock
|
import org.briarproject.bramble.api.system.Clock
|
||||||
import org.briarproject.bramble.util.StringUtils.utf8IsTooLong
|
import org.briarproject.bramble.util.StringUtils.utf8IsTooLong
|
||||||
import org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_TEXT_LENGTH
|
import org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_TEXT_LENGTH
|
||||||
import org.briarproject.briar.api.blog.BlogManager
|
import org.briarproject.briar.api.blog.BlogManager
|
||||||
import org.briarproject.briar.api.blog.BlogPostFactory
|
import org.briarproject.briar.api.blog.BlogPostFactory
|
||||||
|
import org.briarproject.briar.api.blog.BlogPostHeader
|
||||||
import org.briarproject.briar.headless.getFromJson
|
import org.briarproject.briar.headless.getFromJson
|
||||||
import javax.annotation.concurrent.Immutable
|
import javax.annotation.concurrent.Immutable
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -21,6 +24,7 @@ internal class BlogControllerImpl
|
|||||||
constructor(
|
constructor(
|
||||||
private val blogManager: BlogManager,
|
private val blogManager: BlogManager,
|
||||||
private val blogPostFactory: BlogPostFactory,
|
private val blogPostFactory: BlogPostFactory,
|
||||||
|
private val db: TransactionManager,
|
||||||
private val identityManager: IdentityManager,
|
private val identityManager: IdentityManager,
|
||||||
private val objectMapper: ObjectMapper,
|
private val objectMapper: ObjectMapper,
|
||||||
private val clock: Clock
|
private val clock: Clock
|
||||||
@@ -45,8 +49,10 @@ constructor(
|
|||||||
val blog = blogManager.getPersonalBlog(author)
|
val blog = blogManager.getPersonalBlog(author)
|
||||||
val now = clock.currentTimeMillis()
|
val now = clock.currentTimeMillis()
|
||||||
val post = blogPostFactory.createBlogPost(blog.id, now, null, author, text)
|
val post = blogPostFactory.createBlogPost(blog.id, now, null, author, text)
|
||||||
blogManager.addLocalPost(post)
|
val header = db.transactionWithResult<BlogPostHeader, DbException>(true) { txn ->
|
||||||
val header = blogManager.getPostHeader(blog.id, post.message.id)
|
blogManager.addLocalPost(txn, post)
|
||||||
|
return@transactionWithResult blogManager.getPostHeader(txn, blog.id, post.message.id)
|
||||||
|
}
|
||||||
return ctx.json(header.output(text))
|
return ctx.json(header.output(text))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import io.mockk.mockk
|
|||||||
import org.briarproject.bramble.api.connection.ConnectionRegistry
|
import org.briarproject.bramble.api.connection.ConnectionRegistry
|
||||||
import org.briarproject.bramble.api.contact.Contact
|
import org.briarproject.bramble.api.contact.Contact
|
||||||
import org.briarproject.bramble.api.contact.ContactManager
|
import org.briarproject.bramble.api.contact.ContactManager
|
||||||
|
import org.briarproject.bramble.api.db.TransactionManager
|
||||||
import org.briarproject.bramble.api.identity.Author
|
import org.briarproject.bramble.api.identity.Author
|
||||||
import org.briarproject.bramble.api.identity.IdentityManager
|
import org.briarproject.bramble.api.identity.IdentityManager
|
||||||
import org.briarproject.bramble.api.identity.LocalAuthor
|
import org.briarproject.bramble.api.identity.LocalAuthor
|
||||||
@@ -24,6 +25,7 @@ import javax.servlet.http.HttpServletResponse
|
|||||||
|
|
||||||
abstract class ControllerTest {
|
abstract class ControllerTest {
|
||||||
|
|
||||||
|
protected val db = mockk<TransactionManager>()
|
||||||
protected val contactManager = mockk<ContactManager>()
|
protected val contactManager = mockk<ContactManager>()
|
||||||
protected val conversationManager = mockk<ConversationManager>()
|
protected val conversationManager = mockk<ConversationManager>()
|
||||||
protected val identityManager = mockk<IdentityManager>()
|
protected val identityManager = mockk<IdentityManager>()
|
||||||
|
|||||||
@@ -6,14 +6,22 @@ import io.mockk.Runs
|
|||||||
import io.mockk.every
|
import io.mockk.every
|
||||||
import io.mockk.just
|
import io.mockk.just
|
||||||
import io.mockk.mockk
|
import io.mockk.mockk
|
||||||
import org.briarproject.briar.api.identity.AuthorInfo
|
import io.mockk.slot
|
||||||
import org.briarproject.briar.api.identity.AuthorInfo.Status.OURSELVES
|
import org.briarproject.bramble.api.db.DbCallable
|
||||||
|
import org.briarproject.bramble.api.db.DbException
|
||||||
|
import org.briarproject.bramble.api.db.Transaction
|
||||||
import org.briarproject.bramble.api.sync.MessageId
|
import org.briarproject.bramble.api.sync.MessageId
|
||||||
import org.briarproject.bramble.identity.output
|
import org.briarproject.bramble.identity.output
|
||||||
import org.briarproject.bramble.util.StringUtils.getRandomString
|
import org.briarproject.bramble.util.StringUtils.getRandomString
|
||||||
import org.briarproject.briar.api.blog.*
|
import org.briarproject.briar.api.blog.Blog
|
||||||
import org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_TEXT_LENGTH
|
import org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_TEXT_LENGTH
|
||||||
|
import org.briarproject.briar.api.blog.BlogManager
|
||||||
|
import org.briarproject.briar.api.blog.BlogPost
|
||||||
|
import org.briarproject.briar.api.blog.BlogPostFactory
|
||||||
|
import org.briarproject.briar.api.blog.BlogPostHeader
|
||||||
import org.briarproject.briar.api.blog.MessageType.POST
|
import org.briarproject.briar.api.blog.MessageType.POST
|
||||||
|
import org.briarproject.briar.api.identity.AuthorInfo
|
||||||
|
import org.briarproject.briar.api.identity.AuthorInfo.Status.OURSELVES
|
||||||
import org.briarproject.briar.headless.ControllerTest
|
import org.briarproject.briar.headless.ControllerTest
|
||||||
import org.junit.jupiter.api.Assertions.assertThrows
|
import org.junit.jupiter.api.Assertions.assertThrows
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
@@ -24,7 +32,7 @@ internal class BlogControllerTest : ControllerTest() {
|
|||||||
private val blogPostFactory = mockk<BlogPostFactory>()
|
private val blogPostFactory = mockk<BlogPostFactory>()
|
||||||
|
|
||||||
private val controller =
|
private val controller =
|
||||||
BlogControllerImpl(blogManager, blogPostFactory, identityManager, objectMapper, clock)
|
BlogControllerImpl(blogManager, blogPostFactory, db, identityManager, objectMapper, clock)
|
||||||
|
|
||||||
private val blog = Blog(group, author, false)
|
private val blog = Blog(group, author, false)
|
||||||
private val parentId: MessageId? = null
|
private val parentId: MessageId? = null
|
||||||
@@ -46,6 +54,8 @@ internal class BlogControllerTest : ControllerTest() {
|
|||||||
@Test
|
@Test
|
||||||
fun testCreate() {
|
fun testCreate() {
|
||||||
val post = BlogPost(message, null, localAuthor)
|
val post = BlogPost(message, null, localAuthor)
|
||||||
|
val dbSlot = slot<DbCallable<BlogPostHeader, DbException>>()
|
||||||
|
val txn = Transaction(Object(), true)
|
||||||
|
|
||||||
every { ctx.body() } returns """{"text": "$text"}"""
|
every { ctx.body() } returns """{"text": "$text"}"""
|
||||||
every { identityManager.localAuthor } returns localAuthor
|
every { identityManager.localAuthor } returns localAuthor
|
||||||
@@ -60,8 +70,13 @@ internal class BlogControllerTest : ControllerTest() {
|
|||||||
text
|
text
|
||||||
)
|
)
|
||||||
} returns post
|
} returns post
|
||||||
every { blogManager.addLocalPost(post) } just Runs
|
every { db.transactionWithResult(true, capture(dbSlot)) } answers {
|
||||||
every { blogManager.getPostHeader(post.message.groupId, post.message.id) } returns header
|
dbSlot.captured.call(txn)
|
||||||
|
}
|
||||||
|
every { blogManager.addLocalPost(txn, post) } just Runs
|
||||||
|
every {
|
||||||
|
blogManager.getPostHeader(txn, post.message.groupId, post.message.id)
|
||||||
|
} returns header
|
||||||
every { ctx.json(header.output(text)) } returns ctx
|
every { ctx.json(header.output(text)) } returns ctx
|
||||||
|
|
||||||
controller.createPost(ctx)
|
controller.createPost(ctx)
|
||||||
|
|||||||
Reference in New Issue
Block a user