package com.brink.main.Activities; import java.util.ArrayList; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.HorizontalScrollView; import android.widget.TabHost; import android.widget.TabWidget; import android.widget.TextView; import com.brink.main.R; import com.brink.main.Fragments.ActivityFeed; import com.brink.main.Fragments.Bars; import com.brink.main.Fragments.Rate; import com.brink.main.Fragments.TopBars; import com.brink.main.api.ApiManager; public class ViewHandler extends FragmentActivity{ TabHost mTabHost; ViewPager mViewPager; TabsAdapter mTabsAdapter; public static String TAG = "ViewHandlerActivity"; static HorizontalScrollView mHorizontalScrollView; static int mActiveFeature = 0; private static GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ApiManager.SetMainActivity(this); setContentView(R.layout.mainpage); mTabHost = (TabHost)findViewById(android.R.id.tabhost); mHorizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontalscrollview); mViewPager = (ViewPager)findViewById(R.id.pager); mTabHost.setup(); mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager); mTabsAdapter.addTab(mTabHost.newTabSpec("rate"), Rate.RateFragment.class , "Rate"); mTabsAdapter.addTab(mTabHost.newTabSpec("bars"), Bars.BarsFragment.class, "Bars"); mTabsAdapter.addTab(mTabHost.newTabSpec("activityfeed"), ActivityFeed.FeedFragment.class, "Activity"); mTabsAdapter.addTab(mTabHost.newTabSpec("topbars"), TopBars.TopBarsFragment.class, "Top Bars"); mTabsAdapter.mTabHost.setCurrentTabByTag("Activity"); if (savedInstanceState != null) { mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("tab", mTabHost.getCurrentTabTag()); } public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener { private final Context mContext; private final TabHost mTabHost; private final ViewPager mViewPager; private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); static final class TabInfo { private final String tag; private final Class<?> clss; private final Bundle args; TabInfo(String _tag, Class<?> _class, Bundle _args) { tag = _tag; clss = _class; args = _args; } } static class DummyTabFactory implements TabHost.TabContentFactory { private final Context mContext; public DummyTabFactory(Context context) { mContext = context; } public View createTabContent(String tag) { View v = new View(mContext); v.setMinimumWidth(0); v.setMinimumHeight(0); return v; } } public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mTabHost = tabHost; mViewPager = pager; mTabHost.setOnTabChangedListener(this); mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); mHorizontalScrollView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if(mGestureDetector.onTouchEvent(event)) { Log.i(TAG, "TabsAdapter-onTouch Case 1"); return true; } else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { Log.i(TAG, "TabsAdapter-onTouch Case 2"); int scrollX = mHorizontalScrollView.getScrollX(); int featureWidth = v.getMeasuredWidth(); mActiveFeature = ((scrollX + (featureWidth/2))/featureWidth); int scrollTo = mActiveFeature*featureWidth; mHorizontalScrollView.smoothScrollTo(scrollTo,0); return true; } else { Log.i(TAG, "TabsAdapter-onTouch Case 3"); return false; } } }); mGestureDetector = new GestureDetector(new MyGestureDetector()); } public class MyGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { //right to left if(velocityX < 0 && Math.abs(velocityX) > 300) { Log.i(TAG, "MyGestureDetector - Processing onFling RtoL"); int featureWidth = mHorizontalScrollView.getMeasuredWidth(); mHorizontalScrollView.smoothScrollTo(mActiveFeature*featureWidth, 0); return true; } //left to right else if (velocityX > 0 && Math.abs(velocityX) > 300) { Log.i(TAG, "MyGestureDetector - Processing onFling LtoR"); int featureWidth = mHorizontalScrollView.getMeasuredWidth(); mActiveFeature = (mActiveFeature > 0)? mActiveFeature - 1:0; mHorizontalScrollView.smoothScrollTo(mActiveFeature*featureWidth, 0); return true; } } catch (Exception e) { Log.e("Fling", "There was an error processing the Fling event:" + e.getMessage()); } return false; } } public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, String tabName) { tabSpec.setContent(new DummyTabFactory(mContext)); String tag = tabSpec.getTag(); TabInfo info = new TabInfo(tag, clss, null); mTabs.add(info); tabSpec.setIndicator(prepareTab(mTabHost.getContext(), tabName)); mTabHost.addTab(tabSpec); notifyDataSetChanged(); } public static View prepareTab(Context context, String text) { View view = LayoutInflater.from(context).inflate(R.layout.tabs_main,null); TextView tabText = (TextView) view.findViewById(R.id.tabsText); tabText.setText(text); return view; } public int getCount() { return mTabs.size(); } public Fragment getItem(int position) { TabInfo info = mTabs.get(position); return Fragment.instantiate(mContext, info.clss.getName(), info.args); } public void onTabChanged(String tabId) { int position = mTabHost.getCurrentTab(); mViewPager.setCurrentItem(position); mHorizontalScrollView.scrollTo(position, 0); mHorizontalScrollView.refreshDrawableState(); } public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { mHorizontalScrollView.scrollTo(position, 0); mHorizontalScrollView.refreshDrawableState(); } public void onPageSelected(int position) { // Unfortunately when TabHost changes the current tab, it kindly // also takes care of putting focus on it when not in touch mode. // The jerk. // This hack tries to prevent this from pulling focus out of our // ViewPager. TabWidget widget = mTabHost.getTabWidget(); int oldFocusability = widget.getDescendantFocusability(); widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); mTabHost.setCurrentTab(position); widget.setDescendantFocusability(oldFocusability); } public void onPageScrollStateChanged(int state) { } } }