ca.liquidlabs.android.speedtestvisualizer.fragments.GraphViewMasterFragment.java Source code

Java tutorial

Introduction

Here is the source code for ca.liquidlabs.android.speedtestvisualizer.fragments.GraphViewMasterFragment.java

Source

/*
 * Copyright 2013 Liquid Labs Inc.
 *
 * 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 ca.liquidlabs.android.speedtestvisualizer.fragments;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import ca.liquidlabs.android.speedtestvisualizer.R;
import ca.liquidlabs.android.speedtestvisualizer.model.GraphLabelDate;
import ca.liquidlabs.android.speedtestvisualizer.model.GraphType;
import ca.liquidlabs.android.speedtestvisualizer.util.SpeedTestRecordProcessorTask;
import ca.liquidlabs.android.speedtestvisualizer.util.SpeedTestRecordProcessorTask.OnDataProcessorListener;
import ca.liquidlabs.android.speedtestvisualizer.util.Tracer;

import com.jjoe64.graphview.BarGraphView;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.GraphViewDataInterface;
import com.jjoe64.graphview.GraphViewSeries;
import com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle;
import com.jjoe64.graphview.LineGraphView;

public class GraphViewMasterFragment extends BaseGraphFragment {
    /**
     * Log tag.
     */
    private static final String LOG_TAG = GraphViewMasterFragment.class.getSimpleName();

    /**
     * The fragment argument representing the section number for this fragment.
     */
    public static final String BUNDLE_ARG_HEADER = "csvHeader";
    public static final String BUNDLE_ARG_DATA = "csvData";
    public static final String BUNDLE_ARG_GRAPH_TYPE = "graphType";

    private FrameLayout mGraphViewContainer;

    private GraphLabelDate mGraphDateLabelFormatter;

    //
    // Data from bundle
    //
    private String mCsvHeader;
    private String mCsvData;
    private GraphType mGraphType;

    /**
     * Creates a graph fragment to draw graphview based on data and graph type.
     * 
     * @param header CSV header for parsing.
     * @param csvData CSV Data for parsing.
     * @param graphType Type of graph to draw. See {@link GraphType}.
     * @return Fragment containing graph.
     */
    public static Fragment newInstance(final String header, final String csvData, GraphType graphType) {
        Tracer.debug(LOG_TAG, "newInstance()");
        GraphViewMasterFragment fragment = new GraphViewMasterFragment();
        Bundle bundle = new Bundle();
        bundle.putString(BUNDLE_ARG_HEADER, header);
        bundle.putString(BUNDLE_ARG_DATA, csvData);
        bundle.putSerializable(BUNDLE_ARG_GRAPH_TYPE, graphType);
        fragment.setArguments(bundle);

        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Tracer.debug(LOG_TAG, "onCreateView()");
        View rootView = inflater.inflate(R.layout.fragment_graph_generic, container, false);
        mGraphViewContainer = (FrameLayout) rootView.findViewById(R.id.graph_view_container);

        return rootView;
    }

    /*
     * (non-Javadoc)
     * @see android.app.Fragment#onActivityCreated(android.os.Bundle)
     */
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Get the arguments and save them.
        Bundle bundleArgs = getArguments();
        mCsvHeader = bundleArgs.getString(BUNDLE_ARG_HEADER);
        mCsvData = bundleArgs.getString(BUNDLE_ARG_DATA);
        mGraphType = (GraphType) bundleArgs.getSerializable(BUNDLE_ARG_GRAPH_TYPE);
        mGraphDateLabelFormatter = new GraphLabelDate();

        new SpeedTestRecordProcessorTask(this).execute(mCsvHeader, mCsvData, mGraphType.name());

        Tracer.debug(LOG_TAG, "onActivityCreated()");

    }

    /**
     * {@inheritDoc} <br/>
     * 
     * @see OnDataProcessorListener
     */
    @Override
    public void onComplete(final GraphViewDataInterface[]... dataSets) {
        // Check after all processing done, if this fragment is still visible.
        if (this.isRemoving() || this.isDetached()) {
            Tracer.debug(LOG_TAG, "onComplete() >> Fragment is removing or already detached.");
            // do nothing, view is already gone.
            return;
        }

        // first - hide the progress indicator
        hideProgressIndicator();
        Tracer.debug(LOG_TAG, "onComplete (multi): " + dataSets);

        Tracer.debug(LOG_TAG, "onComplete (multi) > data available? - " + dataSets.length);

        GraphViewDataInterface[][] availableDataSets = dataSets;

        /*
         * For single series graph, use BAR chart. Usually used for single
         * dimension graph. Eg. Download VS Date, Upload VS Date and so on.
         */
        if (availableDataSets.length == 1) {
            addSingleSeriesGraph(availableDataSets[0]);
            return;
        }

        // graph with dynamically genereated horizontal and vertical labels
        LineGraphView graphView;
        graphView = new LineGraphView(getActivity().getApplicationContext(), mGraphType.getGraphTitle());

        for (int index = 0; index < availableDataSets.length; index++) {
            /*
             * Since we have limited type of multi series data, hardcode the
             * type for now. FIXME: Fix this in next release and generalize the
             * return type after data is processed.
             */
            if (index == 0) {
                // DONWLOAD data - FIXME: Hardcoded value - must be fixed!!!!!!!
                GraphViewSeries seriesData = new GraphViewSeries("Download",
                        new GraphViewSeriesStyle(Color.rgb(200, 50, 00), 3), availableDataSets[index]);
                graphView.addSeries(seriesData);

            } else if (index == 1) {
                // UPLOAD data - FIXME: Hardcoded value - must be fixed!!!!!!!
                GraphViewSeries seriesData = new GraphViewSeries("Upload",
                        new GraphViewSeriesStyle(Color.rgb(90, 250, 00), 3), availableDataSets[index]);
                graphView.addSeries(seriesData);

            } else {
                GraphViewSeries seriesData = new GraphViewSeries("Data: " + index,
                        new GraphViewSeriesStyle(Color.rgb(200, 50, 00), 5), availableDataSets[index]);
                // add data
                graphView.addSeries(seriesData);
            }
        }
        // set legend
        graphView.setShowLegend(true);
        graphView.getGraphViewStyle().setHorizontalLabelsColor(Color.GRAY);
        graphView.getGraphViewStyle().setVerticalLabelsColor(Color.GRAY);
        graphView.setCustomLabelFormatter(mGraphDateLabelFormatter);
        // set view port, start=2, size=40
        // graphView.setViewPort(2, 40);
        // graphView.setScrollable(true);

        // add graph to the view
        mGraphViewContainer.addView(graphView);
    }

    private void addSingleSeriesGraph(final GraphViewDataInterface[] data) {
        // init graph data
        GraphViewSeries downloadSeries = new GraphViewSeries(data);

        GraphView graphView;
        graphView = new BarGraphView(getActivity().getApplicationContext() // context
                , mGraphType.getGraphTitle() // heading
        );

        // override styles
        graphView.getGraphViewStyle().setHorizontalLabelsColor(Color.GRAY);
        graphView.getGraphViewStyle().setVerticalLabelsColor(Color.GRAY);
        graphView.setCustomLabelFormatter(mGraphDateLabelFormatter);

        // add data
        graphView.addSeries(downloadSeries);

        // add graph to the view
        mGraphViewContainer.addView(graphView);
    }

}