package com.mistareader; import android.app.Activity; import android.app.Fragment; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import com.mistareader.NavigationDrawer.NavDrawer_Main; import com.mistareader.TextProcessors.S; import com.mistareader.WebIteraction.RequestResult; import java.util.ArrayList; public class Topics_Fragment extends Fragment { OnTopicSelectedListener mOntopicSelectedCallback; OnUnsubscribeListener mOnUnsubscribe; public interface OnTopicSelectedListener { public void onTopicSelected(Topic selectedTopic, boolean focusLast, boolean forceFirst); } public interface OnUnsubscribeListener { public void onUnsubscribe(); } public String sSection; public String sForum; private Forum forum; public Topics_Adapter topics_sAdapter; ListView lvMain; View rootView; boolean isInternetConnection; private String URL; private boolean topics_isLoading = false; private boolean mode_Subscription = false; boolean isOpenedFromNotifications = false; class TopicsOnItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> adapter, View view, int position, final long id) { try { mOntopicSelectedCallback.onTopicSelected((Topic) adapter.getItemAtPosition(position), false, false); } catch (Exception e) { S.L("TopicsOnItemClickListener: ", e); } } } private class topicScrollListener implements OnScrollListener { private int visibleThreshold = 10; @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemsInList) { if (mode_Subscription || topics_isLoading || visibleItemCount == 0 || !isInternetConnection) return; if ((totalItemsInList - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { loadTopicsInfinite(); } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); if (v.getId() == R.id.lvMain) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.topics_context, menu); menu.setHeaderTitle(R.string.sPopupMenuHeader); AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; int position = info.position; Topic selTopic = topics_sAdapter.getItem(position); if (!forum.mainDB.isTopicInSubscriptions(selTopic.id)) { menu.removeItem(R.id.menu_removeFromSubscriptions); if (forum.mainDB.getTotalSubscriptionsCount() >= Settings.SUBSCRIPTIONS_MAX_COUNT) { menu.removeItem(R.id.menu_addToSubscription); } } else { menu.removeItem(R.id.menu_addToSubscription); } } } @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); int itemId = item.getItemId(); if (itemId == R.id.menu_GoToLastMessage) { mOntopicSelectedCallback.onTopicSelected(topics_sAdapter.getItem(info.position), true, false); return true; } else if (itemId == R.id.menu_GoToFirstMessage) { mOntopicSelectedCallback.onTopicSelected(topics_sAdapter.getItem(info.position), false, true); return true; } else if (itemId == R.id.menu_addToSubscription) { Topic selTopic = topics_sAdapter.getItem(info.position); forum.mainDB.addTopicToSubscriptions(selTopic); return true; } else if (itemId == R.id.menu_removeFromSubscriptions) { Topic selTopic = topics_sAdapter.getItem(info.position); forum.mainDB.removeTopicFromSubscriptions(selTopic.id); if (mode_Subscription) { reLoad(); } try { mOnUnsubscribe.onUnsubscribe(); } catch (Exception e) { S.L("TopicsOnItemClickListener: ", e); } return true; } else { return super.onContextItemSelected(item); } } private void drawTopicsList() { try { if (topics_sAdapter == null) { final Activity activity = getActivity(); if (activity == null) { return; } topics_sAdapter = new Topics_Adapter(activity, forum, sSection, mode_Subscription); lvMain = (ListView) rootView.findViewById(R.id.lvMain); lvMain.setAdapter(topics_sAdapter); lvMain.setOnScrollListener(new topicScrollListener()); lvMain.setOnItemClickListener(new TopicsOnItemClickListener()); registerForContextMenu(lvMain); } else { topics_sAdapter.notifyDataSetChanged(); } } catch (Exception e) { S.L("DrawTopicsList: " + Log.getStackTraceString(e)); } } public class RequestAsyncTopics extends AsyncTask<String, Integer, RequestResult> { @Override protected void onPreExecute() { topics_isLoading = true; } protected RequestResult doInBackground(String... urls) { if (urls.length == 2) { return WebIteraction.doServerRequest(urls[0], urls[1]); } else return WebIteraction.doServerRequest(urls[0], urls[1], urls[2], urls[3]); } protected void onPostExecute(RequestResult result) { if (!result.cookie.isEmpty()) { forum.sessionCookies = result.cookie; } forum.addNewTopics(result.result); drawTopicsList(); topics_isLoading = false; } } private void loadTopicsInfinite() { if (topics_isLoading || forum.reachedMaxTopics) { return; } if (forum.topics == null || forum.topics.isEmpty()) { loadTopics(0); } loadTopics(forum.getLastTopicTime()); } private void loadTopics(long beforeUTime) { if (topics_isLoading) { return; } switch (sForum) { case API.TOPICS_WITH_ME: URL = API.getTopicsWithMe(forum.accountUserID, beforeUTime); new RequestAsyncTopics().execute(URL, forum.sessionCookies); break; case API.MYTOPICS: URL = API.getMyTopics(beforeUTime); new RequestAsyncTopics().execute(URL, forum.sessionCookies, forum.sessionID, forum.accountUserID); break; case NavDrawer_Main.MENU_SUBSCRIPTIONS: fillTopicsWithSubscriptions(); drawTopicsList(); break; default: URL = API.getTopics(sForum, sSection, beforeUTime); new RequestAsyncTopics().execute(URL, forum.sessionCookies); break; } } private void fillTopicsWithSubscriptions() { ArrayList<Topic> subs = forum.mainDB.getSubscriptions(); for (int i = 0; i < subs.size(); i++) { forum.topics.add(subs.get(i)); } } public void loadNewTopics() { if (topics_isLoading) { return; } switch (sForum) { case API.TOPICS_WITH_ME: break; case API.MYTOPICS: break; default: URL = API.getLastTopics(sForum, sSection, forum.getFirstTopicTime()); new RequestAsyncTopics().execute(URL, forum.sessionCookies); break; } } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mOntopicSelectedCallback = (OnTopicSelectedListener) activity; mOnUnsubscribe = (OnUnsubscribeListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnTopicSelectedListener"); } } @Override public void onCreate(Bundle savedInstanceState) { // setRetainInstance(true); // setHasOptionsMenu(true); super.onCreate(savedInstanceState); Bundle args = getArguments(); if (args != null) { sForum = args.getString("sForum", ""); if (sForum.equals(NavDrawer_Main.MENU_SUBSCRIPTIONS)) { mode_Subscription = true; } else { sSection = args.getString("sSection", ""); if (sForum.equals(API.TOPICS_WITH_ME) && !sSection.isEmpty()) { sForum = sSection; sSection = ""; } } } if (sSection == null) { sSection = ""; } if (sForum == null) { sForum = ""; } } // ---------------------------------------------------------------------------------------------- @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_main, container, false); forum = Forum.getInstance(); isInternetConnection = forum.isInternetConnection; if (isInternetConnection) { forum.deleteTopics(); loadTopics(0); } return rootView; } public void reLoad() { isInternetConnection = forum.isInternetConnection; if (!isInternetConnection) { return; } if (topics_sAdapter != null) { topics_sAdapter.notifyDataSetInvalidated(); } forum.deleteTopics(); loadTopics(0); } }