/*
* Copyright (C) 2016 Glucosio Foundation
*
* This file is part of Glucosio.
*
* Glucosio is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* Glucosio 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Glucosio. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
package org.glucosio.android.fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.BottomSheetDialog;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import org.glucosio.android.R;
import org.glucosio.android.activity.AddA1CActivity;
import org.glucosio.android.activity.AddCholesterolActivity;
import org.glucosio.android.activity.AddGlucoseActivity;
import org.glucosio.android.activity.AddKetoneActivity;
import org.glucosio.android.activity.AddPressureActivity;
import org.glucosio.android.activity.AddWeightActivity;
import org.glucosio.android.activity.MainActivity;
import org.glucosio.android.adapter.HistoryAdapter;
import org.glucosio.android.listener.ItemClickSupport;
import org.glucosio.android.presenter.HistoryPresenter;
import org.glucosio.android.tools.FormatDateTime;
public class HistoryFragment extends Fragment {
private static final String INTENT_EXTRA_PAGER = "pager";
private static final String INTENT_EXTRA_EDITING_ID = "edit_id";
private static final String INTENT_EXTRA_EDITING = "editing";
private static final String INTENT_EXTRA_DROPDOWN = "history_dropdown";
private RecyclerView mRecyclerView;
private LinearLayoutManager mLayoutManager;
private RecyclerView.Adapter mAdapter;
private HistoryPresenter presenter;
private LinearLayout glucoseLegend;
private Spinner historySpinner;
private BottomSheetDialog mBottomSheetDialog;
private Boolean isToolbarScrolling = true;
private int historyDropdownPosition = 0;
public static HistoryFragment newInstance() {
return new HistoryFragment();
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View mFragmentView;
presenter = new HistoryPresenter(this);
mFragmentView = inflater.inflate(R.layout.fragment_history, container, false);
mRecyclerView = (RecyclerView) mFragmentView.findViewById(R.id.fragment_history_recycler_view);
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
mLayoutManager = new LinearLayoutManager(super.getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setHasFixedSize(false);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
historySpinner = (Spinner) mFragmentView.findViewById(R.id.history_spinner);
glucoseLegend = (LinearLayout) mFragmentView.findViewById(R.id.fragment_history_legend);
// use a linear layout manager
// Set array and adapter for graphSpinner
String[] selectorArray = getActivity().getResources().getStringArray(R.array.fragment_history_selector);
ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, selectorArray);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
historySpinner.setAdapter(dataAdapter);
final Context context = getActivity().getApplicationContext();
historySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (!presenter.isdbEmpty()) {
if (position != 0) {
glucoseLegend.setVisibility(View.GONE);
} else {
glucoseLegend.setVisibility(View.VISIBLE);
}
mAdapter = new HistoryAdapter(context, presenter, position);
mRecyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
historyDropdownPosition = position;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
ItemClickSupport.addTo(mRecyclerView).setOnItemLongClickListener(new ItemClickSupport.OnItemLongClickListener() {
@Override
public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) {
showBottomSheetDialog(v);
return true;
}
});
mRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
mRecyclerView.removeOnLayoutChangeListener(this);
updateToolbarBehaviour();
}
});
Bundle extras = getActivity().getIntent().getExtras();
if (extras != null) {
if (extras.containsKey(INTENT_EXTRA_DROPDOWN)) {
historySpinner.setSelection(extras.getInt(INTENT_EXTRA_DROPDOWN));
}
}
return mFragmentView;
}
private void showBottomSheetDialog(final View itemView) {
mBottomSheetDialog = new BottomSheetDialog(getActivity());
View sheetView = getActivity().getLayoutInflater().inflate(R.layout.fragment_history_bottom_sheet, null);
LinearLayout edit = (LinearLayout) sheetView.findViewById(R.id.fragment_history_bottom_sheet_edit);
LinearLayout delete = (LinearLayout) sheetView.findViewById(R.id.fragment_history_bottom_sheet_delete);
final TextView idTextView = (TextView) itemView.findViewById(R.id.item_history_id);
edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int historyTypePosition = (int) historySpinner.getSelectedItemId();
Intent intent;
switch (historyTypePosition) {
// HAB1C
case 1:
intent = new Intent(getActivity(), AddA1CActivity.class);
break;
// Cholesterol
case 2:
intent = new Intent(getActivity(), AddCholesterolActivity.class);
break;
// Pressure
case 3:
intent = new Intent(getActivity(), AddPressureActivity.class);
break;
// Ketone
case 4:
intent = new Intent(getActivity(), AddKetoneActivity.class);
break;
// Weight
case 5:
intent = new Intent(getActivity(), AddWeightActivity.class);
break;
// Glucose
default:
intent = new Intent(getActivity(), AddGlucoseActivity.class);
break;
}
intent.putExtra(INTENT_EXTRA_EDITING_ID, Long.parseLong(idTextView.getText().toString()));
intent.putExtra(INTENT_EXTRA_EDITING, true);
intent.putExtra(INTENT_EXTRA_DROPDOWN, historyDropdownPosition);
// History page is 1
intent.putExtra(INTENT_EXTRA_PAGER, 1);
startActivity(intent);
mBottomSheetDialog.dismiss();
getActivity().finish();
}
});
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBottomSheetDialog.dismiss();
TextView idTextView = (TextView) itemView.findViewById(R.id.item_history_id);
final long idToDelete = Long.parseLong(idTextView.getText().toString());
final CardView item = (CardView) itemView.findViewById(R.id.item_history);
item.animate().alpha(0.0f).setDuration(2000);
Snackbar.make(((MainActivity) getActivity()).getFabView(), R.string.fragment_history_snackbar_text, Snackbar.LENGTH_SHORT).setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
switch (event) {
case Snackbar.Callback.DISMISS_EVENT_ACTION:
// Do nothing, see Undo onClickListener
break;
case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
presenter.onDeleteClicked(idToDelete, historySpinner.getSelectedItemPosition());
break;
default:
break;
}
}
}).setAction("UNDO", new View.OnClickListener() {
@Override
public void onClick(View v) {
item.clearAnimation();
item.setAlpha(1.0f);
mAdapter.notifyDataSetChanged();
}
}).setActionTextColor(getResources().getColor(R.color.glucosio_accent)).show();
}
});
mBottomSheetDialog.setContentView(sheetView);
mBottomSheetDialog.show();
mBottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
mBottomSheetDialog = null;
}
});
}
public void updateToolbarBehaviour() {
if (mAdapter != null) {
if (mLayoutManager.findLastCompletelyVisibleItemPosition() == mAdapter.getItemCount() - 1) {
isToolbarScrolling = false;
if (getActivity() != null) {
((MainActivity) getActivity()).turnOffToolbarScrolling();
}
} else {
if (!isToolbarScrolling) {
isToolbarScrolling = true;
((MainActivity) getActivity()).turnOnToolbarScrolling();
}
}
}
}
public String convertDate(String date) {
FormatDateTime dateTime = new FormatDateTime(getActivity().getApplicationContext());
return dateTime.convertDateTime(date);
}
public void notifyAdapter() {
mAdapter.notifyDataSetChanged();
}
public void reloadFragmentAdapter() {
if (getActivity() != null) {
((MainActivity) getActivity()).reloadFragmentAdapter();
((MainActivity) getActivity()).checkIfEmptyLayout();
}
}
public int getHistoryDropdownPosition() {
return historyDropdownPosition;
}
}