package org.openhab.habclient.rule;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
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.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import org.openhab.domain.IOpenHABWidgetProvider;
import org.openhab.domain.IUnitEntityDataTypeProvider;
import org.openhab.domain.rule.IEntityDataType;
import org.openhab.domain.rule.IRuleOperationBuildListener;
import org.openhab.domain.rule.RuleAction;
import org.openhab.domain.rule.RuleActionType;
import org.openhab.domain.rule.RuleActionValueType;
import org.openhab.domain.rule.operators.RuleOperator;
import org.openhab.habclient.HABApplication;
import org.openhab.habclient.dagger.DaggerRuleActionComponent;
import org.openhab.habdroid.R;
import javax.inject.Inject;
public class RuleActionFragment extends Fragment implements RuleActionDialogFragment.RuleActionBuildListener, IRuleOperationBuildListener {
private final String TAG = "RuleActionFragment";
private ListView mListView;
private ArrayAdapter<RuleAction> mListAdapter;
private int mSelectedActionPosition = -1;
private RuleAction mActionUnderConstruction;
private EditText mRuleNameView;
@Inject IOpenHABWidgetProvider mWidgetProvider;
@Inject IUnitEntityDataTypeProvider mUnitEntityDataTypeProvider;
public static RuleActionFragment newInstance() {
return new RuleActionFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerRuleActionComponent.builder()
.appComponent(((HABApplication) getActivity().getApplication()).appComponent())
.build()
.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(HABApplication.getLogTag(), "RuleActionFragment.onCreateView()");
View view = inflater.inflate(R.layout.fragment_rule_action, container, false);
mRuleNameView = (EditText) view.findViewById(R.id.rule_name_textview);
mListView = (ListView) view.findViewById(R.id.rule_then_list);
mListAdapter = new ArrayAdapter<RuleAction>(getActivity(), android.R.layout.simple_list_item_1, ((RuleEditActivity)getActivity()).getRule().getActions());
mListView.setAdapter(mListAdapter);
setHasOptionsMenu(true);
mRuleNameView.setText(((RuleEditActivity) getActivity()).getRuleName());
TextWatcher ruleNameTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
Log.d(HABApplication.getLogTag(), "ruleNameTextWatcher.afterTextChanged = " + s.toString());
((RuleEditActivity) getActivity()).setRuleName(s.toString());
}
};
mRuleNameView.addTextChangedListener(ruleNameTextWatcher);
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getActivity(), "OnItemLongClickListener", Toast.LENGTH_SHORT).show();
return false;
}
});
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSelectedActionPosition = position;
// mListView.setItemChecked(position, true);
// mListView.getFocusables(position);
// mListView.setSelection(position);
}
});
return view;
}
@Override
public void onStart() {
super.onStart();
Log.d("LifeCycle", "RuleActionFragment.onStart()");
}
@Override
public void onResume() {
super.onResume();
Log.d("LifeCycle", "RuleActionFragment.onResume()");
}
@Override
public void onPause() {
super.onPause();
Log.d("LifeCycle", "RuleActionFragment.onPause()");
}
@Override
public void onStop() {
super.onStop();
Log.d("LifeCycle", "RuleActionFragment.onStop()");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("LifeCycle", "RuleActionFragment.onDestroyView()");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("LifeCycle", "RuleActionFragment.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", "RuleActionFragment.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", "RuleActionFragment.onDetach()");
// mListener = null;
}
public void onUpdateView() {
if(mRuleNameView != null)
mRuleNameView.setText(((RuleEditActivity)getActivity()).getRuleName());
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.rule_action_edit, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_edit_rule_action:
openActionBuilderDialog(mSelectedActionPosition, RuleActionType.COMMAND);//COMMAND is used as default if something goes wrong.
break;
case R.id.action_delete_rule_action:
//TODO - TA: Implement this.
Toast.makeText(getActivity(), "Not implemented.", Toast.LENGTH_SHORT).show();
break;
case R.id.action_add_rule_command_action:
openActionBuilderDialog(-1, RuleActionType.COMMAND);
break;
case R.id.action_add_rule_message_action:
openActionBuilderDialog(-1, RuleActionType.MESSAGE);
break;
}
return true;
}
private void openActionBuilderDialog(int position, RuleActionType actionType) {
mSelectedActionPosition = position;
if(mSelectedActionPosition > -1)
mActionUnderConstruction = mListAdapter.getItem(mSelectedActionPosition);
else
mActionUnderConstruction = new RuleAction(actionType, mWidgetProvider, mUnitEntityDataTypeProvider);
if (mActionUnderConstruction == null ) {
Toast.makeText(getActivity(), "Select a target item first.", Toast.LENGTH_SHORT).show();
} else {
RuleEditActivity activity = ((RuleEditActivity)getActivity());
activity.setActionUnderConstruction(mActionUnderConstruction);
activity.setRuleActionBuildListener(this);
final RuleActionDialogFragment dialogFragment = RuleActionDialogFragment.newInstance();
dialogFragment.show(getFragmentManager(), "Action_Builder_Tag");
}
}
@Override
public void onActionBuildResult(RuleActionDialogFragment.RuleActionBuildListener.RuleActionDialogButtonInterface ruleActionDialogButtonInterface,
String actionID,
RuleActionValueType ruleActionValueType,
String valueAsText) {
if (ruleActionDialogButtonInterface == RuleActionDialogFragment.RuleActionBuildListener.RuleActionDialogButtonInterface.CANCEL)
return;
RuleAction action;
if (mActionUnderConstruction.getID().equalsIgnoreCase(actionID))
action = mActionUnderConstruction;
else if (/*((RuleAction) mListView.getSelectedItem())*/mListAdapter.getItem(mSelectedActionPosition).getID().equalsIgnoreCase(actionID)) {
action = (RuleAction) mListView.getSelectedItem();
} else {
Log.w("onActionBuildResult occurred but no selected action was found with ID = " + actionID, HABApplication.getLogTag());
return;
}
switch (ruleActionValueType) {
case STATIC:
action.setStaticValue(valueAsText);
break;
case SOURCE_UNIT:
action.setSourceOpenHABItemName(valueAsText);
break;
case TEXT:
action.setTextValue(valueAsText);
break;
case NA:
action.setStaticValue(null);
action.setSourceOpenHABItemName(null);
action.setTextValue(null);
break;
}
if (mSelectedActionPosition < 0/*mListView.getSelectedItem() == null*/) {
((RuleEditActivity)getActivity()).getRule().getActions().add(mActionUnderConstruction);
} else {
int actionIndex = ((RuleEditActivity)getActivity()).getRule().getActions().indexOf(/*mListView.getSelectedItem()*/mListAdapter.getItem(mSelectedActionPosition));
((RuleEditActivity)getActivity()).getRule().getActions().remove(actionIndex);
((RuleEditActivity)getActivity()).getRule().getActions().add(actionIndex, mActionUnderConstruction);
}
// IEntityDataType oldOperand = mOperationUnderConstruction.getOperand(operandPosition);
// if(oldOperand != null && oldOperand.getSourceType() == EntityDataTypeSource.UNIT)
// mWidgetProvider.removeItemListener((UnitEntityDataType)oldOperand);
// mOperationUnderConstruction.setOperand(operandPosition, operand);
// mWidgetProvider.addItemListener((UnitEntityDataType) operand);
if(((RuleEditActivity)getActivity()).getRule().getRuleOperation() != null)
((RuleEditActivity)getActivity()).getRule().getRuleOperation().runCalculation();//TODO - TA: Temporary test code
mListAdapter.notifyDataSetChanged();
}
@Override
public void onOperationBuildResult(IRuleOperationBuildListener.RuleOperationSelectionInterface ruleOperationSelectionInterface
, IRuleOperationBuildListener.RuleOperationDialogButtonInterface ruleOperationDialogButtonInterface, IEntityDataType operand
, int operandPosition, RuleOperator ruleOperator) {
if(ruleOperationDialogButtonInterface == IRuleOperationBuildListener.RuleOperationDialogButtonInterface.CANCEL)
return;
//THEN tab
if(ruleOperationSelectionInterface == IRuleOperationBuildListener.RuleOperationSelectionInterface.UNIT && mActionUnderConstruction != null) {
if (operandPosition == 0) {
mActionUnderConstruction.setTargetOpenHABItemName(operand.getName());
mActionUnderConstruction.validate();
} else {
mActionUnderConstruction.setSourceOpenHABItemName(operand.getName());
}
RuleEditActivity activity = ((RuleEditActivity)getActivity());
activity.setActionUnderConstruction(mActionUnderConstruction);
activity.setRuleActionBuildListener(this);
final RuleActionDialogFragment dialogFragment = RuleActionDialogFragment.newInstance();
dialogFragment.show(getFragmentManager(), "Action_Builder_Tag");
}
}
}