Add thumbnail to pins

captchafix
Florens Douwes 11 years ago
parent f2843fd56d
commit 49ac791e05
  1. 4
      Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java
  2. 28
      Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java
  3. 11
      Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java
  4. 2
      Clover/app/src/main/java/org/floens/chan/core/model/Pin.java
  5. 4
      Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java
  6. 4
      Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java
  7. 28
      Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java
  8. 34
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java
  9. 2
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java
  10. 5
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java
  11. 5
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java
  12. 4
      Clover/app/src/main/java/org/floens/chan/ui/view/CustomNetworkImageView.java
  13. 6
      Clover/app/src/main/res/layout/pin_item.xml

@ -281,9 +281,7 @@ public class ThreadManager implements Loader.LoaderListener {
ChanApplication.getDatabaseManager().saveReply(new SavedReply(post.board, post.no, "foo"));
break;
case 9: // Pin
Pin pin = new Pin();
pin.loadable = new Loadable(loader.getLoadable().board, post.no, WatchManager.generateTitle(post));
ChanApplication.getWatchManager().addPin(pin);
ChanApplication.getWatchManager().addPin(post);
break;
}
return false;

@ -48,16 +48,6 @@ public class WatchManager implements ChanApplication.ForegroundChangedListener {
private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
private PendingTimer pendingTimer;
public static String generateTitle(Post post) {
if (!TextUtils.isEmpty(post.subject)) {
return post.subject;
} else if (!TextUtils.isEmpty(post.comment)) {
return "/" + post.board + "/ - " + post.comment.subSequence(0, Math.min(post.comment.length(), 100)).toString();
} else {
return "/" + post.board + "/" + post.no;
}
}
public WatchManager(Context context) {
this.context = context;
@ -139,6 +129,24 @@ public class WatchManager implements ChanApplication.ForegroundChangedListener {
return true;
}
public boolean addPin(Loadable loadable) {
Pin pin = new Pin();
if (!TextUtils.isEmpty(loadable.title)) {
pin.loadable = new Loadable(loadable.board, loadable.no, loadable.title);
} else {
pin.loadable = new Loadable(loadable.board, loadable.no);
}
return addPin(pin);
}
public boolean addPin(Post opPost) {
Pin pin = new Pin();
pin.loadable = new Loadable(opPost.board, opPost.no);
pin.loadable.generateTitle(opPost);
pin.opPost = opPost;
return addPin(pin);
}
/**
* Remove a pin
*

@ -19,6 +19,7 @@ package org.floens.chan.core.model;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@ -171,6 +172,16 @@ public class Loadable {
return copy;
}
public void generateTitle(Post post) {
if (!TextUtils.isEmpty(post.subject)) {
title = post.subject;
} else if (!TextUtils.isEmpty(post.comment)) {
title = "/" + post.board + "/ - " + post.comment.subSequence(0, Math.min(post.comment.length(), 100)).toString();
} else {
title = "/" + post.board + "/" + post.no;
}
}
public static class Mode {
public static final int INVALID = -1;
public static final int THREAD = 0;

@ -48,6 +48,8 @@ public class Pin {
public boolean isError = false;
public Post opPost;
private PinWatcher pinWatcher;
public int getNewPostsCount() {

@ -129,6 +129,10 @@ public class PinWatcher implements Loader.LoaderListener {
public void onData(List<Post> result, boolean append) {
pin.isError = false;
if (pin.opPost == null && result.size() > 0) {
pin.opPost = result.get(0);
}
posts.clear();
posts.addAll(result);

@ -230,10 +230,6 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
}
}
public void addPin(Pin pin) {
ChanApplication.getWatchManager().addPin(pin);
}
public void removePin(Pin pin) {
ChanApplication.getWatchManager().removePin(pin);
}

@ -45,6 +45,7 @@ import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.loader.Loader;
import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.core.manager.WatchManager;
import org.floens.chan.core.model.Loadable;
@ -214,7 +215,9 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel
@Override
public void onOPClicked(Post post) {
startLoadingThread(new Loadable(post.board, post.no, WatchManager.generateTitle(post)));
Loadable l = new Loadable(post.board, post.no);
l.generateTitle(post);
startLoadingThread(l);
}
@Override
@ -225,7 +228,7 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel
@Override
public void onThreadLoaded(Loadable loadable, List<Post> posts) {
if (loadable.isThreadMode() && TextUtils.isEmpty(threadLoadable.title) && posts.size() > 0) {
threadLoadable.title = WatchManager.generateTitle(posts.get(0));
threadLoadable.generateTitle(posts.get(0));
updateActionBarState();
}
}
@ -314,6 +317,16 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel
left.requestLayout();
right.requestLayout();
LayoutParams drawerParams = pinDrawerView.getLayoutParams();
if (width < Utils.dp(340)) {
drawerParams.width = Utils.dp(280);
} else {
drawerParams.width = Utils.dp(320);
}
pinDrawerView.setLayoutParams(drawerParams);
updateActionBarState();
if (isSlidable != wasSlidable) {
@ -439,12 +452,11 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel
return true;
case R.id.action_pin:
if (threadFragment.hasLoader()) {
Pin pin = new Pin();
pin.loadable = threadLoadable;
addPin(pin);
pinDrawer.openDrawer(pinDrawerView);
Loader loader = threadFragment.getLoader();
if (loader.getCachedPosts().size() > 0) {
ChanApplication.getWatchManager().addPin(loader.getCachedPosts().get(0));
pinDrawer.openDrawer(pinDrawerView);
}
}
return true;

@ -25,6 +25,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
@ -33,6 +34,7 @@ import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.model.Pin;
import org.floens.chan.ui.view.CustomNetworkImageView;
import java.util.ArrayList;
import java.util.List;
@ -107,13 +109,24 @@ public class PinnedAdapter extends BaseAdapter {
public View getView(int position, View convertView, ViewGroup parent) {
switch (getItemViewType(position)) {
case VIEW_TYPE_ITEM: {
final Pin item = getItem(position);
final Pin pin = getItem(position);
if (convertView == null) {
convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item, null);
}
((TextView) convertView.findViewById(R.id.pin_text)).setText(item.loadable.title);
CustomNetworkImageView imageView = (CustomNetworkImageView) convertView.findViewById(R.id.pin_image);
if (pin.opPost != null && pin.opPost.hasImage) {
imageView.setVisibility(View.VISIBLE);
imageView.setFadeIn(100);
if (imageView.getUrl() == null || !imageView.getUrl().equals(pin.opPost.thumbnailUrl)) {
imageView.setImageUrl(pin.opPost.thumbnailUrl, ChanApplication.getImageLoader());
}
} else {
imageView.setVisibility(View.GONE);
}
((TextView) convertView.findViewById(R.id.pin_text)).setText(pin.loadable.title);
FrameLayout timeContainer = (FrameLayout) convertView.findViewById(R.id.pin_time_container);
FrameLayout countContainer = (FrameLayout) convertView.findViewById(R.id.pin_count_container);
@ -121,10 +134,9 @@ public class PinnedAdapter extends BaseAdapter {
countContainer.setVisibility(View.VISIBLE);
TextView timeView = (TextView) convertView.findViewById(R.id.pin_time);
if (item.watching && item.getPinWatcher() != null) {
if (pin.watching && pin.getPinWatcher() != null) {
timeContainer.setVisibility(View.VISIBLE);
long timeRaw = item.getPinWatcher().getTimeUntilNextLoad();
long timeRaw = pin.getPinWatcher().getTimeUntilNextLoad();
long time = 0;
if (timeRaw > 0) {
time = timeRaw / 1000L;
@ -141,10 +153,10 @@ public class PinnedAdapter extends BaseAdapter {
TextView countView = (TextView) convertView.findViewById(R.id.pin_count);
ProgressBar loadView = (ProgressBar) convertView.findViewById(R.id.pin_load);
if (item.isError) {
if (pin.isError) {
countView.setText("Err");
} else {
int count = item.getNewPostsCount();
int count = pin.getNewPostsCount();
String total = Integer.toString(count);
if (count > 999) {
total = "1k+";
@ -152,7 +164,7 @@ public class PinnedAdapter extends BaseAdapter {
countView.setText(total);
}
if (item.getPinWatcher() != null && item.getPinWatcher().isLoading()) {
if (pin.getPinWatcher() != null && pin.getPinWatcher().isLoading()) {
countView.setVisibility(View.GONE);
loadView.setVisibility(View.VISIBLE);
} else {
@ -163,13 +175,13 @@ public class PinnedAdapter extends BaseAdapter {
countView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
item.toggleWatch();
pin.toggleWatch();
}
});
if (!item.watching) {
if (!pin.watching) {
countContainer.setBackgroundResource(R.drawable.pin_icon_gray);
} else if (item.getNewQuoteCount() > 0) {
} else if (pin.getNewQuoteCount() > 0) {
countContainer.setBackgroundResource(R.drawable.pin_icon_red);
} else {
countContainer.setBackgroundResource(R.drawable.pin_icon_blue);

@ -242,7 +242,7 @@ public class PostAdapter extends BaseAdapter {
if (error != null) {
setText(error);
} else {
int time = Math.round(loader.getTimeUntilLoadMore() / 1000f);
long time = loader.getTimeUntilLoadMore() / 1000L;
if (time == 0) {
setText("Loading");
} else {

@ -515,13 +515,10 @@ public class ReplyFragment extends DialogFragment {
} else if (response.isSuccessful) {
shouldSaveDraft = false;
Toast.makeText(context, R.string.reply_success, Toast.LENGTH_SHORT).show();
// threadFragment.reload(); // won't work: it takes 4chan a variable time to process the reply
// Pin thread on successful post
if (loadable.isThreadMode()) {
Pin pin = new Pin();
pin.loadable = loadable;
ChanApplication.getWatchManager().addPin(pin);
ChanApplication.getWatchManager().addPin(loadable);
}
closeReply();

@ -40,6 +40,7 @@ import com.android.volley.VolleyError;
import org.floens.chan.R;
import org.floens.chan.core.loader.EndOfLineException;
import org.floens.chan.core.loader.Loader;
import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
@ -107,6 +108,10 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
this.viewMode = viewMode;
}
public Loader getLoader() {
return threadManager.getLoader();
}
@Override
public void onDestroy() {
super.onDestroy();

@ -91,6 +91,10 @@ public class CustomNetworkImageView extends ImageView {
return mMaxScale;
}
public String getUrl() {
return mUrl;
}
/**
* Animate the image fading in.
*

@ -20,6 +20,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
android:layout_height="48dp"
android:orientation="horizontal">
<org.floens.chan.ui.view.CustomNetworkImageView
android:id="@+id/pin_image"
android:layout_width="48dp"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/pin_text"
android:layout_width="0dp"

Loading…
Cancel
Save