diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java index b8333ee0..7fe19dd9 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java @@ -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; diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java index e3aecdc3..07b0f66c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java @@ -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 * diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java b/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java index 61879237..20df6d6f 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java @@ -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; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java b/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java index 9da7cede..61c20fa1 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java @@ -48,6 +48,8 @@ public class Pin { public boolean isError = false; + public Post opPost; + private PinWatcher pinWatcher; public int getNewPostsCount() { diff --git a/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java b/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java index bb73a2a9..704d72f9 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java +++ b/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java @@ -129,6 +129,10 @@ public class PinWatcher implements Loader.LoaderListener { public void onData(List result, boolean append) { pin.isError = false; + if (pin.opPost == null && result.size() > 0) { + pin.opPost = result.get(0); + } + posts.clear(); posts.addAll(result); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java index 2f6f699e..3cd6c57a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java @@ -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); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java index 0a475eee..f8ab448c 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java @@ -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 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; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java index ac84d235..9536bd8b 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java @@ -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); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java index b55dc3af..713d17ce 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java @@ -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 { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java index 5e336b5e..27031e21 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java @@ -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(); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java index 78b41ec3..66c404e9 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java @@ -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(); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/CustomNetworkImageView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/CustomNetworkImageView.java index 446d4324..41bccdb4 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/CustomNetworkImageView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/CustomNetworkImageView.java @@ -91,6 +91,10 @@ public class CustomNetworkImageView extends ImageView { return mMaxScale; } + public String getUrl() { + return mUrl; + } + /** * Animate the image fading in. * diff --git a/Clover/app/src/main/res/layout/pin_item.xml b/Clover/app/src/main/res/layout/pin_item.xml index ddbb7381..c462f96a 100644 --- a/Clover/app/src/main/res/layout/pin_item.xml +++ b/Clover/app/src/main/res/layout/pin_item.xml @@ -20,6 +20,12 @@ along with this program. If not, see . android:layout_height="48dp" android:orientation="horizontal"> + +