diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-10-03 20:31:30 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-10-03 20:31:30 +0900 |
commit | c7e44bfdf9c9934f6879258c6d50967bc93f08fc (patch) | |
tree | 24a84b8c223eb5c8785b838120efd1e3217a0369 | |
parent | 8e99b32745345bc3b76fb9249d0c73ba7c713116 (diff) | |
download | SmileEssence-c7e44bfdf9c9934f6879258c6d50967bc93f08fc.tar.gz |
アカウント変更時全てのページをリロードさせる
13 files changed, 268 insertions, 321 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java index f8fb631e..424a6cbd 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java +++ b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java @@ -69,7 +69,6 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou private TwitterStream stream; private Uri cameraTempFilePath; private UserStreamListener userStreamListener; - private boolean waitingAccount = true; public Uri getCameraTempFilePath() { return cameraTempFilePath; @@ -121,7 +120,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou } public void openSearchPage(String query) { - SearchFragment fragment = pagerAdapter.getFragment(SearchFragment.class); + SearchFragment fragment = (SearchFragment) pagerAdapter.getCachedFragment(pagerAdapter.getIndex(SearchFragment.class)); if (fragment != null) { fragment.startSearch(query); openSearchPage(); @@ -129,7 +128,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou } public void openUserListPage(String listFullName) { - UserListFragment fragment = pagerAdapter.getFragment(UserListFragment.class); + UserListFragment fragment = (UserListFragment) pagerAdapter.getCachedFragment(pagerAdapter.getIndex(UserListFragment.class)); if (fragment != null) { fragment.startUserList(listFullName); openUserListPage(); @@ -168,14 +167,6 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { - case REQUEST_MANAGE_ACCOUNT: { - if (waitingAccount) { - // first run - waitingAccount = false; - initializePages(); - } - break; - } case REQUEST_GET_PICTURE_FROM_GALLERY: case REQUEST_GET_PICTURE_FROM_CAMERA: { getImageUri(requestCode, resultCode, data); @@ -189,7 +180,6 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou Logger.debug("onCreate"); Application app = (Application) getApplication(); app.resetState(); - app.addOnCurrentAccountChangedListener(this); setTheme(app.getThemeResId()); super.onCreate(savedInstanceState); setContentView(R.layout.layout_main); @@ -203,12 +193,12 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou CommandSetting.initialize(); Account.load(); ExtractionWord.load(); + initializePages(); + app.addOnCurrentAccountChangedListener(this); Account account = getLastUsedAccount(); if (account != null) { - waitingAccount = false; app.setCurrentAccount(account); - initializePages(); IntentRouter.onNewIntent(this, getIntent()); } else { startActivityForResult(new Intent(this, ManageAccountsActivity.class), REQUEST_MANAGE_ACCOUNT); @@ -219,7 +209,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou protected void onDestroy() { super.onDestroy(); if (stream != null) { - new Thread(stream::shutdown).run(); + new Thread(stream::shutdown).start(); } Logger.debug("onDestroy"); } @@ -329,9 +319,9 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou openPostPageWithImage(uri); } - public boolean startStream() { + private boolean startStream() { if (stream != null) { - stream.shutdown(); + new Thread(stream::cleanUp).start(); } stream = Application.getInstance().getCurrentAccount().getTwitterStream(); userStreamListener = new UserStreamListener(Application.getInstance().getCurrentAccount()); @@ -343,12 +333,15 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou @Override public void onCurrentAccountChanged(Account account) { + Logger.debug(String.format("onCurrentAccountChanged: %s", account.getUser().getScreenName())); User user = account.getUser(); + // update cache account.refreshListSubscriptions(); account.refreshUserMuteList(); new ShowUserTask(account, account.getUserId()).execute(); + // update actionbar Runnable update = () -> { getActionBar().setTitle(user.getScreenName()); String newUrl = user.getProfileImageUrl(); @@ -369,10 +362,20 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou if (changes.contains(RBinding.BASIC)) update.run(); }); + // refresh all pages + for (int i = 0; i < pagerAdapter.getCount(); ++i) { + PageFragment pf = pagerAdapter.getCachedFragment(i); + if (pf != null && pf.isAdded()) { + Logger.debug(String.format("PageFragment %s is already attached; refreshing", pf.getClass().getName())); + pf.refresh(); + } + } + + // start user stream startStream(); } - // TODO: page fragments requires Application#getCurrentAccount returns Account + // TODO: tab order? private void initializePages() { pagerAdapter.addPage(PostFragment.class, getString(R.string.page_name_post), null, false); pagerAdapter.addPage(HomeFragment.class, getString(R.string.page_name_home), null, false); @@ -387,8 +390,9 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou pagerAdapter.addPage(UserListFragment.class, getString(R.string.page_name_list), null, false); pagerAdapter.notifyDataSetChanged(); viewPager.setOffscreenPageLimit(pagerAdapter.getCount()); - PostState.newState().beginTransaction().commit(); + viewPager.setAdapter(pagerAdapter); setSelectedPageIndex(pagerAdapter.getIndex(HomeFragment.class), false); + PostState.newState().beginTransaction().commit(); } private Account getLastUsedAccount() { diff --git a/app/src/main/java/net/lacolaco/smileessence/util/BackgroundTask.java b/app/src/main/java/net/lacolaco/smileessence/util/BackgroundTask.java index be5dd09f..dbe13d77 100644 --- a/app/src/main/java/net/lacolaco/smileessence/util/BackgroundTask.java +++ b/app/src/main/java/net/lacolaco/smileessence/util/BackgroundTask.java @@ -7,6 +7,7 @@ public abstract class BackgroundTask<Result, Progress> { private Consumer<Result> then; private Consumer<Progress> progress; private Consumer<Exception> fail; + private Runnable finish; private Exception exception; private final InnerAsyncTask task; @@ -29,6 +30,11 @@ public abstract class BackgroundTask<Result, Progress> { return this; } + public BackgroundTask<Result, Progress> onFinish(Runnable cb) { + this.finish = cb; + return this; + } + public BackgroundTask<Result, Progress> onDoneUI(Consumer<Result> cb) { return onDone(r -> new UIHandler().post(() -> cb.accept(r))); } @@ -41,6 +47,10 @@ public abstract class BackgroundTask<Result, Progress> { return onFail(e -> new UIHandler().post(() -> cb.accept(e))); } + public BackgroundTask<Result, Progress> onFinishUI(Runnable cb) { + return onFinish(() -> new UIHandler().post(cb::run)); + } + public boolean cancel() { return task.cancel(true); } @@ -83,6 +93,9 @@ public abstract class BackgroundTask<Result, Progress> { if (!isCancelled() && exception == null && then != null) { then.accept(result); } + if (finish != null) { + finish.run(); + } } @Override diff --git a/app/src/main/java/net/lacolaco/smileessence/view/CustomListFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/CustomListFragment.java index 1d04a741..eb92b201 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/CustomListFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/CustomListFragment.java @@ -55,12 +55,10 @@ public abstract class CustomListFragment<T extends CustomListAdapter> extends Pa @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { - } @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { - } // --------------------- Interface OnScrollListener --------------------- diff --git a/app/src/main/java/net/lacolaco/smileessence/view/HistoryFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/HistoryFragment.java index 9e1833e6..f7716721 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/HistoryFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/HistoryFragment.java @@ -25,7 +25,6 @@ package net.lacolaco.smileessence.view; import android.os.Bundle; -import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; import net.lacolaco.smileessence.twitter.StatusFilter; import net.lacolaco.smileessence.view.adapter.EventListAdapter; @@ -57,13 +56,7 @@ public class HistoryFragment extends CustomListFragment<EventListAdapter> { }, null); } - // --------------------- Interface OnRefreshListener2 --------------------- - - @Override - public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { - } - @Override - public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { + public void refresh() { } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/HomeFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/HomeFragment.java index 9f4dbed2..fed8cf7d 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/HomeFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/HomeFragment.java @@ -30,19 +30,17 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase; import net.lacolaco.smileessence.Application; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; -import net.lacolaco.smileessence.entity.Account; import net.lacolaco.smileessence.entity.Tweet; +import net.lacolaco.smileessence.logging.Logger; import net.lacolaco.smileessence.notification.NotificationType; import net.lacolaco.smileessence.notification.Notificator; import net.lacolaco.smileessence.preference.UserPreferenceHelper; import net.lacolaco.smileessence.twitter.StatusFilter; import net.lacolaco.smileessence.twitter.task.HomeTimelineTask; -import net.lacolaco.smileessence.util.UIHandler; +import net.lacolaco.smileessence.twitter.task.TimelineTask; import net.lacolaco.smileessence.view.adapter.StatusListAdapter; import net.lacolaco.smileessence.viewmodel.StatusViewModel; -import java.util.ListIterator; - public class HomeFragment extends CustomListFragment<StatusListAdapter> { // --------------------- GETTER / SETTER METHODS --------------------- @@ -67,66 +65,58 @@ public class HomeFragment extends CustomListFragment<StatusListAdapter> { adapter.removeByStatusID(id); adapter.updateForce(); }); - final Account account = Application.getInstance().getCurrentAccount(); - new HomeTimelineTask(account) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .onFail(e -> Notificator.getInstance().publish(R.string.notice_error_get_home, NotificationType.ALERT)) - .onDoneUI(tweets -> { - for (Tweet tweet : tweets) { - StatusViewModel statusViewModel = new StatusViewModel(tweet); - adapter.addToBottom(statusViewModel); - } - adapter.updateForce(); - }).execute(); + + if (Application.getInstance().getCurrentAccount() != null) { + Logger.debug(String.format("Current account %s is set; refreshing", Application.getInstance().getCurrentAccount().getUser().getScreenName())); + refresh(); + } } + @Override + public void refresh() { + runRefreshTask(new HomeTimelineTask(Application.getInstance().getCurrentAccount()), () -> getAdapter().updateForce()); + } // --------------------- Interface OnRefreshListener2 --------------------- @Override public void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) { final MainActivity activity = (MainActivity) getActivity(); - final StatusListAdapter adapter = getAdapter(); if (activity.isStreaming()) { - new UIHandler().post(() -> { - updateListViewWithNotice(refreshView.getRefreshableView(), true); - refreshView.onRefreshComplete(); - }); - return; + updateListViewWithNotice(refreshView.getRefreshableView(), true); + refreshView.onRefreshComplete(); + } else { + runRefreshTask( + new HomeTimelineTask(Application.getInstance().getCurrentAccount()) + .setSinceId(getAdapter().getTopID()), + () -> { + updateListViewWithNotice(refreshView.getRefreshableView(), true); + refreshView.onRefreshComplete(); + }); } - final Account currentAccount = Application.getInstance().getCurrentAccount(); - new HomeTimelineTask(currentAccount) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .setSinceId(adapter.getTopID()) - .onFail(e -> Notificator.getInstance().publish(R.string.notice_error_get_home, NotificationType.ALERT)) - .onDoneUI(tweets -> { - ListIterator<Tweet> li = tweets.listIterator(tweets.size()); - while (li.hasPrevious()) { - StatusViewModel viewModel = new StatusViewModel(li.previous()); - adapter.addToTop(viewModel); - StatusFilter.getInstance().filter(viewModel); - } - updateListViewWithNotice(refreshView.getRefreshableView(), true); - refreshView.onRefreshComplete(); - }).execute(); } @Override public void onPullUpToRefresh(final PullToRefreshBase<ListView> refreshView) { - final StatusListAdapter adapter = getAdapter(); - final Account currentAccount = Application.getInstance().getCurrentAccount(); - new HomeTimelineTask(currentAccount) + runRefreshTask( + new HomeTimelineTask(Application.getInstance().getCurrentAccount()) + .setMaxId(getAdapter().getLastID() - 1), + () -> { + updateListViewWithNotice(refreshView.getRefreshableView(), false); + refreshView.onRefreshComplete(); + }); + } + + private void runRefreshTask(TimelineTask<Tweet> task, Runnable onFinish) { + task .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .setMaxId(adapter.getLastID() - 1) .onFail(e -> Notificator.getInstance().publish(R.string.notice_error_get_home, NotificationType.ALERT)) .onDoneUI(tweets -> { for (Tweet tweet : tweets) { - StatusViewModel viewModel = new StatusViewModel(tweet); - adapter.addToBottom(viewModel); - StatusFilter.getInstance().filter(viewModel); + StatusFilter.getInstance().filter(new StatusViewModel(tweet)); } - updateListViewWithNotice(refreshView.getRefreshableView(), false); - refreshView.onRefreshComplete(); - }).execute(); + }) + .onFinishUI(onFinish) + .execute(); } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/MentionsFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/MentionsFragment.java index 7da1df18..8eb1d9e6 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/MentionsFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/MentionsFragment.java @@ -29,7 +29,6 @@ import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; import net.lacolaco.smileessence.Application; import net.lacolaco.smileessence.R; -import net.lacolaco.smileessence.entity.Account; import net.lacolaco.smileessence.entity.ExtractionWord; import net.lacolaco.smileessence.entity.Tweet; import net.lacolaco.smileessence.notification.NotificationType; @@ -37,6 +36,7 @@ import net.lacolaco.smileessence.notification.Notificator; import net.lacolaco.smileessence.preference.UserPreferenceHelper; import net.lacolaco.smileessence.twitter.StatusFilter; import net.lacolaco.smileessence.twitter.task.MentionsTimelineTask; +import net.lacolaco.smileessence.twitter.task.TimelineTask; import net.lacolaco.smileessence.view.adapter.StatusListAdapter; import net.lacolaco.smileessence.viewmodel.StatusViewModel; @@ -73,54 +73,51 @@ public class MentionsFragment extends CustomListFragment<StatusListAdapter> { adapter.removeByStatusID(id); adapter.updateForce(); }); - final Account account = Application.getInstance().getCurrentAccount(); - final StatusListAdapter adapter_ = adapter; - new MentionsTimelineTask(account) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_mentions, NotificationType.ALERT)) - .onDoneUI(tweets -> { - for (Tweet tweet : tweets) { - StatusViewModel statusViewModel = new StatusViewModel(tweet); - adapter_.addToBottom(statusViewModel); - StatusFilter.getInstance().filter(statusViewModel); - } - adapter_.updateForce(); - }).execute(); + + if (Application.getInstance().getCurrentAccount() != null) { + refresh(); + } + } + + @Override + public void refresh() { + runRefreshTask(new MentionsTimelineTask(Application.getInstance().getCurrentAccount()), () -> getAdapter().updateForce()); } // --------------------- Interface OnRefreshListener2 --------------------- @Override public void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) { - final Account currentAccount = Application.getInstance().getCurrentAccount(); - final StatusListAdapter adapter = getAdapter(); - new MentionsTimelineTask(currentAccount) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .setSinceId(adapter.getTopID()) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_mentions, NotificationType.ALERT)) - .onDoneUI(tweets -> { - for (int i = tweets.size() - 1; i >= 0; i--) { - adapter.addToTop(new StatusViewModel(tweets.get(i))); - } + runRefreshTask( + new MentionsTimelineTask(Application.getInstance().getCurrentAccount()) + .setSinceId(getAdapter().getTopID()), + () -> { updateListViewWithNotice(refreshView.getRefreshableView(), true); refreshView.onRefreshComplete(); - }).execute(); + }); } @Override public void onPullUpToRefresh(final PullToRefreshBase<ListView> refreshView) { - final Account currentAccount = Application.getInstance().getCurrentAccount(); - final StatusListAdapter adapter = getAdapter(); - new MentionsTimelineTask(currentAccount) + runRefreshTask( + new MentionsTimelineTask(Application.getInstance().getCurrentAccount()) + .setMaxId(getAdapter().getLastID() - 1), + () -> { + updateListViewWithNotice(refreshView.getRefreshableView(), false); + refreshView.onRefreshComplete(); + }); + } + + private void runRefreshTask(TimelineTask<Tweet> task, Runnable onFinish) { + task .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .setMaxId(adapter.getLastID() - 1) .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_mentions, NotificationType.ALERT)) .onDoneUI(tweets -> { for (Tweet tweet : tweets) { - adapter.addToBottom(new StatusViewModel(tweet)); + StatusFilter.getInstance().filter(new StatusViewModel(tweet)); } - updateListViewWithNotice(refreshView.getRefreshableView(), false); - refreshView.onRefreshComplete(); - }).execute(); + }) + .onFinishUI(onFinish) + .execute(); } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/MessagesFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/MessagesFragment.java index e3d77721..ed738fd1 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/MessagesFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/MessagesFragment.java @@ -29,7 +29,6 @@ import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; import net.lacolaco.smileessence.Application; import net.lacolaco.smileessence.R; -import net.lacolaco.smileessence.entity.Account; import net.lacolaco.smileessence.entity.DirectMessage; import net.lacolaco.smileessence.notification.NotificationType; import net.lacolaco.smileessence.notification.Notificator; @@ -37,6 +36,7 @@ import net.lacolaco.smileessence.preference.UserPreferenceHelper; import net.lacolaco.smileessence.twitter.StatusFilter; import net.lacolaco.smileessence.twitter.task.DirectMessagesTask; import net.lacolaco.smileessence.twitter.task.SentDirectMessagesTask; +import net.lacolaco.smileessence.twitter.task.TimelineTask; import net.lacolaco.smileessence.view.adapter.MessageListAdapter; import net.lacolaco.smileessence.viewmodel.MessageViewModel; @@ -67,60 +67,52 @@ public class MessagesFragment extends CustomListFragment<MessageListAdapter> { adapter.removeByMessageID(id); adapter.updateForce(); }); - final Account account = Application.getInstance().getCurrentAccount(); - new DirectMessagesTask(account) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_messages, NotificationType.ALERT)) - .onDoneUI(directMessages -> { - for (DirectMessage message : directMessages) { - adapter.addToBottom(new MessageViewModel(message)); - } - adapter.notifyDataSetChanged(); - }).execute(); - new SentDirectMessagesTask(account) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_messages, NotificationType.ALERT)) - .onDoneUI(directMessages -> { - for (DirectMessage message : directMessages) { - adapter.addToBottom(new MessageViewModel(message)); - } - adapter.notifyDataSetChanged(); - }).execute(); + + if (Application.getInstance().getCurrentAccount() != null) { + refresh(); + } + } + + @Override + public void refresh() { + runRefreshTask(new DirectMessagesTask(Application.getInstance().getCurrentAccount()), () -> getAdapter().updateForce()); + runRefreshTask(new SentDirectMessagesTask(Application.getInstance().getCurrentAccount()), () -> getAdapter().updateForce()); } // --------------------- Interface OnRefreshListener2 --------------------- @Override public void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) { - final Account currentAccount = Application.getInstance().getCurrentAccount(); - final MessageListAdapter adapter = getAdapter(); - new DirectMessagesTask(currentAccount) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .setSinceId(adapter.getTopID()) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_messages, NotificationType.ALERT)) - .onDoneUI(directMessages -> { - for (int i = directMessages.size() - 1; i >= 0; i--) { - adapter.addToTop(new MessageViewModel(directMessages.get(i))); - } - updateListViewWithNotice(refreshView.getRefreshableView(), true); - refreshView.onRefreshComplete(); - }).execute(); + runRefreshTask( + new DirectMessagesTask(Application.getInstance().getCurrentAccount()) + .setSinceId(getAdapter().getTopID()), + () -> { + updateListViewWithNotice(refreshView.getRefreshableView(), true); + refreshView.onRefreshComplete(); + }); // TODO: sent? } @Override public void onPullUpToRefresh(final PullToRefreshBase<ListView> refreshView) { - final Account currentAccount = Application.getInstance().getCurrentAccount(); - final MessageListAdapter adapter = getAdapter(); - new DirectMessagesTask(currentAccount) + runRefreshTask( + new DirectMessagesTask(Application.getInstance().getCurrentAccount()) + .setMaxId(getAdapter().getLastID() - 1), + () -> { + updateListViewWithNotice(refreshView.getRefreshableView(), false); + refreshView.onRefreshComplete(); + }); // TODO: sent? + } + + private void runRefreshTask(TimelineTask<DirectMessage> task, Runnable onFinish) { + task .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .setMaxId(adapter.getLastID() - 1) .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_messages, NotificationType.ALERT)) - .onDoneUI(directMessages -> { - for (DirectMessage directMessage : directMessages) { - adapter.addToBottom(new MessageViewModel(directMessage)); - } - updateListViewWithNotice(refreshView.getRefreshableView(), false); - refreshView.onRefreshComplete(); - }).execute(); + .onDoneUI(messages -> { + for (DirectMessage message : messages) { + StatusFilter.getInstance().filter(new MessageViewModel(message)); + } + }) + .onFinishUI(onFinish) + .execute(); } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/PageFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/PageFragment.java index a9108276..2fa199b3 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/PageFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/PageFragment.java @@ -14,4 +14,6 @@ public abstract class PageFragment<T extends Adapter> extends Fragment { protected void setAdapter(T _adapter) { adapter = _adapter; } + + public abstract void refresh(); } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/PostFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/PostFragment.java index b5457222..c864c45e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/PostFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/PostFragment.java @@ -64,8 +64,9 @@ public class PostFragment extends PageFragment implements TextWatcher, View.OnFo private ViewGroup viewGroupReply; private ViewGroup viewGroupMedia; - // ------------------------ INTERFACE METHODS ------------------------ - + @Override + public void refresh() { + } // --------------------- Interface OnClickListener --------------------- diff --git a/app/src/main/java/net/lacolaco/smileessence/view/SearchFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/SearchFragment.java index 6025e8bb..9e808a66 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/SearchFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/SearchFragment.java @@ -40,7 +40,6 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import net.lacolaco.smileessence.Application; import net.lacolaco.smileessence.R; -import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.CommandOpenSearch; import net.lacolaco.smileessence.entity.Account; @@ -52,7 +51,6 @@ import net.lacolaco.smileessence.preference.InternalPreferenceHelper; import net.lacolaco.smileessence.preference.UserPreferenceHelper; import net.lacolaco.smileessence.twitter.StatusFilter; import net.lacolaco.smileessence.twitter.task.SearchTask; -import net.lacolaco.smileessence.util.UIHandler; import net.lacolaco.smileessence.view.adapter.SearchListAdapter; import net.lacolaco.smileessence.view.dialog.SelectSearchQueryDialogFragment; import net.lacolaco.smileessence.viewmodel.StatusViewModel; @@ -83,6 +81,13 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem SearchListAdapter adapter = new SearchListAdapter(getActivity()); setAdapter(adapter); + if (Application.getInstance().getCurrentAccount() != null) { + refresh(); + } + } + + @Override + public void refresh() { //TODO String lastUsedSearchQuery = InternalPreferenceHelper.getInstance().get(R.string.key_last_used_search_query, ""); if (!TextUtils.isEmpty(lastUsedSearchQuery)) { startSearch(lastUsedSearchQuery); @@ -130,14 +135,11 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem @Override public void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) { - final Account currentAccount = Application.getInstance().getCurrentAccount(); final SearchListAdapter adapter = getAdapter(); String queryString = adapter.getQuery(); if (TextUtils.isEmpty(queryString)) { - new UIHandler().post(() -> { - notifyTextEmpty(); - refreshView.onRefreshComplete(); - }); + notifyTextEmpty(); + refreshView.onRefreshComplete(); return; } final Query query = new Query(); @@ -147,25 +149,12 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem if (adapter.getCount() > 0) { query.setSinceId(adapter.getTopID()); } - new SearchTask(currentAccount, query) - .onDoneUI(queryResult -> { - if (queryResult != null) { - List<twitter4j.Status> tweets = queryResult.getTweets(); - for (int i = tweets.size() - 1; i >= 0; i--) { - twitter4j.Status status = tweets.get(i); - if (!status.isRetweet()) { - StatusViewModel viewModel = new StatusViewModel(Tweet.fromTwitter(status, currentAccount.getUserId())); - adapter.addToTop(viewModel); - StatusFilter.getInstance().filter(viewModel); - } - } - updateListViewWithNotice(refreshView.getRefreshableView(), true); - adapter.setTopID(queryResult.getMaxId()); - refreshView.onRefreshComplete(); - } - }) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_search, NotificationType.ALERT)) - .execute(); + runRefreshTask( + new SearchTask(Application.getInstance().getCurrentAccount(), query), + () -> { + updateListViewWithNotice(refreshView.getRefreshableView(), true); + refreshView.onRefreshComplete(); + }); } @Override @@ -174,10 +163,8 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem final SearchListAdapter adapter = getAdapter(); String queryString = adapter.getQuery(); if (TextUtils.isEmpty(queryString)) { - new UIHandler().post(() -> { - notifyTextEmpty(); - refreshView.onRefreshComplete(); - }); + notifyTextEmpty(); + refreshView.onRefreshComplete(); return; } final Query query = new Query(); @@ -187,23 +174,12 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem if (adapter.getCount() > 0) { query.setMaxId(adapter.getLastID() - 1); } - new SearchTask(currentAccount, query) - .onDoneUI(queryResult -> { - if (queryResult != null) { - List<twitter4j.Status> tweets = queryResult.getTweets(); - for (twitter4j.Status status : tweets) { - if (!status.isRetweet()) { - StatusViewModel viewModel = new StatusViewModel(Tweet.fromTwitter(status, currentAccount.getUserId())); - adapter.addToBottom(viewModel); - StatusFilter.getInstance().filter(viewModel); - } - } - updateListViewWithNotice(refreshView.getRefreshableView(), false); - refreshView.onRefreshComplete(); - } - }) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_search, NotificationType.ALERT)) - .execute(); + runRefreshTask( + new SearchTask(Application.getInstance().getCurrentAccount(), query), + () -> { + updateListViewWithNotice(refreshView.getRefreshableView(), false); + refreshView.onRefreshComplete(); + }); } // ------------------------ OVERRIDE METHODS ------------------------ @@ -320,7 +296,7 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem if (TextUtils.isEmpty(text)) { Notificator.getInstance().publish(R.string.notice_query_is_empty, NotificationType.ALERT); } else { - ((MainActivity) getActivity()).openSearchPage(text); + startSearch(text); hideIME(); } } @@ -331,30 +307,37 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem if (!TextUtils.isEmpty(queryString)) { final SearchListAdapter adapter = getAdapter(); adapter.initSearch(queryString); - adapter.clear(); adapter.updateForce(); final Query query = new Query(); query.setQuery(queryString); query.setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()); query.setResultType(Query.RECENT); - new SearchTask(Application.getInstance().getCurrentAccount(), query) - .onDoneUI(queryResult -> { - if (queryResult != null) { - List<twitter4j.Status> tweets = queryResult.getTweets(); - for (int i = tweets.size() - 1; i >= 0; i--) { - twitter4j.Status status = tweets.get(i); - if (!status.isRetweet()) { - StatusViewModel viewModel = new StatusViewModel(Tweet.fromTwitter(status, Application.getInstance().getCurrentAccount().getUserId())); - adapter.addToTop(viewModel); - StatusFilter.getInstance().filter(viewModel); - } + runRefreshTask( + new SearchTask(Application.getInstance().getCurrentAccount(), query), + () -> { + adapter.updateForce(); + }); + } + } + + private void runRefreshTask(SearchTask task, Runnable onFinish) { + final SearchListAdapter adapter = getAdapter(); + final Account account = Application.getInstance().getCurrentAccount(); + task + .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_search, NotificationType.ALERT)) + .onDoneUI(queryResult -> { + if (queryResult != null) { + List<Tweet> tweets = Tweet.fromTwitter(queryResult.getTweets(), account.getUserId()); + for (Tweet tweet : tweets) { + if (!tweet.isRetweet()) { + StatusViewModel viewModel = new StatusViewModel(tweet); + StatusFilter.getInstance().filter(viewModel); + adapter.addToTop(viewModel); } - adapter.setTopID(queryResult.getMaxId()); - adapter.updateForce(); } - }) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_search, NotificationType.ALERT)) - .execute(); - } + } + }) + .onFinishUI(onFinish) + .execute(); } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/UserListFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/UserListFragment.java index e282287f..ec6575de 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/UserListFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/UserListFragment.java @@ -38,15 +38,14 @@ import com.handmark.pulltorefresh.library.PullToRefreshListView; import net.lacolaco.smileessence.Application; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; -import net.lacolaco.smileessence.entity.Account; import net.lacolaco.smileessence.entity.Tweet; import net.lacolaco.smileessence.notification.NotificationType; import net.lacolaco.smileessence.notification.Notificator; import net.lacolaco.smileessence.preference.InternalPreferenceHelper; import net.lacolaco.smileessence.preference.UserPreferenceHelper; import net.lacolaco.smileessence.twitter.StatusFilter; +import net.lacolaco.smileessence.twitter.task.TimelineTask; import net.lacolaco.smileessence.twitter.task.UserListStatusesTask; -import net.lacolaco.smileessence.util.UIHandler; import net.lacolaco.smileessence.view.adapter.UserListListAdapter; import net.lacolaco.smileessence.view.dialog.SelectUserListDialogFragment; import net.lacolaco.smileessence.viewmodel.StatusViewModel; @@ -76,11 +75,19 @@ public class UserListFragment extends CustomListFragment<UserListListAdapter> im UserListListAdapter adapter = new UserListListAdapter(getActivity()); setAdapter(adapter); + if (Application.getInstance().getCurrentAccount() != null) { + refresh(); + } + } + + @Override + public void refresh() {//TODO String lastUserList = InternalPreferenceHelper.getInstance().get(R.string.key_last_used_user_list, ""); if (!TextUtils.isEmpty(lastUserList)) { startUserList(lastUserList); } } + // --------------------- Interface OnClickListener --------------------- @Override @@ -98,58 +105,38 @@ public class UserListFragment extends CustomListFragment<UserListListAdapter> im @Override public void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) { - final Account currentAccount = Application.getInstance().getCurrentAccount(); final UserListListAdapter adapter = getAdapter(); String listFullName = adapter.getListFullName(); if (TextUtils.isEmpty(listFullName)) { - new UIHandler().post(() -> { - notifyTextEmpty(); - refreshView.onRefreshComplete(); - }); + notifyTextEmpty(); + refreshView.onRefreshComplete(); return; } - new UserListStatusesTask(currentAccount, listFullName) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .setSinceId(adapter.getTopID()) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_list, NotificationType.ALERT)) - .onDoneUI(tweets -> { - for (int i = tweets.size() - 1; i >= 0; i--) { - StatusViewModel statusViewModel = new StatusViewModel(tweets.get(i)); - adapter.addToTop(statusViewModel); - StatusFilter.getInstance().filter(statusViewModel); - } + runRefreshTask( + new UserListStatusesTask(Application.getInstance().getCurrentAccount(), listFullName) + .setSinceId(adapter.getTopID()), + () -> { updateListViewWithNotice(refreshView.getRefreshableView(), true); refreshView.onRefreshComplete(); - }) - .execute(); + }); } @Override public void onPullUpToRefresh(final PullToRefreshBase<ListView> refreshView) { - final Account currentAccount = Application.getInstance().getCurrentAccount(); final UserListListAdapter adapter = getAdapter(); String listFullName = adapter.getListFullName(); if (TextUtils.isEmpty(listFullName)) { - new UIHandler().post(() -> { - notifyTextEmpty(); - refreshView.onRefreshComplete(); - }); + notifyTextEmpty(); + refreshView.onRefreshComplete(); return; } - new UserListStatusesTask(currentAccount, listFullName) - .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) - .setMaxId(adapter.getLastID() - 1) - .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_list, NotificationType.ALERT)) - .onDoneUI(tweets -> { - for (Tweet tweet : tweets) { - StatusViewModel statusViewModel = new StatusViewModel(tweet); - adapter.addToBottom(statusViewModel); - StatusFilter.getInstance().filter(statusViewModel); - } + runRefreshTask( + new UserListStatusesTask(Application.getInstance().getCurrentAccount(), listFullName) + .setMaxId(adapter.getLastID() - 1), + () -> { updateListViewWithNotice(refreshView.getRefreshableView(), false); refreshView.onRefreshComplete(); - }) - .execute(); + }); } // ------------------------ OVERRIDE METHODS ------------------------ @@ -203,17 +190,24 @@ public class UserListFragment extends CustomListFragment<UserListListAdapter> im adapter.setListFullName(listFullName); adapter.clear(); adapter.updateForce(); - new UserListStatusesTask(Application.getInstance().getCurrentAccount(), listFullName) + runRefreshTask( + new UserListStatusesTask(Application.getInstance().getCurrentAccount(), listFullName), + () -> adapter.updateForce()); + } + + private void runRefreshTask(TimelineTask<Tweet> task, Runnable onFinish) { + final UserListListAdapter adapter = getAdapter(); + task .setCount(UserPreferenceHelper.getInstance().getRequestCountPerPage()) .onFail(x -> Notificator.getInstance().publish(R.string.notice_error_get_list, NotificationType.ALERT)) .onDoneUI(tweets -> { for (Tweet tweet : tweets) { StatusViewModel statusViewModel = new StatusViewModel(tweet); - adapter.addToBottom(statusViewModel); StatusFilter.getInstance().filter(statusViewModel); + adapter.addToBottom(statusViewModel); } - adapter.updateForce(); }) + .onFinishUI(onFinish) .execute(); } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.java index a404e823..aa32563f 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.java @@ -24,42 +24,57 @@ package net.lacolaco.smileessence.view.adapter; -import android.app.Fragment; -import android.content.Context; import android.os.Bundle; import android.support.v13.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; -import android.widget.ArrayAdapter; -import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.logging.Logger; import net.lacolaco.smileessence.view.PageFragment; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; -public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener {//, ActionBar.OnNavigationListener { +public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener { // ------------------------------ FIELDS ------------------------------ - private final MainActivity context; - //private final ActionBar actionBar; - private final ViewPager viewPager; private final List<PageInfo> pages = new ArrayList<>(); + private final Map<Integer, WeakReference<PageFragment>> fragmentCache = new HashMap<>(); - // --------------------------- CONSTRUCTORS --------------------------- + // --------------------------- FragmentPagerAdapter --------------------------- public PageListAdapter(MainActivity _activity, ViewPager _viewPager) { super(_activity.getFragmentManager()); - context = _activity; - //actionBar = _activity.getActionBar(); - viewPager = _viewPager; - viewPager.setAdapter(this); - viewPager.addOnPageChangeListener(this); + _viewPager.addOnPageChangeListener(this); } - // --------------------- GETTER / SETTER METHODS --------------------- + @Override + public synchronized PageFragment getItem(int position) { + PageFragment pf; + PageInfo info = pages.get(position); + try { + pf = info.getFragmentClass().newInstance(); + } catch (Exception e) { + Logger.error("should not happen: fragmentClass is private or Android is broken?"); + e.printStackTrace(); + throw new RuntimeException(e); + } + pf.setArguments(info.getArgs()); + fragmentCache.put(position, new WeakReference<>(pf)); + return pf; + } + + public synchronized PageFragment getCachedFragment(int pos) { + WeakReference<PageFragment> wpf = fragmentCache.get(pos); + if (wpf == null) { + return null; + } else { + return wpf.get(); + } + } @Override public synchronized int getCount() { @@ -68,15 +83,6 @@ public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.O // ------------------------ INTERFACE METHODS ------------------------ - - // --------------------- Interface OnNavigationListener --------------------- - - //@Override - //public synchronized boolean onNavigationItemSelected(int itemPosition, long itemId) { - // viewPager.setCurrentItem(itemPosition, true); - // return true; - //} - // --------------------- Interface OnPageChangeListener --------------------- @Override @@ -86,7 +92,7 @@ public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.O @Override public synchronized void onPageSelected(int position) { //Synchronize pager and navigation. - Logger.debug(String.format("Page selected:%d", position)); + Logger.debug(String.format("Page selected: %d", position)); //actionBar.setSelectedNavigationItem(position); } @@ -96,12 +102,6 @@ public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.O // -------------------------- OTHER METHODS -------------------------- - @Override - public synchronized Fragment getItem(int position) { - PageInfo info = pages.get(position); - return info.instantiate(context); - } - public void addPage(Class<? extends PageFragment> klass, String name, Bundle args) { this.addPage(klass, name, args, true); } @@ -125,7 +125,7 @@ public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.O for (PageInfo f : pages) { itemList.add(f.getName()); } - ArrayAdapter<String> adapter = new ArrayAdapter<>(context, R.layout.navigation_list_item, R.id.navigation_list_item_text, itemList); + //ArrayAdapter<String> adapter = new ArrayAdapter<>(context, R.layout.navigation_list_item, R.id.navigation_list_item_text, itemList); //actionBar.setListNavigationCallbacks(adapter, this); super.notifyDataSetChanged(); } @@ -140,21 +140,10 @@ public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.O return -1; } - @Deprecated @SuppressWarnings("unchecked") - public <T extends PageFragment> T getFragment(Class<T> fragmentClass) { - for(PageInfo info : pages) { - if (info.getFragmentClass() == fragmentClass) { - return (T) info.getCachedInstance(); - } - } - return null; - } - private static final class PageInfo { private final Class<? extends PageFragment> fragmentClass; private final Bundle args; private final String name; - private WeakReference<PageFragment> fragmentCache; PageInfo(Class<? extends PageFragment> _fragmentClass, String _name, Bundle _args) { fragmentClass = _fragmentClass; @@ -171,15 +160,5 @@ public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.O public Bundle getArgs() { return args; } - - public PageFragment instantiate(Context context) { - PageFragment fragment = (PageFragment) Fragment.instantiate(context, getFragmentClass().getName(), getArgs()); - fragmentCache = new WeakReference<>(fragment); - return fragment; - } - - public PageFragment getCachedInstance() { - return fragmentCache.get(); - } } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/SearchListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/SearchListAdapter.java index 3cf4e6a5..8c535c85 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/SearchListAdapter.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/SearchListAdapter.java @@ -30,7 +30,7 @@ public class SearchListAdapter extends StatusListAdapter { // ------------------------------ FIELDS ------------------------------ - private long topID; + //private long topID; private String query; private OnQueryChangeListener listener; @@ -50,14 +50,14 @@ public class SearchListAdapter extends StatusListAdapter { return query; } - @Override - public long getTopID() { - return topID; - } + //@Override + //public long getTopID() { + // return topID; + //} - public void setTopID(long topID) { - this.topID = topID; - } + //public void setTopID(long topID) { + // this.topID = topID; + //} public void setOnQueryChangeListener(OnQueryChangeListener listener) { this.listener = listener; @@ -67,7 +67,8 @@ public class SearchListAdapter extends StatusListAdapter { public void initSearch(String query) { this.query = query; - topID = 0; + clear(); + // topID = 0; if (listener != null) { listener.onQueryChange(query); } |