
package org.holoeverywhere.app;

import java.util.ArrayList;
import java.util.List;

import org.holoeverywhere.LayoutInflater;
import org.holoeverywhere.R;
import org.holoeverywhere.app.TabSwipeFragment.TabInfo;

import android.os.Bundle;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.ActionBar.TabListener;

/**
 * This fragment class implement tabs + swipe navigation pattern<br />
 * <br />
 * Part of HoloEverywhere
 */
public abstract class TabSwipeFragment extends Fragment implements TabSwipeInterface<TabInfo> {
    public static class TabInfo implements TabSwipeInterface.TabInfo {
        public Bundle fragmentArguments;
        public Class<? extends Fragment> fragmentClass;
        public CharSequence title;

        @Override
        public Bundle getFragmentArguments() {
            return fragmentArguments;
        }

        @Override
        public Class<? extends Fragment> getFragmentClass() {
            return fragmentClass;
        }

        @Override
        public CharSequence getTitle() {
            return title;
        }

        @Override
        public void setFragmentArguments(Bundle fragmentArguments) {
            this.fragmentArguments = fragmentArguments;
        }

        @Override
        public void setFragmentClass(Class<? extends Fragment> fragmentClass) {
            this.fragmentClass = fragmentClass;
        }

        @Override
        public void setTitle(CharSequence title) {
            this.title = title;
        }
    }

    private final class TabSwipeAdapter extends FragmentStatePagerAdapter implements
            OnPageChangeListener, TabListener {
        public TabSwipeAdapter() {
            super(getChildFragmentManager());
        }

        @Override
        public int getCount() {
            return mTabs.size();
        }

        @Override
        public Fragment getItem(int position) {
            final TabInfo info = mTabs.get(position);
            return Fragment.instantiate(info.fragmentClass, info.fragmentArguments);
        }

        @Override
        public void onPageScrolled(int position, float percent, int pixels) {
            // Do nothing
        }

        @Override
        public void onPageScrollStateChanged(int scrollState) {
            // Do nothing
        }

        @Override
        public void onPageSelected(int position) {
            dispatchTabSelected(position);
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // Do nothing
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            dispatchTabSelected(tab.getPosition());
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // Do nothing
        }
    }

    private TabSwipeAdapter mAdapter;
    private int mCustomLayout = -1;
    private OnTabSelectedListener mOnTabSelectedListener;
    private int mPrevNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD;
    private boolean mSmoothScroll = true;
    private List<TabInfo> mTabs = new ArrayList<TabInfo>();

    private ViewPager mViewPager;

    @Override
    public TabInfo addTab(CharSequence title, Class<? extends Fragment> fragmentClass) {
        return addTab(title, fragmentClass, null);
    }

    @Override
    public TabInfo addTab(CharSequence title, Class<? extends Fragment> fragmentClass,
            Bundle fragmentArguments) {
        TabInfo info = new TabInfo();
        info.title = title;
        info.fragmentClass = fragmentClass;
        info.fragmentArguments = fragmentArguments;
        return addTab(info);
    }

    @Override
    public TabInfo addTab(int title, Class<? extends Fragment> fragmentClass) {
        return addTab(getText(title), fragmentClass, null);
    }

    @Override
    public TabInfo addTab(int title, Class<? extends Fragment> fragmentClass,
            Bundle fragmentArguments) {
        return addTab(getText(title), fragmentClass, fragmentArguments);
    }

    @Override
    public TabInfo addTab(TabInfo tabInfo) {
        mTabs.add(tabInfo);
        getSupportActionBar().addTab(makeActionBarTab(tabInfo));
        notifyChanged();
        return tabInfo;
    }

    @Override
    public TabInfo addTab(TabInfo tabInfo, int position) {
        mTabs.add(position, tabInfo);
        getSupportActionBar().addTab(makeActionBarTab(tabInfo), position);
        notifyChanged();
        return tabInfo;
    }

    private void dispatchTabSelected(int position) {
        boolean notify = false;
        if (mViewPager.getCurrentItem() != position) {
            mViewPager.setCurrentItem(position, mSmoothScroll);
            notify = true;
        }
        if (getSupportActionBar().getSelectedNavigationIndex() != position) {
            getSupportActionBar().selectTab(getSupportActionBar().getTabAt(position));
            notify = true;
        }
        if (notify) {
            onTabSelected(position);
        }
    }

    @Override
    public OnTabSelectedListener getOnTabSelectedListener() {
        return mOnTabSelectedListener;
    }

    @Override
    public boolean isSmoothScroll() {
        return mSmoothScroll;
    }

    protected Tab makeActionBarTab(TabInfo tabInfo) {
        Tab tab = getSupportActionBar().newTab();
        tab.setText(tabInfo.title);
        tab.setTabListener(mAdapter);
        return tab;
    }

    private void notifyChanged() {
        if (mAdapter != null) {
            mAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(mCustomLayout > 0 ? mCustomLayout : R.layout.tab_swipe, container,
                false);
    }

    @Override
    public void onDestroyView() {
        getSupportActionBar().removeAllTabs();
        getSupportActionBar().setNavigationMode(mPrevNavigationMode);
        super.onDestroyView();
    }

    /**
     * Add your tabs here
     */
    protected abstract void onHandleTabs();

    public void onTabSelected(int position) {
        if (mOnTabSelectedListener != null) {
            mOnTabSelectedListener.onTabSelected(position);
        }
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mViewPager = (ViewPager) view.findViewById(R.id.tabSwipePager);
        if (mViewPager == null) {
            throw new IllegalStateException(
                    "Add ViewPager to your custom layout with id @id/tabSwipePager");
        }
        if (getSupportActionBar().getTabCount() > 0) {
            throw new IllegalStateException(
                    "TabSwipeFragment doesn't support multitabbed fragments");
        }
        mAdapter = new TabSwipeAdapter();
        onHandleTabs();
        mViewPager.setAdapter(mAdapter);
        mViewPager.setOnPageChangeListener(mAdapter);
        mPrevNavigationMode = getSupportActionBar().getNavigationMode();
        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }

    @Override
    public void reloadTabs() {
        removeAllTabs();
        onHandleTabs();
    }

    @Override
    public void removeAllTabs() {
        getSupportActionBar().removeAllTabs();
        mTabs.clear();
        notifyChanged();
    }

    @Override
    public TabInfo removeTab(int position) {
        TabInfo tabInfo = mTabs.remove(position);
        getSupportActionBar().removeTabAt(position);
        notifyChanged();
        return tabInfo;
    }

    @Override
    public TabInfo removeTab(TabInfo tabInfo) {
        for (int i = 0; i < mTabs.size(); i++) {
            if (mTabs.get(i) == tabInfo) {
                return removeTab(i);
            }
        }
        return tabInfo;
    }

    @Override
    public void setCurrentTab(int position) {
        dispatchTabSelected(Math.min(0, Math.max(position, mTabs.size() - 1)));
    }

    /**
     * If you want custom layout for this activity - call this method before
     * super.onCreate<br />
     * Your layout should be contains ViewPager with id @id/tabSwipePager
     */
    @Override
    public void setCustomLayout(int customLayout) {
        mCustomLayout = customLayout;
    }

    @Override
    public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener) {
        mOnTabSelectedListener = onTabSelectedListener;
    }

    /**
     * Smooth scroll of ViewPager when user click on tab
     */
    @Override
    public void setSmoothScroll(boolean smoothScroll) {
        mSmoothScroll = smoothScroll;
    }
}

@@ -8294,18 +8294,18 @@
 d(Math.m
-in
+ax
 (0, Math
@@ -8306,18 +8306,18 @@
 , Math.m
-ax
+in
 (positio

Fix #474 [deploy snapshot]