/*
This file is part of AbianReader.
AbianReader is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
AbianReader is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with AbianReader. If not, see <http://www.gnu.org/licenses/>.
*/
package com.abiansoftware.lib.reader;
import java.util.Vector;
import com.abiansoftware.lib.reader.AbianReaderData.AbianReaderItem;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.viewpagerindicator.CirclePageIndicator;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
class AbianReaderListView
{
private static final String TAG = "AbianReaderListView";
private int m_preferredListItemHeight;
private ListView m_abianReaderListView;
private AbianReaderListAdapter m_abianReaderListAdapter;
private RelativeLayout m_headerViewPagerLayout;
private UninterceptableViewPager m_headerViewPager;
private AbianReaderListHeaderViewPagerAdapter m_headerViewPagerAdapter;
private CirclePageIndicator m_pageIndicator;
public AbianReaderListView()
{
m_preferredListItemHeight = -1;
m_abianReaderListView = null;
m_abianReaderListAdapter = null;
m_headerViewPagerLayout = null;
m_headerViewPager = null;
m_headerViewPagerAdapter = null;
}
public void initializeViewAfterPopulation(FragmentActivity parentActivity)
{
m_abianReaderListView = (ListView)parentActivity.findViewById(R.id.abian_reader_list_view_listview);
LayoutInflater theLayoutInflater = LayoutInflater.from(parentActivity);
m_headerViewPagerLayout = (RelativeLayout)theLayoutInflater.inflate(R.layout.abian_reader_list_header_view_pager, null);
m_headerViewPager = (UninterceptableViewPager)m_headerViewPagerLayout.findViewById(R.id.abian_reader_list_header_viewpager_view);
m_pageIndicator = (CirclePageIndicator)m_headerViewPagerLayout.findViewById(R.id.abian_reader_list_header_page_indicator);
m_headerViewPagerAdapter = new AbianReaderListHeaderViewPagerAdapter(parentActivity.getSupportFragmentManager());
m_headerViewPager.setAdapter(m_headerViewPagerAdapter);
m_pageIndicator.setViewPager(m_headerViewPager);
// m_pageIndicator.setPageColor(0xFFcbedcc);
int indicatorColor = AbianReaderApplication.getInstance().getResources().getColor(R.color.view_page_indicator_color);
m_pageIndicator.setFillColor(indicatorColor);
m_pageIndicator.setStrokeColor(indicatorColor);
m_pageIndicator.setSnap(true);
ViewGroup.LayoutParams headerViewPagerLayoutParams = m_headerViewPager.getLayoutParams();
m_preferredListItemHeight = headerViewPagerLayoutParams.height;
headerViewPagerLayoutParams.height = (int)(m_preferredListItemHeight * AbianReaderApplication.FEATURED_IMAGE_SIZE);
m_headerViewPager.setLayoutParams(headerViewPagerLayoutParams);
m_abianReaderListView.addHeaderView(m_headerViewPagerLayout);
// have to set the adapter after you add header/footer views
m_abianReaderListAdapter = new AbianReaderListAdapter(parentActivity);
m_abianReaderListView.setAdapter(m_abianReaderListAdapter);
m_headerViewPagerLayout.setVisibility(View.GONE);
m_headerViewPager.setVisibility(View.GONE);
m_pageIndicator.setVisibility(View.GONE);
AbianReaderApplication.getInstance().registerAdapter(m_abianReaderListAdapter);
}
public int getPreferredListItemHeight()
{
return m_preferredListItemHeight;
}
public void updateList()
{
m_abianReaderListAdapter.notifyDataSetChanged();
m_headerViewPagerAdapter.notifyDataSetChanged();
if(m_headerViewPagerAdapter.getCount() > 0)
{
m_headerViewPagerLayout.setVisibility(View.VISIBLE);
m_headerViewPager.setVisibility(View.VISIBLE);
m_pageIndicator.setVisibility(View.VISIBLE);
}
else
{
m_headerViewPagerLayout.setVisibility(View.GONE);
m_headerViewPager.setVisibility(View.GONE);
m_pageIndicator.setVisibility(View.GONE);
}
}
private static class RSSFeedListItem
{
TextView m_titleText;
TextView m_detailsText;
ImageView m_imageView;
ProgressBar m_progressBar;
int m_targetIndex;
public RSSFeedListItem()
{
resetData();
}
public void resetData()
{
m_targetIndex = 0;
}
}
private static class AbianReaderListAdapter extends BaseAdapter implements OnClickListener, ImageLoadingListener
{
private LayoutInflater m_layoutInflater;
private DisplayImageOptions m_thumbnailDisplayOptions;
public AbianReaderListAdapter(Context context)
{
m_layoutInflater = LayoutInflater.from(context);
m_thumbnailDisplayOptions = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.app_icon)
.cacheInMemory()
.cacheOnDisc()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.displayer(new RoundedBitmapDisplayer(0))
.build();
}
public int getCount()
{
AbianReaderData abianReaderAppData = AbianReaderApplication.getData();
int countVal = abianReaderAppData.getNumberOfItems();
if(countVal < AbianReaderData.MAX_DATA_ITEMS)
{
countVal++;
}
return countVal;
}
public Object getItem(int position)
{
return position;
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
final RSSFeedListItem listItem;
if(convertView == null)
{
convertView = m_layoutInflater.inflate(R.layout.abian_reader_list_item, null);
listItem = new RSSFeedListItem();
listItem.m_titleText = (TextView)convertView.findViewById(R.id.abian_reader_list_item_title_text_view);
listItem.m_detailsText = (TextView)convertView.findViewById(R.id.abian_reader_list_item_details_text_view);
listItem.m_imageView = (ImageView)convertView.findViewById(R.id.abian_reader_list_item_icon_image_view);
listItem.m_progressBar = (ProgressBar)convertView.findViewById(R.id.abian_reader_list_item_progress_bar);
convertView.setTag(listItem);
}
else
{
listItem = (RSSFeedListItem)convertView.getTag();
listItem.resetData();
}
convertView.setBackgroundResource(R.drawable.list_item_unread);
AbianReaderData abianReaderAppData = AbianReaderApplication.getData();
AbianReaderDataFetcher abianReaderAppDataFetcher = AbianReaderApplication.getDataFetcher();
if(position == abianReaderAppData.getNumberOfItems())
{
if(abianReaderAppDataFetcher.getLastConnectionHadError())
{
listItem.m_titleText.setVisibility(View.VISIBLE);
listItem.m_detailsText.setVisibility(View.VISIBLE);
listItem.m_imageView.setVisibility(View.VISIBLE);
listItem.m_progressBar.setVisibility(View.GONE);
listItem.m_targetIndex = -1;
listItem.m_titleText.setText("Unable to retrieve articles");
listItem.m_detailsText.setText("Tap here to try again");
listItem.m_imageView.setImageResource(R.drawable.refresh_dark);
convertView.setBackgroundResource(R.drawable.list_item_read);
}
else
{
listItem.m_progressBar.setVisibility(View.VISIBLE);
listItem.m_titleText.setVisibility(View.VISIBLE);
listItem.m_detailsText.setVisibility(View.GONE);
listItem.m_imageView.setVisibility(View.GONE);
listItem.m_titleText.setText("Updating...");
convertView.setBackgroundResource(R.drawable.list_item_read);
listItem.m_targetIndex = -2;
if(abianReaderAppDataFetcher.isRefreshingFeed() == false)
{
abianReaderAppDataFetcher.getMoreFeed();
}
}
}
else
{
listItem.m_progressBar.setVisibility(View.GONE);
listItem.m_titleText.setVisibility(View.VISIBLE);
listItem.m_detailsText.setVisibility(View.VISIBLE);
listItem.m_imageView.setVisibility(View.VISIBLE);
AbianReaderItem theItem = abianReaderAppData.getItemNumber(position);
if(theItem.getHasArticleBeenRead())
{
convertView.setBackgroundResource(R.drawable.list_item_read);
}
else
{
convertView.setBackgroundResource(R.drawable.list_item_unread);
}
listItem.m_targetIndex = position;
listItem.m_titleText.setText(theItem.getTitle());
String detailsText = "By ";
detailsText += theItem.getCreator();
detailsText += "\n";
detailsText += theItem.getPubDateOnly();
detailsText += ", ";
if(theItem.getCommentsCount() == 0)
{
detailsText += "No";
}
else
{
detailsText += Integer.toString(theItem.getCommentsCount());
}
detailsText += " Comment";
if(theItem.getCommentsCount() != 1)
{
detailsText += "s";
}
listItem.m_detailsText.setText(detailsText);
ImageLoader theImageLoader = ImageLoader.getInstance();
theImageLoader.displayImage(theItem.getThumbnailLink(), listItem.m_imageView, m_thumbnailDisplayOptions, this);
}
convertView.setOnClickListener(this);
convertView.setTag(listItem);
return convertView;
}
public void onClick(View v)
{
RSSFeedListItem listItem = (RSSFeedListItem)v.getTag();
if(listItem != null)
{
if(listItem.m_targetIndex == -1)
{
// this is a retry
AbianReaderDataFetcher abianReaderAppDataFetcher = AbianReaderApplication.getDataFetcher();
if(abianReaderAppDataFetcher != null)
{
abianReaderAppDataFetcher.refreshFeed();
}
Log.e(TAG, "-1 List Item");
}
else if(listItem.m_targetIndex == -2)
{
// this is an "updating" item
}
else
{
Intent itemIntent = new Intent(m_layoutInflater.getContext(), AbianReaderItemActivity.class);
itemIntent.putExtra(AbianReaderApplication.CHOSEN_ARTICLE_NUMBER, listItem.m_targetIndex);
m_layoutInflater.getContext().startActivity(itemIntent);
}
}
}
@Override
public void onLoadingCancelled()
{
//Log.e(this.getClass().toString(), "onLoadingCancelled");
//
}
@Override
public void onLoadingComplete(Bitmap arg0)
{
//notifyDataSetChanged();
//Log.e(this.getClass().toString(), "onLoadingComplete");
}
@Override
public void onLoadingFailed(FailReason arg0)
{
//
//Log.e(this.getClass().toString(), "onLoadingFailed");
}
@Override
public void onLoadingStarted()
{
//
//Log.e(this.getClass().toString(), "onLoadingStarted");
}
}
private class AbianReaderListHeaderViewPagerAdapter extends FragmentPagerAdapter
{
private Vector<AbianReaderListHeaderFragment> m_fragmentVector;
public AbianReaderListHeaderViewPagerAdapter(FragmentManager fm)
{
super(fm);
m_fragmentVector = new Vector<AbianReaderListHeaderFragment>();
}
@Override
public Fragment getItem(int arg0)
{
AbianReaderListHeaderFragment thisFragment = new AbianReaderListHeaderFragment();
thisFragment.setFeaturedArticleNumber(arg0);
m_fragmentVector.add(thisFragment);
return thisFragment;
}
@Override
public int getCount()
{
AbianReaderData abianReaderAppData = AbianReaderApplication.getData();
int currentCount = abianReaderAppData.getNumberedOfFeaturedArticles();
return currentCount;
}
@Override
public void notifyDataSetChanged()
{
for(int i = 0; i < m_fragmentVector.size(); i++)
{
AbianReaderListHeaderFragment thisFragment = m_fragmentVector.get(i);
if(thisFragment != null)
{
if(thisFragment.isVisible())
{
thisFragment.updateContent();
}
if(thisFragment.isDetached())
{
m_fragmentVector.remove(i);
i = -1;
}
}
else
{
m_fragmentVector.remove(i);
i = -1;
}
}
super.notifyDataSetChanged();
}
}
}