diff --git a/Chan/AndroidManifest.xml b/Chan/AndroidManifest.xml
index ac698bc9..0d594f59 100644
--- a/Chan/AndroidManifest.xml
+++ b/Chan/AndroidManifest.xml
@@ -86,13 +86,8 @@
+ android:exported="false" >
+
-
-
-
-
-
diff --git a/Chan/res/drawable/pin_icon.xml b/Chan/res/drawable/pin_icon.xml
new file mode 100644
index 00000000..81c87c0b
--- /dev/null
+++ b/Chan/res/drawable/pin_icon.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Chan/res/layout/drawer_item.xml b/Chan/res/layout/drawer_item.xml
deleted file mode 100644
index 75abe039..00000000
--- a/Chan/res/layout/drawer_item.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
diff --git a/Chan/res/layout/pin_item.xml b/Chan/res/layout/pin_item.xml
new file mode 100644
index 00000000..33b85c79
--- /dev/null
+++ b/Chan/res/layout/pin_item.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Chan/res/layout/drawer_item_header.xml b/Chan/res/layout/pin_item_header.xml
similarity index 100%
rename from Chan/res/layout/drawer_item_header.xml
rename to Chan/res/layout/pin_item_header.xml
diff --git a/Chan/src/org/floens/chan/ChanApplication.java b/Chan/src/org/floens/chan/ChanApplication.java
index b411d1ac..e0894f28 100644
--- a/Chan/src/org/floens/chan/ChanApplication.java
+++ b/Chan/src/org/floens/chan/ChanApplication.java
@@ -4,9 +4,11 @@ import org.floens.chan.database.DatabaseManager;
import org.floens.chan.manager.BoardManager;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.manager.ReplyManager;
+import org.floens.chan.service.PinnedService;
import org.floens.chan.utils.IconCache;
import android.app.Application;
+import android.content.Intent;
import android.content.SharedPreferences;
import android.os.StrictMode;
import android.preference.PreferenceManager;
@@ -62,8 +64,6 @@ public class ChanApplication extends Application {
.build());
}
- // startService(new Intent(this, PinnedService.class));
-
// VolleyLog.setTag(getPackageName());
IconCache.createIcons(this);
@@ -73,13 +73,14 @@ public class ChanApplication extends Application {
// These manager need a Context
new DatabaseManager(this);
+
new BoardManager(this);
new PinnedManager(this);
new ReplyManager(this);
+
+ startService(new Intent(this, PinnedService.class));
}
}
-
-
diff --git a/Chan/src/org/floens/chan/adapter/PinnedAdapter.java b/Chan/src/org/floens/chan/adapter/PinnedAdapter.java
index 4e748ac5..17d5c1f1 100644
--- a/Chan/src/org/floens/chan/adapter/PinnedAdapter.java
+++ b/Chan/src/org/floens/chan/adapter/PinnedAdapter.java
@@ -38,11 +38,11 @@ public class PinnedAdapter extends ArrayAdapter {
Pin item = getItem(position);
if (item.type == Pin.Type.HEADER) {
- view = (LinearLayout) inflater.inflate(R.layout.drawer_item_header, null);
+ view = (LinearLayout) inflater.inflate(R.layout.pin_item_header, null);
((TextView) view.findViewById(R.id.drawer_item_header)).setText(R.string.drawer_pinned);
} else {
- view = (LinearLayout) inflater.inflate(R.layout.drawer_item, null);
+ view = (LinearLayout) inflater.inflate(R.layout.pin_item, null);
((TextView) view.findViewById(R.id.drawer_item_text)).setText(item.loadable.title);
}
diff --git a/Chan/src/org/floens/chan/database/DatabaseManager.java b/Chan/src/org/floens/chan/database/DatabaseManager.java
index 14cf4cb3..6dc9bae0 100644
--- a/Chan/src/org/floens/chan/database/DatabaseManager.java
+++ b/Chan/src/org/floens/chan/database/DatabaseManager.java
@@ -50,6 +50,20 @@ public class DatabaseManager {
}
}
+ public void updatePins(List pins) {
+ try {
+ for (Pin pin : pins) {
+ helper.pinDao.update(pin);
+ }
+
+ for (Pin pin : pins) {
+ helper.loadableDao.update(pin.loadable);
+ }
+ } catch(SQLException e) {
+ Logger.e("Error updating pins in db", e);
+ }
+ }
+
public List getPinned() {
List list = null;
try {
diff --git a/Chan/src/org/floens/chan/fragment/PostRepliesFragment.java b/Chan/src/org/floens/chan/fragment/PostRepliesFragment.java
index bc372681..49fc830b 100644
--- a/Chan/src/org/floens/chan/fragment/PostRepliesFragment.java
+++ b/Chan/src/org/floens/chan/fragment/PostRepliesFragment.java
@@ -8,7 +8,6 @@ import org.floens.chan.model.Post;
import org.floens.chan.view.PostView;
import android.app.DialogFragment;
-import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -21,7 +20,6 @@ import android.widget.ListView;
* A DialogFragment that shows a list of posts. Use the newInstance method for instantiating.
*/
public class PostRepliesFragment extends DialogFragment {
- private Context context;
private ListView listView;
private List posts;
@@ -59,8 +57,6 @@ public class PostRepliesFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup unused, Bundle savedInstanceState) {
- context = inflater.getContext();
-
View container = inflater.inflate(R.layout.post_replies, null);
listView = (ListView) container.findViewById(R.id.post_list);
diff --git a/Chan/src/org/floens/chan/manager/PinnedManager.java b/Chan/src/org/floens/chan/manager/PinnedManager.java
index 1275da15..a3bbca15 100644
--- a/Chan/src/org/floens/chan/manager/PinnedManager.java
+++ b/Chan/src/org/floens/chan/manager/PinnedManager.java
@@ -53,6 +53,10 @@ public class PinnedManager {
return null;
}
+ public List getPins() {
+ return pins;
+ }
+
/**
* Add a pin
* @param pin
@@ -91,14 +95,13 @@ 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)
*/
public void updateAll() {
new Thread(new Runnable() {
@Override
public void run() {
- for (Pin pin : pins) {
- DatabaseManager.getInstance().updatePin(pin);
- }
+ DatabaseManager.getInstance().updatePins(pins);
}
}).start();
}
diff --git a/Chan/src/org/floens/chan/model/Pin.java b/Chan/src/org/floens/chan/model/Pin.java
index cb2781a8..548a6dc0 100644
--- a/Chan/src/org/floens/chan/model/Pin.java
+++ b/Chan/src/org/floens/chan/model/Pin.java
@@ -1,23 +1,58 @@
package org.floens.chan.model;
+import java.util.List;
+
+import org.floens.chan.net.ThreadLoader;
+import org.floens.chan.utils.Logger;
+
+import com.android.volley.VolleyError;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable
-public class Pin {
+public class Pin implements ThreadLoader.ThreadLoaderListener {
+ // Database stuff
@DatabaseField(generatedId = true)
private int id;
- public Type type = Type.THREAD;
-
@DatabaseField(canBeNull = false, foreign = true)
public Loadable loadable = new Loadable("", -1);
+ // ListView Stuff
/** Header is used to display a static header in the drawer listview. */
+ public Type type = Type.THREAD;
public static enum Type {
HEADER,
THREAD
};
+
+ // PinnedService stuff
+ public ThreadLoader threadLoader;
+ public int lastPostCount;
+ public int newPostCount;
+
+ public void update() {
+ Logger.test("Update in pin");
+
+ if (threadLoader == null) {
+ threadLoader = new ThreadLoader(this);
+ }
+
+ threadLoader.start(loadable);
+ }
+
+ @Override
+ public void onError(VolleyError error) {
+ Logger.test("OnError in pin: ", error);
+ }
+
+ @Override
+ public void onData(List result) {
+ Logger.test("OnData in pin: ");
+ Logger.test("Size: " + result.size());
+
+ newPostCount = result.size();
+ }
}
diff --git a/Chan/src/org/floens/chan/net/ThreadLoader.java b/Chan/src/org/floens/chan/net/ThreadLoader.java
index 2d5b6b8c..21c13f28 100644
--- a/Chan/src/org/floens/chan/net/ThreadLoader.java
+++ b/Chan/src/org/floens/chan/net/ThreadLoader.java
@@ -118,7 +118,7 @@ public class ThreadLoader {
}
}
- public static abstract class ThreadLoaderListener {
+ public static abstract interface ThreadLoaderListener {
public abstract void onData(List result);
public abstract void onError(VolleyError error);
}
diff --git a/Chan/src/org/floens/chan/service/PinnedService.java b/Chan/src/org/floens/chan/service/PinnedService.java
index 36275612..f071da4c 100644
--- a/Chan/src/org/floens/chan/service/PinnedService.java
+++ b/Chan/src/org/floens/chan/service/PinnedService.java
@@ -1,113 +1,84 @@
package org.floens.chan.service;
-import java.util.ArrayList;
+import java.util.List;
+import org.floens.chan.R;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.model.Pin;
-public class PinnedService /*extends Service*/ {
- /**
- * Base interval when the thread wakes up
- */
- private final int LOAD_BASE_INTERVAL = 20000;
-
- private PinnedManager pinnedManager;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class PinnedService extends Service {
private Thread loadThread;
- private final boolean running = true;
-
- private final ArrayList pinList = new ArrayList();
-
- private final Runnable loadRunnable = new Runnable() {
- @Override
- public void run() {
- while (running) {
-// loadPins();
-
- try {
- Thread.sleep(LOAD_BASE_INTERVAL);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- };
+ private boolean running = true;
- /*public PinnedService() {
- pinnedManager = ChanApplication.getPinnedManager();
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ start();
}
- private void loadPins() {
- organizePins();
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
- for (Pin pin : pinList) {
- loadPin(pin);
- }
+ running = false;
+
+ showNotification("Stop");
}
- private void loadPin(Pin pin) {
- if (!pin.threadLoader.isLoading()) {
- pin.startLoading();
- }
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
}
- /**
- * Add not yet added pins to our list.
- * Remove old/unwatched pins from our list.
-
- private void organizePins() {
- ArrayList managerList = pinnedManager.getPinnedThreads();
-
- for (Pin pin : managerList) {
- if (pin.getShouldWatch() && !pinList.contains(pin)) {
- // Add pin to watcher
- pinList.add(pin);
-
- testToast("Added pin: " + pin.loadable.title);
- }
- }
+ private void start() {
+ showNotification("Start");
- for (Iterator it = pinList.iterator(); it.hasNext();) {
- Pin pin = it.next();
- if (!pin.getShouldWatch() || !managerList.contains(pin)) {
- // Remove pin from watcher
- it.remove();
-
- testToast("Removed pin: " + pin.loadable.title);
- }
- }
- }
-
- private void testToast(final String text) {
- new Handler(Looper.getMainLooper()).post(new Runnable() {
+ loadThread = new Thread(new Runnable() {
@Override
public void run() {
- Toast.makeText(PinnedService.this, text, Toast.LENGTH_SHORT).show();
+ while (running) {
+ doUpdates();
+
+ try {
+ Thread.sleep(60000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
}
});
+
+ loadThread.start();
}
- @Override
- public void onCreate() {
- super.onCreate();
-
- testToast("Service started!");
-
- if (loadThread == null) {
- loadThread = new Thread(loadRunnable);
-// loadThread.start();
+ private void doUpdates() {
+ List pins = PinnedManager.getInstance().getPins();
+ for (Pin pin : pins) {
+// pin.update();
}
}
- @Override
- public void onDestroy() {
- super.onDestroy();
+ @SuppressWarnings("deprecation")
+ private void showNotification(String text) {
+ NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+
+ Notification.Builder builder = new Notification.Builder(this);
+ builder.setTicker(text);
+ builder.setContentTitle(text);
+ builder.setContentText(text);
+ builder.setSmallIcon(R.drawable.ic_stat_notify);
- testToast("Service stopped!");
+ nm.notify(1, builder.getNotification());
}
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }*/
-
}
+
+
+
+
diff --git a/Chan/src/org/floens/chan/utils/Logger.java b/Chan/src/org/floens/chan/utils/Logger.java
index c72a5389..55d86c13 100644
--- a/Chan/src/org/floens/chan/utils/Logger.java
+++ b/Chan/src/org/floens/chan/utils/Logger.java
@@ -61,6 +61,12 @@ public class Logger {
Log.i(TAG_TEST, message);
}
}
+
+ public static void test(String message, Throwable throwable) {
+ if (ChanApplication.DEVELOPER_MODE) {
+ Log.i(TAG_TEST, message, throwable);
+ }
+ }
}