diff options
Diffstat (limited to 'src/org/fox/ttrss/FeedsFragment.java')
| -rw-r--r-- | src/org/fox/ttrss/FeedsFragment.java | 808 |
1 files changed, 0 insertions, 808 deletions
diff --git a/src/org/fox/ttrss/FeedsFragment.java b/src/org/fox/ttrss/FeedsFragment.java deleted file mode 100644 index 7c974809..00000000 --- a/src/org/fox/ttrss/FeedsFragment.java +++ /dev/null @@ -1,808 +0,0 @@ -package org.fox.ttrss; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.lang.reflect.Type; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; - -import org.fox.ttrss.types.Feed; -import org.fox.ttrss.types.FeedCategory; -import org.fox.ttrss.types.FeedList; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.http.AndroidHttpClient; -import android.os.AsyncTask; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -import android.preference.PreferenceManager; -import android.support.v4.app.Fragment; -import android.support.v4.widget.SwipeRefreshLayout; -import android.util.Base64; -import android.util.Log; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.View.OnClickListener; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.AdapterContextMenuInfo; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; - -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.reflect.TypeToken; - -public class FeedsFragment extends Fragment implements OnItemClickListener, OnSharedPreferenceChangeListener { - private final String TAG = this.getClass().getSimpleName(); - private SharedPreferences m_prefs; - private FeedListAdapter m_adapter; - private FeedList m_feeds = new FeedList(); - private FeedsActivity m_activity; - private Feed m_selectedFeed; - private FeedCategory m_activeCategory; - private static final String ICON_PATH = "/icons/"; - private boolean m_enableFeedIcons; - private boolean m_feedIconsChecked = false; - private SwipeRefreshLayout m_swipeLayout; - - public void initialize(FeedCategory cat) { - m_activeCategory = cat; - } - - @SuppressLint("DefaultLocale") - class FeedUnreadComparator implements Comparator<Feed> { - - @Override - public int compare(Feed a, Feed b) { - if (a.unread != b.unread) - return b.unread - a.unread; - else - return a.title.toUpperCase().compareTo(b.title.toUpperCase()); - } - - } - - - @SuppressLint("DefaultLocale") - class FeedTitleComparator implements Comparator<Feed> { - - @Override - public int compare(Feed a, Feed b) { - if (a.is_cat && b.is_cat) - return a.title.toUpperCase().compareTo(b.title.toUpperCase()); - else if (a.is_cat && !b.is_cat) - return -1; - else if (!a.is_cat && b.is_cat) - return 1; - else if (a.id >= 0 && b.id >= 0) - return a.title.toUpperCase().compareTo(b.title.toUpperCase()); - else - return a.id - b.id; - } - - } - - @SuppressLint("DefaultLocale") - class FeedOrderComparator implements Comparator<Feed> { - - @Override - public int compare(Feed a, Feed b) { - if (a.id >= 0 && b.id >= 0) - if (a.is_cat && b.is_cat) - return a.title.toUpperCase().compareTo(b.title.toUpperCase()); - else if (a.is_cat && !b.is_cat) - return -1; - else if (!a.is_cat && b.is_cat) - return 1; - else if (a.order_id != 0 && b.order_id != 0) - return a.order_id - b.order_id; - else - return a.title.toUpperCase().compareTo(b.title.toUpperCase()); - else - return a.id - b.id; - } - - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - AdapterContextMenuInfo info = (AdapterContextMenuInfo) item - .getMenuInfo(); - switch (item.getItemId()) { - case R.id.browse_articles: - if (true) { - Feed feed = getFeedAtPosition(info.position); - if (feed != null) { - m_activity.openFeedArticles(feed); - } - } - return true; - case R.id.browse_headlines: - if (true) { - Feed feed = getFeedAtPosition(info.position); - if (feed != null) { - m_activity.onFeedSelected(feed); - } - } - return true; - case R.id.browse_feeds: - if (true) { - Feed feed = getFeedAtPosition(info.position); - if (feed != null) { - m_activity.onCatSelected(new FeedCategory(feed.id, feed.title, feed.unread), false); - } - } - return true; - case R.id.unsubscribe_feed: - if (true) { - final Feed feed = getFeedAtPosition(info.position); - - AlertDialog.Builder builder = new AlertDialog.Builder( - m_activity) - .setMessage(getString(R.string.unsubscribe_from_prompt, feed.title)) - .setPositiveButton(R.string.unsubscribe, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - m_activity.unsubscribeFeed(feed); - - } - }) - .setNegativeButton(R.string.dialog_cancel, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - } - }); - - AlertDialog dlg = builder.create(); - dlg.show(); - } - - return true; - case R.id.create_shortcut: - if (true) { - Feed feed = getFeedAtPosition(info.position); - if (feed != null) { - m_activity.createFeedShortcut(feed); - } - } - return true; - case R.id.catchup_feed: - if (true) { - final Feed feed = getFeedAtPosition(info.position); - - if (feed != null) { - if (m_prefs.getBoolean("confirm_headlines_catchup", true)) { - AlertDialog.Builder builder = new AlertDialog.Builder( - m_activity) - .setMessage(getString(R.string.context_confirm_catchup, feed.title)) - .setPositiveButton(R.string.catchup, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - m_activity.catchupFeed(feed); - - } - }) - .setNegativeButton(R.string.dialog_cancel, - new Dialog.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - - } - }); - - AlertDialog dlg = builder.create(); - dlg.show(); - } else { - m_activity.catchupFeed(feed); - } - } - } - return true; - - default: - Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId()); - return super.onContextItemSelected(item); - } - } - - @Override - public void onCreateContextMenu(ContextMenu menu, View v, - ContextMenuInfo menuInfo) { - - getActivity().getMenuInflater().inflate(R.menu.feed_menu, menu); - - AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - Feed feed = m_adapter.getItem(info.position); - - if (feed != null) - menu.setHeaderTitle(feed.title); - - if (!m_activity.isSmallScreen()) { - menu.findItem(R.id.browse_articles).setVisible(false); - } - - if (!feed.is_cat) { - menu.findItem(R.id.browse_feeds).setVisible(false); - } - - if (feed.id <= 0) { - menu.findItem(R.id.unsubscribe_feed).setVisible(false); - } - - super.onCreateContextMenu(menu, v, menuInfo); - - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - if (savedInstanceState != null) { - m_selectedFeed = savedInstanceState.getParcelable("selectedFeed"); - m_feeds = savedInstanceState.getParcelable("feeds"); - m_feedIconsChecked = savedInstanceState.getBoolean("feedIconsChecked"); - m_activeCategory = savedInstanceState.getParcelable("activeCat"); - } - - View view = inflater.inflate(R.layout.feeds_fragment, container, false); - - m_swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.feeds_swipe_container); - - m_swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - refresh(false); - } - }); - - if (!m_activity.isCompatMode()) { - m_swipeLayout.setColorScheme(android.R.color.holo_green_dark, - android.R.color.holo_red_dark, - android.R.color.holo_blue_dark, - android.R.color.holo_orange_dark); - } - - ListView list = (ListView)view.findViewById(R.id.feeds); - m_adapter = new FeedListAdapter(getActivity(), R.layout.feeds_row, (ArrayList<Feed>)m_feeds); - list.setAdapter(m_adapter); - //list.setEmptyView(view.findViewById(R.id.no_feeds)); - list.setOnItemClickListener(this); - - registerForContextMenu(list); - - m_enableFeedIcons = m_prefs.getBoolean("download_feed_icons", false); - - //Log.d(TAG, "mpTRA=" + m_activity.m_pullToRefreshAttacher); - //m_activity.m_pullToRefreshAttacher.addRefreshableView(list, this); - - return view; - } - - @Override - public void onDestroy() { - super.onDestroy(); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - - m_prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); - m_prefs.registerOnSharedPreferenceChangeListener(this); - - m_activity = (FeedsActivity)activity; - - } - - @Override - public void onResume() { - super.onResume(); - - refresh(false); - - m_activity.initMenu(); - } - - @Override - public void onSaveInstanceState (Bundle out) { - super.onSaveInstanceState(out); - - out.setClassLoader(getClass().getClassLoader()); - out.putParcelable("selectedFeed", m_selectedFeed); - out.putParcelable("feeds", m_feeds); - out.putBoolean("feedIconsChecked", m_feedIconsChecked); - out.putParcelable("activeCat", m_activeCategory); - } - - @Override - public void onItemClick(AdapterView<?> av, View view, int position, long id) { - ListView list = (ListView)av; - - if (list != null) { - Feed feed = (Feed)list.getItemAtPosition(position); - - if (feed.is_cat) { - if (m_activity.isSmallScreen() && "ARTICLES".equals(m_prefs.getString("default_view_mode", "HEADLINES")) && - m_prefs.getBoolean("browse_cats_like_feeds", false)) { - - m_activity.openFeedArticles(feed); - - } else { - m_activity.onCatSelected(new FeedCategory(feed.id, feed.title, feed.unread)); - } - } else { - if ("ARTICLES".equals(m_prefs.getString("default_view_mode", "HEADLINES"))) { - m_activity.openFeedArticles(feed); - } else { - m_activity.onFeedSelected(feed); - } - } - - if (!m_activity.isSmallScreen()) - m_selectedFeed = feed; - - m_adapter.notifyDataSetChanged(); - } - } - - @SuppressWarnings({ "serial" }) - public void refresh(boolean background) { - //FeedCategory cat = m_onlineServices.getActiveCategory(); - - m_swipeLayout.setRefreshing(true); - - final int catId = (m_activeCategory != null) ? m_activeCategory.id : -4; - - final String sessionId = m_activity.getSessionId(); - final boolean unreadOnly = m_activity.getUnreadOnly(); - - FeedsRequest req = new FeedsRequest(getActivity().getApplicationContext(), catId); - - if (sessionId != null) { - //m_activity.setLoadingStatus(R.string.blank, true); - //m_activity.setProgressBarVisibility(true); - - HashMap<String,String> map = new HashMap<String,String>() { - { - put("op", "getFeeds"); - put("sid", sessionId); - put("include_nested", "true"); - put("cat_id", String.valueOf(catId)); - if (unreadOnly) { - put("unread_only", String.valueOf(unreadOnly)); - } - } - }; - - req.execute(map); - - } - } - - /* private void setLoadingStatus(int status, boolean showProgress) { - if (getView() != null) { - TextView tv = (TextView)getView().findViewById(R.id.loading_message); - - if (tv != null) { - tv.setText(status); - } - } - - if (getActivity() != null) - getActivity().setProgressBarIndeterminateVisibility(showProgress); - } */ - - @SuppressWarnings({ "serial" }) - public void getFeedIcons() { - - ApiRequest req = new ApiRequest(getActivity().getApplicationContext()) { - protected void onPostExecute(JsonElement result) { - if (isDetached()) return; - - if (result != null) { - - try { - JsonElement iconsUrl = result.getAsJsonObject().get("icons_dir"); - - if (iconsUrl != null) { - String iconsStr = iconsUrl.getAsString(); - String baseUrl = ""; - - if (!iconsStr.contains("://")) { - baseUrl = m_prefs.getString("ttrss_url", "").trim() + "/" + iconsStr; - } else { - baseUrl = iconsStr; - } - - GetIconsTask git = new GetIconsTask(baseUrl); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - git.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, m_feeds); - else - git.execute(m_feeds); - - m_feedIconsChecked = true; - } - } catch (Exception e) { - Log.d(TAG, "Error receiving icons configuration"); - e.printStackTrace(); - } - - } - } - }; - - final String sessionId = m_activity.getSessionId(); - - HashMap<String,String> map = new HashMap<String,String>() { - { - put("sid", sessionId); - put("op", "getConfig"); - } - }; - - req.execute(map); - } - - private class FeedsRequest extends ApiRequest { - private int m_catId; - - public FeedsRequest(Context context, int catId) { - super(context); - m_catId = catId; - } - - @Override - protected void onProgressUpdate(Integer... progress) { - m_activity.setProgress(Math.round((((float)progress[0] / (float)progress[1]) * 10000))); - } - - @Override - protected void onPostExecute(JsonElement result) { - if (isDetached()) return; - - if (getView() != null) { - ListView list = (ListView)getView().findViewById(R.id.feeds); - - if (list != null) { - list.setEmptyView(getView().findViewById(R.id.no_feeds)); - } - } - - m_activity.setProgressBarVisibility(false); - //m_activity.m_pullToRefreshAttacher.setRefreshComplete(); - m_swipeLayout.setRefreshing(false); - - if (result != null) { - try { - JsonArray content = result.getAsJsonArray(); - if (content != null) { - - Type listType = new TypeToken<List<Feed>>() {}.getType(); - final List<Feed> feeds = new Gson().fromJson(content, listType); - - m_feeds.clear(); - - for (Feed f : feeds) - if (f.id > -10 || m_catId != -4) // skip labels for flat feedlist for now - m_feeds.add(f); - - sortFeeds(); - - /*if (m_feeds.size() == 0) - setLoadingStatus(R.string.no_feeds_to_display, false); - else */ - - m_activity.setLoadingStatus(R.string.blank, false); - //m_adapter.notifyDataSetChanged(); (done by sortFeeds) - - if (m_enableFeedIcons && !m_feedIconsChecked && Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) - getFeedIcons(); - - return; - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - - if (m_lastError == ApiError.LOGIN_FAILED) { - m_activity.login(true); - } else { - m_activity.setLoadingStatus(getErrorMessage(), false); - } - } - } - - private class FeedListAdapter extends ArrayAdapter<Feed> { - private ArrayList<Feed> items; - - public static final int VIEW_NORMAL = 0; - public static final int VIEW_SELECTED = 1; - - public static final int VIEW_COUNT = VIEW_SELECTED+1; - - public FeedListAdapter(Context context, int textViewResourceId, ArrayList<Feed> items) { - super(context, textViewResourceId, items); - this.items = items; - } - - public int getViewTypeCount() { - return VIEW_COUNT; - } - - @Override - public int getItemViewType(int position) { - Feed feed = items.get(position); - - if (!m_activity.isSmallScreen() && m_selectedFeed != null && feed.id == m_selectedFeed.id) { - return VIEW_SELECTED; - } else { - return VIEW_NORMAL; - } - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View v = convertView; - - Feed feed = items.get(position); - - if (v == null) { - int layoutId = R.layout.feeds_row; - - switch (getItemViewType(position)) { - case VIEW_SELECTED: - layoutId = R.layout.feeds_row_selected; - break; - } - - LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = vi.inflate(layoutId, null); - - } - - TextView tt = (TextView) v.findViewById(R.id.title); - - if (tt != null) { - tt.setText(feed.title); - } - - TextView tu = (TextView) v.findViewById(R.id.unread_counter); - - if (tu != null) { - tu.setText(String.valueOf(feed.unread)); - tu.setVisibility((feed.unread > 0) ? View.VISIBLE : View.INVISIBLE); - } - - ImageView icon = (ImageView)v.findViewById(R.id.icon); - - if (icon != null) { - - if (m_enableFeedIcons) { - - try { - File storage = m_activity.getExternalCacheDir(); - - File iconFile = new File(storage.getAbsolutePath() + ICON_PATH + feed.id + ".ico"); - if (iconFile.exists()) { - Bitmap bmpOrig = BitmapFactory.decodeFile(iconFile.getAbsolutePath()); - if (bmpOrig != null) { - icon.setImageBitmap(bmpOrig); - } - } else { - icon.setImageResource(feed.unread > 0 ? R.drawable.ic_published : R.drawable.ic_unpublished); - } - } catch (NullPointerException e) { - icon.setImageResource(feed.unread > 0 ? R.drawable.ic_published : R.drawable.ic_unpublished); - } - - } else { - icon.setImageResource(feed.unread > 0 ? R.drawable.ic_published : R.drawable.ic_unpublished); - } - - } - - ImageButton ib = (ImageButton) v.findViewById(R.id.feed_menu_button); - - if (ib != null) { - ib.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - getActivity().openContextMenu(v); - } - }); - } - - return v; - } - } - - public void sortFeeds() { - Comparator<Feed> cmp; - - if (m_prefs.getBoolean("sort_feeds_by_unread", false)) { - cmp = new FeedUnreadComparator(); - } else { - if (m_activity.getApiLevel() >= 3) { - cmp = new FeedOrderComparator(); - } else { - cmp = new FeedTitleComparator(); - } - } - - try { - Collections.sort(m_feeds, cmp); - } catch (IllegalArgumentException e) { - // sort order got changed in prefs or something - e.printStackTrace(); - } - - try { - m_adapter.notifyDataSetChanged(); - } catch (NullPointerException e) { - // adapter missing - } - } - - public class GetIconsTask extends AsyncTask<FeedList, Integer, Integer> { - - private String m_baseUrl; - - public GetIconsTask(String baseUrl) { - m_baseUrl = baseUrl.trim(); - } - - @Override - protected Integer doInBackground(FeedList... params) { - - FeedList localList = new FeedList(); - - try { - localList.addAll(params[0]); - - File storage = m_activity.getExternalCacheDir(); - final File iconPath = new File(storage.getAbsolutePath() + ICON_PATH); - if (!iconPath.exists()) iconPath.mkdirs(); - - if (iconPath.exists()) { - for (Feed feed : localList) { - if (feed.id > 0 && feed.has_icon && !feed.is_cat) { - File outputFile = new File(iconPath.getAbsolutePath() + "/" + feed.id + ".ico"); - String fetchUrl = m_baseUrl + "/" + feed.id + ".ico"; - - if (!outputFile.exists()) { - downloadFile(fetchUrl, outputFile.getAbsolutePath()); - Thread.sleep(2000); - } - } - } - } - } catch (Exception e) { - Log.d(TAG, "Error while downloading feed icons"); - e.printStackTrace(); - } - return null; - } - - protected void downloadFile(String fetchUrl, String outputFile) { - AndroidHttpClient client = AndroidHttpClient.newInstance("Tiny Tiny RSS"); - - /* ApiRequest.disableConnectionReuseIfNecessary(); */ - - /* ApiRequest.trustAllHosts(m_prefs.getBoolean("ssl_trust_any", false), - m_prefs.getBoolean("ssl_trust_any_host", false)); */ - - try { - URL url = new URL(fetchUrl); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - - conn.setConnectTimeout(1000); - conn.setReadTimeout(5000); - - Log.d(TAG, "[downloadFile] " + url); - - String httpLogin = m_prefs.getString("http_login", ""); - String httpPassword = m_prefs.getString("http_password", ""); - - if (httpLogin.length() > 0) { - conn.setRequestProperty("Authorization", "Basic " + - Base64.encodeToString((httpLogin + ":" + httpPassword).getBytes("UTF-8"), Base64.NO_WRAP)); - } - - InputStream content = conn.getInputStream(); - - BufferedInputStream is = new BufferedInputStream(content, 1024); - FileOutputStream fos = new FileOutputStream(outputFile); - - byte[] buffer = new byte[1024]; - int len = 0; - while ((len = is.read(buffer)) != -1) { - fos.write(buffer, 0, len); - } - - fos.close(); - is.close(); - - } catch (Exception e) { - e.printStackTrace(); - } - - client.close(); - } - - protected void onPostExecute(Integer result) { - if (isDetached()) return; - - m_adapter.notifyDataSetChanged(); - } - - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, - String key) { - - sortFeeds(); - m_enableFeedIcons = m_prefs.getBoolean("download_feed_icons", false); - - } - - public Feed getFeedAtPosition(int position) { - try { - return m_adapter.getItem(position); - } catch (IndexOutOfBoundsException e) { - return null; - } - } - - public Feed getSelectedFeed() { - return m_selectedFeed; - } - - public void setSelectedFeed(Feed feed) { - m_selectedFeed = feed; - - if (m_adapter != null) { - m_adapter.notifyDataSetChanged(); - } - } - - /* @Override - public void onRefreshStarted(View view) { - refresh(false); - } */ - -} |