com.groksolutions.grok.mobile.HourDayWeekActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.groksolutions.grok.mobile.HourDayWeekActivity.java

Source

/*
 * Numenta Platform for Intelligent Computing (NuPIC)
 * Copyright (C) 2015, Numenta, Inc.  Unless you have purchased from
 * Numenta, Inc. a separate commercial license for this software code, the
 * following terms and conditions apply:
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero Public License version 3 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero Public License for more details.
 *
 * You should have received a copy of the GNU Affero Public License
 * along with this program.  If not, see http://www.gnu.org/licenses.
 *
 * http://numenta.org/licenses/
 *
 */

package com.groksolutions.grok.mobile;

import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;

import com.numenta.core.data.AggregationType;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

import java.util.Locale;

/**
 * <p>
 * Based activity whose all other activities must inherit to show a fixed action bar and menu
 * </p>
 * <p>
 * The basic application layout is based on a ViewPager connected to ActionBar Tabs where the user
 * can change between 3 different views:
 * </p>
 * <ul>
 * <li>Hour</li>
 * <li>Day</li>
 * <li>Week</li>
 * </ul>
 * <p>
 * Where each View is managed by its own Fragment.
 * <ul>
 * <li>Override {@link #createTabFragment(Tab)} to create your own fragment for each {@link Tab}
 * <li>Override {@link #getResourceView()} to supply the view layout. The layout must contain
 * {@link ViewPager} whose id is {@link R.id.pager} to host all other {@link Fragment}s.
 * </ul>
 * </p>
 *
 * @see com.groksolutions.grok.mobile.GrokActivity
 */
@SuppressWarnings("deprecation")
public abstract class HourDayWeekActivity extends GrokActivity implements ActionBar.TabListener {

    /**
     * Override {@link #getResourceView()} to supply the view layout.
     *
     * @return ID for an XML layout resource to be used as the
     * top level view (e.g., R.layout.activity_instance_list)
     */
    protected abstract int getResourceView();

    /**
     * Create {@link android.support.v4.app.Fragment} to be associated with the given {@link
     * android.app.ActionBar.Tab}
     *
     * @param tab The {@link android.app.ActionBar.Tab} for which the
     *            {@link android.support.v4.app.Fragment} will be created.
     *            Usually the tab is associated with a specific {@link com.numenta.core.data.AggregationType},
     *            use {@link android.app.ActionBar.Tab#getTag()} to get the {@link
     *            com.numenta.core.data.AggregationType}
     * @return The {@link android.support.v4.app.Fragment} for this tab
     */
    protected abstract Fragment createTabFragment(Tab tab);

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager _viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getResourceView());

        // Set up the action bar.
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(false);

        Locale l = Locale.getDefault();

        // For each of the sections in the app, add a tab to the action bar.
        // Add the "Fragment" class to the tab's tag. The tab's "Fragment" will
        // be created using this class

        // Hour Page
        actionBar.addTab(actionBar.newTab().setText(getString(R.string.title_tab_hour).toUpperCase(l))
                .setTabListener(this).setTag(AggregationType.Hour));

        // Day Page
        actionBar.addTab(actionBar.newTab().setText(getString(R.string.title_tab_day).toUpperCase(l))
                .setTabListener(this).setTag(AggregationType.Day));

        // Week Page
        actionBar.addTab(actionBar.newTab().setText(getString(R.string.title_tab_week).toUpperCase(l))
                .setTabListener(this).setTag(AggregationType.Week));

        // Create the fragment adapter that will return a fragment based on the
        // Fragment class attached to the tab's tag object
        final FragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

            final Fragment[] _fragments = new Fragment[3];

            @Override
            public Fragment getItem(int position) {
                Tab tab = actionBar.getTabAt(position);
                if (tab != null) {
                    if (_fragments[position] == null) {
                        _fragments[position] = createTabFragment(tab);
                    }
                }
                return _fragments[position];
            }

            @Override
            public int getCount() {
                return actionBar.getTabCount();
            }
        };

        // Set up the ViewPager with the sections adapter.
        _viewPager = (ViewPager) findViewById(R.id.pager);
        _viewPager.setAdapter(pagerAdapter);

        // Keep all pages in memory
        _viewPager.setOffscreenPageLimit(2);

        // When swiping between different sections, select the corresponding
        // tab. We can also use ActionBar.Tab#select() to do this if we have
        // a reference to the Tab.
        _viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });
    }

    void restoreTabSelection() {
        AggregationType aggregation = HTMITApplication.getAggregation();
        final ActionBar actionBar = getActionBar();
        if (actionBar == null) {
            return;
        }
        for (int i = 0; i < actionBar.getTabCount(); i++) {
            Tab tab = actionBar.getTabAt(i);
            if (aggregation.equals(tab.getTag())) {
                actionBar.selectTab(tab);
                break;
            }
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        restoreTabSelection();
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in
        // the ViewPager.
        if (_viewPager != null) {
            _viewPager.setCurrentItem(tab.getPosition());
            AggregationType aggregationType = (AggregationType) tab.getTag();
            // Update Global State with new aggregation
            HTMITApplication.setAggregation(aggregationType);
            Tracker tracker = HTMITApplication.getInstance().getGoogleAnalyticsTracker();
            tracker.setPage(aggregationType.name());
            tracker.send(new HitBuilders.AppViewBuilder().build());
        }
    }

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

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