package org.openhab.habclient; import android.app.Activity; import android.app.Fragment; import android.content.Intent; import android.os.Bundle; 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.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import org.openhab.domain.IOpenHABWidgetProvider; import org.openhab.domain.IRestCommunication; import org.openhab.domain.IRoomProvider; import org.openhab.domain.model.Direction; import org.openhab.domain.model.OpenHABWidget; import org.openhab.domain.model.OpenHABWidgetType; import org.openhab.domain.model.Room; import org.openhab.domain.util.IColorParser; import org.openhab.domain.util.ILogger; import org.openhab.habclient.dagger.DaggerRoomConfigFragmentComponent; import org.openhab.habclient.dagger.RoomConfigFragmentComponent; import org.openhab.habclient.media.ICamera; import org.openhab.habclient.media.IImagePicker; import org.openhab.habdroid.R; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import javax.inject.Inject; public class RoomConfigFragment extends Fragment { private static final String TAG = "RoomConfigFragment"; private int mRoomBackgroundImageCaptureRequestCode; private int mRoomBackgroundImagePickRequestCode; private Room mCurrentRoom; private Button mSaveButton; private EditText mRoomNameText; private Spinner mHABGroupSpinner; private OpenHABWidget mNullGroupWidget; private Room mNullRoom; private HashMap<Direction, Spinner> mSpinnerHashMap; private String mImageCaptureFilePath; private TextView mRoomImageFilePathText; @Inject IRoomProvider mRoomProvider; @Inject IOpenHABWidgetProvider mOpenHABWidgetProvider; @Inject IRestCommunication mRestCommunication; @Inject ILogger mLogger; @Inject IColorParser mColorParser; @Inject ICamera mCamera; @Inject IImagePicker mImagePicker; public static RoomConfigFragment newInstance() { return new RoomConfigFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RoomConfigFragmentComponent component = DaggerRoomConfigFragmentComponent.builder() .appComponent(((HABApplication)getActivity().getApplication()).appComponent()) .build(); component.inject(this); mNullGroupWidget = new OpenHABWidget(mLogger); mNullRoom = new Room(null, "<Undefined room>", mLogger, mColorParser, mOpenHABWidgetProvider);//TA: TODO - Fix name problem. (now sitemapID) mCurrentRoom = ((RoomConfigActivity)getActivity()).getConfigRoom(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("LifeCycle", "RoomConfigFragment.onCreateView()"); // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_room_config, container, false); mRoomNameText = (EditText) view.findViewById(R.id.edittext_room_alias); mHABGroupSpinner = (Spinner) view.findViewById(R.id.spinner_hab_group); ImageView roomImageChangeView = (ImageView) view.findViewById(R.id.imageview_room_image); mRoomImageFilePathText = (TextView) view.findViewById(R.id.room_background_image_path); Spinner upRoomSpinner = (Spinner) view.findViewById(R.id.spinner_up_room); Spinner upRightRoomSpinner = (Spinner) view.findViewById(R.id.spinner_up_right_room); Spinner rightRoomSpinner = (Spinner) view.findViewById(R.id.spinner_right_room); Spinner downRightRoomSpinner = (Spinner) view.findViewById(R.id.spinner_down_right_room); Spinner downRoomSpinner = (Spinner) view.findViewById(R.id.spinner_down_room); Spinner downLeftRoomSpinner = (Spinner) view.findViewById(R.id.spinner_down_left_room); Spinner leftRoomSpinner = (Spinner) view.findViewById(R.id.spinner_left_room); Spinner upLeftRoomSpinner = (Spinner) view.findViewById(R.id.spinner_up_left_room); Spinner aboveRoomSpinner = (Spinner) view.findViewById(R.id.spinner_above_room); Spinner belowRoomSpinner = (Spinner) view.findViewById(R.id.spinner_below_room); mSaveButton = (Button) view.findViewById(R.id.room_edit_save_button); mRoomNameText.setText(mCurrentRoom.getName() != null? mCurrentRoom.getName(): ""); mRoomNameText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(v.equals(mRoomNameText) && !hasFocus && mRoomNameText.getText().toString().length() > 0) { mCurrentRoom.setName(mRoomNameText.getText().toString()); } } }); mImageCaptureFilePath = mCurrentRoom.getBackgroundImageFilePath(); String imagePathText = mImageCaptureFilePath == null || mImageCaptureFilePath.isEmpty()? "<Pick an image>" : mImageCaptureFilePath; mRoomImageFilePathText.setText(imagePathText); if(mCamera.hasCamera()) { roomImageChangeView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mRoomBackgroundImageCaptureRequestCode = mCamera.takePhoto(RoomConfigFragment.this); } }); } mRoomImageFilePathText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mRoomBackgroundImagePickRequestCode = mImagePicker.pickImageFromGallery(RoomConfigFragment.this); } }); List<OpenHABWidget> habGroupArrayList = mOpenHABWidgetProvider.getWidgetList(EnumSet.of(OpenHABWidgetType.Group, OpenHABWidgetType.SitemapText)); if(habGroupArrayList.size() == 0) Log.e(HABApplication.getLogTag(), "No OpenHABWidget groups found in OpenHABWidgetProvider."); mNullGroupWidget.setLabel("<Undefined HAB group>"); habGroupArrayList.add(mNullGroupWidget); //Create adapter for HAB Group spinner ArrayAdapter<OpenHABWidget> habGroupSpinnerAdapter = new ArrayAdapter<OpenHABWidget>(this.getActivity().getApplicationContext(), android.R.layout.simple_spinner_item, habGroupArrayList); habGroupSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //Create adapter for Room spinners final Collection<Room> allRooms = mRoomProvider.getAllRooms(); List<Room> roomArrayList = new ArrayList<Room>(allRooms.size()); for(Room room : allRooms) { //TA: TODO - Load the whole sitemap to ensure that all groups are loaded. if(room.getGroupWidgetId() == null && room.getRoomWidget() != null) { OpenHABWidget groupWidget = mOpenHABWidgetProvider.getWidgetByID(room.getRoomWidget().getId()); mRestCommunication.requestOpenHABSitemap(groupWidget, false, TAG); } roomArrayList.add(room); } roomArrayList.add(mNullRoom); //Inline sort the list of rooms. Collections.sort(roomArrayList, new Comparator<Room>() { public int compare(Room lhs, Room rhs) { return (lhs.getName().compareTo(rhs.getName())); } }); ArrayAdapter<Room> roomSpinnerAdapter = new ArrayAdapter<Room>(this.getActivity().getApplicationContext(), android.R.layout.simple_spinner_item, roomArrayList); roomSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //Set adapters for spinners mHABGroupSpinner.setAdapter(habGroupSpinnerAdapter); upRoomSpinner.setAdapter(roomSpinnerAdapter); upRightRoomSpinner.setAdapter(roomSpinnerAdapter); rightRoomSpinner.setAdapter(roomSpinnerAdapter); downRightRoomSpinner.setAdapter(roomSpinnerAdapter); downRoomSpinner.setAdapter(roomSpinnerAdapter); downLeftRoomSpinner.setAdapter(roomSpinnerAdapter); leftRoomSpinner.setAdapter(roomSpinnerAdapter); upLeftRoomSpinner.setAdapter(roomSpinnerAdapter); aboveRoomSpinner.setAdapter(roomSpinnerAdapter); belowRoomSpinner.setAdapter(roomSpinnerAdapter); //Set selection for spinners if(mCurrentRoom.getGroupWidgetId() == null || mCurrentRoom.getGroupWidgetId().isEmpty()) mHABGroupSpinner.setSelection(habGroupSpinnerAdapter.getPosition(mNullGroupWidget)); else mHABGroupSpinner.setSelection(habGroupSpinnerAdapter.getPosition(mOpenHABWidgetProvider.getWidgetByID(mCurrentRoom.getGroupWidgetId()))); if(mSpinnerHashMap == null) mSpinnerHashMap = new HashMap<Direction, Spinner>(); mSpinnerHashMap.put(Direction.UP, upRoomSpinner); mSpinnerHashMap.put(Direction.UP_RIGHT, upRightRoomSpinner); mSpinnerHashMap.put(Direction.RIGHT, rightRoomSpinner); mSpinnerHashMap.put(Direction.DOWN_RIGHT, downRightRoomSpinner); mSpinnerHashMap.put(Direction.DOWN, downRoomSpinner); mSpinnerHashMap.put(Direction.DOWN_LEFT, downLeftRoomSpinner); mSpinnerHashMap.put(Direction.LEFT, leftRoomSpinner); mSpinnerHashMap.put(Direction.UP_LEFT, upLeftRoomSpinner); mSpinnerHashMap.put(Direction.ABOVE, aboveRoomSpinner); mSpinnerHashMap.put(Direction.BELOW, belowRoomSpinner); for(Direction direction : mSpinnerHashMap.keySet()) { Spinner spinner = mSpinnerHashMap.get(direction); if(mCurrentRoom.getRoomByAlignment(direction) != null) { spinner.setSelection(roomSpinnerAdapter.getPosition(mCurrentRoom.getRoomByAlignment(direction))); } else { spinner.setSelection(roomSpinnerAdapter.getPosition(mNullRoom)); } } mHABGroupSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // if(mCurrentRoom.getUnits().size() > 0) { // // } mCurrentRoom.setGroupWidgetId(((OpenHABWidget) mHABGroupSpinner.getSelectedItem()).getId()); mRestCommunication.requestOpenHABSitemap((OpenHABWidget) mHABGroupSpinner.getSelectedItem(), false, TAG);//Used //TODO - Needed? } @Override public void onNothingSelected(AdapterView<?> parent) { } }); mSaveButton.setOnClickListener(buttonClickListener); return view; } @Override public void onStart() { super.onStart(); Log.d("LifeCycle", "RoomConfigFragment.onStart()"); } @Override public void onResume() { super.onResume(); Log.d("LifeCycle", "RoomConfigFragment.onResume()"); } @Override public void onPause() { super.onPause(); Log.d("LifeCycle", "RoomConfigFragment.onPause()"); } @Override public void onStop() { super.onStop(); Log.d("LifeCycle", "RoomConfigFragment.onStop()"); } @Override public void onDestroyView() { super.onDestroyView(); Log.d("LifeCycle", "RoomConfigFragment.onDestroyView()"); } @Override public void onDestroy() { super.onDestroy(); Log.d("LifeCycle", "RoomConfigFragment.onDestroy()"); } // // TODO: Rename method, update argument and hook method into UI event // public void onButtonPressed(Uri uri) { // if (mListener != null) { // mListener.onFragmentInteraction(uri); // } // } @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.d("LifeCycle", "RoomConfigFragment.onAttach()"); // try { // mListener = (OnFragmentInteractionListener) activity; // } catch (ClassCastException e) { // throw new ClassCastException(activity.toString() // + " must implement OnFragmentInteractionListener"); // } } @Override public void onDetach() { super.onDetach(); Log.d("LifeCycle", "RoomConfigFragment.onDetach()"); // mListener = null; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == mRoomBackgroundImageCaptureRequestCode) { mImageCaptureFilePath = mCamera.getPhotoPath(resultCode, data); mRoomImageFilePathText.setText(mImageCaptureFilePath); mCurrentRoom.setBackgroundImageFilePath(mImageCaptureFilePath); } else if(requestCode == mRoomBackgroundImagePickRequestCode) { mImageCaptureFilePath = mImagePicker.getImagePath( resultCode, data, getActivity().getContentResolver()); mRoomImageFilePathText.setText(mImageCaptureFilePath); mCurrentRoom.setBackgroundImageFilePath(mImageCaptureFilePath); } } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ // public interface OnFragmentInteractionListener { // // TODO: Update argument type and name // public void onFragmentInteraction(Uri uri); // } View.OnClickListener buttonClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if(v.getId() == mSaveButton.getId()) { saveRoomConfig(); } } }; private void saveRoomConfig() { Log.d(TAG, "saveRoomConfig()"); if(mHABGroupSpinner.getSelectedItem() == mNullGroupWidget) { Toast.makeText(getActivity(), "Unsuccessful! HAB Group item must be selected.", Toast.LENGTH_SHORT).show(); return; } boolean hasAlignment = false; for (Direction direction : mSpinnerHashMap.keySet()) { Spinner spinner = mSpinnerHashMap.get(direction); if (spinner.getSelectedItem() == mNullRoom) mCurrentRoom.setAlignment(null, direction); else { mCurrentRoom.setAlignment((Room) spinner.getSelectedItem(), direction); hasAlignment = true; } } if(!hasAlignment) { Toast.makeText(getActivity(), "Unsuccessful! At least one room alignment must be selected.", Toast.LENGTH_SHORT).show(); return; } // mCurrentRoom.setGroupWidgetId(((OpenHABWidget) mHABGroupSpinner.getSelectedItem()).getId()); // if(mRoomNameText.getText().toString().length() > 0) // mCurrentRoom.setName(mRoomNameText.getText().toString()); // mCurrentRoom.setBackgroundImageFilePath(mImageCaptureFilePath); mRoomProvider.saveRoom(mCurrentRoom); } }