/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.timers; import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.os.SystemClock; import android.text.format.DateFormat; import android.view.View; import android.view.View.OnClickListener; import android.widget.Chronometer; import android.widget.Chronometer.OnChronometerTickListener; import android.widget.ImageView; import android.widget.LinearLayout; import com.timsu.astrid.R; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.helper.TaskEditControlSet; public class TimerActionControlSet extends TaskEditControlSet { private final ImageView timerButton; private final Chronometer chronometer; private final LinearLayout timerContainer; private boolean timerActive; private final List<TimerActionListener> listeners = new LinkedList<TimerActionListener>(); public TimerActionControlSet(Activity activity, View parent) { super(activity, -1); timerContainer = (LinearLayout) parent.findViewById(R.id.timer_container); timerButton = (ImageView) parent.findViewById(R.id.timer_button); timerContainer.setOnClickListener(timerListener); chronometer = (Chronometer) parent.findViewById(R.id.timer); } @Override protected void readFromTaskOnInitialize() { if (model.getValue(Task.TIMER_START) == 0) timerActive = false; else timerActive = true; updateDisplay(); } @Override protected void afterInflate() { // Do nothing } @Override protected String writeToModelAfterInitialized(Task task) { // Nothing to do here return null; } private final OnClickListener timerListener = new OnClickListener() { @Override public void onClick(View v) { if (timerActive) { TimerPlugin.updateTimer(activity, model, false); for(TimerActionListener listener : listeners) listener.timerStopped(model); chronometer.stop(); } else { TimerPlugin.updateTimer(activity, model, true); for(TimerActionListener listener : listeners) listener.timerStarted(model); chronometer.start(); } timerActive = !timerActive; updateDisplay(); } }; private void updateDisplay() { final int drawable; if(timerActive) { drawable = R.drawable.icn_timer_stop; } else { drawable = R.drawable.icn_edit_timer; } timerButton.setImageResource(drawable); long elapsed = model.getValue(Task.ELAPSED_SECONDS) * 1000L; if (timerActive) { chronometer.setVisibility(View.VISIBLE); elapsed += DateUtilities.now() - model.getValue(Task.TIMER_START); chronometer.setBase(SystemClock.elapsedRealtime() - elapsed); if (elapsed > DateUtilities.ONE_DAY) { chronometer.setOnChronometerTickListener(new OnChronometerTickListener() { public void onChronometerTick(Chronometer cArg) { long t = SystemClock.elapsedRealtime() - cArg.getBase(); cArg.setText(DateFormat.format("d'd' h:mm", t)); //$NON-NLS-1$ } }); } chronometer.start(); } else { chronometer.setVisibility(View.GONE); chronometer.stop(); } } public interface TimerActionListener { public void timerStopped(Task task); public void timerStarted(Task task); } public void addListener(TimerActionListener listener) { this.listeners.add(listener); } public void removeListener(TimerActionListener listener) { if (listeners.contains(listener)) listeners.remove(listener); } }