package apt.tutorial.three;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import winterwell.jtwitter.Twitter;
import apt.tutorial.IPostListener;
import apt.tutorial.IPostMonitor;
public class PostMonitor extends Service {
private static final int POLL_PERIOD=60000;
private static final int INITIAL_POLL_PERIOD=1000;
private int pollPeriod=INITIAL_POLL_PERIOD;
private AtomicBoolean active=new AtomicBoolean(true);
private Set<Long> seenStatus=new HashSet<Long>();
private Map<IPostListener, Account> accounts=
new ConcurrentHashMap<IPostListener, Account>();
@Override
public void onCreate() {
super.onCreate();
new Thread(threadBody).start();
}
@Override
public IBinder onBind(Intent intent) {
return(binder);
}
@Override
public void onDestroy() {
super.onDestroy();
active.set(false);
}
private void poll(Account l) {
try {
Twitter client=new Twitter(l.user, l.password);
client.setAPIRootUrl("https://identi.ca/api");
List<Twitter.Status> timeline=client.getFriendsTimeline();
for (Twitter.Status s : timeline) {
if (!seenStatus.contains(s.id)) {
try {
l.callback.newFriendStatus(s.user.screenName, s.text,
s.createdAt.toString());
seenStatus.add(s.id);
}
catch (Throwable t) {
Log.e("PostMonitor", "Exception in callback", t);
}
}
}
}
catch (Throwable t) {
Log.e("PostMonitor", "Exception in poll()", t);
}
}
private Runnable threadBody=new Runnable() {
public void run() {
while (active.get()) {
for (Account l : accounts.values()) {
poll(l);
pollPeriod=POLL_PERIOD;
}
SystemClock.sleep(pollPeriod);
}
}
};
class Account {
String user=null;
String password=null;
IPostListener callback=null;
Account(String user, String password,
IPostListener callback) {
this.user=user;
this.password=password;
this.callback=callback;
}
}
private final IPostMonitor.Stub binder=new IPostMonitor.Stub() {
public void registerAccount(String user, String password,
IPostListener callback) {
Account l=new Account(user, password, callback);
poll(l);
accounts.put(callback, l);
}
public void removeAccount(IPostListener callback) {
accounts.remove(callback);
}
};
}