Start of the thread watcher.

captchafix
Florens Douwes 12 years ago
parent 1d14b01be8
commit 75d6583ff6
  1. 9
      Chan/AndroidManifest.xml
  2. 16
      Chan/res/drawable/pin_icon.xml
  3. 23
      Chan/res/layout/drawer_item.xml
  4. 41
      Chan/res/layout/pin_item.xml
  5. 0
      Chan/res/layout/pin_item_header.xml
  6. 9
      Chan/src/org/floens/chan/ChanApplication.java
  7. 4
      Chan/src/org/floens/chan/adapter/PinnedAdapter.java
  8. 14
      Chan/src/org/floens/chan/database/DatabaseManager.java
  9. 4
      Chan/src/org/floens/chan/fragment/PostRepliesFragment.java
  10. 9
      Chan/src/org/floens/chan/manager/PinnedManager.java
  11. 41
      Chan/src/org/floens/chan/model/Pin.java
  12. 2
      Chan/src/org/floens/chan/net/ThreadLoader.java
  13. 141
      Chan/src/org/floens/chan/service/PinnedService.java
  14. 6
      Chan/src/org/floens/chan/utils/Logger.java

@ -86,13 +86,8 @@
<service
android:name="org.floens.chan.service.PinnedService"
android:exported="false"
></service>
android:exported="false" >
</service>
</application>
</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="#FF0099CC" />
<corners
android:radius="4dp" />
</shape>
</inset>

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/drawer_item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingLeft="16dp"
android:paddingRight="56dp"
android:textSize="19sp"
android:textColor="#fff"
android:gravity="center_vertical"
android:ellipsize="end"
android:lines="1"
android:singleLine="true"
android:orientation="vertical" >
</TextView>
</LinearLayout>

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="48dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/drawer_item_text"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingLeft="16dp"
android:paddingRight="8dp"
android:textSize="19sp"
android:textColor="#fff"
android:gravity="center_vertical"
android:ellipsize="end"
android:lines="1"
android:singleLine="true">
</TextView>
<FrameLayout
android:background="@drawable/pin_icon"
android:layout_width="48dp"
android:layout_height="48dp" >
<TextView
android:id="@+id/drawer_item_count"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="16dp"
android:textColor="#fff"
android:text="99+" />
</FrameLayout>
</LinearLayout>

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

@ -38,11 +38,11 @@ public class PinnedAdapter extends ArrayAdapter<Pin> {
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);
}

@ -50,6 +50,20 @@ public class DatabaseManager {
}
}
public void updatePins(List<Pin> 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<Pin> getPinned() {
List<Pin> list = null;
try {

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

@ -53,6 +53,10 @@ public class PinnedManager {
return null;
}
public List<Pin> 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();
}

@ -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<Post> result) {
Logger.test("OnData in pin: ");
Logger.test("Size: " + result.size());
newPostCount = result.size();
}
}

@ -118,7 +118,7 @@ public class ThreadLoader {
}
}
public static abstract class ThreadLoaderListener {
public static abstract interface ThreadLoaderListener {
public abstract void onData(List<Post> result);
public abstract void onError(VolleyError error);
}

@ -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<Pin> pinList = new ArrayList<Pin>();
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<Pin> 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<Pin> 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<Pin> 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;
}*/
}

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

Loading…
Cancel
Save