aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence')
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java4
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/twitter/task/GetTalkTask.java26
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/util/BackgroundTask.java46
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/util/BiConsumer.java5
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java15
5 files changed, 78 insertions, 18 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java
index 5a2d1e55..d356eb9a 100644
--- a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java
+++ b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java
@@ -23,6 +23,10 @@ public class Tweet extends EntitySupport {
}
public synchronized static Tweet fromTwitter(final twitter4j.Status st) {
+ if (st == null) {
+ return null;
+ }
+
Tweet t = fetch(st.getId());
if (t == null) {
t = new Tweet(st);
diff --git a/app/src/main/java/net/lacolaco/smileessence/twitter/task/GetTalkTask.java b/app/src/main/java/net/lacolaco/smileessence/twitter/task/GetTalkTask.java
index 2c7f8205..6419d3f5 100644
--- a/app/src/main/java/net/lacolaco/smileessence/twitter/task/GetTalkTask.java
+++ b/app/src/main/java/net/lacolaco/smileessence/twitter/task/GetTalkTask.java
@@ -1,7 +1,9 @@
package net.lacolaco.smileessence.twitter.task;
+import net.lacolaco.smileessence.entity.Account;
import net.lacolaco.smileessence.entity.Tweet;
import net.lacolaco.smileessence.logging.Logger;
+import net.lacolaco.smileessence.util.BackgroundTask;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
@@ -9,26 +11,32 @@ import twitter4j.TwitterException;
import java.util.ArrayList;
import java.util.List;
-public class GetTalkTask extends TwitterTaskWithProgress<List<Tweet>, Tweet> {
+public class GetTalkTask extends BackgroundTask<List<Tweet>, Tweet> {
+ private final Account account;
private final long statusId;
- public GetTalkTask(Twitter twitter, long statusId) {
- super(twitter);
+ public GetTalkTask(Account account, long statusId) {
+ this.account = account;
this.statusId = statusId;
}
@Override
protected List<Tweet> doInBackground(Void... params) {
ArrayList<Tweet> list = new ArrayList<>();
+ long id = statusId;
try {
- long id = statusId;
while (id != -1) {
- Tweet tweet = Tweet.fromTwitter(twitter.showStatus(id));
- if (tweet != null) {
- publishProgress(tweet);
- list.add(tweet);
- } else {
+ Tweet tweet = Tweet.fetch(id);
+ if (tweet == null) {
+ tweet = Tweet.fromTwitter(account.getTwitter().showStatus(id));
+ }
+
+ if (tweet == null) {
break;
+ } else {
+ list.add(tweet);
+ publishProgress(tweet);
+ id = tweet.getInReplyTo();
}
}
} catch (TwitterException e) {
diff --git a/app/src/main/java/net/lacolaco/smileessence/util/BackgroundTask.java b/app/src/main/java/net/lacolaco/smileessence/util/BackgroundTask.java
new file mode 100644
index 00000000..fce3470e
--- /dev/null
+++ b/app/src/main/java/net/lacolaco/smileessence/util/BackgroundTask.java
@@ -0,0 +1,46 @@
+package net.lacolaco.smileessence.util;
+
+import android.os.AsyncTask;
+
+public abstract class BackgroundTask<Result, Progress> extends AsyncTask<Void, Progress, Result> {
+ private Consumer<Result> then;
+ private Consumer<Progress> progress;
+
+ public BackgroundTask<Result, Progress> onDone(Consumer<Result> cb) {
+ this.then = cb;
+ return this;
+ }
+
+ public BackgroundTask<Result, Progress> onProgress(Consumer<Progress> cb) {
+ this.progress = cb;
+ return this;
+ }
+
+ public BackgroundTask<Result, Progress> onDoneUI(Consumer<Result> cb) {
+ return onDone(r -> new UIHandler().post(() -> cb.accept(r)));
+ }
+
+ public BackgroundTask<Result, Progress> onProgressUI(Consumer<Progress> cb) {
+ return onProgress(p -> new UIHandler().post(() -> cb.accept(p)));
+ }
+
+ public boolean cancel() {
+ return cancel(true);
+ }
+
+ @Override
+ protected final void onProgressUpdate(Progress... values) {
+ for (Progress value : values) {
+ if (!isCancelled()) {
+ progress.accept(value);
+ }
+ }
+ }
+
+ @Override
+ protected final void onPostExecute(Result result) {
+ if (!isCancelled()) {
+ then.accept(result);
+ }
+ }
+}
diff --git a/app/src/main/java/net/lacolaco/smileessence/util/BiConsumer.java b/app/src/main/java/net/lacolaco/smileessence/util/BiConsumer.java
new file mode 100644
index 00000000..84179bf9
--- /dev/null
+++ b/app/src/main/java/net/lacolaco/smileessence/util/BiConsumer.java
@@ -0,0 +1,5 @@
+package net.lacolaco.smileessence.util;
+
+public interface BiConsumer<T, U> {
+ void accept(T t, U u);
+}
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java
index 12dcc01c..f31d6930 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java
+++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java
@@ -35,6 +35,7 @@ import net.lacolaco.smileessence.activity.MainActivity;
import net.lacolaco.smileessence.entity.Account;
import net.lacolaco.smileessence.entity.Tweet;
import net.lacolaco.smileessence.twitter.task.GetTalkTask;
+import net.lacolaco.smileessence.util.UIHandler;
import net.lacolaco.smileessence.view.adapter.StatusListAdapter;
import net.lacolaco.smileessence.viewmodel.StatusViewModel;
@@ -64,20 +65,16 @@ public class TalkChainDialogFragment extends StackableDialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
MainActivity activity = (MainActivity) getActivity();
final Account account = activity.getCurrentAccount();
- Twitter twitter = account.getTwitter();
+
View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_talk_list, null);
ListView listView = (ListView) view.findViewById(R.id.listview_dialog_talk_list);
final StatusListAdapter adapter = new StatusListAdapter(getActivity());
listView.setAdapter(adapter);
- new GetTalkTask(twitter, getStatusID()) {
- @Override
- protected void onProgressUpdate(Tweet... tweets) {
- Tweet tweet = tweets[0];
- adapter.addToBottom(new StatusViewModel(tweet));
- adapter.updateForce();
- }
- }.execute();
+ new GetTalkTask(account, getStatusID()).onProgressUI(tweet -> {
+ adapter.addToBottom(new StatusViewModel(tweet));
+ adapter.updateForce();
+ }).execute();
return new AlertDialog.Builder(activity)
.setTitle(R.string.dialog_title_talk_chain)