package com.github.andlyticsproject;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.FrameLayout.LayoutParams;
import android.widget.Gallery;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.ViewSwitcher;
import com.github.andlyticsproject.Preferences.Timeframe;
import com.github.andlyticsproject.chart.Chart;
import com.github.andlyticsproject.view.ChartGallery;
import com.github.andlyticsproject.view.ChartGalleryAdapter;
import com.github.andlyticsproject.view.ViewSwitcher3D;
import com.github.andlyticsproject.view.ViewSwitcher3D.ViewSwitcherListener;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("deprecation")
public abstract class ChartFragmentBase extends Fragment implements ViewSwitcherListener {
protected static final String SELECTED_CHART_PAGE = "selected_chart_page";
protected static final String SELECTED_CHART_COLUMN = "selected_chart_position";
protected ChartGalleryAdapter chartGalleryAdapter;
protected ChartGallery chartGallery;
protected ListView dataList;
protected TextView timeframeText;
protected String timetext;
protected Timeframe currentTimeFrame;
protected ViewSwitcher3D listViewSwitcher;
protected ViewGroup dataframe;
protected ViewGroup chartframe;
protected BaseChartListAdapter<?> myAdapter;
protected int currentChartPage = -1;
protected int currentChartColumn = -1;
private DetailedStatsActivity statsActivity;
public ChartFragmentBase() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.chart_fragment, container, false);
List<View> extras = getExtraFullViews(view);
if (extras != null) {
ViewSwitcher vs = (ViewSwitcher) view.findViewById(R.id.base_chart_viewswitcher_config);
for (View v : extras)
vs.addView(v);
}
currentTimeFrame = Preferences.getChartTimeframe(getActivity());
listViewSwitcher = new ViewSwitcher3D(
(ViewGroup) view.findViewById(R.id.base_chart_bottom_frame));
listViewSwitcher.setListener(this);
chartGallery = (ChartGallery) view.findViewById(R.id.base_chart_gallery);
chartGalleryAdapter = new ChartGalleryAdapter(new ArrayList<View>());
chartGallery.setAdapter(chartGalleryAdapter);
chartGallery.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
chartGallery.setIgnoreLayoutCalls(true);
if (view.getTag() != null) {
// (page, column, num columns)?
int pageColumn[] = (int[]) view.getTag();
int page = pageColumn[0];
int column = pageColumn[1];
myAdapter.setCurrentChart(page, column);
updateChartHeadline();
myAdapter.notifyDataSetChanged();
onChartSelected(page, column);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
dataList = (ListView) view.findViewById(R.id.base_chart_list);
timeframeText = (TextView) view.findViewById(R.id.base_chart_timeframe);
dataframe = (ViewGroup) view.findViewById(R.id.base_chart_datacontainer);
chartframe = (ViewGroup) view.findViewById(R.id.base_chart_chartframe);
return view;
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
if (chartGallery != null && myAdapter != null) {
state.putInt(SELECTED_CHART_PAGE, myAdapter.getCurrentPage());
state.putInt(SELECTED_CHART_COLUMN, myAdapter.getCurrentColumn());
}
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState != null) {
currentChartPage = savedInstanceState.getInt(SELECTED_CHART_PAGE, -1);
currentChartColumn = savedInstanceState.getInt(SELECTED_CHART_COLUMN, -1);
}
restoreChartSelection();
}
/**
* Toggles visibility of chart/data UI parts.
*/
protected void toggleChartData(MenuItem item) {
if (View.VISIBLE == chartframe.getVisibility()) {
chartframe.setVisibility(View.GONE);
dataframe.setVisibility(View.VISIBLE);
item.setIcon(ContextCompat.getDrawable(getActivity(), R.drawable.icon_graph));
} else {
chartframe.setVisibility(View.VISIBLE);
dataframe.setVisibility(View.GONE);
item.setIcon(ContextCompat.getDrawable(getActivity(), R.drawable.icon_data));
}
}
/**
* Called when chart is selected
*
* @param page
* @param column
*/
protected void onChartSelected(int page, int column) {
currentChartPage = page;
currentChartColumn = column;
}
public void setCurrentChart(int page, int column) {
if (chartGalleryAdapter.getViews().isEmpty()) {
// chart not initialized yet
return;
}
int pos = 0;
for (View view : chartGalleryAdapter.getViews()) {
int pageColumn[] = (int[]) view.getTag();
if (page == pageColumn[0] && column == pageColumn[1]) {
chartGallery.setSelection(pos, false);
myAdapter.setCurrentChart(page, column);
return;
}
pos++;
}
throw new IndexOutOfBoundsException("page=" + page + " column=" + column);
}
public int getCurrentChart() {
return chartGallery.getSelectedItemPosition();
}
protected abstract void notifyChangedDataformat();
protected List<View> getExtraFullViews(View root) {
return new ArrayList<View>();
}
protected abstract void executeLoadData(Timeframe currentTimeFrame);
protected final void setAdapter(BaseChartListAdapter<?> adapter) {
myAdapter = adapter;
dataList.setAdapter(adapter);
}
protected final void updateTitleTextSwitcher(String string) {
statsActivity.setActionBarTitle(string);
}
@Override
public void onResume() {
super.onResume();
chartGallery.setIgnoreLayoutCalls(false);
}
@Override
public void onViewChanged(boolean frontsideVisible) {
chartGallery.setIgnoreLayoutCalls(true);
}
@Override
public void onRender() {
chartGallery.invalidate();
}
public Timeframe getCurrentTimeFrame() {
return currentTimeFrame;
}
public ViewSwitcher3D getListViewSwitcher() {
return listViewSwitcher;
}
protected final void updateChartHeadline() {
String subHeadlineText = "";
String title = myAdapter.getCurrentChartTitle();
String ret = myAdapter.getCurrentSubHeadLine();
if (ret != null)
subHeadlineText = ret;
updateTitleTextSwitcher(title);
if (Preferences.getShowChartHint(getActivity())) {
timeframeText.setText(Html.fromHtml(getChartHint()));
} else {
if (timetext != null) {
timeframeText.setText(Html.fromHtml(timetext + ": <b>" + subHeadlineText + "</b>"));
}
}
}
protected abstract String getChartHint();
public void setAllowChangePageSliding(boolean allowChangePageSliding) {
chartGallery.setAllowChangePageSliding(allowChangePageSliding);
}
public void updateCharts(List<?> statsForApp) {
Chart chart = new Chart();
int page = myAdapter.getCurrentPage();
int column = myAdapter.getCurrentColumn();
int position = -1;
List<View> charts = new ArrayList<View>();
int pos = 0;
for (int i = 0; i < myAdapter.getNumPages(); i++)
for (int j = 1; j < myAdapter.getNumCharts(i); j++) {
int pageColumn[] = new int[3];
View chartView = myAdapter.buildChart(getActivity(), chart, statsForApp, i, j);
/*
* if(chartView==null) {
* Log.i(LOG_TAG,"Ignoring chart p="+i+" c="+j+"for class="
* +this.getClass().toString()); continue; }
*/
Gallery.LayoutParams params = new Gallery.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
chartView.setLayoutParams(params);
pageColumn[0] = i;
pageColumn[1] = j;
pageColumn[2] = myAdapter.getNumCharts(i);
if (i == page && j == column)
position = pos;
pos++;
chartView.setTag(pageColumn);
charts.add(chartView);
}
chartGallery.setIgnoreLayoutCalls(false);
chartGalleryAdapter.setViews(charts);
if (position >= 0)
chartGallery.setSelection(position);
chartGalleryAdapter.notifyDataSetChanged();
chartGallery.invalidate();
}
protected final void setChartIgnoreCallLayouts(boolean ignoreLayoutCalls) {
chartGallery.setIgnoreLayoutCalls(ignoreLayoutCalls);
}
protected void restoreChartSelection() {
if (currentChartPage != -1 && currentChartColumn != -1) {
setCurrentChart(currentChartPage, currentChartColumn);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
statsActivity = (DetailedStatsActivity) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
statsActivity = null;
}
}