diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml index 0677e45dbda840b74b6441c24eba9f9e52693215..2feaa4e95fbea9bbb14af009cc80761f3beb8141 100644 --- a/.idea/codeStyleSettings.xml +++ b/.idea/codeStyleSettings.xml @@ -37,6 +37,34 @@ <JavaCodeStyleSettings> <option name="ANNOTATION_PARAMETER_WRAP" value="1" /> </JavaCodeStyleSettings> + <Objective-C-extensions> + <option name="GENERATE_INSTANCE_VARIABLES_FOR_PROPERTIES" value="ASK" /> + <option name="RELEASE_STYLE" value="IVAR" /> + <option name="TYPE_QUALIFIERS_PLACEMENT" value="BEFORE" /> + <file> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" /> + </file> + <class> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" /> + </class> + <extensions> + <pair source="cpp" header="h" /> + <pair source="c" header="h" /> + </extensions> + </Objective-C-extensions> <XML> <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" /> </XML> diff --git a/briar-android/src/org/briarproject/android/blogs/BaseController.java b/briar-android/src/org/briarproject/android/blogs/BaseController.java index e81c44d602a6d1856f4b8ec8abc16064369639e0..a7cf1e4243eebaa076e59f7ecedc373b5cf2251c 100644 --- a/briar-android/src/org/briarproject/android/blogs/BaseController.java +++ b/briar-android/src/org/briarproject/android/blogs/BaseController.java @@ -13,8 +13,10 @@ import java.util.Collection; public interface BaseController { + @UiThread void onStart(); + @UiThread void onStop(); void loadBlogPosts(GroupId g, diff --git a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java index 7e14c9d8ec415265113ebb69df991ecf179d213a..249d0ff7cf0fc741b7fad3bff73c02c6d908c7d0 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java @@ -67,11 +67,11 @@ public class BlogActivity extends BriarActivity implements groupId = new GroupId(b); blogController.setGroupId(groupId); - // Name of the Blog from Intent + // Name of the blog blogName = i.getStringExtra(BLOG_NAME); if (blogName != null) setTitle(blogName); - // Is this our blog and was it just created? + // Was this blog just created? isNew = i.getBooleanExtra(IS_NEW_BLOG, false); setContentView(R.layout.activity_blog); diff --git a/briar-android/src/org/briarproject/android/blogs/BlogCommentItem.java b/briar-android/src/org/briarproject/android/blogs/BlogCommentItem.java index f499d124607f56ffc9a2d703e419e801ab5a6c70..b3dea0b8c96a5faf7753d96ceec98efb47c69b25 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogCommentItem.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogCommentItem.java @@ -13,13 +13,16 @@ import java.util.List; @UiThread class BlogCommentItem extends BlogPostItem { + private static final BlogCommentComparator COMPARATOR = + new BlogCommentComparator(); + private final BlogPostHeader postHeader; private final List<BlogCommentHeader> comments = new ArrayList<>(); BlogCommentItem(BlogCommentHeader header) { super(header, null); postHeader = collectComments(header); - Collections.sort(comments, new BlogCommentComparator()); + Collections.sort(comments, COMPARATOR); } private BlogPostHeader collectComments(BlogPostHeader header) { @@ -54,10 +57,9 @@ class BlogCommentItem extends BlogPostItem { private static class BlogCommentComparator implements Comparator<BlogCommentHeader> { @Override - public int compare(org.briarproject.api.blogs.BlogCommentHeader h1, - org.briarproject.api.blogs.BlogCommentHeader h2) { + public int compare(BlogCommentHeader h1, BlogCommentHeader h2) { // re-use same comparator used for blog posts, but reverse it - return BlogCommentItem.compare(h2, h1); + return BlogPostItem.compare(h2, h1); } } } diff --git a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java index a85b4873451f9b66bd2341a4dc475bbd8dcb6121..d70779e34ea17b04f149c318601f736fe6a3597e 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java @@ -38,20 +38,20 @@ public class BlogControllerImpl extends BaseControllerImpl } else { throw new IllegalStateException( "An activity that injects the BlogController must " + - "implement the BlogPostListener"); + "implement the OnBlogPostAddedListener"); } } @Override public void onActivityResume() { - super.onStart(); + super.onStart(); // TODO: Should be called when activity starts. #609 notificationManager.blockNotification(groupId); notificationManager.clearBlogPostNotification(groupId); } @Override public void onActivityPause() { - super.onStop(); + super.onStop(); // TODO: Should be called when activity stops. #609 notificationManager.unblockNotification(groupId); } diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java b/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java index 5d83843f5e2b022858555c691065c1f5a7a035c7..747b661593e1d0cb12f6efd2dc73a247c08dcff1 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java @@ -2,6 +2,7 @@ package org.briarproject.android.blogs; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.UiThread; import org.briarproject.api.blogs.BlogPostHeader; import org.briarproject.api.identity.Author; @@ -9,7 +10,7 @@ import org.briarproject.api.identity.Author.Status; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; -// This class is not thread-safe +@UiThread class BlogPostItem implements Comparable<BlogPostItem> { private final BlogPostHeader header; diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostViewHolder.java b/briar-android/src/org/briarproject/android/blogs/BlogPostViewHolder.java index 71fff22031c745ae6ff761bf7c5dece7ec1e0c53..378b3993b7afe3545e6e5312e7b9527aef6b24b6 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogPostViewHolder.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogPostViewHolder.java @@ -3,6 +3,7 @@ package org.briarproject.android.blogs; import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.support.annotation.UiThread; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.view.ViewCompat; @@ -28,11 +29,10 @@ import static org.briarproject.android.BriarActivity.GROUP_ID; import static org.briarproject.android.blogs.BlogActivity.POST_ID; import static org.briarproject.api.blogs.MessageType.POST; -public class BlogPostViewHolder extends RecyclerView.ViewHolder { +@UiThread +class BlogPostViewHolder extends RecyclerView.ViewHolder { private final Context ctx; - private OnBlogPostClickListener listener; - private final ViewGroup layout; private final AuthorView reblogger; private final AuthorView author; @@ -40,6 +40,8 @@ public class BlogPostViewHolder extends RecyclerView.ViewHolder { private final TextView body; private final ViewGroup commentContainer; + private OnBlogPostClickListener listener; + BlogPostViewHolder(View v) { super(v); diff --git a/briar-android/src/org/briarproject/android/blogs/ReblogActivity.java b/briar-android/src/org/briarproject/android/blogs/ReblogActivity.java index 1df967c619ea87a04f936e04628c7d564d59c262..923d520a65053f6d7adfc3c2e7ab03c977acf2f8 100644 --- a/briar-android/src/org/briarproject/android/blogs/ReblogActivity.java +++ b/briar-android/src/org/briarproject/android/blogs/ReblogActivity.java @@ -2,6 +2,7 @@ package org.briarproject.android.blogs; import android.annotation.TargetApi; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.transition.Fade; import android.transition.Transition; @@ -14,8 +15,6 @@ import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.LOLLIPOP; import static org.briarproject.android.blogs.BlogActivity.POST_ID; public class ReblogActivity extends BriarActivity implements @@ -25,7 +24,7 @@ public class ReblogActivity extends BriarActivity implements public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (SDK_INT >= LOLLIPOP) { + if (Build.VERSION.SDK_INT >= 21) { setTransition(); } @@ -80,7 +79,7 @@ public class ReblogActivity extends BriarActivity implements } - @TargetApi(LOLLIPOP) + @TargetApi(21) private void setTransition() { Transition fade = new Fade(); fade.excludeTarget(android.R.id.statusBarBackground, true); diff --git a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java index 119290bb23cc6ddb27a23958b680d2ef1e878c66..1fee6c6473124c6d2893cbcb5bd01d3e33fe6274 100644 --- a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java @@ -33,7 +33,6 @@ public class ReblogFragment extends BaseFragment { public static final String TAG = ReblogFragment.class.getName(); - private BaseFragmentListener listener; private ViewHolder ui; private GroupId blogId; @@ -104,6 +103,7 @@ public class ReblogFragment extends BaseFragment { public void onStart() { super.onStart(); + // TODO: Load blog post when fragment is created. #631 feedController.loadBlogPost(blogId, postId, new UiResultExceptionHandler<BlogPostItem, DbException>( getActivity()) { @@ -112,6 +112,7 @@ public class ReblogFragment extends BaseFragment { item = result; bindViewHolder(); } + @Override public void onExceptionUi(DbException exception) { // TODO @@ -123,6 +124,8 @@ public class ReblogFragment extends BaseFragment { private void bindViewHolder() { if (item == null) return; + hideProgressBar(); + ui.post.bindItem(item); ui.post.hideReblogButton(); @@ -134,7 +137,6 @@ public class ReblogFragment extends BaseFragment { } }); ui.publish.setEnabled(true); - hideProgressBar(); ui.scrollView.post(new Runnable() { @Override public void run() { @@ -151,6 +153,7 @@ public class ReblogFragment extends BaseFragment { public void onResultUi(Void result) { // do nothing, this fragment is gone already } + @Override public void onExceptionUi(DbException exception) { // do nothing, this fragment is gone already @@ -177,6 +180,7 @@ public class ReblogFragment extends BaseFragment { } private static class ViewHolder { + private final ScrollView scrollView; private final ProgressBar progressBar; private final BlogPostViewHolder post; diff --git a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java index a2cf536461e26839f31f1b6db06f42a97b49f2e0..c19bcf1eed31cafa16714666da3283ab0a1901cb 100644 --- a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java +++ b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java @@ -3,6 +3,7 @@ package org.briarproject.android.fragment; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.annotation.UiThread; import android.support.v4.app.Fragment; import org.briarproject.android.ActivityComponent; @@ -39,22 +40,27 @@ public abstract class BaseFragment extends Fragment { listener.onFragmentCreated(getUniqueTag()); } + @UiThread protected void finish() { getActivity().supportFinishAfterTransition(); } public interface BaseFragmentListener { + @UiThread void showLoadingScreen(boolean isBlocking, int stringId); + @UiThread void hideLoadingScreen(); void runOnUiThread(Runnable runnable); void runOnDbThread(Runnable runnable); + @UiThread ActivityComponent getActivityComponent(); + @UiThread void onFragmentCreated(String tag); } } diff --git a/briar-android/src/org/briarproject/android/util/AuthorView.java b/briar-android/src/org/briarproject/android/util/AuthorView.java index d84fb7f1bd78cae6ebfcad39e0c894af81f4ec1b..c98c889a305b28ec67ca4486c35375fa3e8609a7 100644 --- a/briar-android/src/org/briarproject/android/util/AuthorView.java +++ b/briar-android/src/org/briarproject/android/util/AuthorView.java @@ -3,7 +3,6 @@ package org.briarproject.android.util; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; -import android.graphics.Typeface; import android.support.annotation.Nullable; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.content.ContextCompat; @@ -25,6 +24,8 @@ import org.briarproject.api.sync.GroupId; import de.hdodenhof.circleimageview.CircleImageView; import im.delight.android.identicons.IdenticonDrawable; +import static android.content.Context.LAYOUT_INFLATER_SERVICE; +import static android.graphics.Typeface.BOLD; import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation; import static android.util.TypedValue.COMPLEX_UNIT_PX; import static org.briarproject.android.BriarActivity.GROUP_ID; @@ -42,9 +43,8 @@ public class AuthorView extends RelativeLayout { super(context, attrs); LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - inflater - .inflate(R.layout.author_view, this, true); + .getSystemService(LAYOUT_INFLATER_SERVICE); + inflater.inflate(R.layout.author_view, this, true); avatar = (CircleImageView) findViewById(R.id.avatar); avatarIcon = (ImageView) findViewById(R.id.avatarIcon); @@ -75,7 +75,7 @@ public class AuthorView extends RelativeLayout { public void setAuthorStatus(Status status) { trustIndicator.setTrustLevel(status); if (status == OURSELVES) { - authorName.setTypeface(authorName.getTypeface(), Typeface.BOLD); + authorName.setTypeface(authorName.getTypeface(), BOLD); } invalidate(); @@ -92,9 +92,8 @@ public class AuthorView extends RelativeLayout { public void setBlogLink(final GroupId groupId) { setClickable(true); TypedValue outValue = new TypedValue(); - getContext().getTheme() - .resolveAttribute(android.R.attr.selectableItemBackground, - outValue, true); + getContext().getTheme().resolveAttribute( + android.R.attr.selectableItemBackground, outValue, true); setBackgroundResource(outValue.resourceId); setOnClickListener(new OnClickListener() { @Override @@ -106,8 +105,7 @@ public class AuthorView extends RelativeLayout { android.R.anim.slide_in_left, android.R.anim.slide_out_right); Intent[] intents = {i}; - ContextCompat - .startActivities(getContext(), intents, + ContextCompat.startActivities(getContext(), intents, options.toBundle()); } });