/* * AndFHEM - Open Source Android application to control a FHEM home automation * server. * * Copyright (c) 2011, Matthias Klass or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU GENERAL PUBLIC LICENSE, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GENERAL PUBLIC LICENSE * for more details. * * You should have received a copy of the GNU GENERAL PUBLIC LICENSE * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package li.klass.fhem.adapter.weekprofile; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TableRow; import android.widget.TextView; import android.widget.TimePicker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import li.klass.fhem.R; import li.klass.fhem.adapter.devices.genericui.TemperatureChangeTableRow; import li.klass.fhem.domain.heating.schedule.DayProfile; import li.klass.fhem.domain.heating.schedule.interval.FilledTemperatureInterval; import li.klass.fhem.ui.AndroidBug; import li.klass.fhem.util.ApplicationProperties; import li.klass.fhem.util.DialogUtil; import li.klass.fhem.widget.FallbackTimePicker; import static li.klass.fhem.util.ValueDescriptionUtil.appendTemperature; public class IntervalWeekProfileAdapter extends BaseWeekProfileAdapter<FilledTemperatureInterval> { private final ApplicationProperties applicationProperties; private static final Logger LOGGER = LoggerFactory.getLogger(IntervalWeekProfileAdapter.class); public IntervalWeekProfileAdapter(Context context, ApplicationProperties applicationProperties) { super(context); this.applicationProperties = applicationProperties; } @Override protected int getNumberOfAdditionalChildrenForParent() { return 1; } @Override protected View getChildView(final DayProfile<FilledTemperatureInterval, ?, ?> parent, int parentPosition, final FilledTemperatureInterval child, View v, ViewGroup viewGroup, final int relativeChildPosition) { if (child == null) { return addView(parent, viewGroup); } final View view = layoutInflater.inflate(R.layout.weekprofile_interval_item, viewGroup, false); assert view != null; boolean isNew = child.isNew(); int intervalStringId = weekProfile.getIntervalType().stringId; TextView intervalTypeTextView = (TextView) view.findViewById(R.id.intervalType); intervalTypeTextView.setText(intervalStringId); setDetailTextView(view, R.id.time, child.getChangedSwitchTime(), child.getSwitchTime(), isNew); setDetailTextView(view, R.id.temperature, appendTemperature(child.getChangedTemperature()), appendTemperature(child.getTemperature()), isNew); setTemperatureAndInterval(view, R.id.set, child, viewGroup, new OnIntervalTemperatureChangedListener() { @Override public void onIntervalTemperatureChanged(String time, double temperature) { LOGGER.info("onIntervalTemperatureChanged(time={}, temperature={})", time, temperature); child.setChangedTemperature(temperature); if (!child.isTimeFixed()) { child.setChangedSwitchTime(time); } else { LOGGER.info("onIntervalTemperatureChanged() - cannot change switch time, time is fixed!"); } notifyWeekProfileChangedListener(); } }); Button deleteButton = (Button) view.findViewById(R.id.delete); deleteButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { DialogUtil.showConfirmBox(context, R.string.areYouSure, R.string.deleteConfirmIntervalText, new DialogUtil.AlertOnClickListener() { @Override public void onClick() { parent.deleteHeatingIntervalAt(relativeChildPosition); notifyWeekProfileChangedListener(); } }); } }); if (child.isTimeFixed()) { deleteButton.setVisibility(View.INVISIBLE); } return view; } private View addView(final DayProfile<FilledTemperatureInterval, ?, ?> parent, ViewGroup viewGroup) { View view = layoutInflater.inflate(R.layout.weekprofile_interval_add, viewGroup, false); final FilledTemperatureInterval interval = new FilledTemperatureInterval(); setTemperatureAndInterval(view, R.id.addInterval, interval, viewGroup, new OnIntervalTemperatureChangedListener() { @Override public void onIntervalTemperatureChanged(String time, double temperature) { interval.setChangedSwitchTime(time); interval.setChangedTemperature(temperature); interval.setNew(true); parent.addHeatingInterval(interval); notifyWeekProfileChangedListener(); } }); return view; } private void setTemperatureAndInterval(View view, int buttonId, final FilledTemperatureInterval interval, final ViewGroup viewGroup, final OnIntervalTemperatureChangedListener listener) { Button button = (Button) view.findViewById(buttonId); button.setOnClickListener(new View.OnClickListener() { @Override @SuppressWarnings("unchecked") public void onClick(View view) { new IntervalEditHolder(interval, listener).showDialog(context, viewGroup); } }); } private class IntervalEditHolder { private final OnIntervalTemperatureChangedListener listener; FilledTemperatureInterval interval; private int hours; private int minutes; private IntervalEditHolder(FilledTemperatureInterval interval, OnIntervalTemperatureChangedListener listener) { this.interval = interval; this.listener = listener; String time = interval.getChangedSwitchTime(); String hoursPart = time == null ? "0" : time.substring(0, 2); String minutesPart = time == null ? "0" : time.substring(3, 5); hours = hoursPart.equals("24") ? 0 : Integer.valueOf(hoursPart); minutes = Integer.valueOf(minutesPart); } public void showDialog(Context context, final ViewGroup viewGroup) { View contentView = AndroidBug.handleColorStateBug(new AndroidBug.BugHandler() { @Override public View bugEncountered() { final View contentView = layoutInflater.inflate(R.layout.weekprofile_temperature_time_selector_android_bug, viewGroup, false); final FallbackTimePicker timePicker = (FallbackTimePicker) contentView.findViewById(R.id.timePicker); timePicker.setHours(hours); timePicker.setMinutes(minutes); timePicker.setOnValueChangedListener(new FallbackTimePicker.OnValueChangedListener() { @Override public void onValueChanged(int hours, int minutes) { IntervalEditHolder.this.hours = hours; IntervalEditHolder.this.minutes = minutes; } }); timePicker.setEnabled(! interval.isTimeFixed()); return contentView; } @Override public View defaultAction() { final View contentView = layoutInflater.inflate(R.layout.weekprofile_temperature_time_selector, viewGroup, false); final TimePicker timePicker = (TimePicker) contentView.findViewById(R.id.timePicker); timePicker.setIs24HourView(true); timePicker.setCurrentHour(hours); timePicker.setCurrentMinute(minutes); timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { IntervalEditHolder.this.hours = hourOfDay; IntervalEditHolder.this.minutes = minute; } }); timePicker.setEnabled(! interval.isTimeFixed()); return contentView; } }); LinearLayout layout = (LinearLayout) contentView.findViewById(R.id.tableLayout); TableRow updateRow = (TableRow) contentView.findViewById(R.id.updateRow); final TemperatureChangeTableRow temperatureChangeTableRow = new TemperatureChangeTableRow(context, interval.getChangedTemperature(), updateRow, 5.5, 30.0, applicationProperties) { @Override protected ApplicationProperties getApplicationProperties() { return applicationProperties; } @Override protected boolean showButton() { return false; } }; //noinspection unchecked layout.addView(temperatureChangeTableRow.createRow(layoutInflater, null, 8)); DialogUtil.showContentDialog(context, null, contentView, new DialogUtil.AlertOnClickListener() { @Override public void onClick() { double temperature = temperatureChangeTableRow.getTemperature(); String time = timeToTimeString(hours, minutes); if (listener != null) { LOGGER.debug("showDialog() - notifying listener"); listener.onIntervalTemperatureChanged(time, temperature); } else { LOGGER.error("showDialog() - no listener"); } notifyWeekProfileChangedListener(); } }); } } private interface OnIntervalTemperatureChangedListener { void onIntervalTemperatureChanged(String time, double temperature); } }