package treehou.se.habit.ui.control;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import com.trello.rxlifecycle.components.support.RxFragment;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import io.realm.Realm;
import treehou.se.habit.R;
import treehou.se.habit.core.db.model.controller.ControllerDB;
import treehou.se.habit.ui.adapter.ControllerAdapter;
/**
* Fragment listing all app controllers.
*/
public class ControllsFragment extends RxFragment {
private static final String TAG = "ControllsFragment";
private ControllerAdapter mAdapter;
@BindView(R.id.list) RecyclerView mListView;
@BindView(R.id.empty) View viwEmpty;
@BindView(R.id.fab_add) FloatingActionButton fabAdd;
private Realm realm;
private Unbinder unbinder;
public static ControllsFragment newInstance() {
ControllsFragment fragment = new ControllsFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
public ControllsFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
realm = Realm.getDefaultInstance();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_control_universal, container, false);
unbinder = ButterKnife.bind(this, view);
viwEmpty.setOnClickListener(view1 -> createNewController());
fabAdd.setOnClickListener(v -> createNewController());
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if(actionBar != null) {
actionBar.setTitle(R.string.controllers);
}
mAdapter = new ControllerAdapter(getActivity());
mAdapter.setItemListener(new ControllerAdapter.ItemListener() {
@Override
public void itemCountUpdated(int itemCount) {
updateEmptyView(itemCount);
}
@Override
public void itemClickListener(ControllerAdapter.ControllerHolder controllerHolder) {
ControllerDB controller = mAdapter.getItem(controllerHolder.getAdapterPosition());
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.page_container, ControlFragment.newInstance(controller.getId()))
.addToBackStack(null)
.commit();
}
@Override
public boolean itemLongClickListener(final ControllerAdapter.ControllerHolder controllerHolder) {
final ControllerDB controller = mAdapter.getItem(controllerHolder.getAdapterPosition());
new AlertDialog.Builder(getActivity())
.setItems(R.array.controll_manager, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
loadController(controller.getId());
break;
case 1:
mAdapter.removeItem(controllerHolder.getAdapterPosition());
final long id = controller.getId();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
ControllerDB controller = ControllerDB.load(realm, id);
controller.deleteFromRealm();
}
});
break;
}
}
}).create().show();
return true;
}
});
final List<ControllerDB> controllers = realm.where(ControllerDB.class).findAll();
mAdapter.addAll(controllers);
// Set the adapter
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 1);
mListView.setLayoutManager(gridLayoutManager);
mListView.setItemAnimator(new DefaultItemAnimator());
mListView.setAdapter(mAdapter);
updateEmptyView(controllers.size());
setHasOptionsMenu(true);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
@Override
public void onDestroy() {
super.onDestroy();
realm.close();
}
/**
* Show empty view if no controllers exist
*/
private void updateEmptyView(int itemCount){
viwEmpty.setVisibility(itemCount <= 0 ? View.VISIBLE : View.GONE);
}
public void loadController(long id){
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.page_container, EditControlFragment.newInstance(id))
.addToBackStack(null)
.commit();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.controllers, menu);
}
/**
* Creates a new empty controller.
*/
private void createNewController(){
ControllerDB controller = new ControllerDB();
String name = "Controller";
controller.setName(name);
ControllerDB.save(realm, controller);
controller.addRow(realm);
loadController(controller.getId());
}
}