diff options
Diffstat (limited to 'app/src')
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) |