diff --git a/Chan/res/values/strings.xml b/Chan/res/values/strings.xml
index 5b8c196f..0ed167b2 100644
--- a/Chan/res/values/strings.xml
+++ b/Chan/res/values/strings.xml
@@ -82,6 +82,7 @@
Info
+ - Show clickables
- Info
- Quote
- Copy text
diff --git a/Chan/src/org/floens/chan/activity/BaseActivity.java b/Chan/src/org/floens/chan/activity/BaseActivity.java
index 40e35471..35921181 100644
--- a/Chan/src/org/floens/chan/activity/BaseActivity.java
+++ b/Chan/src/org/floens/chan/activity/BaseActivity.java
@@ -230,6 +230,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
if (!TextUtils.isEmpty(value)) {
pin.loadable.title = value;
+ ChanApplication.getPinnedManager().refresh();
}
}
})
diff --git a/Chan/src/org/floens/chan/activity/BoardActivity.java b/Chan/src/org/floens/chan/activity/BoardActivity.java
index 3a384f02..b90c31c0 100644
--- a/Chan/src/org/floens/chan/activity/BoardActivity.java
+++ b/Chan/src/org/floens/chan/activity/BoardActivity.java
@@ -41,7 +41,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
super.onCreate(savedInstanceState);
boardLoadable.mode = Loadable.Mode.BOARD;
- threadLoadable.mode = Loadable.Mode.THREAD;
+ threadLoadable.mode = Loadable.Mode.THREAD;
boardFragment = ThreadFragment.newInstance(this);
threadFragment = ThreadFragment.newInstance(this);
diff --git a/Chan/src/org/floens/chan/entity/Post.java b/Chan/src/org/floens/chan/entity/Post.java
index 8e712c9c..9b6e8a79 100644
--- a/Chan/src/org/floens/chan/entity/Post.java
+++ b/Chan/src/org/floens/chan/entity/Post.java
@@ -4,7 +4,9 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.List;
+import org.floens.chan.entity.PostLinkable.Type;
import org.floens.chan.net.ChanUrls;
+import org.floens.chan.view.PostView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
@@ -48,6 +50,7 @@ public class Post {
public long time = 0;
public String email = "";
+ private PostView linkableListener;
public final ArrayList linkables = new ArrayList();
public Post() {
@@ -57,6 +60,14 @@ public class Post {
rawComment = e;
}
+ public void setLinkableListener(PostView listener) {
+ linkableListener = listener;
+ }
+
+ public PostView getLinkableListener() {
+ return linkableListener;
+ }
+
/**
* Finish up the data
* @return false if this data is invalid
@@ -119,18 +130,24 @@ public class Post {
String[] parts = text.split("\\s");
for (String item : parts) {
- try {
- URL url = new URL(item);
-
- SpannableString link = new SpannableString(url.toString());
- link.setSpan(new ForegroundColorSpan(Color.argb(255, 0, 0, 180)), 0, link.length(), 0);
-
- linkables.add(new PostLinkable(item, item, PostLinkable.Type.LINK));
-
- total = TextUtils.concat(total, link, " ");
- } catch(Exception e) {
- total = TextUtils.concat(total, item, " ");
- }
+ if (item.contains("://")) {
+ try {
+ URL url = new URL(item);
+
+ SpannableString link = new SpannableString(url.toString());
+// link.setSpan(new ForegroundColorSpan(Color.argb(255, 0, 0, 180)), 0, link.length(), 0);
+
+// linkables.add(new PostLinkable(this, item, item, PostLinkable.Type.LINK));
+
+ PostLinkable pl = new PostLinkable(this, item, item, PostLinkable.Type.LINK);
+ link.setSpan(pl, 0, link.length(), 0);
+ linkables.add(pl);
+
+ total = TextUtils.concat(total, link, " ");
+ } catch(Exception e) {
+ total = TextUtils.concat(total, item, " ");
+ }
+ }
}
} else {
total = TextUtils.concat(total, text);
@@ -148,11 +165,12 @@ public class Post {
Element anchor = (Element)node;
SpannableString link = new SpannableString(anchor.text());
- link.setSpan(new ForegroundColorSpan(Color.argb(255, 221, 0, 0)), 0, link.length(), 0);
- total = TextUtils.concat(total, link);
+ PostLinkable pl = new PostLinkable(this, anchor.text(), anchor.attr("href"), anchor.text().contains("://") ? Type.LINK : Type.QUOTE);
+ link.setSpan(pl, 0, link.length(), 0);
+ linkables.add(pl);
- linkables.add(new PostLinkable(anchor.text(), anchor.attr("href"), PostLinkable.Type.QUOTE));
+ total = TextUtils.concat(total, link);
} else {
// Unknown tag, add the inner part
if (node instanceof Element) {
diff --git a/Chan/src/org/floens/chan/entity/PostLinkable.java b/Chan/src/org/floens/chan/entity/PostLinkable.java
index 72e813ba..ba9b1a56 100644
--- a/Chan/src/org/floens/chan/entity/PostLinkable.java
+++ b/Chan/src/org/floens/chan/entity/PostLinkable.java
@@ -1,18 +1,38 @@
package org.floens.chan.entity;
+import android.graphics.Color;
+import android.text.TextPaint;
+import android.text.style.ClickableSpan;
+import android.view.View;
+
/**
* Anything that links to something in a post uses this entity.
*/
-public class PostLinkable {
+public class PostLinkable extends ClickableSpan {
public static enum Type {QUOTE, LINK};
+ public final Post post;
public final String key;
public final String value;
public final Type type;
- public PostLinkable(String key, String value, Type type) {
+ public PostLinkable(Post post, String key, String value, Type type) {
+ this.post = post;
this.key = key;
this.value = value;
this.type = type;
}
+
+ @Override
+ public void onClick(View widget) {
+ if (post.getLinkableListener() != null) {
+ post.getLinkableListener().onLinkableClick(this);
+ }
+ }
+
+ @Override
+ public void updateDrawState(TextPaint ds) {
+ ds.setColor(type == Type.QUOTE ? Color.argb(255, 221, 0, 0) : Color.argb(255, 0, 0, 180));
+ ds.setUnderlineText(true);
+ }
}
diff --git a/Chan/src/org/floens/chan/fragment/ThreadFragment.java b/Chan/src/org/floens/chan/fragment/ThreadFragment.java
index 47524be9..a8ec0fb8 100644
--- a/Chan/src/org/floens/chan/fragment/ThreadFragment.java
+++ b/Chan/src/org/floens/chan/fragment/ThreadFragment.java
@@ -139,11 +139,7 @@ public class ThreadFragment extends Fragment implements ThreadListener {
@Override
public void onPostClicked(Post post) {
- if (loadable.isThreadMode()) {
- threadManager.showPostLinkables(post);
- } else {
- baseActivity.onOPClicked(post);
- }
+ baseActivity.onOPClicked(post);
}
@Override
diff --git a/Chan/src/org/floens/chan/manager/PinnedManager.java b/Chan/src/org/floens/chan/manager/PinnedManager.java
index d5636ada..4d5fec13 100644
--- a/Chan/src/org/floens/chan/manager/PinnedManager.java
+++ b/Chan/src/org/floens/chan/manager/PinnedManager.java
@@ -66,6 +66,12 @@ public class PinnedManager {
return tempList;
}
+ public void refresh() {
+ adapter.notifyDataSetChanged();
+
+ storePinnedListInPreferences("pinnedList", list);
+ }
+
public void remove(Pin pin) {
adapter.remove(pin);
diff --git a/Chan/src/org/floens/chan/manager/ThreadManager.java b/Chan/src/org/floens/chan/manager/ThreadManager.java
index cdf5523a..90edd4d5 100644
--- a/Chan/src/org/floens/chan/manager/ThreadManager.java
+++ b/Chan/src/org/floens/chan/manager/ThreadManager.java
@@ -119,7 +119,9 @@ public class ThreadManager {
}
public void onPostClicked(Post post) {
- threadListener.onPostClicked(post);
+ if (loadable.isBoardMode()) {
+ threadListener.onPostClicked(post);
+ }
}
public void onPostLongClicked(final Post post) {
@@ -129,12 +131,15 @@ public class ThreadManager {
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which) {
- case 0: // Info
+ case 0: // Show clickables
+ showPostLinkables(post);
+ break;
+ case 1: // Info
showPostInfo(post);
- case 1: // Quote
+ case 2: // Quote
ReplyManager.getInstance().quote(post.no);
break;
- case 2: // Copy text
+ case 3: // Copy text
copyText(post.comment.toString());
break;
}
@@ -144,6 +149,10 @@ public class ThreadManager {
builder.create().show();
}
+ public void onPostLinkableClicked(PostLinkable linkable) {
+ handleLinkableSelected(linkable);
+ }
+
/**
* Returns an TextView containing the appropiate error message
* @param error
diff --git a/Chan/src/org/floens/chan/net/ThreadLoader.java b/Chan/src/org/floens/chan/net/ThreadLoader.java
index d919dd45..a93e71f2 100644
--- a/Chan/src/org/floens/chan/net/ThreadLoader.java
+++ b/Chan/src/org/floens/chan/net/ThreadLoader.java
@@ -85,7 +85,7 @@ public class ThreadLoader {
private void onError(VolleyError error) {
if (stopped) return;
- Log.e("Chan", "VolleyError: " + error.getMessage());
+ Log.e("Chan", "VolleyError in ThreadLoader: " + error.getMessage());
// 404 with more pages already loaded means endofline
if ((error instanceof ServerError) && loadable.isBoardMode() && loadable.no > 0) {
diff --git a/Chan/src/org/floens/chan/view/PostView.java b/Chan/src/org/floens/chan/view/PostView.java
index 86d19f21..68af263b 100644
--- a/Chan/src/org/floens/chan/view/PostView.java
+++ b/Chan/src/org/floens/chan/view/PostView.java
@@ -3,6 +3,7 @@ package org.floens.chan.view;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.entity.Post;
+import org.floens.chan.entity.PostLinkable;
import org.floens.chan.manager.ThreadManager;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.utils.IconCache;
@@ -15,6 +16,7 @@ import android.graphics.drawable.Drawable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.format.DateUtils;
+import android.text.method.LinkMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;
@@ -69,6 +71,15 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
init();
}
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+
+ if (post != null) {
+ post.setLinkableListener(null);
+ }
+ }
+
@SuppressWarnings("deprecation")
public void setPost(Post post, ThreadManager manager) {
this.post = post;
@@ -118,6 +129,24 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
if (!TextUtils.isEmpty(post.comment)) {
commentView.setVisibility(View.VISIBLE);
commentView.setText(post.comment);
+ commentView.setMovementMethod(LinkMovementMethod.getInstance());
+ commentView.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ PostView.this.onClick(v);
+ }
+ });
+
+ commentView.setOnLongClickListener(new OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ return PostView.this.onLongClick(v);
+ }
+ });
+
+ if (manager.getLoadable().isThreadMode()) {
+ post.setLinkableListener(this);
+ }
if (manager.getLoadable().isBoardMode()) {
int maxHeight = context.getResources().getDimensionPixelSize(R.dimen.post_max_height);
@@ -128,6 +157,9 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
} else {
commentView.setVisibility(View.GONE);
commentView.setText("");
+ commentView.setOnClickListener(null);
+ commentView.setOnLongClickListener(null);
+ post.setLinkableListener(null);
}
if (post.isOP && post.replies > 0 && manager.getLoadable().isBoardMode()) {
@@ -240,6 +272,7 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
right.addView(iconView, matchWrapParams);
commentView = new TextView(context);
+ commentView.setTextSize(15);
right.addView(commentView, matchWrapParams);
repliesView = new TextView(context);
@@ -254,6 +287,10 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
addView(full, wrapParams);
}
+ public void onLinkableClick(PostLinkable linkable) {
+ manager.onPostLinkableClicked(linkable);
+ }
+
@Override
public void onClick(View v) {
manager.onPostClicked(post);