package com.moupress.app.friendshost.ui;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
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.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.AbsListView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Toast;
import com.moupress.app.friendshost.Const;
import com.moupress.app.friendshost.PubSub;
import com.moupress.app.friendshost.R;
import com.moupress.app.friendshost.activity.FHGuideActivity;
import com.moupress.app.friendshost.sns.SnsUtil;
import com.moupress.app.friendshost.sns.Listener.SnsEventListener;
import com.moupress.app.friendshost.ui.listeners.ContentViewListener;
import com.moupress.app.friendshost.ui.listeners.TitleBarListener;
import com.moupress.app.friendshost.uicomponent.SlidingPanel;
import com.moupress.app.friendshost.uicomponent.PullToRefreshListView;
import com.moupress.app.friendshost.uicomponent.PullToRefreshListView.OnRefreshListener;
import com.moupress.app.friendshost.uicomponent.TabPageIndicator;
import com.moupress.app.friendshost.uicomponent.SlidingPanel.PanelSlidingListener;
import com.moupress.app.friendshost.uicomponent.interfaces.TitleProvider;
import com.moupress.app.friendshost.util.Pref;
import com.moupress.app.friendshost.util.FlurryUtil;
/**
* @author Li Ji
*
*/
public class MainUIView extends View{
private static final String TAG = "MainUIView";
private ViewPager mPager;
private TabPageIndicator mIndicator;
private FragmentStatePagerAdapter mAdapter;
private SlidingPanel slidingPanel;
private LeftPanelView leftPanelView;
//Interface between Presenter (MainUIView) and Model (SnsUtil)
private SnsEventListener snsEventListener = new SnsEventListener()
{
@Override
public void OnSnsUtilAdded(String snsName) {
leftPanelView.RefreshView();
RefreshView();
}
@Override
public void OnSnsUtilRemoved(String snsName) {
leftPanelView.RefreshView();
RefreshView();
}
};
public MainUIView()
{
this.TitleLayoutId = R.layout.fh_title_bar;
this.ContentLayoutId = R.layout.fh_main_ui;
}
@Override
public void InitTitle(Activity activity, TitleBarListener titleBarListener) {
super.InitTitle(activity, titleBarListener);
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
}
private static Activity zActivity;
@Override
protected void RefreshView()
{
if(mAdapter != null)
{
this.LoadData.clear();
LoadData.putCharSequenceArrayList(Const.SNS_SIGN_ON, PubSub.zSnsOrg.GetSignOnSnsNames());
this.mAdapter.notifyDataSetChanged();
this.mIndicator.notifyDataSetChanged();
//this.mIndicator.setViewPager(mPager);
//this.LoadView(LoadData);
}
}
@Override
public void InitContent(Activity activity, ContentViewListener contentViewListener) {
// TODO Auto-generated method stub
super.InitContent(activity, contentViewListener);
if(ContentLayoutId != -1)
activity.setContentView(ContentLayoutId);
//if(TitleLayoutId != -1)
//activity.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, this.TitleLayoutId);
if(activity instanceof FragmentActivity)
mAdapter = new SnsAdapter(((FragmentActivity)activity).getSupportFragmentManager());
mPager = (ViewPager) activity.findViewById(R.id.snsPager);
mIndicator = (TabPageIndicator) activity.findViewById(R.id.snsTabIndicator);
zActivity = activity;
InitSlidingPanel(activity);
InitTitleButtons(activity);
InitLeftPanelView(activity);
InitGuide(activity);
}
private void InitGuide(Activity activity) {
if(!Pref.getMyBoolPref(activity.getApplicationContext(), Const.VIEW_GUIDE))
{
this.launchGuide();
}
}
@Override
public void LoadView(Bundle loadData) {
//Set Adapter for View Pages on the MainUI
this.LoadData = loadData;
mPager.setAdapter(mAdapter);
mIndicator.setViewPager(mPager);
}
public FragmentStatePagerAdapter getAdapter() {
return mAdapter;
}
private void InitSlidingPanel(Activity activity)
{
slidingPanel = (SlidingPanel) activity.findViewById(R.id.slidepanel);
slidingPanel.SetAlignViewId(R.id.leftPanelLayout);
slidingPanel.setPanelSlidingListener(new PanelSlidingListener(){
@Override
public void onSlidingDownEnd() {
// TODO Auto-generated method stub
}
@Override
public void onSlidingUpEnd() {
// TODO Auto-generated method stub
}});
}
public boolean SlidePanelBack()
{
return slidingPanel.Slide2Right();
}
private void InitTitleButtons(final Activity activity)
{
ImageButton btnSetting = (ImageButton) activity.findViewById(R.id.leftpanelbtn);
btnSetting.setOnClickListener(new OnClickListener(){
@Override
public void onClick(android.view.View arg0) {
slidingPanel.Slide2Left();
//slidingPanel.setVisibility(android.view.View.GONE);
}});
ImageButton btnPub = (ImageButton) activity.findViewById(R.id.writefeedbtn);
btnPub.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(android.view.View v) {
if(!slidingPanel.Slide2Right())
titleBarListener.OnTitleBarButtonClick(Const.VIEW_MAIN, 1, Const.SNS_RENREN);
}
});
ImageButton btnRefresh = (ImageButton) activity.findViewById(R.id.refreshbtn);
// btnRefresh.setOnClickListener(new OnClickListener(){
//
// @Override
// public void onClick(android.view.View arg0) {
// launchGuide();
// }});
btnRefresh.setOnClickListener(new OnClickListener(){
@Override
public void onClick(android.view.View v) {
//slidingPanel.Slide2Right();
if(!slidingPanel.Slide2Right())
{
int index = mPager.getCurrentItem();
//String snsName = Const.SNSGROUPS[index];
//final ListView lv = (SnsFeedListFragment)mPager.ge ().getListView();
SnsFeedListFragment lstFrag = (SnsFeedListFragment) ((FragmentActivity)activity).getSupportFragmentManager().findFragmentByTag(((SnsAdapter)mAdapter).getTitle(index));
if(lstFrag != null)
{
final ListView lv = (ListView) lstFrag.getListView();
lv.post(new Runnable(){
@Override
public void run() {
lv.setSelection(0);
}});
}
}
}});
}
private void launchGuide() {
// TODO Auto-generated method stub
Intent intent = new Intent(this.zActivity,FHGuideActivity.class);
this.zActivity.startActivity(intent);
}
private void InitLeftPanelView(Activity activity) {
leftPanelView = new LeftPanelView(snsEventListener);
leftPanelView.InitContent(activity, contentViewListener);
leftPanelView.LoadView(null);
}
public class SnsAdapter extends FragmentStatePagerAdapter implements TitleProvider
{
FragmentManager fm;
//Bundle framentBundle;
public SnsAdapter(FragmentManager fm) {
super(fm);
this.fm = fm;
//framentBundle = new Bundle();
}
@Override
public int getItemPosition(Object object) {
//return super.getItemPosition(object);
int status = PagerAdapter.POSITION_NONE;
return status;
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
SnsFeedListFragment snsFeedListFragment = SnsFeedListFragment.newInstance(LoadData.getCharSequenceArrayList(Const.SNS_SIGN_ON).get(position).toString());
try{
fm.beginTransaction().add(snsFeedListFragment, LoadData.getCharSequenceArrayList(Const.SNS_SIGN_ON).get(position).toString().toUpperCase()).commit();
}
catch(Exception e)
{
Log.i(TAG, "Error + "+e.toString());
}
return snsFeedListFragment;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return LoadData.getCharSequenceArrayList(Const.SNS_SIGN_ON).size();
//return Const.SNSGROUPS.length;
}
@Override
public String getTitle(int position) {
// TODO Auto-generated method stub
//return MainUIView.CONTENT[position % MainUIView.CONTENT.length].toUpperCase();
ArrayList<CharSequence> titles = LoadData.getCharSequenceArrayList(Const.SNS_SIGN_ON);
return titles.get(position%titles.size()).toString().toUpperCase();
}
@Override
public int getTitleCount() {
// TODO Auto-generated method stub
return LoadData.getCharSequenceArrayList(Const.SNS_SIGN_ON).size();
}
}
public static class SnsFeedListFragment extends ListFragment
{
//private android.view.View v;
private String snsName;
private PullToRefreshListView lstViewFeedPreview;
private int iCountScrollEvent;
private boolean bScrolling;
private int iPrevScrollState;
// @Override
// public ListView getListView() {
// // TODO Auto-generated method stub
// //return super.getListView();
// return (ListView) v;
// }
static SnsFeedListFragment newInstance(String sns)
{
SnsFeedListFragment snsFeedListFragment = new SnsFeedListFragment();
Bundle args = new Bundle();
args.putString(Const.SNS, sns);
snsFeedListFragment.setArguments(args);
return snsFeedListFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
snsName = getArguments() != null ? getArguments().getString("sns"): null;
}
@Override
public android.view.View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
//return super.onCreateView(inflater, container, savedInstanceState);
android.view.View v = inflater.inflate(R.layout.fh_feed_list, container, false);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
final SnsUtil snsUtil = PubSub.zSnsOrg.GetSnsInstance(this.snsName);
this.setListAdapter(snsUtil.getFeedAdapter());
snsUtil.RefreshAdapter();
lstViewFeedPreview = (PullToRefreshListView) this.getListView();
lstViewFeedPreview.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
// FlurryUtil
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ");
FlurryUtil.logEvent(TAG + ":SnsFeedListFragment:onRefresh", snsName + "," +sdf.format(new Date()));
new GetDataTask().execute();
}
});
iCountScrollEvent = 0;
bScrolling = false;
iPrevScrollState = OnScrollListener.SCROLL_STATE_IDLE;
lstViewFeedPreview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if ((iPrevScrollState == OnScrollListener.SCROLL_STATE_IDLE
&& scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL)
|| (iPrevScrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL
&& scrollState == OnScrollListener.SCROLL_STATE_FLING)) {
bScrolling = true;
} else {
bScrolling = false;
}
iPrevScrollState = scrollState;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
boolean loadOlder = firstVisibleItem + visibleItemCount >= totalItemCount;
//boolean loadNewer = firstVisibleItem == 0;
if(loadOlder && bScrolling) {
//still some bug but only trigger 2 times at the bottom now.
//fGetAdapterFeedPreview() += visibleItemCount; // or any other amount
//fGetAdapterFeedPreview().notifyDataSetChanged();
iCountScrollEvent++;
Toast.makeText(zActivity, "Loading More Feeds",
Toast.LENGTH_LONG).show();
//PubSub.zFeedOrg.fGet10MoreNewsFeed(snsName);
PubSub.zSnsOrg.GetSnsInstance(snsName).RefreshAdapter10MoreFeed();
bScrolling = false;
}
}
});
}
private class GetDataTask extends AsyncTask<Void, Void, String[]> {
@Override
protected String[] doInBackground(Void... params) {
// Simulates a background job.
String[] mStrings = {
"aa", "bb"};
try {
PubSub.zSnsOrg.GetSnsInstance(snsName).fGetNewsFeed(zActivity);
//sleep a while to wait for async news feed getting return
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return mStrings;
}
@Override
protected void onPostExecute(String[] result) {
//mListItems.addFirst("Added after refresh...");
Toast.makeText(zActivity, "Refresh Complete " +snsName,
Toast.LENGTH_SHORT).show();
PubSub.zSnsOrg.GetSnsInstance(snsName).RefreshAdapter();
// Call onRefreshComplete when the list has been refreshed.
try{
((PullToRefreshListView) getListView()).onRefreshComplete();
}
catch(Exception e)
{
Log.i(TAG, "Main UI View "+ e.getMessage());
}
super.onPostExecute(result);
}
}
}
public void DialogCallBack(Intent data) {
// TODO Auto-generated method stub
this.leftPanelView.DialogCallBack(data);
}
}