package com.dataart.devicehive.device.sample; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.content.Context; import android.database.DataSetObserver; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; import com.dataart.android.devicehive.EquipmentData; import com.dataart.android.devicehive.Notification; public class DeviceSendNotificationFragment extends SherlockFragment { private static final String TAG = "DeviceSendNotificationFragment"; private Button sendNotificationButton; private TextView notificationNameEdit; private LinearLayout parametersContainer; private Spinner equipmentSpinner; private NotificationSender notificationSender; private ParameterProvider parameterProvider; private ParametersAdapter parametersAdapter; private List<EquipmentData> equipment; private List<Parameter> parameters = new LinkedList<Parameter>(); public static class Parameter { public final String name; public final String value; public Parameter(String name, String value) { this.name = name; this.value = value; } } public interface NotificationSender { void sendNotification(Notification notification); } public interface ParameterProvider { void queryParameter(); } public void setNotificationSender(NotificationSender notificationSender) { this.notificationSender = notificationSender; } public void setParameterProvider(ParameterProvider parameterProvider) { this.parameterProvider = parameterProvider; } public void setEquipment(List<EquipmentData> equipment) { this.equipment = equipment; setupEquipmentSpinner(equipment); } public void addParameter(String name, String value) { this.parameters.add(new Parameter(name, value)); setupParameters(this.parameters); } @Override public void onAttach(Activity activity) { super.onAttach(activity); notificationSender = (NotificationSender) activity; } @Override public void onResume() { super.onResume(); setupEquipmentSpinner(equipment); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_send_notification, container, false); sendNotificationButton = (Button) view .findViewById(R.id.send_notification_button); notificationNameEdit = (EditText) view.findViewById(R.id.notification_name_edit); parametersContainer = (LinearLayout) view .findViewById(R.id.parameters_container); sendNotificationButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendNotification(); } }); final Button addParameterButton = (Button) view .findViewById(R.id.add_parameter_button); addParameterButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (parameterProvider != null) { parameterProvider.queryParameter(); } } }); equipmentSpinner = (Spinner) view.findViewById(R.id.equipment_spinner); equipmentSpinner.setPrompt("Select equipment"); setupEquipmentSpinner(equipment); setupParameters(parameters); return view; } private void setupEquipmentSpinner(List<EquipmentData> equipment) { if (equipment != null && equipmentSpinner != null) { ArrayAdapter<String> adapter = new ArrayAdapter<String>( this.getActivity(), android.R.layout.simple_spinner_item, getEquipmentItems(equipment)); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); equipmentSpinner.setAdapter(adapter); } } private List<String> getEquipmentItems(List<EquipmentData> equipment) { final List<String> equipmentNames = new LinkedList<String>(); equipmentNames.add("None"); for (EquipmentData eq : equipment) { equipmentNames.add(eq.getName()); } return equipmentNames; } private void setupParameters(List<Parameter> parameters) { parametersContainer.removeAllViews(); parametersAdapter = new ParametersAdapter(getActivity(), parameters); parametersAdapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { super.onChanged(); setupParameters(DeviceSendNotificationFragment.this.parameters); } }); final int count = parametersAdapter.getCount(); for (int i = 0; i < count; i++) { parametersContainer.addView(parametersAdapter.getView(i, null, parametersContainer)); } } @Override public void onDestroyView() { sendNotificationButton = null; notificationNameEdit = null; equipmentSpinner = null; super.onDestroyView(); } private void sendNotification() { String notification = notificationNameEdit.getText().toString(); if (TextUtils.isEmpty(notification)) { notification = "TestNotificationAndroidFramework"; } HashMap<String, Object> parameters = paramsAsMap(this.parameters); int selectedItemPosition = equipmentSpinner.getSelectedItemPosition(); if (selectedItemPosition != 0) { final EquipmentData selectedEquipment = equipment .get(selectedItemPosition - 1); parameters.put("equipment", selectedEquipment.getCode()); } if (notificationSender != null) { notificationSender.sendNotification(new Notification(notification, parameters)); } } private static HashMap<String, Object> paramsAsMap( List<Parameter> params) { HashMap<String, Object> paramsMap = new HashMap<String, Object>(); for (Parameter param : params) { paramsMap.put(param.name, param.value); } return paramsMap; } private static class ParametersAdapter extends BaseAdapter { private final LayoutInflater inflater; private final List<Parameter> parameters; public ParametersAdapter(Context context, List<Parameter> parameters) { this.parameters = parameters; this.inflater = LayoutInflater.from(context); } @Override public int getCount() { return parameters.size(); } @Override public Object getItem(int position) { return parameters.get(position); } @Override public long getItemId(int position) { return position; } public void removeParameter(Parameter parameter) { parameters.remove(parameter); notifyDataSetChanged(); } private View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { removeParameter((Parameter)v.getTag()); } }; @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.parameters_list_item, null); holder = new ViewHolder(); holder.name = (TextView) convertView .findViewById(R.id.parameter_name_text_view); holder.value = (TextView) convertView .findViewById(R.id.parameter_value_text_view); holder.deleteButton = convertView.findViewById(R.id.parameter_delete_image_view); holder.deleteButton.setOnClickListener(clickListener); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final Parameter parameter = parameters.get(position); holder.name.setText(parameter.name); holder.value.setText(parameter.value); holder.deleteButton.setTag(parameter); return convertView; } private class ViewHolder { TextView name; TextView value; View deleteButton; } } }