diff --git a/Chan/AndroidManifest.xml b/Chan/AndroidManifest.xml index 48d20742..c8ad01e7 100644 --- a/Chan/AndroidManifest.xml +++ b/Chan/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="13" + android:versionName="v0.11" > + @@ -67,8 +68,8 @@ android:windowSoftInputMode="adjustResize" > - \ No newline at end of file + diff --git a/Chan/res/drawable/pin_icon_gray.xml b/Chan/res/drawable/pin_icon_gray.xml new file mode 100644 index 00000000..6ffc7d91 --- /dev/null +++ b/Chan/res/drawable/pin_icon_gray.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/Chan/res/values/strings.xml b/Chan/res/values/strings.xml index f01974a4..758742ee 100644 --- a/Chan/res/values/strings.xml +++ b/Chan/res/values/strings.xml @@ -107,5 +107,29 @@ To view the thread watcher options, turn the thread watcher on. + Time between reloads in background + + 1 minute + 2 minutes + 3 minutes + 5 minutes + 10 minutes + 30 minutes + 60 minutes + + + 60 + 120 + 180 + 300 + 600 + 1800 + 3600 + + + + + + diff --git a/Chan/res/xml/preference_watch.xml b/Chan/res/xml/preference_watch.xml new file mode 100644 index 00000000..a41b73f9 --- /dev/null +++ b/Chan/res/xml/preference_watch.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/Chan/src/org/floens/chan/ChanApplication.java b/Chan/src/org/floens/chan/ChanApplication.java index 86dbf6d1..e94d9510 100644 --- a/Chan/src/org/floens/chan/ChanApplication.java +++ b/Chan/src/org/floens/chan/ChanApplication.java @@ -2,9 +2,10 @@ package org.floens.chan; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.PinnedManager; +import org.floens.chan.core.manager.PinnedManager.PinListener; import org.floens.chan.core.manager.ReplyManager; import org.floens.chan.database.DatabaseManager; -import org.floens.chan.service.PinnedService; +import org.floens.chan.service.WatchService; import org.floens.chan.utils.IconCache; import android.app.Application; @@ -17,7 +18,7 @@ import com.android.volley.extra.BitmapLruImageCache; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.Volley; -public class ChanApplication extends Application { +public class ChanApplication extends Application implements PinListener { public static final boolean DEVELOPER_MODE = true; private static ChanApplication instance; @@ -88,9 +89,15 @@ public class ChanApplication extends Application { databaseManager = new DatabaseManager(this); boardManager = new BoardManager(this); pinnedManager = new PinnedManager(this); + pinnedManager.addPinListener(this); replyManager = new ReplyManager(this); - PinnedService.updateRunningState(this); + WatchService.updateRunningState(this); + } + + @Override + public void onPinsChanged() { + WatchService.updateRunningState(this); } } diff --git a/Chan/src/org/floens/chan/core/ChanPreferences.java b/Chan/src/org/floens/chan/core/ChanPreferences.java index ebb0b426..77111290 100644 --- a/Chan/src/org/floens/chan/core/ChanPreferences.java +++ b/Chan/src/org/floens/chan/core/ChanPreferences.java @@ -1,7 +1,7 @@ package org.floens.chan.core; import org.floens.chan.ChanApplication; -import org.floens.chan.service.PinnedService; +import org.floens.chan.service.WatchService; public class ChanPreferences { public static boolean getOpenLinkConfirmation() { @@ -41,7 +41,13 @@ public class ChanPreferences { public static void setWatchEnabled(boolean enabled) { if (getWatchEnabled() != enabled) { ChanApplication.getPreferences().edit().putBoolean("preference_watch_enabled", enabled).commit(); - PinnedService.updateRunningState(ChanApplication.getInstance()); + WatchService.updateRunningState(ChanApplication.getInstance()); + ChanApplication.getPinnedManager().onPinsChanged(); } } + + public static long getWatchBackgroundTimeout() { + String number = ChanApplication.getPreferences().getString("preference_watch_background_timeout", "0"); + return Integer.parseInt(number) * 1000L; + } } diff --git a/Chan/src/org/floens/chan/core/loader/Loader.java b/Chan/src/org/floens/chan/core/loader/Loader.java index 903946a5..32541663 100644 --- a/Chan/src/org/floens/chan/core/loader/Loader.java +++ b/Chan/src/org/floens/chan/core/loader/Loader.java @@ -75,7 +75,7 @@ public class Loader { */ public void setAutoLoadMore(boolean autoReload) { if (this.autoReload != autoReload) { - Logger.test("Setting autoreload to " + autoReload); + Logger.d(TAG, "Setting autoreload to " + autoReload); this.autoReload = autoReload; if (!autoReload) { @@ -89,7 +89,7 @@ public class Loader { * If auto load more is disabled, this needs to be called manually. * Otherwise this is called automatically when the timer hits 0. */ - public void tryLoadMoreIfTime() { + public void loadMoreIfTime() { if (getTimeUntilLoadMore() < 0L) { requestMoreData(); } @@ -112,6 +112,7 @@ public class Loader { } currentTimeout = 0; + cachedPosts.clear(); request = getData(); } @@ -176,47 +177,40 @@ public class Loader { } private void setTimer(int postCount) { - if (pendingRunnable != null) { - clearTimer(); - } - - if (pendingRunnable == null) { - if (postCount > lastPostCount) { - currentTimeout = 0; - } else { - currentTimeout++; - if (currentTimeout >= watchTimeouts.length) { - currentTimeout = watchTimeouts.length - 1; - } - } + clearTimer(); - if (!autoReload && currentTimeout < 4) { - currentTimeout = 4; // At least 60 seconds in the background + if (postCount > lastPostCount) { + currentTimeout = 0; + } else { + currentTimeout++; + if (currentTimeout >= watchTimeouts.length) { + currentTimeout = watchTimeouts.length - 1; } + } - lastPostCount = postCount; + if (!autoReload && currentTimeout < 4) { + currentTimeout = 4; // At least 60 seconds in the background + } - Logger.test("Current timeout: " + watchTimeouts[currentTimeout]); + lastPostCount = postCount; - if (autoReload) { - pendingRunnable = new Runnable() { - @Override - public void run() { - pendingRunnable = null; - tryLoadMoreIfTime(); - }; + if (autoReload) { + pendingRunnable = new Runnable() { + @Override + public void run() { + pendingRunnable = null; + loadMoreIfTime(); }; + }; - Logger.test("Scheduled reload"); - handler.postDelayed(pendingRunnable, watchTimeouts[currentTimeout] * 1000L); - - } + Logger.d(TAG, "Scheduled reload in " + watchTimeouts[currentTimeout] * 1000L); + handler.postDelayed(pendingRunnable, watchTimeouts[currentTimeout] * 1000L); } } private void clearTimer() { if (pendingRunnable != null) { - Logger.test("Removed reload"); + Logger.d(TAG, "Removed pending runnable"); handler.removeCallbacks(pendingRunnable); pendingRunnable = null; } diff --git a/Chan/src/org/floens/chan/core/manager/PinnedManager.java b/Chan/src/org/floens/chan/core/manager/PinnedManager.java index 22b8b04e..c0bd01f8 100644 --- a/Chan/src/org/floens/chan/core/manager/PinnedManager.java +++ b/Chan/src/org/floens/chan/core/manager/PinnedManager.java @@ -26,9 +26,12 @@ public class PinnedManager { } /** - * Look for a pin that has an loadable that is equal to the supplied loadable. + * Look for a pin that has an loadable that is equal to the supplied + * loadable. + * * @param other - * @return The pin whose loadable is equal to the supplied loadable, or null if no pin was found. + * @return The pin whose loadable is equal to the supplied loadable, or null + * if no pin was found. */ public Pin findPinByLoadable(Loadable other) { for (Pin pin : pins) { @@ -44,8 +47,20 @@ public class PinnedManager { return pins; } + public List getWatchingPins() { + List l = new ArrayList(); + + for (Pin p : pins) { + if (p.watching) + l.add(p); + } + + return l; + } + /** * Add a pin + * * @param pin * @return true if it was added, false if it wasn't (duplicated) */ @@ -67,18 +82,20 @@ public class PinnedManager { /** * Remove a pin + * * @param pin */ public void remove(Pin pin) { pins.remove(pin); ChanApplication.getDatabaseManager().removePin(pin); - pin.destroy(); + pin.destroyWatcher(); onPinsChanged(); } /** * Update the pin in the database + * * @param pin */ public void update(Pin pin) { @@ -88,9 +105,9 @@ public class PinnedManager { } /** - * Updates all the pins to the database. - * This will run in a new thread because it can be an expensive operation. - * (this will be an huge headache later on when we get concurrent problems) + * Updates all the pins to the database. This will run in a new thread + * because it can be an expensive operation. (this will be an huge headache + * later on when we get concurrent problems) */ public void updateAll() { new Thread(new Runnable() { @@ -117,8 +134,3 @@ public class PinnedManager { public void onPinsChanged(); } } - - - - - diff --git a/Chan/src/org/floens/chan/core/model/Pin.java b/Chan/src/org/floens/chan/core/model/Pin.java index 48fb9b27..985d4853 100644 --- a/Chan/src/org/floens/chan/core/model/Pin.java +++ b/Chan/src/org/floens/chan/core/model/Pin.java @@ -25,6 +25,9 @@ public class Pin { // PinnedService stuff public PinWatcher pinWatcher; + @DatabaseField + public boolean watching = true; + @DatabaseField public int watchLastCount; @@ -51,9 +54,18 @@ public class Pin { watchLastCount = watchNewCount; } - public void destroy() { + public void destroyWatcher() { if (pinWatcher != null) { pinWatcher.destroy(); + pinWatcher = null; + } + } + + public boolean isError() { + if (pinWatcher != null) { + return pinWatcher.isError(); + } else { + return false; } } } diff --git a/Chan/src/org/floens/chan/core/watch/PinWatcher.java b/Chan/src/org/floens/chan/core/watch/PinWatcher.java index 87864cca..00eca50c 100644 --- a/Chan/src/org/floens/chan/core/watch/PinWatcher.java +++ b/Chan/src/org/floens/chan/core/watch/PinWatcher.java @@ -6,7 +6,7 @@ import org.floens.chan.core.loader.Loader; import org.floens.chan.core.loader.LoaderPool; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; -import org.floens.chan.service.PinnedService; +import org.floens.chan.service.WatchService; import org.floens.chan.utils.Logger; import com.android.volley.VolleyError; @@ -15,9 +15,7 @@ public class PinWatcher implements Loader.LoaderListener { private static final String TAG = "PinWatcher"; private final Pin pin; - private final Loader loader; - - private long startTime; + private Loader loader; private boolean isError = false; public PinWatcher(Pin pin) { @@ -27,14 +25,15 @@ public class PinWatcher implements Loader.LoaderListener { } public void destroy() { - LoaderPool.getInstance().release(loader, this); + if (loader != null) { + LoaderPool.getInstance().release(loader, this); + loader = null; + } } public void update() { -// Logger.test("PinWatcher update"); - if (!isError) { - loader.tryLoadMoreIfTime(); + loader.loadMoreIfTime(); } } @@ -46,14 +45,24 @@ public class PinWatcher implements Loader.LoaderListener { } } + public boolean isError() { + return isError; + } + @Override public void onError(VolleyError error) { - Logger.test("PinWatcher onError: ", error); + Logger.e(TAG, "PinWatcher onError: ", error); isError = true; + pin.watchLastCount = 0; + pin.watchNewCount = 0; + + WatchService.callOnPinsChanged(); } @Override public void onData(List result, boolean append) { + isError = false; + int count = result.size(); Logger.test("PinWatcher onData, Post size: " + count); @@ -64,6 +73,6 @@ public class PinWatcher implements Loader.LoaderListener { pin.watchNewCount = count; - PinnedService.callOnPinsChanged(); + WatchService.callOnPinsChanged(); } } diff --git a/Chan/src/org/floens/chan/core/watch/WatchNotifier.java b/Chan/src/org/floens/chan/core/watch/WatchNotifier.java index fce41eae..a6bb5cb4 100644 --- a/Chan/src/org/floens/chan/core/watch/WatchNotifier.java +++ b/Chan/src/org/floens/chan/core/watch/WatchNotifier.java @@ -1,11 +1,12 @@ package org.floens.chan.core.watch; +import java.util.ArrayList; import java.util.List; import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.core.model.Pin; -import org.floens.chan.service.PinnedService; +import org.floens.chan.service.WatchService; import org.floens.chan.ui.activity.BoardActivity; import android.app.Notification; @@ -17,57 +18,81 @@ import android.content.Intent; public class WatchNotifier { private final int NOTIFICATION_ID = 1; - private final PinnedService pinnedService; + private final WatchService pinnedService; private final NotificationManager nm; - public WatchNotifier(PinnedService pinnedService) { + private int lastNewPosts; + + public WatchNotifier(WatchService pinnedService) { this.pinnedService = pinnedService; nm = (NotificationManager) pinnedService.getSystemService(Context.NOTIFICATION_SERVICE); } public void update() { - List pins = ChanApplication.getPinnedManager().getPins(); + if (!WatchService.getActivityInForeground()) { + prepareNotification(); + } + } + + public void onForegroundChanged() { + if (WatchService.getActivityInForeground()) { + nm.cancel(NOTIFICATION_ID); + } else { + + } + } + + private void prepareNotification() { + List pins = ChanApplication.getPinnedManager().getWatchingPins(); - int count = 0; - int pinCount = 0; + int newPosts = 0; + List pinsWithNewPosts = new ArrayList(); for (Pin pin : pins) { - count += pin.getNewPostCount(); - pinCount++; + if (pin.getNewPostCount() > 0) { + newPosts += pin.getNewPostCount(); + pinsWithNewPosts.add(pin); + } } - if (!PinnedService.getActivityInForeground()) { - showNotification(count + " new posts in " + pinCount + " threads\n" + System.currentTimeMillis()); + boolean show = false; + + if (lastNewPosts != newPosts && newPosts > 0) { + show = true; } - } + lastNewPosts = newPosts; - public void onForegroundChanged() { - if (PinnedService.getActivityInForeground()) { - nm.cancel(NOTIFICATION_ID); - } else { + if (show) { + String descriptor; + if (pinsWithNewPosts.size() == 1) { + descriptor = pinsWithNewPosts.get(0).loadable.title; + } else { + descriptor = pinsWithNewPosts.size() + " threads"; + } + + String content = newPosts + " new posts in " + descriptor; + String title = "New posts"; + showNotification(content, title, content, Integer.toString(newPosts)); } } @SuppressWarnings("deprecation") - private void showNotification(String text) { + private void showNotification(String tickerText, String title, String content, String contentInfo) { Intent intent = new Intent(pinnedService, BoardActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP + | Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pending = PendingIntent.getActivity(pinnedService, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); Notification.Builder builder = new Notification.Builder(pinnedService); builder.setContentIntent(pending); - builder.setTicker(text); - builder.setContentTitle(text); - builder.setContentText(text); + builder.setTicker(tickerText); + builder.setContentTitle(title); + builder.setContentText(content); + builder.setContentInfo(contentInfo); builder.setSmallIcon(R.drawable.ic_stat_notify); nm.notify(NOTIFICATION_ID, builder.getNotification()); } } - - - - - diff --git a/Chan/src/org/floens/chan/database/DatabaseHelper.java b/Chan/src/org/floens/chan/database/DatabaseHelper.java index f87db8d1..5d7ba1f3 100644 --- a/Chan/src/org/floens/chan/database/DatabaseHelper.java +++ b/Chan/src/org/floens/chan/database/DatabaseHelper.java @@ -17,21 +17,21 @@ import com.j256.ormlite.table.TableUtils; public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final String TAG = "DatabaseHelper"; - + private static final String DATABASE_NAME = "ChanDB"; - private static final int DATABASE_VERSION = 7; - + private static final int DATABASE_VERSION = 8; + public Dao pinDao; public Dao loadableDao; public Dao savedDao; - + private final Context context; - + public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); - + this.context = context; - + try { pinDao = getDao(Pin.class); loadableDao = getDao(Loadable.class); @@ -58,25 +58,25 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { switch(oldVersion) { // Change tables if we make adjustments } - + // Drop the tables and recreate them for now reset(database, connectionSource); } - + public void reset() { Logger.i(TAG, "Resetting database!"); - + if (context.deleteDatabase(DATABASE_NAME)) { Logger.i(TAG, "Deleted database"); } } - + private void reset(SQLiteDatabase database, ConnectionSource connectionSource) { try { TableUtils.dropTable(connectionSource, Pin.class, true); TableUtils.dropTable(connectionSource, Loadable.class, true); TableUtils.dropTable(connectionSource, SavedReply.class, true); - + onCreate(database, connectionSource); } catch (SQLException e) { e.printStackTrace(); diff --git a/Chan/src/org/floens/chan/service/PinnedService.java b/Chan/src/org/floens/chan/service/WatchService.java similarity index 75% rename from Chan/src/org/floens/chan/service/PinnedService.java rename to Chan/src/org/floens/chan/service/WatchService.java index 2a7f33a6..cc807790 100644 --- a/Chan/src/org/floens/chan/service/PinnedService.java +++ b/Chan/src/org/floens/chan/service/WatchService.java @@ -16,11 +16,10 @@ import android.os.IBinder; import android.os.Looper; import android.widget.Toast; -public class PinnedService extends Service { +public class WatchService extends Service { private static final long FOREGROUND_INTERVAL = 10000L; - private static final long BACKGROUND_INTERVAL = 60000L; - private static PinnedService instance; + private static WatchService instance; private static boolean activityInForeground = false; private Thread loadThread; @@ -47,8 +46,14 @@ public class PinnedService extends Service { public static void updateRunningState(Context context) { if (ChanPreferences.getWatchEnabled()) { - if (!getRunning()) { - enable(context); + if (ChanApplication.getPinnedManager().getWatchingPins().size() == 0) { + if (getRunning()) { + disable(context); + } + } else { + if (!getRunning()) { + enable(context); + } } } else { if (getRunning()) { @@ -59,13 +64,18 @@ public class PinnedService extends Service { public static void enable(Context context) { if (!getRunning()) { - context.startService(new Intent(context, PinnedService.class)); + context.startService(new Intent(context, WatchService.class)); } } public static void disable(Context context) { if (getRunning()) { - context.stopService(new Intent(context, PinnedService.class)); + context.stopService(new Intent(context, WatchService.class)); + + List pins = ChanApplication.getPinnedManager().getWatchingPins(); + for (Pin pin : pins) { + pin.destroyWatcher(); + } } } @@ -86,10 +96,10 @@ public class PinnedService extends Service { public void onCreate() { super.onCreate(); - watchNotifier = new WatchNotifier(this); - instance = this; + watchNotifier = new WatchNotifier(this); + startThread(); } @@ -102,7 +112,7 @@ public class PinnedService extends Service { running = false; if (loadThread != null) { loadThread.interrupt(); - Toast.makeText(getApplicationContext(), "Service thread interrupted", Toast.LENGTH_SHORT).show(); + Toast.makeText(getApplicationContext(), "Pinned thread interrupted", Toast.LENGTH_SHORT).show(); } } @@ -121,7 +131,7 @@ public class PinnedService extends Service { if (!running) return; - long timeout = activityInForeground ? FOREGROUND_INTERVAL : BACKGROUND_INTERVAL; + long timeout = activityInForeground ? FOREGROUND_INTERVAL : getBackgroundTimeout(); try { Thread.sleep(timeout); @@ -135,7 +145,7 @@ public class PinnedService extends Service { }); loadThread.start(); - Toast.makeText(getApplicationContext(), "Service thread started", Toast.LENGTH_SHORT).show(); + Toast.makeText(getApplicationContext(), "Pinned thread started", Toast.LENGTH_SHORT).show(); } } @@ -150,8 +160,13 @@ public class PinnedService extends Service { watchNotifier.onForegroundChanged(); } + private long getBackgroundTimeout() { + Logger.test("::: " + ChanPreferences.getWatchBackgroundTimeout()); + return ChanPreferences.getWatchBackgroundTimeout(); + } + private void update() { - List pins = ChanApplication.getPinnedManager().getPins(); + List pins = ChanApplication.getPinnedManager().getWatchingPins(); for (Pin pin : pins) { pin.updateWatch(); } diff --git a/Chan/src/org/floens/chan/ui/activity/BaseActivity.java b/Chan/src/org/floens/chan/ui/activity/BaseActivity.java index 698e9e8e..0383551c 100644 --- a/Chan/src/org/floens/chan/ui/activity/BaseActivity.java +++ b/Chan/src/org/floens/chan/ui/activity/BaseActivity.java @@ -83,6 +83,13 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene ChanApplication.getPinnedManager().removePinListener(this); } + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + pinDrawer.openDrawer(pinDrawerView); + } + private void initPane() { threadPane.setPanelSlideListener(this); threadPane.setParallaxDistance(200); diff --git a/Chan/src/org/floens/chan/ui/activity/BoardActivity.java b/Chan/src/org/floens/chan/ui/activity/BoardActivity.java index cb240953..fdf7041d 100644 --- a/Chan/src/org/floens/chan/ui/activity/BoardActivity.java +++ b/Chan/src/org/floens/chan/ui/activity/BoardActivity.java @@ -9,7 +9,7 @@ import org.floens.chan.chan.ChanUrls; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; -import org.floens.chan.service.PinnedService; +import org.floens.chan.service.WatchService; import org.floens.chan.ui.fragment.ThreadFragment; import android.app.ActionBar; @@ -92,14 +92,14 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio protected void onStart() { super.onStart(); - PinnedService.onActivityStart(); + WatchService.onActivityStart(); } @Override protected void onStop() { super.onStop(); - PinnedService.onActivityStop(); + WatchService.onActivityStop(); } @Override diff --git a/Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java b/Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java index e267e779..4c353e30 100644 --- a/Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java +++ b/Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java @@ -93,6 +93,7 @@ public class WatchSettingsActivity extends Activity implements OnCheckedChangeLi TextView text = new TextView(inflater.getContext()); text.setTextSize(20); text.setText(getArguments().getInt("text_resource")); + text.setGravity(Gravity.CENTER); container.setGravity(Gravity.CENTER); container.addView(text); @@ -102,7 +103,24 @@ public class WatchSettingsActivity extends Activity implements OnCheckedChangeLi } public static class WatchSettingsFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.preference_watch); + } } } + + + + + + + + + + + diff --git a/Chan/src/org/floens/chan/ui/adapter/PinnedAdapter.java b/Chan/src/org/floens/chan/ui/adapter/PinnedAdapter.java index 275d9f96..a1579f00 100644 --- a/Chan/src/org/floens/chan/ui/adapter/PinnedAdapter.java +++ b/Chan/src/org/floens/chan/ui/adapter/PinnedAdapter.java @@ -5,6 +5,7 @@ import java.util.HashMap; import org.floens.chan.ChanApplication; import org.floens.chan.R; +import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.model.Pin; import android.content.Context; @@ -32,7 +33,7 @@ public class PinnedAdapter extends ArrayAdapter { LinearLayout view = null; - Pin item = getItem(position); + final Pin item = getItem(position); if (item.type == Pin.Type.HEADER) { view = (LinearLayout) inflater.inflate(R.layout.pin_item_header, null); @@ -43,20 +44,41 @@ public class PinnedAdapter extends ArrayAdapter { ((TextView) view.findViewById(R.id.drawer_item_text)).setText(item.loadable.title); - int count = item.getNewPostCount(); - String total = Integer.toString(count); - if (count > 999) { - total = "1k+"; - } - - ((TextView) view.findViewById(R.id.drawer_item_count)).setText(total); - FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.drawer_item_count_container); -// if (Math.random() < 0.5d) { - frameLayout.setBackgroundResource(R.drawable.pin_icon_blue); -// } else { -// frameLayout.setBackgroundResource(R.drawable.pin_icon_red); -// } + if (ChanPreferences.getWatchEnabled()) { + frameLayout.setVisibility(View.VISIBLE); + + TextView itemCount = (TextView) view.findViewById(R.id.drawer_item_count); + + if (item.isError()) { + itemCount.setText("404"); + } else { + int count = item.getNewPostCount(); + String total = Integer.toString(count); + if (count > 999) { + total = "1k+"; + } + itemCount.setText(total); + } + + itemCount.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + item.watching = !item.watching; + ChanApplication.getPinnedManager().onPinsChanged(); + } + }); + + if (item.isError()) { + frameLayout.setBackgroundResource(R.drawable.pin_icon_red); + } else if (item.watching) { + frameLayout.setBackgroundResource(R.drawable.pin_icon_blue); + } else { + frameLayout.setBackgroundResource(R.drawable.pin_icon_gray); + } + } else { + frameLayout.setVisibility(View.GONE); + } } return view; @@ -95,7 +117,8 @@ public class PinnedAdapter extends ArrayAdapter { @Override public long getItemId(int position) { - if (position < 0 || position >= getCount()) return -1; + if (position < 0 || position >= getCount()) + return -1; Pin item = getItem(position); if (item == null) { @@ -110,8 +133,3 @@ public class PinnedAdapter extends ArrayAdapter { } } } - - - - -