aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/entity/Account.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/entity/Account.java')
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/entity/Account.java130
1 files changed, 95 insertions, 35 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Account.java b/app/src/main/java/net/lacolaco/smileessence/entity/Account.java
index a5fdd25f..0f346642 100644
--- a/app/src/main/java/net/lacolaco/smileessence/entity/Account.java
+++ b/app/src/main/java/net/lacolaco/smileessence/entity/Account.java
@@ -25,10 +25,10 @@
package net.lacolaco.smileessence.entity;
import android.os.Handler;
-import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import com.activeandroid.query.Delete;
+import com.activeandroid.query.Select;
import net.lacolaco.smileessence.twitter.task.GetUserListsTask;
import net.lacolaco.smileessence.twitter.task.ShowStatusTask;
import net.lacolaco.smileessence.util.BackgroundTask;
@@ -39,69 +39,99 @@ import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.auth.AccessToken;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
-@Table(name = "Accounts")
-public class Account extends Model {
+public class Account {
+ private static Map<Long, Account> cache; // model id -> Account
private User user;
+ private Model model;
private final Set<String> listSubscriptions = Collections.newSetFromMap(new ConcurrentHashMap<>());
- @Column(name = "Token", notNull = true)
- private String accessToken;
- @Column(name = "Secret", notNull = true)
- private String accessSecret;
- @Column(name = "UserID", notNull = true)
- private long userID;
- @Column(name = "ScreenName", notNull = true)
- private String screenName;
+ // --------------------- static methods ---------------------
+ public static synchronized Account get(long i) {
+ if (cache == null) {
+ throw new IllegalStateException("Load first");
+ }
+ return cache.get(i);
+ }
- // Required by ActiveAndroid
- public Account() {
- super();
+ public static synchronized int count() {
+ return cache.size();
}
- public Account(String token, String tokenSecret, long userID, String screenName) {
- super();
- this.accessToken = token;
- this.accessSecret = tokenSecret;
- this.userID = userID;
- this.screenName = screenName;
+ public static synchronized List<Account> all() {
+ return new ArrayList<>(cache.values());
}
- @Deprecated
- public static void deleteAll() {
- new Delete().from(Account.class).execute();
+ public static synchronized void load() {
+ cache = new LinkedHashMap<>();
+ List<Model> all = new Select().from(Model.class).execute();
+ for (Model model : all) {
+ cache.put(model.getId(), new Account(model));
+ }
+ }
+
+ public static synchronized Account register(String token, String tokenSecret, long userID, String screenName) {
+ Account account = Account.get(userID);
+ if (account == null) {
+ Model model = new Model(token, tokenSecret, userID, screenName);
+ model.save();
+ account = new Account(model);
+ cache.put(model.getId(), account);
+ } else {
+ Model model = account.model;
+ model.accessToken = token;
+ model.accessSecret = tokenSecret;
+ model.screenName = screenName;
+ model.save();
+ }
+ return account;
+ }
+
+ public static synchronized Account unregister(long modelId) {
+ Account account = cache.remove(modelId);
+ if (account != null) {
+ Model.delete(Model.class, modelId);
+ }
+ return account;
+ }
+
+ // --------------------- instance methods ---------------------
+ private Account(Model model) {
+ this.model = model;
}
public long getUserId() {
- return userID;
+ return model.userID;
+ }
+
+ public long getModelId() {
+ return model.getId();
}
public Twitter getTwitter() {
Twitter twitter = new TwitterFactory().getInstance();
- twitter.setOAuthAccessToken(new AccessToken(accessToken, accessSecret));
+ twitter.setOAuthAccessToken(new AccessToken(model.accessToken, model.accessSecret));
return twitter;
}
public TwitterStream getTwitterStream() {
TwitterStream stream = new TwitterStreamFactory().getInstance();
- stream.setOAuthAccessToken(new AccessToken(accessToken, accessSecret));
+ stream.setOAuthAccessToken(new AccessToken(model.accessToken, model.accessSecret));
return stream;
}
public User getUser() {
if (user == null) {
- user = User.fetch(userID);
+ user = User.fetch(model.userID);
if (user == null) {
- user = User._makeSkeleton(getUserId(), screenName);
+ user = User._makeSkeleton(getUserId(), model.screenName);
}
user.addObserver(this, (user, objs) -> {
- if (!this.screenName.equals(((User) user).getScreenName())) {
- this.screenName = ((User) user).getScreenName();
- this.save();
+ if (!model.screenName.equals(((User) user).getScreenName())) {
+ model.screenName = ((User) user).getScreenName();
+ model.save();
}
});
}
@@ -153,4 +183,34 @@ public class Account extends Model {
public boolean removeListSubscription(String fullName) {
return listSubscriptions.remove(fullName);
}
-}
+
+ @Table(name = "Accounts")
+ private static class Model extends com.activeandroid.Model {
+ @Column(name = "Token", notNull = true)
+ private String accessToken;
+ @Column(name = "Secret", notNull = true)
+ private String accessSecret;
+ @Column(name = "UserID", notNull = true)
+ private long userID;
+ @Column(name = "ScreenName", notNull = true)
+ private String screenName;
+
+ // Required by ActiveAndroid
+ public Model() {
+ super();
+ }
+
+ public Model(String token, String tokenSecret, long userID, String screenName) {
+ super();
+ this.accessToken = token;
+ this.accessSecret = tokenSecret;
+ this.userID = userID;
+ this.screenName = screenName;
+ }
+
+ @Deprecated
+ public static void deleteAll() {
+ new Delete().from(Model.class).execute();
+ }
+ }
+} \ No newline at end of file