package treehou.se.habit.ui.control.config; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.Spinner; 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.models.OHItem; import se.treehou.ng.ohcommunicator.connector.models.OHServer; 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.core.controller.Cell; import treehou.se.habit.core.db.model.ItemDB; import treehou.se.habit.core.db.model.ServerDB; import treehou.se.habit.core.db.model.controller.CellDB; import treehou.se.habit.core.db.model.controller.VoiceCellDB; import treehou.se.habit.util.Util; import treehou.se.habit.ui.util.IconPickerActivity; public class CellVoiceConfigFragment extends Fragment { private static final String TAG = "CellVoiceConfigFragment"; private static String ARG_CELL_ID = "ARG_CELL_ID"; private static int REQUEST_ICON = 183; @BindView(R.id.spr_items) Spinner sprItems; @BindView(R.id.btn_set_icon) ImageButton btnSetIcon; private VoiceCellDB voiceCell; private Cell cell; private OHItem item; private ArrayAdapter<OHItem> mItemAdapter; private ArrayList<OHItem> mItems = new ArrayList<>(); private Realm realm; private Unbinder unbinder; public static CellVoiceConfigFragment newInstance(CellDB cell) { CellVoiceConfigFragment fragment = new CellVoiceConfigFragment(); Bundle args = new Bundle(); args.putLong(ARG_CELL_ID, cell.getId()); fragment.setArguments(args); return fragment; } public CellVoiceConfigFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); realm = Realm.getDefaultInstance(); mItemAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_dropdown_item, mItems); if (getArguments() != null) { long id = getArguments().getLong(ARG_CELL_ID); cell = new Cell(CellDB.load(realm, id)); voiceCell = VoiceCellDB.getCell(realm, cell.getDB()); if(voiceCell == null){ realm.beginTransaction(); voiceCell = new VoiceCellDB(); voiceCell.setId(VoiceCellDB.getUniqueId(realm)); voiceCell = realm.copyToRealm(voiceCell); voiceCell.setCell(cell.getDB()); realm.commitTransaction(); } ItemDB itemDB = voiceCell.getItem(); if(itemDB != null){ item = itemDB.toGeneric(); } } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_cell_voice_config, container, false); unbinder = ButterKnife.bind(this, rootView); sprItems.setAdapter(mItemAdapter); List<ServerDB> servers = realm.where(ServerDB.class).findAll(); mItems.clear(); for(final ServerDB serverDB : servers) { final OHServer server = serverDB.toGeneric(); OHCallback<List<OHItem>> callback = new OHCallback<List<OHItem>>() { @Override public void onUpdate(OHResponse<List<OHItem>> response) { List<OHItem> items = filterItems(response.body()); mItems.addAll(items); mItemAdapter.notifyDataSetChanged(); } @Override public void onError() { Log.d("Get Items", "Failure"); } }; IServerHandler serverHandler = new Connector.ServerHandler(server, getContext()); serverHandler.requestItem(callback); } sprItems.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { OHItem item = mItems.get(position); if(item != null) { realm.beginTransaction(); ItemDB itemDB = ItemDB.createOrLoadFromGeneric(realm, item); voiceCell.setItem(itemDB); realm.commitTransaction(); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); if(item != null){ mItems.add(item); mItemAdapter.add(item); mItemAdapter.notifyDataSetChanged(); } updateIconImage(); btnSetIcon.setOnClickListener(v -> { Intent intent = new Intent(getActivity(), IconPickerActivity.class); startActivityForResult(intent, REQUEST_ICON); }); return rootView; } private List<OHItem> filterItems(List<OHItem> items){ List<OHItem> tempItems = new ArrayList<>(); for(OHItem item : items){ if(item.getType().equals(OHItem.TYPE_STRING)){ tempItems.add(item); } } items.clear(); items.addAll(tempItems); return items; } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } @Override public void onDestroy() { super.onDestroy(); realm.close(); } private void updateIconImage(){ btnSetIcon.setImageDrawable(Util.getIconDrawable(getActivity(), voiceCell.getIcon())); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQUEST_ICON && resultCode == Activity.RESULT_OK && data.hasExtra(IconPickerActivity.RESULT_ICON)){ realm.beginTransaction(); String iconName = data.getStringExtra(IconPickerActivity.RESULT_ICON); voiceCell.setIcon(iconName.equals("") ? null : iconName); updateIconImage(); realm.commitTransaction(); } } }