package co.smartreceipts.android.settings.widget;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
import co.smartreceipts.android.R;
import co.smartreceipts.android.fragments.WBFragment;
import co.smartreceipts.android.persistence.database.controllers.TableController;
import co.smartreceipts.android.persistence.database.controllers.TableEventsListener;
import co.smartreceipts.android.persistence.database.operations.DatabaseOperationMetadata;
public abstract class SimpleInsertableListFragment<T> extends WBFragment implements View.OnClickListener, TableEventsListener<T> {
private Toolbar mToolbar;
private ListView mListView;
private Adapter mAdapter;
private List<T> mData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mData = new ArrayList<>();
mAdapter = new Adapter(this, getActivity());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.simple_list, container, false);
mToolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
mListView = (ListView) rootView.findViewById(android.R.id.list);
mListView.setAdapter(mAdapter);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mListView.setAdapter(mAdapter);
setSupportActionBar(mToolbar);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_settings_categories, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_settings_add) {
addItem();
return true;
}
else if (item.getItemId() == android.R.id.home) {
getActivity().onBackPressed();
return true;
}
else {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onResume() {
super.onResume();
getTableController().subscribe(this);
getTableController().get();
}
@Override
public void onPause() {
getTableController().unsubscribe(this);
super.onPause();
}
/**
* @return the {@link Adapter} that is being used by this fragment
*/
protected final Adapter getAdapter() {
return mAdapter;
}
/**
* @return - the data set used to populate this list fragment
*/
protected abstract TableController<T> getTableController();
/**
* Shows the proper message in order to assist the user with inserting an item
*/
protected abstract void addItem();
/**
* Gets a view for a particular item. Subclasses should implement the traditional view-holder pattern
*
* @param item - the data item to use
* @param convertView - the recycled view or {@code null} if it does not yet exist
* @param parent - the parent view with which to add this to
* @return the properly constructed view object
*/
public abstract View getView(LayoutInflater inflater, T item, View convertView, ViewGroup parent);
@Override
public void onGetSuccess(@NonNull List<T> list) {
mData = list;
mAdapter.notifyDataSetChanged();
}
@Override
public void onGetFailure(@Nullable Throwable e) {
}
@Override
public void onInsertSuccess(@NonNull T t, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
getTableController().get();
}
@Override
public void onInsertFailure(@NonNull T t, @Nullable Throwable e, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
}
@Override
public void onUpdateSuccess(@NonNull T oldT, @NonNull T newT, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
getTableController().get();
}
@Override
public void onUpdateFailure(@NonNull T oldT, @Nullable Throwable e, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
}
@Override
public void onDeleteSuccess(@NonNull T t, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
getTableController().get();
}
@Override
public void onDeleteFailure(@NonNull T t, @Nullable Throwable e, @NonNull DatabaseOperationMetadata databaseOperationMetadata) {
}
private final class Adapter extends BaseAdapter {
private final SimpleInsertableListFragment<T> mParentFragment;
protected final LayoutInflater mInflater;
public Adapter(final SimpleInsertableListFragment<T> parentFragment, final Context context) {
mParentFragment = parentFragment;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public T getItem(int i) {
return mData.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View convertView, ViewGroup parent) {
final T item = getItem(i);
return mParentFragment.getView(mInflater, item, convertView, parent);
}
}
}