package com.brink.main.Fragments;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.brink.main.R;
import com.brink.main.api.FeedApiManager;
import com.brink.main.contracts.ISecondTaskNotifier;
import com.brink.main.contracts.IThirdTaskNotifier;
import com.brink.main.converters.FeedConverter;
import com.brink.main.models.Checkin;
import com.brink.main.models.FeedItem;
public class ActivityFeed extends FragmentActivity {
private static String TAG = "ActivityFeedFragmentActivity";
public static Context mContext;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
FragmentManager fm = getSupportFragmentManager();
//Add our fragment if and only if it has not been added before
if(fm.findFragmentById(android.R.id.content) == null)
{
Log.i(TAG, "onCreate - Adding FeedFragment");
FeedFragment mFeedFragment = new FeedFragment();
fm.beginTransaction().add(android.R.id.content, mFeedFragment).commit();
}
}
public static class FeedFragment extends ListFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.feed, container, false);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mContext = getActivity();
ActivityFeed eFeed = new ActivityFeed();
FeedAdapter mFeedAdapter = eFeed.new FeedAdapter(getActivity());
this.setListAdapter(mFeedAdapter);
}
}
/*
* Name: ActivityFeedListAdapter
* Description: Adapter to mesh the array of items containted in the data feed and the list.
* @param ArrayList<feedItems> items: This will be the list of items to be displayed to the user.
*/
public class FeedAdapter extends BaseAdapter implements ISecondTaskNotifier<List<FeedItem>>, AdapterView.OnItemClickListener{
private ArrayList<FeedItem> feedData = new ArrayList<FeedItem>();
private FeedItem mLoadingItem = new FeedItem();
private LayoutInflater mInflater;
private Context mContext;
private Checkin mCheckin = null;
private static final int TYPE_CHECKIN = 0;
private static final int TYPE_TRENDING =1;
private static final int TYPE_ADVERTITEM = 2;
private static final int TYPE_LOAD = 3;
public ISecondTaskNotifier<List<FeedItem>> _notifier;
public FeedAdapter(Context _context) {
mContext = _context;
mInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
_notifier = this;
mLoadingItem.SetEnum("Loading");
AsyncTask<Integer, Void, List<FeedItem>> mFeedTask = FeedApiManager.getFeedItems(_notifier, "Baton Rouge");
mFeedTask.execute(0);
}
public void addFeedItems(List<FeedItem> feedItems) {
if(feedData.size() == 0) {
feedData.addAll(feedItems);
feedData.add(mLoadingItem);
notifyDataSetChanged();
} else {
feedData.remove(feedData.size() - 1);
feedData.addAll(feedItems);
feedData.add(mLoadingItem);
notifyDataSetChanged();
}
}
public int getCount() {
return feedData.size();
}
public Object getItem(int position) {
return feedData.get(position);
}
public int getViewTypeCount() {
return 2;
}
public int getItemViewType(int position) {
return feedData.get(position).type.TypeValue();
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
RatedItemHolder rateHolder = null;
LoadItemHolder loadHolder = null;
AdvertisementHolder advertHolder = null;
int type = getItemViewType(position);
if(convertView == null) {
switch(type) {
case TYPE_CHECKIN:
convertView = mInflater.inflate(R.layout.feeditem1, null);
rateHolder = new RatedItemHolder();
rateHolder.barName = (TextView)convertView.findViewById(R.id.feeditemratebarname);
rateHolder.barRating = (TextView)convertView.findViewById(R.id.feeditemratebarrating);
rateHolder.checkedIn = (TextView)convertView.findViewById(R.id.feeditemratebarcheckins);
rateHolder.usersName = (TextView)convertView.findViewById(R.id.feeditemrateusersname);
rateHolder.userTakenPicture = (ImageView)convertView.findViewById(R.id.ratedbarpicture);
convertView.setTag(rateHolder);
break;
//This is the case for when we add advertisement items.
case TYPE_ADVERTITEM:
break;
case TYPE_TRENDING:
break;
case TYPE_LOAD:
convertView = mInflater.inflate(R.layout.feed_load, null);
loadHolder = new LoadItemHolder();
loadHolder.feedLoad = (ProgressBar)convertView.findViewById(R.id.feedloadprogress);
convertView.setTag(loadHolder);
break;
}
} else {
switch(type) {
case TYPE_CHECKIN:
rateHolder = (RatedItemHolder) convertView.getTag();
break;
//This is the case for when we add advertisement items.
case TYPE_ADVERTITEM:
break;
case TYPE_TRENDING:
break;
case TYPE_LOAD:
loadHolder = (LoadItemHolder) convertView.getTag();
break;
}
}
//Setting the data on to the feed.
switch(type) {
case TYPE_CHECKIN:
//Get the information to inflate;
mCheckin = new Checkin();
mCheckin = (Checkin) getItem(position);
rateHolder.barName.setText(mCheckin.Bar.Name);
rateHolder.barRating.setText(mCheckin.Bar.Rating);
rateHolder.checkedIn.setText("" + mCheckin.Bar.CheckinCount);
rateHolder.usersName.setText(mCheckin.User.Name);
rateHolder.userTakenPicture.setImageBitmap(mCheckin.Image);
break;
//This is the case for when we add advertisement items.
case TYPE_ADVERTITEM:
break;
case TYPE_TRENDING:
break;
case TYPE_LOAD:
loadHolder.feedLoad.setVisibility(View.INVISIBLE);
break;
}
return convertView;
}
public void onSecondTaskComplete(List<FeedItem> result) {
addFeedItems(result);
}
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
Log.i("TAG", "Receiving input");
}
}
//TODO adjust later to where these are in the current format of the app.
public static class Advertisement {
public String barName, barAddress, happeningSpecial;
Bitmap barLogo;
}
public static class RatedItemHolder {
TextView barName, barRating, usersName, checkedIn;
ImageView userTakenPicture;
}
public static class LoadItemHolder {
ProgressBar feedLoad;
}
public static class AdvertisementHolder {
TextView barName, barAddress, happeningSpecial;
ImageView barLogo;
}
}