diff --git a/Clover/app/src/main/java/org/floens/chan/controller/Controller.java b/Clover/app/src/main/java/org/floens/chan/controller/Controller.java index e29e4c26..8a6f9e03 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/Controller.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/Controller.java @@ -118,7 +118,9 @@ public abstract class Controller { } if (AndroidUtils.removeFromParentView(view)) { - Logger.test(getClass().getSimpleName() + " view removed onDestroy"); + if (LOG_STATES) { + Logger.test(getClass().getSimpleName() + " view removed onDestroy"); + } } } diff --git a/Clover/app/src/main/java/org/floens/chan/controller/ui/NavigationControllerContainerLayout.java b/Clover/app/src/main/java/org/floens/chan/controller/ui/NavigationControllerContainerLayout.java index d8899237..2825fbcf 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/ui/NavigationControllerContainerLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/ui/NavigationControllerContainerLayout.java @@ -32,6 +32,7 @@ import android.widget.Scroller; import org.floens.chan.controller.Controller; import org.floens.chan.controller.NavigationController; +import org.floens.chan.utils.Time; public class NavigationControllerContainerLayout extends FrameLayout { private NavigationController navigationController; @@ -183,12 +184,12 @@ public class NavigationControllerContainerLayout extends FrameLayout { swipingController = navigationController.getTop(); drawShadow = true; -// long start = Time.startTiming(); + long start = Time.startTiming(); Controller below = getBelowTop(); navigationController.beginSwipeTransition(swipingController, below); -// Time.endTiming("attach", start); + Time.endTiming("attach", start); } float translationX = Math.max(0, event.getX() - swipeStartEvent.getX()); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java b/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java index 5c9b5354..8ed47940 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java @@ -36,18 +36,19 @@ import android.text.Spanned; import android.text.TextPaint; import android.text.TextUtils; import android.text.format.DateUtils; +import android.text.method.LinkMovementMethod; import android.text.style.AbsoluteSizeSpan; import android.text.style.BackgroundColorSpan; import android.text.style.ClickableSpan; import android.text.style.ForegroundColorSpan; import android.text.style.UnderlineSpan; import android.util.AttributeSet; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; +import android.widget.TextView; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader; @@ -83,7 +84,7 @@ public class PostCell extends LinearLayout implements PostCellInterface, PostLin private ThumbnailView thumbnailView; private FastTextView title; private PostIcons icons; - private FastTextView comment; + private TextView comment; private FastTextView replies; private ImageView options; private View divider; @@ -94,6 +95,7 @@ public class PostCell extends LinearLayout implements PostCellInterface, PostLin private int countrySizePx; private int paddingPx; private boolean threadMode; + private boolean ignoreNextOnClick; private boolean bound = false; private Theme theme; @@ -107,9 +109,15 @@ public class PostCell extends LinearLayout implements PostCellInterface, PostLin private OnClickListener selfClicked = new OnClickListener() { @Override public void onClick(View v) { - callback.onPostClicked(post); + if (ignoreNextOnClick) { + ignoreNextOnClick = false; + } else { + callback.onPostClicked(post); + } } }; + private PostViewMovementMethod commentMovementMethod = new PostViewMovementMethod(); + private PostViewFastMovementMethod titleMovementMethod = new PostViewFastMovementMethod(); public PostCell(Context context) { super(context); @@ -130,7 +138,7 @@ public class PostCell extends LinearLayout implements PostCellInterface, PostLin thumbnailView = (ThumbnailView) findViewById(R.id.thumbnail_view); title = (FastTextView) findViewById(R.id.title); icons = (PostIcons) findViewById(R.id.icons); - comment = (FastTextView) findViewById(R.id.comment); + comment = (TextView) findViewById(R.id.comment); replies = (FastTextView) findViewById(R.id.replies); options = (ImageView) findViewById(R.id.options); divider = findViewById(R.id.divider); @@ -397,18 +405,17 @@ public class PostCell extends LinearLayout implements PostCellInterface, PostLin commentText = post.comment; } - comment.setText(new SpannableString(commentText)); + comment.setText(commentText); comment.setVisibility(isEmpty(commentText) && !post.hasImage ? GONE : VISIBLE); if (commentClickable != threadMode) { commentClickable = threadMode; if (commentClickable) { - PostViewMovementMethod movementMethod = new PostViewMovementMethod(); - comment.setMovementMethod(movementMethod); + comment.setMovementMethod(commentMovementMethod); comment.setOnClickListener(selfClicked); if (noClickable) { - title.setMovementMethod(movementMethod); + title.setMovementMethod(titleMovementMethod); } } else { comment.setOnClickListener(null); @@ -494,17 +501,17 @@ public class PostCell extends LinearLayout implements PostCellInterface, PostLin * A MovementMethod that searches for PostLinkables.
* See {@link PostLinkable} for more information. */ - private class PostViewMovementMethod implements FastTextViewMovementMethod { + private class PostViewMovementMethod extends LinkMovementMethod { @Override - public boolean onTouchEvent(@NonNull FastTextView widget, @NonNull Spanned buffer, @NonNull Spanned cachedBuffer, @NonNull MotionEvent event) { + public boolean onTouchEvent(@NonNull TextView widget, @NonNull Spannable buffer, @NonNull MotionEvent event) { int action = event.getActionMasked(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); - x -= widget.getPaddingLeft(); - y -= widget.getPaddingTop(); + x -= widget.getTotalPaddingLeft(); + y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); @@ -517,45 +524,58 @@ public class PostCell extends LinearLayout implements PostCellInterface, PostLin if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { + ignoreNextOnClick = true; link[0].onClick(widget); - removeBackgroundSpan(widget, cachedBuffer); + buffer.removeSpan(BACKGROUND_SPAN); } else if (action == MotionEvent.ACTION_DOWN && link[0] instanceof PostLinkable) { - int spanStart = buffer.getSpanStart(link[0]); - int spanEnd = buffer.getSpanEnd(link[0]); - - // Set the buffer on the visible buffer, not on the functional buffer - // This is because the visible buffer may be a cached one or may be in use multiple times - if (spanStart <= spanEnd && spanStart >= 0 && spanEnd >= 0 && spanStart <= cachedBuffer.length() && spanEnd <= cachedBuffer.length()) { - showBackgroundSpan(widget, cachedBuffer, spanStart, spanEnd); - } else { - Log.e(TAG, "Could not add the background span because it was out of range!"); - } + buffer.setSpan(BACKGROUND_SPAN, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]), 0); } else if (action == MotionEvent.ACTION_CANCEL) { - removeBackgroundSpan(widget, cachedBuffer); + buffer.removeSpan(BACKGROUND_SPAN); } return true; } else { - removeBackgroundSpan(widget, cachedBuffer); - return false; + buffer.removeSpan(BACKGROUND_SPAN); } } - return false; + return true; } + } - private void showBackgroundSpan(FastTextView widget, Spanned buffer, int start, int end) { - if (buffer instanceof Spannable) { - ((Spannable) buffer).setSpan(BACKGROUND_SPAN, start, end, 0); - widget.invalidate(); - } - } + /** + * A MovementMethod that searches for PostLinkables.
+ * This version is for the {@link FastTextView}.
+ * See {@link PostLinkable} for more information. + */ + private class PostViewFastMovementMethod implements FastTextViewMovementMethod { + @Override + public boolean onTouchEvent(@NonNull FastTextView widget, @NonNull Spanned buffer, @NonNull MotionEvent event) { + int action = event.getActionMasked(); + + if (action == MotionEvent.ACTION_UP) { + int x = (int) event.getX(); + int y = (int) event.getY(); - private void removeBackgroundSpan(FastTextView widget, Spanned buffer) { - if (buffer instanceof Spannable) { - ((Spannable) buffer).removeSpan(BACKGROUND_SPAN); - widget.invalidate(); + x -= widget.getPaddingLeft(); + y -= widget.getPaddingTop(); + + x += widget.getScrollX(); + y += widget.getScrollY(); + + Layout layout = widget.getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + + ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); + + if (link.length != 0) { + link[0].onClick(widget); + return true; + } } + + return false; } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/text/FastTextView.java b/Clover/app/src/main/java/org/floens/chan/ui/text/FastTextView.java index 7296563d..c2690df6 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/text/FastTextView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/text/FastTextView.java @@ -32,14 +32,13 @@ import android.view.MotionEvent; import android.view.View; import org.floens.chan.R; -import org.floens.chan.ui.cell.PostCell; import org.floens.chan.utils.Logger; import static org.floens.chan.utils.AndroidUtils.sp; /** * A simple implementation of a TextView that caches the used StaticLayouts for performance.
- * This view was made for {@link PostCell} and may have untested behaviour with other layouts. + * This view was made for {@link org.floens.chan.ui.cell.PostCell} and {@link org.floens.chan.ui.cell.CardPostCell }and may have untested behaviour with other layouts. */ public class FastTextView extends View { private static final String TAG = "FastTextView"; @@ -130,7 +129,7 @@ public class FastTextView extends View { boolean handled = false; if (movementMethod != null && text instanceof Spanned && layout != null && isEnabled()) { - handled |= movementMethod.onTouchEvent(this, (Spanned) text, (Spanned) layout.getText(), event); + handled |= movementMethod.onTouchEvent(this, (Spanned) text, event); } return handled || super.onTouchEvent(event); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/text/FastTextViewMovementMethod.java b/Clover/app/src/main/java/org/floens/chan/ui/text/FastTextViewMovementMethod.java index 705df8f8..80196129 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/text/FastTextViewMovementMethod.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/text/FastTextViewMovementMethod.java @@ -21,5 +21,5 @@ import android.text.Spanned; import android.view.MotionEvent; public interface FastTextViewMovementMethod { - boolean onTouchEvent(FastTextView widget, Spanned buffer, Spanned cachedBuffer, MotionEvent event); + boolean onTouchEvent(FastTextView widget, Spanned buffer, MotionEvent event); } diff --git a/Clover/app/src/main/res/layout/cell_post.xml b/Clover/app/src/main/res/layout/cell_post.xml index 6df46358..0f608785 100644 --- a/Clover/app/src/main/res/layout/cell_post.xml +++ b/Clover/app/src/main/res/layout/cell_post.xml @@ -61,7 +61,7 @@ along with this program. If not, see . android:layout_below="@id/title" android:layout_toRightOf="@id/thumbnail_view" /> - . android:layout_alignWithParentIfMissing="true" android:layout_below="@id/icons" android:layout_toRightOf="@id/thumbnail_view" - app:textColor="?attr/text_color_primary" /> + android:textColor="?attr/text_color_primary" />