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