package info.guardianproject.securereaderinterface.views; import info.guardianproject.securereader.Settings.SyncFrequency; import info.guardianproject.securereader.Settings.SyncMode; import info.guardianproject.securereaderinterface.App; import info.guardianproject.securereaderinterface.adapters.DownloadsAdapter; import info.guardianproject.securereaderinterface.ui.UICallbacks; import info.guardianproject.securereaderinterface.widgets.CheckableImageView; import info.guardianproject.securereader.SocialReader; import java.util.ArrayList; import android.content.Context; import android.database.DataSetObserver; import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import info.guardianproject.securereaderinterface.R; import com.tinymission.rss.Feed; public class FeedFilterView extends LinearLayout implements ListAdapter, OnItemClickListener { public interface FeedFilterViewCallbacks { void viewFavorites(); void viewPopular(); void viewDownloads(); void viewShared(); void viewFeed(Feed feedToView); void addNew(); } private class ViewTag { public ViewTag() { } public View.OnClickListener clickListener; public CheckableImageView checkView; public TextView tvName; public TextView tvCount; public ImageView ivFeedImage; public View ivRefresh; } private FeedFilterViewCallbacks mCallbacks; private ListView mListView; private ArrayList<Feed> mListFeeds; private boolean mIsOnline; // Save this so we don't have to call it for // every view! private String mCountFavorites; private String mCountShared; private String mCountNumInProgress; public FeedFilterView(Context context) { super(context); } public FeedFilterView(Context context, AttributeSet attrs) { super(context, attrs); } public void setFeedFilterViewCallbacks(FeedFilterViewCallbacks callbacks) { mCallbacks = callbacks; } @Override protected void onFinishInflate() { super.onFinishInflate(); setOrientation(LinearLayout.VERTICAL); mListView = (ListView) findViewById(R.id.lvFeeds); mListView.setOnItemClickListener(this); mListView.setItemsCanFocus(true); if (!isInEditMode()) { updateList(); mListView.setAdapter(this); } } private boolean isOnline() { boolean isOnline = true; int onlineMode = App.getInstance().socialReader.isOnline(); if (onlineMode == SocialReader.NOT_ONLINE_NO_WIFI || onlineMode == SocialReader.NOT_ONLINE_NO_WIFI_OR_NETWORK) isOnline = false; return isOnline; } private void updateList() { mIsOnline = isOnline(); View btnAddFeeds = this.findViewById(R.id.btnAddFeeds); btnAddFeeds.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mCallbacks != null) mCallbacks.addNew(); } }); mListFeeds = App.getInstance().socialReader.getSubscribedFeedsList(); mCountFavorites = String.valueOf(App.getInstance().socialReader.getAllFavoritesCount()); mCountShared = String.valueOf(App.getInstance().socialReader.getAllSharedCount()); mCountNumInProgress = String.valueOf(DownloadsAdapter.getNumInProgress()); } private class RefreshFeed implements View.OnClickListener { private final Feed mFeed; public RefreshFeed(Feed feed) { mFeed = feed; } @Override public void onClick(View v) { UICallbacks.requestResync(mFeed); mListView.setAdapter(null); mListView.setAdapter(FeedFilterView.this); } } private class ViewFeed implements View.OnClickListener { private final Feed mFeed; public ViewFeed(Feed feed) { mFeed = feed; } @Override public void onClick(View v) { if (mCallbacks != null) mCallbacks.viewFeed(mFeed); } } private int getCountSpecials() { return 5 + (App.UI_ENABLE_POPULAR_ITEMS ? 1 : 0); } @Override public int getCount() { return getCountSpecials() + (mListFeeds != null ? mListFeeds.size() : 0); } @Override public Object getItem(int position) { if (position < getCountSpecials()) return null; return mListFeeds.get(position - getCountSpecials()); } @Override public long getItemId(int position) { if (position < getCountSpecials()) return 0; return mListFeeds.get(position - getCountSpecials()).hashCode(); } @Override public int getItemViewType(int position) { if (App.UI_ENABLE_POPULAR_ITEMS) { if (position == 1) return getCountSpecials(); else if (position > 1) position -= 1; } if (position < 5) return position; return 5; } @Override public View getView(int position, View convertView, ViewGroup parent) { int type = this.getItemViewType(position); View returnView = null; View.OnClickListener listener = null; switch (type) { case 0: { if (convertView == null) convertView = createDisplayPhotosView(); ViewTag holder = (ViewTag) convertView.getTag(); holder.checkView.setChecked(App.getSettings().syncMode() == SyncMode.LetItFlow); listener = new OnClickListener() { @Override public void onClick(View v) { ViewTag holder = (ViewTag) v.getTag(); CheckableImageView view = holder.checkView; if (view != null) view.toggle(); App.getSettings().setSyncMode(view.isChecked() ? SyncMode.LetItFlow : SyncMode.BitWise); } }; returnView = convertView; break; } case 1: { if (convertView == null) convertView = createFavoritesView(); ViewTag holder = (ViewTag) convertView.getTag(); holder.tvCount.setText(mCountFavorites); listener = new View.OnClickListener() { @Override public void onClick(View v) { if (mCallbacks != null) mCallbacks.viewFavorites(); } }; returnView = convertView; break; } case 2: { if (convertView == null) convertView = createSharedView(); ViewTag holder = (ViewTag) convertView.getTag(); holder.ivFeedImage.setImageResource(R.drawable.ic_share_receiver); holder.tvCount.setText(mCountShared); holder.tvName.setText(R.string.feed_filter_shared_stories); listener = new View.OnClickListener() { @Override public void onClick(View v) { if (mCallbacks != null) mCallbacks.viewShared(); } }; returnView = convertView; break; } case 3: { // Media Downloads // if (convertView == null) convertView = createFavoritesView(); ViewTag holder = (ViewTag) convertView.getTag(); // Set image // holder.ivFeedImage.setVisibility(View.VISIBLE); holder.ivFeedImage.setImageResource(R.drawable.ic_menu_downloads); holder.tvName.setText(R.string.downloads_title); holder.tvCount.setText(mCountNumInProgress); listener = new View.OnClickListener() { @Override public void onClick(View v) { if (mCallbacks != null) mCallbacks.viewDownloads(); } }; returnView = convertView; break; } case 4: { if (convertView == null) convertView = createAllFeedsView(); ViewTag holder = (ViewTag) convertView.getTag(); holder.ivFeedImage.setImageResource(R.drawable.ic_menu_news); // ivFeedImage.setVisibility(View.GONE); holder.ivRefresh.setVisibility(App.getSettings().syncFrequency() == SyncFrequency.Manual ? View.VISIBLE : View.GONE); holder.ivRefresh.setEnabled(mIsOnline); holder.ivRefresh.setOnClickListener(new RefreshFeed(null)); if (holder.ivRefresh.getVisibility() == View.VISIBLE && App.getInstance().socialReader.manualSyncInProgress()) holder.ivRefresh.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.rotate)); else holder.ivRefresh.clearAnimation(); holder.tvName.setText(R.string.feed_filter_all_feeds); listener = new View.OnClickListener() { @Override public void onClick(View v) { if (mCallbacks != null) mCallbacks.viewFeed(null); } }; returnView = convertView; break; } case 5: { Feed feed = mListFeeds.get(position - getCountSpecials()); if (convertView == null) convertView = createAllFeedsView(); ViewTag holder = (ViewTag) convertView.getTag(); // Set image // holder.ivFeedImage.setVisibility(View.VISIBLE); // TODO - feed images holder.tvName.setText(feed.getTitle()); if (TextUtils.isEmpty(feed.getTitle())) holder.tvName.setText(R.string.add_feed_not_loaded); holder.ivRefresh.setVisibility(App.getSettings().syncFrequency() == SyncFrequency.Manual ? View.VISIBLE : View.GONE); holder.ivRefresh.setEnabled(mIsOnline); holder.ivRefresh.setOnClickListener(new RefreshFeed(feed)); if (holder.ivRefresh.getVisibility() == View.VISIBLE && feed.getStatus() == Feed.STATUS_SYNC_IN_PROGRESS) holder.ivRefresh.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.rotate)); else holder.ivRefresh.clearAnimation(); listener = new ViewFeed(feed); returnView = convertView; break; } case 6: { if (convertView == null) convertView = createFavoritesView(); ViewTag holder = (ViewTag) convertView.getTag(); holder.ivFeedImage.setImageResource(R.drawable.ic_filter_popular); holder.tvName.setText(R.string.feed_filter_popular); holder.tvCount.setText("0"); listener = new View.OnClickListener() { @Override public void onClick(View v) { if (mCallbacks != null) mCallbacks.viewPopular(); } }; returnView = convertView; break; } } if (returnView != null) ((ViewTag)returnView.getTag()).clickListener = listener; return returnView; } @Override public int getViewTypeCount() { return 1 + getCountSpecials(); } @Override public boolean hasStableIds() { return true; } @Override public boolean isEmpty() { return false; } @Override public void registerDataSetObserver(DataSetObserver observer) { } @Override public void unregisterDataSetObserver(DataSetObserver observer) { } @Override public boolean areAllItemsEnabled() { return true; } @Override public boolean isEnabled(int position) { return true; } @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { ViewTag tag = (ViewTag) view.getTag(); if (tag != null && tag.clickListener != null) { tag.clickListener.onClick(view); } } public View createDisplayPhotosView() { // Display photos View view = LayoutInflater.from(getContext()).inflate(R.layout.feed_list_display_photos, mListView, false); createViewHolder(view); return view; } public View createFavoritesView() { View view = LayoutInflater.from(getContext()).inflate(R.layout.feed_list_favorites, mListView, false); createViewHolder(view); return view; } public View createSharedView() { View view = LayoutInflater.from(getContext()).inflate(R.layout.feed_list_favorites, mListView, false); createViewHolder(view); return view; } public View createAllFeedsView() { View view = LayoutInflater.from(getContext()).inflate(R.layout.feed_list_item, mListView, false); createViewHolder(view); return view; } private void createViewHolder(View view) { ViewTag holder = new ViewTag(); holder.ivFeedImage = (ImageView) view.findViewById(R.id.ivFeedImage); holder.tvName = (TextView) view.findViewById(R.id.tvFeedName); holder.tvCount = (TextView) view.findViewById(R.id.tvCount); holder.ivRefresh = view.findViewById(R.id.ivRefresh); holder.checkView = (CheckableImageView) view.findViewById(R.id.chkShowImages); view.setTag(holder); } }