diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-09-13 19:45:46 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-09-13 19:45:46 +0900 |
commit | 32196e2761b7219634f0b502268145b902f764f5 (patch) | |
tree | 7458bfd37e354c79f6c3d00c00c25f7d30dcfe6b /app/src/main/java/net/lacolaco/smileessence/view | |
parent | d010a1af8b35c18f99d07c41a6b6a78c67aa1cdd (diff) | |
download | SmileEssence-32196e2761b7219634f0b502268145b902f764f5.tar.gz |
Adapter のインスタンスを MainActivity ではなく個々の Fragment に持たせた
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/view')
14 files changed, 263 insertions, 291 deletions
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 e9eccabc..51dd6477 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/CustomListFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/CustomListFragment.java @@ -24,7 +24,6 @@ package net.lacolaco.smileessence.view; -import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -37,25 +36,17 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import net.lacolaco.smileessence.R; -import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.notification.Notificator; import net.lacolaco.smileessence.view.adapter.CustomListAdapter; -public abstract class CustomListFragment extends PageFragment implements AbsListView.OnScrollListener, +public abstract class CustomListFragment<T extends CustomListAdapter> extends PageFragment<T> implements AbsListView.OnScrollListener, PullToRefreshBase.OnRefreshListener2<ListView> { // ------------------------------ FIELDS ------------------------------ public static final int SCROLL_DURATION = 1500; - // --------------------- GETTER / SETTER METHODS --------------------- - protected abstract MainActivity.AdapterID getAdapterIndex(); - - protected CustomListAdapter<?> getListAdapter() { - return ((MainActivity) getActivity()).getListAdapter(getAdapterIndex()); - } - protected PullToRefreshBase.Mode getRefreshMode() { return PullToRefreshBase.Mode.DISABLED; } @@ -79,7 +70,7 @@ public abstract class CustomListFragment extends PageFragment implements AbsList @Override public void onScrollStateChanged(AbsListView absListView, int scrollState) { - CustomListAdapter<?> adapter = getListAdapter(); + T adapter = getAdapter(); adapter.setNotifiable(false); if (absListView.getFirstVisiblePosition() == 0 && absListView.getChildAt(0) != null && absListView.getChildAt(0).getTop() == 0) { @@ -104,7 +95,7 @@ public abstract class CustomListFragment extends PageFragment implements AbsList public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View page = inflater.inflate(R.layout.fragment_list, container, false); PullToRefreshListView listView = getListView(page); - ListAdapter adapter = getListAdapter(); + ListAdapter adapter = getAdapter(); listView.setAdapter(adapter); listView.setOnScrollListener(this); listView.setOnRefreshListener(this); 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 a26832c1..6e6d96bd 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/HistoryFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/HistoryFragment.java @@ -24,31 +24,41 @@ package net.lacolaco.smileessence.view; +import android.os.Bundle; import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; +import net.lacolaco.smileessence.twitter.StatusFilter; +import net.lacolaco.smileessence.view.adapter.EventListAdapter; +import net.lacolaco.smileessence.viewmodel.EventViewModel; /** * Fragment for notice history */ -public class HistoryFragment extends CustomListFragment { +public class HistoryFragment extends CustomListFragment<EventListAdapter> { // --------------------- GETTER / SETTER METHODS --------------------- @Override - protected MainActivity.AdapterID getAdapterIndex() { - return MainActivity.AdapterID.History; - } - - @Override protected PullToRefreshBase.Mode getRefreshMode() { return PullToRefreshBase.Mode.DISABLED; } // ------------------------ INTERFACE METHODS ------------------------ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EventListAdapter adapter = new EventListAdapter(getActivity()); + setAdapter(adapter); + + StatusFilter.getInstance().register(this, EventViewModel.class, (EventViewModel vm) -> { + adapter.addToTop(vm); + adapter.update(); + }); + } // --------------------- Interface OnRefreshListener2 --------------------- 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 23b1339b..8f090869 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/HomeFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/HomeFragment.java @@ -24,11 +24,11 @@ package net.lacolaco.smileessence.view; +import android.os.Bundle; import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; -import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.entity.Account; import net.lacolaco.smileessence.entity.Tweet; @@ -46,33 +46,54 @@ import twitter4j.Twitter; import java.util.List; import java.util.ListIterator; -public class HomeFragment extends CustomListFragment { +public class HomeFragment extends CustomListFragment<StatusListAdapter> { // --------------------- GETTER / SETTER METHODS --------------------- @Override - protected MainActivity.AdapterID getAdapterIndex() { - return MainActivity.AdapterID.Home; - } - - @Override protected PullToRefreshBase.Mode getRefreshMode() { return PullToRefreshBase.Mode.BOTH; } // ------------------------ INTERFACE METHODS ------------------------ + @Override // onCreate って Fragment のインスタンスが作られるときは必ず呼ばれるって認識でいいんだよね? + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + StatusListAdapter adapter = new StatusListAdapter(getActivity()); + setAdapter(adapter); + + StatusFilter.getInstance().register(this, StatusViewModel.class, (StatusViewModel tweet) -> { + adapter.addToTop(tweet); + adapter.update(); + }); + final Twitter twitter = TwitterApi.getTwitter(((MainActivity) getActivity()).getCurrentAccount()); + final Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount((MainActivity) getActivity())); + new HomeTimelineTask(twitter, paging) { + @Override + protected void onPostExecute(List<Tweet> tweets) { + super.onPostExecute(tweets); + for (Tweet tweet : tweets) { + StatusViewModel statusViewModel = new StatusViewModel(tweet); + adapter.addToBottom(statusViewModel); + StatusFilter.getInstance().filter(statusViewModel); + } + adapter.updateForce(); + } + }.execute(); + } + // --------------------- Interface OnRefreshListener2 --------------------- @Override public void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) { final MainActivity activity = (MainActivity) getActivity(); + final StatusListAdapter adapter = getAdapter(); if (activity.isStreaming()) { new UIHandler() { @Override public void run() { - StatusListAdapter adapter = (StatusListAdapter) getListAdapter(); updateListViewWithNotice(refreshView.getRefreshableView(), adapter, true); refreshView.onRefreshComplete(); } @@ -81,7 +102,6 @@ public class HomeFragment extends CustomListFragment { } final Account currentAccount = activity.getCurrentAccount(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final StatusListAdapter adapter = (StatusListAdapter) getListAdapter(); Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount(activity)); if (adapter.getCount() > 0) { paging.setSinceId(adapter.getTopID()); @@ -94,7 +114,7 @@ public class HomeFragment extends CustomListFragment { while (li.hasPrevious()) { StatusViewModel viewModel = new StatusViewModel(li.previous()); adapter.addToTop(viewModel); - StatusFilter.filter(activity, viewModel); + StatusFilter.getInstance().filter(viewModel); } updateListViewWithNotice(refreshView.getRefreshableView(), adapter, true); refreshView.onRefreshComplete(); @@ -105,9 +125,9 @@ public class HomeFragment extends CustomListFragment { @Override public void onPullUpToRefresh(final PullToRefreshBase<ListView> refreshView) { final MainActivity activity = (MainActivity) getActivity(); + final StatusListAdapter adapter = getAdapter(); final Account currentAccount = activity.getCurrentAccount(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final StatusListAdapter adapter = (StatusListAdapter) getListAdapter(); Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount(activity)); if (adapter.getCount() > 0) { paging.setMaxId(adapter.getLastID() - 1); @@ -119,7 +139,7 @@ public class HomeFragment extends CustomListFragment { for (Tweet tweet : tweets) { StatusViewModel viewModel = new StatusViewModel(tweet); adapter.addToBottom(viewModel); - StatusFilter.filter(activity, viewModel); + StatusFilter.getInstance().filter(viewModel); } updateListViewWithNotice(refreshView.getRefreshableView(), adapter, false); refreshView.onRefreshComplete(); 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 831bd41e..a78042c2 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/MentionsFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/MentionsFragment.java @@ -24,14 +24,16 @@ package net.lacolaco.smileessence.view; +import android.os.Bundle; import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; -import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.entity.Account; +import net.lacolaco.smileessence.entity.ExtractionWord; import net.lacolaco.smileessence.entity.Tweet; +import net.lacolaco.smileessence.twitter.StatusFilter; import net.lacolaco.smileessence.twitter.TwitterApi; import net.lacolaco.smileessence.twitter.task.MentionsTimelineTask; import net.lacolaco.smileessence.twitter.util.TwitterUtils; @@ -42,23 +44,50 @@ import twitter4j.Paging; import twitter4j.Twitter; import java.util.List; +import java.util.regex.Pattern; -public class MentionsFragment extends CustomListFragment { +public class MentionsFragment extends CustomListFragment<StatusListAdapter> { // --------------------- GETTER / SETTER METHODS --------------------- @Override - protected MainActivity.AdapterID getAdapterIndex() { - return MainActivity.AdapterID.Mentions; - } - - @Override protected PullToRefreshBase.Mode getRefreshMode() { return PullToRefreshBase.Mode.BOTH; } // ------------------------ INTERFACE METHODS ------------------------ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + StatusListAdapter adapter = new StatusListAdapter(getActivity()); + setAdapter(adapter); + StatusFilter.getInstance().register(this, StatusViewModel.class, (StatusViewModel tweet) -> { + for (ExtractionWord word : ExtractionWord.getAll()) { + Pattern pattern = Pattern.compile(word.text); + if (pattern.matcher(tweet.getTweet().getText()).find()) { + adapter.addToTop(tweet); + adapter.update(); + return; + } + } + }); + final Twitter twitter = TwitterApi.getTwitter(((MainActivity) getActivity()).getCurrentAccount()); + final Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount((MainActivity) getActivity())); + final StatusListAdapter adapter_ = adapter; + new MentionsTimelineTask(twitter, paging) { + @Override + protected void onPostExecute(List<Tweet> tweets) { + super.onPostExecute(tweets); + for (Tweet tweet : tweets) { + StatusViewModel statusViewModel = new StatusViewModel(tweet); + adapter_.addToBottom(statusViewModel); + StatusFilter.getInstance().filter(statusViewModel); + } + adapter_.updateForce(); + } + }.execute(); + } // --------------------- Interface OnRefreshListener2 --------------------- @@ -66,8 +95,8 @@ public class MentionsFragment extends CustomListFragment { public void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) { final MainActivity activity = (MainActivity) getActivity(); final Account currentAccount = activity.getCurrentAccount(); + final StatusListAdapter adapter = getAdapter(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final StatusListAdapter adapter = (StatusListAdapter) getListAdapter(); Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount(activity)); if (adapter.getCount() > 0) { paging.setSinceId(adapter.getTopID()); @@ -89,8 +118,8 @@ public class MentionsFragment extends CustomListFragment { public void onPullUpToRefresh(final PullToRefreshBase<ListView> refreshView) { final MainActivity activity = (MainActivity) getActivity(); final Account currentAccount = activity.getCurrentAccount(); + final StatusListAdapter adapter = getAdapter(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final StatusListAdapter adapter = (StatusListAdapter) getListAdapter(); Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount(activity)); if (adapter.getCount() > 0) { paging.setMaxId(adapter.getLastID() - 1); 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 ac0e8067..29a8a9c3 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/MessagesFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/MessagesFragment.java @@ -24,15 +24,17 @@ package net.lacolaco.smileessence.view; +import android.os.Bundle; import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; -import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.entity.Account; +import net.lacolaco.smileessence.twitter.StatusFilter; import net.lacolaco.smileessence.twitter.TwitterApi; import net.lacolaco.smileessence.twitter.task.DirectMessagesTask; +import net.lacolaco.smileessence.twitter.task.SentDirectMessagesTask; import net.lacolaco.smileessence.twitter.util.TwitterUtils; import net.lacolaco.smileessence.view.adapter.MessageListAdapter; import net.lacolaco.smileessence.viewmodel.MessageViewModel; @@ -46,22 +48,50 @@ import java.util.List; /** * Fragment of messages list */ -public class MessagesFragment extends CustomListFragment { +public class MessagesFragment extends CustomListFragment<MessageListAdapter> { // --------------------- GETTER / SETTER METHODS --------------------- @Override - protected MainActivity.AdapterID getAdapterIndex() { - return MainActivity.AdapterID.Messages; - } - - @Override protected PullToRefreshBase.Mode getRefreshMode() { return PullToRefreshBase.Mode.BOTH; } // ------------------------ INTERFACE METHODS ------------------------ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + MessageListAdapter adapter = new MessageListAdapter(getActivity()); + setAdapter(adapter); + + StatusFilter.getInstance().register(this, MessageViewModel.class, (MessageViewModel message) -> { + adapter.addToTop(message); + adapter.update(); + }); + final Twitter twitter = TwitterApi.getTwitter(((MainActivity) getActivity()).getCurrentAccount()); + final Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount((MainActivity) getActivity())); + new DirectMessagesTask(twitter, paging) { + @Override + protected void onPostExecute(List<DirectMessage> directMessages) { + super.onPostExecute(directMessages); + for (DirectMessage message : directMessages) { + adapter.addToBottom(new MessageViewModel(message)); + } + adapter.notifyDataSetChanged(); + } + }.execute(); + new SentDirectMessagesTask(twitter, paging) { + @Override + protected void onPostExecute(List<DirectMessage> directMessages) { + super.onPostExecute(directMessages); + for (DirectMessage message : directMessages) { + adapter.addToBottom(new MessageViewModel(message)); + } + adapter.notifyDataSetChanged(); + } + }.execute(); + } // --------------------- Interface OnRefreshListener2 --------------------- @@ -70,7 +100,7 @@ public class MessagesFragment extends CustomListFragment { final MainActivity activity = (MainActivity) getActivity(); final Account currentAccount = activity.getCurrentAccount(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final MessageListAdapter adapter = (MessageListAdapter) getListAdapter(); + final MessageListAdapter adapter = getAdapter(); Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount(activity)); if (adapter.getCount() > 0) { paging.setSinceId(adapter.getTopID()); @@ -93,7 +123,7 @@ public class MessagesFragment extends CustomListFragment { final MainActivity activity = (MainActivity) getActivity(); final Account currentAccount = activity.getCurrentAccount(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final MessageListAdapter adapter = (MessageListAdapter) getListAdapter(); + final MessageListAdapter adapter = getAdapter(); Paging paging = TwitterUtils.getPaging(TwitterUtils.getPagingCount(activity)); if (adapter.getCount() > 0) { paging.setMaxId(adapter.getLastID() - 1); 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 b5f54474..a9108276 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/PageFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/PageFragment.java @@ -1,6 +1,17 @@ package net.lacolaco.smileessence.view; import android.app.Fragment; +import android.widget.Adapter; -public abstract class PageFragment extends Fragment { +public abstract class PageFragment<T extends Adapter> extends Fragment { + private T adapter; + + protected T getAdapter() { + if (adapter == null) throw new IllegalStateException("adapter is not initialized"); + return adapter; + } + + protected void setAdapter(T _adapter) { + adapter = _adapter; + } } 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 4b5318f6..797069d1 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/PostFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/PostFragment.java @@ -51,7 +51,7 @@ import net.lacolaco.smileessence.twitter.util.TwitterUtils; import net.lacolaco.smileessence.util.BitmapThumbnailTask; import net.lacolaco.smileessence.util.IntentUtils; import net.lacolaco.smileessence.util.UIHandler; -import net.lacolaco.smileessence.view.adapter.PostState; +import net.lacolaco.smileessence.data.PostState; import net.lacolaco.smileessence.view.dialog.PostMenuDialogFragment; import net.lacolaco.smileessence.view.dialog.SelectImageDialogFragment; import net.lacolaco.smileessence.viewmodel.StatusViewModel; 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 f1a069bc..d82b740a 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/SearchFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/SearchFragment.java @@ -58,13 +58,14 @@ import net.lacolaco.smileessence.view.adapter.SearchListAdapter; import net.lacolaco.smileessence.view.dialog.SelectSearchQueryDialogFragment; import net.lacolaco.smileessence.viewmodel.StatusViewModel; +import twitter4j.Paging; import twitter4j.Query; import twitter4j.QueryResult; import twitter4j.Twitter; import java.util.List; -public class SearchFragment extends CustomListFragment implements View.OnClickListener, View.OnFocusChangeListener, +public class SearchFragment extends CustomListFragment<SearchListAdapter> implements View.OnClickListener, View.OnFocusChangeListener, SearchListAdapter.OnQueryChangeListener { // ------------------------------ FIELDS ------------------------------ @@ -74,17 +75,26 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi // --------------------- GETTER / SETTER METHODS --------------------- @Override - protected MainActivity.AdapterID getAdapterIndex() { - return MainActivity.AdapterID.Search; - } - - @Override protected PullToRefreshBase.Mode getRefreshMode() { return PullToRefreshBase.Mode.BOTH; } // ------------------------ INTERFACE METHODS ------------------------ + @Override // onCreate って Fragment のインスタンスが作られるときは必ず呼ばれるって認識でいいんだよね? + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + SearchListAdapter adapter = new SearchListAdapter(getActivity()); + setAdapter(adapter); + + final MainActivity activity = (MainActivity) getActivity(); + final Twitter twitter = TwitterApi.getTwitter(activity.getCurrentAccount()); + String lastUsedSearchQuery = activity.getLastSearch(); + if (!TextUtils.isEmpty(lastUsedSearchQuery)) { + startSearch(twitter, lastUsedSearchQuery); + } + } // --------------------- Interface OnClickListener --------------------- @@ -130,7 +140,7 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi final MainActivity activity = (MainActivity) getActivity(); final Account currentAccount = activity.getCurrentAccount(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final SearchListAdapter adapter = getListAdapter(activity); + final SearchListAdapter adapter = getAdapter(); String queryString = adapter.getQuery(); if (TextUtils.isEmpty(queryString)) { new UIHandler() { @@ -160,7 +170,7 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi if (!status.isRetweet()) { StatusViewModel viewModel = new StatusViewModel(Tweet.fromTwitter(status)); adapter.addToTop(viewModel); - StatusFilter.filter(activity, viewModel); + StatusFilter.getInstance().filter(viewModel); } } updateListViewWithNotice(refreshView.getRefreshableView(), adapter, true); @@ -176,7 +186,7 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi final MainActivity activity = (MainActivity) getActivity(); final Account currentAccount = activity.getCurrentAccount(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final SearchListAdapter adapter = getListAdapter(activity); + final SearchListAdapter adapter = getAdapter(); String queryString = adapter.getQuery(); if (TextUtils.isEmpty(queryString)) { new UIHandler() { @@ -205,7 +215,7 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi if (!status.isRetweet()) { StatusViewModel viewModel = new StatusViewModel(Tweet.fromTwitter(status)); adapter.addToBottom(viewModel); - StatusFilter.filter(activity, viewModel); + StatusFilter.getInstance().filter(viewModel); } } updateListViewWithNotice(refreshView.getRefreshableView(), adapter, false); @@ -223,12 +233,6 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi } @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - } - - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.removeItem(R.id.actionbar_search); @@ -238,7 +242,7 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View page = inflater.inflate(R.layout.fragment_search, container, false); PullToRefreshListView listView = getListView(page); - SearchListAdapter adapter = (SearchListAdapter) getListAdapter(); + SearchListAdapter adapter = getAdapter(); listView.setAdapter(adapter); listView.setOnScrollListener(this); listView.setOnRefreshListener(this); @@ -289,10 +293,6 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi return (ImageButton) page.findViewById(R.id.button_search_execute); } - private SearchListAdapter getListAdapter(MainActivity activity) { - return (SearchListAdapter) activity.getListAdapter(MainActivity.AdapterID.Search); - } - private ImageButton getQueriesButton(View page) { return (ImageButton) page.findViewById(R.id.button_search_queries); } @@ -347,4 +347,37 @@ public class SearchFragment extends CustomListFragment implements View.OnClickLi } } } + + public void startSearch(final Twitter twitter, final String queryString) { + ((MainActivity) getActivity()).setLastSearch(queryString); + 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(TwitterUtils.getPagingCount((MainActivity) getActivity())); + query.setResultType(Query.RECENT); + new SearchTask(twitter, query) { + @Override + protected void onPostExecute(QueryResult queryResult) { + super.onPostExecute(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)); + adapter.addToTop(viewModel); + StatusFilter.getInstance().filter(viewModel); + } + } + adapter.setTopID(queryResult.getMaxId()); + adapter.updateForce(); + } + } + }.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 3733358a..6b805cc5 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/UserListFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/UserListFragment.java @@ -56,7 +56,7 @@ import twitter4j.Twitter; import java.util.List; -public class UserListFragment extends CustomListFragment implements View.OnClickListener { +public class UserListFragment extends CustomListFragment<UserListListAdapter> implements View.OnClickListener { // ------------------------------ FIELDS ------------------------------ @@ -69,18 +69,24 @@ public class UserListFragment extends CustomListFragment implements View.OnClick } @Override - protected MainActivity.AdapterID getAdapterIndex() { - return MainActivity.AdapterID.UserList; - } - - @Override protected PullToRefreshBase.Mode getRefreshMode() { return PullToRefreshBase.Mode.BOTH; } // ------------------------ INTERFACE METHODS ------------------------ + @Override // onCreate って Fragment のインスタンスが作られるときは必ず呼ばれるって認識でいいんだよね? + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + UserListListAdapter adapter = new UserListListAdapter(getActivity()); + setAdapter(adapter); + final Twitter twitter = TwitterApi.getTwitter(((MainActivity) getActivity()).getCurrentAccount()); + String lastUserList = getMainActivity().getLastUserList(); + if (!TextUtils.isEmpty(lastUserList)) { + startUserList(twitter, lastUserList); + } + } // --------------------- Interface OnClickListener --------------------- @Override @@ -101,7 +107,7 @@ public class UserListFragment extends CustomListFragment implements View.OnClick final MainActivity activity = getMainActivity(); final Account currentAccount = activity.getCurrentAccount(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final UserListListAdapter adapter = (UserListListAdapter) getListAdapter(); + final UserListListAdapter adapter = (UserListListAdapter) getAdapter(); String listFullName = adapter.getListFullName(); if (TextUtils.isEmpty(listFullName)) { new UIHandler() { @@ -117,14 +123,14 @@ public class UserListFragment extends CustomListFragment implements View.OnClick if (adapter.getCount() > 0) { paging.setSinceId(adapter.getTopID()); } - new UserListStatusesTask(twitter, activity, listFullName, paging) { + new UserListStatusesTask(twitter, listFullName, paging) { @Override protected void onPostExecute(List<Tweet> tweets) { super.onPostExecute(tweets); for (int i = tweets.size() - 1; i >= 0; i--) { StatusViewModel statusViewModel = new StatusViewModel(tweets.get(i)); adapter.addToTop(statusViewModel); - StatusFilter.filter(activity, statusViewModel); + StatusFilter.getInstance().filter(statusViewModel); } updateListViewWithNotice(refreshView.getRefreshableView(), adapter, true); refreshView.onRefreshComplete(); @@ -137,7 +143,7 @@ public class UserListFragment extends CustomListFragment implements View.OnClick final MainActivity activity = getMainActivity(); final Account currentAccount = activity.getCurrentAccount(); Twitter twitter = TwitterApi.getTwitter(currentAccount); - final UserListListAdapter adapter = (UserListListAdapter) getListAdapter(); + final UserListListAdapter adapter = (UserListListAdapter) getAdapter(); String listFullName = adapter.getListFullName(); if (TextUtils.isEmpty(listFullName)) { new UIHandler() { @@ -153,14 +159,14 @@ public class UserListFragment extends CustomListFragment implements View.OnClick if (adapter.getCount() > 0) { paging.setMaxId(adapter.getLastID() - 1); } - new UserListStatusesTask(twitter, activity, listFullName, paging) { + new UserListStatusesTask(twitter, listFullName, paging) { @Override protected void onPostExecute(List<Tweet> tweets) { super.onPostExecute(tweets); for (int i = 0; i < tweets.size(); i++) { StatusViewModel statusViewModel = new StatusViewModel(tweets.get(i)); adapter.addToBottom(statusViewModel); - StatusFilter.filter(activity, statusViewModel); + StatusFilter.getInstance().filter(statusViewModel); } updateListViewWithNotice(refreshView.getRefreshableView(), adapter, false); refreshView.onRefreshComplete(); @@ -179,7 +185,7 @@ public class UserListFragment extends CustomListFragment implements View.OnClick public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View page = inflater.inflate(R.layout.fragment_userlist, container, false); PullToRefreshListView listView = getListView(page); - UserListListAdapter adapter = (UserListListAdapter) getListAdapter(); + UserListListAdapter adapter = (UserListListAdapter) getAdapter(); listView.setAdapter(adapter); listView.setOnScrollListener(this); listView.setOnRefreshListener(this); @@ -208,8 +214,28 @@ public class UserListFragment extends CustomListFragment implements View.OnClick @Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); - textListName.setText(((UserListListAdapter) getListAdapter()).getListFullName()); + textListName.setText(getAdapter().getListFullName()); } }); } + + public void startUserList(Twitter twitter, String listFullName) { + getMainActivity().saveLastUserList(listFullName); + final UserListListAdapter adapter = getAdapter(); + adapter.setListFullName(listFullName); + adapter.clear(); + adapter.updateForce(); + new UserListStatusesTask(twitter, listFullName, TwitterUtils.getPaging(TwitterUtils.getPagingCount(getMainActivity()))) { + @Override + protected void onPostExecute(List<Tweet> tweets) { + super.onPostExecute(tweets); + for (Tweet tweet : tweets) { + StatusViewModel statusViewModel = new StatusViewModel(tweet); + adapter.addToBottom(statusViewModel); + StatusFilter.getInstance().filter(statusViewModel); + } + adapter.updateForce(); + } + }.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 c2ffa399..737c03aa 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 @@ -26,10 +26,12 @@ package net.lacolaco.smileessence.view.adapter; import android.app.ActionBar; 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.Adapter; import android.widget.ArrayAdapter; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; @@ -37,6 +39,7 @@ import net.lacolaco.smileessence.logging.Logger; import net.lacolaco.smileessence.view.HomeFragment; import net.lacolaco.smileessence.view.PageFragment; +import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; @@ -102,7 +105,7 @@ public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.O @Override public synchronized Fragment getItem(int position) { PageInfo info = pages.get(position); - return Fragment.instantiate(context, info.getFragmentClass().getName(), info.getArgs()); + return info.instantiate(context); } public void addPage(Class<? extends PageFragment> klass, String name, Bundle args) { @@ -143,10 +146,21 @@ public class PageListAdapter extends FragmentPagerAdapter implements ViewPager.O return -1; } + @Deprecated + 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; @@ -163,5 +177,15 @@ 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/PostState.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/PostState.java deleted file mode 100644 index 72399541..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/PostState.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2012-2014 lacolaco.net - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package net.lacolaco.smileessence.view.adapter; - -import net.lacolaco.smileessence.activity.MainActivity; -import net.lacolaco.smileessence.view.DialogHelper; - -import twitter4j.StatusUpdate; - -public class PostState { - - // ------------------------------ FIELDS ------------------------------ - - private static PostState instance = new PostState(); - private String text = ""; - private long inReplyToStatusID = -1L; - private String inReplyToScreenName = ""; - private String inReplyToText = ""; - private String mediaFilePath = ""; - private boolean directMessage = false; - private OnPostStateChangeListener listener; - private int selectionStart = 0; - private int selectionEnd = 0; - - // -------------------------- STATIC METHODS -------------------------- - - private PostState() { - } - - public static PostState getState() { - return instance; - } - - // --------------------------- CONSTRUCTORS --------------------------- - - public static PostState newState() { - return instance = new PostState().setListener(instance.listener); - } - - // --------------------- GETTER / SETTER METHODS --------------------- - - public long getInReplyToStatusID() { - return inReplyToStatusID; - } - - public String getMediaFilePath() { - return mediaFilePath; - } - - public int getSelectionEnd() { - if (selectionEnd < 0) { - return text.length(); - } - return selectionEnd; - } - - public int getSelectionStart() { - if (selectionStart < 0) { - return text.length(); - } - return selectionStart; - } - - public String getText() { - return text; - } - - public PostState setListener(OnPostStateChangeListener listener) { - this.listener = listener; - return this; - } - - // -------------------------- OTHER METHODS -------------------------- - - public PostStateTransaction beginTransaction() { - return new PostStateTransaction(this); - } - - public void removeListener() { - this.listener = null; - } - - /** - * Convert to StatusUpdate for tweet. - * - * @return StatusUpdate - */ - public StatusUpdate toStatusUpdate() { - return new StatusUpdate(getText()) - .inReplyToStatusId(getInReplyToStatusID()); - } - - private PostState copy(PostState another) { - this.text = another.text; - this.inReplyToStatusID = another.inReplyToStatusID; - this.inReplyToScreenName = another.inReplyToScreenName; - this.inReplyToText = another.inReplyToText; - this.mediaFilePath = another.mediaFilePath; - this.directMessage = another.directMessage; - this.selectionStart = another.selectionStart; - this.selectionEnd = another.selectionEnd; - this.listener = another.listener; - return this; - } - - private void postStateChange() { - if (listener != null) { - listener.onPostStateChange(this); - } - } - - // -------------------------- INNER CLASSES -------------------------- - - public static interface OnPostStateChangeListener { - - void onPostStateChange(PostState postState); - } - - public static class PostStateTransaction { - - private PostState state; - - private PostStateTransaction(PostState state) { - this.state = new PostState().copy(state); - } - - public PostStateTransaction setText(String text) { - state.text = text; - return this; - } - - public PostStateTransaction appendText(String text) { - state.text = state.text + text; - return this; - } - - public PostStateTransaction insertText(int index, String text) { - StringBuilder builder = new StringBuilder(state.text); - builder.insert(index, text); - state.text = builder.toString(); - return this; - } - - public PostStateTransaction setInReplyToStatusID(long inReplyToStatusID) { - state.inReplyToStatusID = inReplyToStatusID; - return this; - } - - public PostStateTransaction setMediaFilePath(String mediaFilePath) { - state.mediaFilePath = mediaFilePath; - return this; - } - - public PostStateTransaction setCursor(int cursor) { - state.selectionStart = state.selectionEnd = cursor; - return this; - } - - public PostStateTransaction setSelection(int start, int end) { - state.selectionStart = start; - state.selectionEnd = end; - return this; - } - - public void commit() { - PostState.getState().copy(state).postStateChange(); - } - - public void commitWithOpen(MainActivity activity) { - DialogHelper.closeAllDialogs(activity); - PostState.getState().copy(state).postStateChange(); - activity.openPostPage(); - } - - public PostStateTransaction moveCursor(int length) { - int cursor = state.selectionEnd + length; - return setCursor(cursor); - } - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/ReviewDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/ReviewDialogFragment.java index 1e95d8be..df72ca35 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/ReviewDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/ReviewDialogFragment.java @@ -36,7 +36,7 @@ import android.widget.RatingBar; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.entity.Tweet; -import net.lacolaco.smileessence.view.adapter.PostState; +import net.lacolaco.smileessence.data.PostState; import net.lacolaco.smileessence.viewmodel.StatusViewModel; diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SendMessageDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SendMessageDialogFragment.java index b17e77c2..7713b0c9 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SendMessageDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SendMessageDialogFragment.java @@ -45,7 +45,7 @@ import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.twitter.TwitterApi; import net.lacolaco.smileessence.twitter.task.SendMessageTask; import net.lacolaco.smileessence.twitter.util.TwitterUtils; -import net.lacolaco.smileessence.view.adapter.PostState; +import net.lacolaco.smileessence.data.PostState; import twitter4j.Twitter; diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java index 2f0a50dc..a8a6ca40 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java @@ -51,7 +51,7 @@ import net.lacolaco.smileessence.twitter.task.RetweetTask; import net.lacolaco.smileessence.twitter.task.UnfavoriteTask; import net.lacolaco.smileessence.twitter.util.TwitterUtils; import net.lacolaco.smileessence.view.DialogHelper; -import net.lacolaco.smileessence.view.adapter.PostState; +import net.lacolaco.smileessence.data.PostState; import net.lacolaco.smileessence.view.adapter.StatusListAdapter; import net.lacolaco.smileessence.view.listener.ListItemClickListener; import net.lacolaco.smileessence.viewmodel.StatusViewModel; |