package treehou.se.habit.ui.bindings; import android.os.Bundle; 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.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.google.gson.reflect.TypeToken; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import io.realm.Realm; import se.treehou.ng.ohcommunicator.connector.GsonHelper; import se.treehou.ng.ohcommunicator.connector.models.OHBinding; import se.treehou.ng.ohcommunicator.services.Connector; import se.treehou.ng.ohcommunicator.services.IServerHandler; import se.treehou.ng.ohcommunicator.services.callbacks.OHCallback; import se.treehou.ng.ohcommunicator.services.callbacks.OHResponse; import treehou.se.habit.R; import treehou.se.habit.connector.models.Binding; import treehou.se.habit.core.db.model.ServerDB; import treehou.se.habit.ui.adapter.BindingAdapter; public class BindingsFragment extends Fragment { private static final String TAG = BindingsFragment.class.getSimpleName(); private static final String ARG_SERVER = "ARG_SERVER"; private static final String STATE_BINDINGS = "STATE_BINDINGS"; @BindView(R.id.lst_bindings) RecyclerView lstBinding; private BindingAdapter bindingAdapter; private ServerDB server; private ViewGroup container; private List<OHBinding> bindings = new ArrayList<>(); private Realm realm; private Unbinder unbinder; private OHCallback<List<OHBinding>> bindingListener = new OHCallback<List<OHBinding>>(){ @Override public void onUpdate(OHResponse<List<OHBinding>> response) { Log.d(TAG, "onUpdate " + response.body()); bindings = response.body(); bindingAdapter.setBindings(bindings); } @Override public void onError() { Log.d(TAG, "onError"); } }; public static BindingsFragment newInstance(long serverId) { BindingsFragment fragment = new BindingsFragment(); Bundle args = new Bundle(); args.putLong(ARG_SERVER, serverId); fragment.setArguments(args); return fragment; } public BindingsFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { realm = Realm.getDefaultInstance(); if(getArguments() != null){ if(getArguments().containsKey(ARG_SERVER)){ long serverId = getArguments().getLong(ARG_SERVER); server = Realm.getDefaultInstance().where(ServerDB.class).equalTo("id", serverId).findFirst(); } } if(savedInstanceState != null){ if(savedInstanceState.containsKey(STATE_BINDINGS)){ bindings = GsonHelper.createGsonBuilder().fromJson(savedInstanceState.getString(STATE_BINDINGS), new TypeToken<List<Binding>>() {}.getType()); } } super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_bindings_list, container, false); unbinder = ButterKnife.bind(this, rootView); this.container = container; ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); if(actionBar != null) { actionBar.setTitle(R.string.bindings); } bindingAdapter = new BindingAdapter(this); bindingAdapter.setItemClickListener(binding -> openBinding(binding)); GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 1); lstBinding.setLayoutManager(gridLayoutManager); lstBinding.setItemAnimator(new DefaultItemAnimator()); lstBinding.setAdapter(bindingAdapter); bindingAdapter.setBindings(bindings); setHasOptionsMenu(true); return rootView; } /** * Open up binding page. * @param binding the binding to show. */ private void openBinding(OHBinding binding){ Fragment fragment = BindingFragment.newInstance(binding); getActivity().getSupportFragmentManager().beginTransaction() .replace(BindingsFragment.this.container.getId(), fragment) .addToBackStack(null) .commit(); } @Override public void onResume() { super.onResume(); IServerHandler serverHandler = new Connector.ServerHandler(server.toGeneric(), getActivity()); serverHandler.requestBindings(bindingListener); } @Override public void onDestroy() { super.onDestroy(); realm.close(); } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } @Override public void onSaveInstanceState(Bundle outState) { outState.putString(STATE_BINDINGS, GsonHelper.createGsonBuilder().toJson(bindings)); super.onSaveInstanceState(outState); } }