Added notifications.

Added watching per pin.
captchafix
Florens Douwes 11 years ago
parent e4a437bead
commit 5c08202164
  1. 11
      Chan/AndroidManifest.xml
  2. 16
      Chan/res/drawable/pin_icon_gray.xml
  3. 24
      Chan/res/values/strings.xml
  4. 12
      Chan/res/xml/preference_watch.xml
  5. 13
      Chan/src/org/floens/chan/ChanApplication.java
  6. 10
      Chan/src/org/floens/chan/core/ChanPreferences.java
  7. 56
      Chan/src/org/floens/chan/core/loader/Loader.java
  8. 34
      Chan/src/org/floens/chan/core/manager/PinnedManager.java
  9. 14
      Chan/src/org/floens/chan/core/model/Pin.java
  10. 29
      Chan/src/org/floens/chan/core/watch/PinWatcher.java
  11. 75
      Chan/src/org/floens/chan/core/watch/WatchNotifier.java
  12. 24
      Chan/src/org/floens/chan/database/DatabaseHelper.java
  13. 41
      Chan/src/org/floens/chan/service/WatchService.java
  14. 7
      Chan/src/org/floens/chan/ui/activity/BaseActivity.java
  15. 6
      Chan/src/org/floens/chan/ui/activity/BoardActivity.java
  16. 18
      Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java
  17. 58
      Chan/src/org/floens/chan/ui/adapter/PinnedAdapter.java

@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.floens.chan"
android:installLocation="auto"
android:versionCode="12"
android:versionName="v0.10" >
android:versionCode="13"
android:versionName="v0.11" >
<uses-sdk
android:minSdkVersion="14"
@ -25,6 +25,7 @@
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
@ -67,8 +68,8 @@
android:windowSoftInputMode="adjustResize" >
</activity>
<activity
android:label="@string/action_settings"
android:name="org.floens.chan.ui.activity.SettingsActivity"
android:label="@string/action_settings"
android:parentActivityName="org.floens.chan.ui.activity.BoardActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -109,9 +110,9 @@
</activity>
<service
android:name="org.floens.chan.service.PinnedService"
android:name="org.floens.chan.service.WatchService"
android:exported="false" >
</service>
</application>
</manifest>
</manifest>

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="8dp"
android:insetTop="8dp"
android:insetRight="8dp"
android:insetBottom="8dp" >
<shape>
<solid
android:color="#FF898989" />
<corners
android:radius="4dp" />
</shape>
</inset>

@ -107,5 +107,29 @@
<string name="watch_info_text">
To view the thread watcher options, turn the thread watcher on.
</string>
<string name="watch_background_timeout_description">Time between reloads in background</string>
<string-array name="watch_background_timeouts">
<item>1 minute</item>
<item>2 minutes</item>
<item>3 minutes</item>
<item>5 minutes</item>
<item>10 minutes</item>
<item>30 minutes</item>
<item>60 minutes</item>
</string-array>
<string-array name="watch_background_timeouts_int">
<item>60</item>
<item>120</item>
<item>180</item>
<item>300</item>
<item>600</item>
<item>1800</item>
<item>3600</item>
</string-array>
</resources>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<ListPreference
android:title="@string/watch_background_timeout_description"
android:summary="Foo"
android:key="preference_watch_background_timeout"
android:defaultValue="60"
android:dialogTitle="bar"
android:entries="@array/watch_background_timeouts"
android:entryValues="@array/watch_background_timeouts_int" />
</PreferenceScreen>

@ -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);
}
}

@ -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;
}
}

@ -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;
}

@ -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<Pin> getWatchingPins() {
List<Pin> l = new ArrayList<Pin>();
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();
}
}

@ -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;
}
}
}

@ -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<Post> 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();
}
}

@ -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<Pin> pins = ChanApplication.getPinnedManager().getPins();
if (!WatchService.getActivityInForeground()) {
prepareNotification();
}
}
public void onForegroundChanged() {
if (WatchService.getActivityInForeground()) {
nm.cancel(NOTIFICATION_ID);
} else {
}
}
private void prepareNotification() {
List<Pin> pins = ChanApplication.getPinnedManager().getWatchingPins();
int count = 0;
int pinCount = 0;
int newPosts = 0;
List<Pin> pinsWithNewPosts = new ArrayList<Pin>();
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());
}
}

@ -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<Pin, Integer> pinDao;
public Dao<Loadable, Integer> loadableDao;
public Dao<SavedReply, Integer> 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();

@ -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<Pin> 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<Pin> pins = ChanApplication.getPinnedManager().getPins();
List<Pin> pins = ChanApplication.getPinnedManager().getWatchingPins();
for (Pin pin : pins) {
pin.updateWatch();
}

@ -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);

@ -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

@ -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);
}
}
}

@ -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<Pin> {
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<Pin> {
((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<Pin> {
@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<Pin> {
}
}
}

Loading…
Cancel
Save