net.peterkuterna.android.apps.devoxxfrsched.ui.ScheduleFragment.java Source code

Java tutorial

Introduction

Here is the source code for net.peterkuterna.android.apps.devoxxfrsched.ui.ScheduleFragment.java

Source

/*
 * Copyright 2011 Google Inc.
 * Copyright 2011 Peter Kuterna
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.peterkuterna.android.apps.devoxxfrsched.ui;

import net.peterkuterna.android.apps.devoxxfrsched.R;
import net.peterkuterna.android.apps.devoxxfrsched.ui.widget.ObservableScrollView;
import net.peterkuterna.android.apps.devoxxfrsched.ui.widget.ObservableScrollView.OnScrollListener;
import net.peterkuterna.android.apps.devoxxfrsched.ui.widget.SwipeyTabs;
import net.peterkuterna.android.apps.devoxxfrsched.ui.widget.SwipeyTabsAdapter;
import net.peterkuterna.android.apps.devoxxfrsched.util.AnalyticsUtils;
import net.peterkuterna.android.apps.devoxxfrsched.util.UIUtils;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;

public class ScheduleFragment extends SherlockFragment {

    protected static final String TAG = "ScheduleFragment";

    private ViewPager mViewPager;
    private SwipeyTabs mTabs;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setHasOptionsMenu(true);

        AnalyticsUtils.getInstance(getActivity()).trackPageView("/Schedule");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_schedule, null);

        mViewPager = (ViewPager) root.findViewById(R.id.viewpager);

        mViewPager.setOffscreenPageLimit(4);
        mViewPager.setPageMargin(getResources().getDimensionPixelSize(R.dimen.viewpager_page_margin));
        mViewPager.setPageMarginDrawable(R.drawable.viewpager_margin);

        mTabs = (SwipeyTabs) root.findViewById(R.id.viewpagerheader);

        return root;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        final BlocksPagerAdapter adapter = new BlocksPagerAdapter(getActivity(), getFragmentManager());
        mViewPager.setAdapter(adapter);
        mTabs.setAdapter(adapter);
        mViewPager.setOnPageChangeListener(mTabs);

        getActivity().runOnUiThread(new Runnable() {
            public void run() {
                updateNowView(true);
            }
        });
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.schedule_menu_items, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.menu_now) {
            if (!updateNowView(true)) {
                Toast.makeText(getActivity(), R.string.toast_now_not_visible, Toast.LENGTH_SHORT).show();
                return true;
            }
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * Update position and visibility of "now" view.
     */
    private boolean updateNowView(boolean forceScroll) {
        final long now = UIUtils.getCurrentTime(getActivity());

        int nowDay = -1;
        for (int i = 0; i < UIUtils.START_DAYS_IN_MILLIS.length; i++) {
            if (now >= UIUtils.START_DAYS_IN_MILLIS[i]
                    && now <= (UIUtils.START_DAYS_IN_MILLIS[i] + DateUtils.DAY_IN_MILLIS)) {
                nowDay = i;
                break;
            }
        }

        if (nowDay != -1 && forceScroll) {
            mViewPager.setCurrentItem(nowDay);
            return true;
        }

        return false;
    }

    private class BlocksPagerAdapter extends FragmentPagerAdapter implements SwipeyTabsAdapter, OnScrollListener {

        private static final int TIME_FLAGS = DateUtils.FORMAT_SHOW_WEEKDAY;

        private final Context mContext;
        private int mScrollY = -1;

        public BlocksPagerAdapter(Context context, FragmentManager fm) {
            super(fm);

            this.mContext = context;
        }

        @Override
        public Fragment getItem(int position) {
            return BlockScheduleItemsFragment.newInstance(position, UIUtils.START_DAYS_IN_MILLIS[position],
                    mScrollY);
        }

        @Override
        public Object instantiateItem(View container, int position) {
            BlockScheduleItemsFragment fragment = (BlockScheduleItemsFragment) super.instantiateItem(container,
                    position);

            fragment.setOnScrollListener(this);
            if (mScrollY != -1) {
                fragment.setScrollY(mScrollY);
            }

            return fragment;
        }

        @Override
        public TextView getTab(final int position, SwipeyTabs root) {
            TextView view = (TextView) LayoutInflater.from(mContext).inflate(R.layout.swipey_tab_indicator, root,
                    false);
            view.setText(DateUtils.formatDateTime(getActivity(), UIUtils.START_DAYS_IN_MILLIS[position], TIME_FLAGS)
                    .toUpperCase());
            view.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(final View v) {
                    mViewPager.setCurrentItem(position);
                }
            });
            return view;
        }

        @Override
        public int getCount() {
            return UIUtils.NUMBER_DAYS;
        }

        @Override
        public void onScrollChanged(ObservableScrollView view) {
            mScrollY = view.getScrollY();

            for (int i = 0; i < getCount(); i++) {
                final String fragmentName = makeFragmentName(mViewPager.getId(), i);
                final Fragment f = getFragmentManager().findFragmentByTag(fragmentName);
                if (f instanceof BlockScheduleItemsFragment) {
                    BlockScheduleItemsFragment scheduleFragment = (BlockScheduleItemsFragment) f;
                    final ScrollView scrollView = scheduleFragment.getScrollView();
                    if (!view.equals(scrollView)) {
                        scheduleFragment.setScrollY(mScrollY);
                    }
                }
            }
        }

    }

}