mirror of https://github.com/tasks/tasks
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
8.2 KiB
Java
258 lines
8.2 KiB
Java
/**
|
|
* Copyright (c) 2012 Todoroo Inc
|
|
* <p/>
|
|
* See the file "LICENSE" for the full license governing this code.
|
|
*/
|
|
package com.todoroo.astrid.timers;
|
|
|
|
import android.app.Activity;
|
|
import android.app.Dialog;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.os.Bundle;
|
|
import android.os.SystemClock;
|
|
import android.support.annotation.Nullable;
|
|
import android.support.v7.app.AlertDialog;
|
|
import android.text.TextUtils;
|
|
import android.text.format.DateFormat;
|
|
import android.text.format.DateUtils;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.Chronometer;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
|
|
import com.todoroo.andlib.utility.DateUtilities;
|
|
import com.todoroo.astrid.data.Task;
|
|
import com.todoroo.astrid.ui.TimeDurationControlSet;
|
|
|
|
import org.tasks.R;
|
|
import org.tasks.dialogs.DialogBuilder;
|
|
import org.tasks.injection.ForActivity;
|
|
import org.tasks.preferences.ActivityPreferences;
|
|
import org.tasks.ui.TaskEditControlFragment;
|
|
|
|
import javax.inject.Inject;
|
|
|
|
import butterknife.Bind;
|
|
import butterknife.OnClick;
|
|
|
|
/**
|
|
* Control Set for managing repeats
|
|
*
|
|
* @author Tim Su <tim@todoroo.com>
|
|
*
|
|
*/
|
|
public class TimerControlSet extends TaskEditControlFragment {
|
|
|
|
public static final int TAG = R.string.TEA_ctrl_timer_pref;
|
|
|
|
public interface TimerControlSetCallback {
|
|
Task stopTimer();
|
|
Task startTimer();
|
|
}
|
|
|
|
private static final String EXTRA_STARTED = "extra_started";
|
|
private static final String EXTRA_ESTIMATED = "extra_estimated";
|
|
private static final String EXTRA_ELAPSED = "extra_elapsed";
|
|
|
|
@Inject ActivityPreferences preferences;
|
|
@Inject DialogBuilder dialogBuilder;
|
|
@Inject @ForActivity Context context;
|
|
|
|
@Bind(R.id.display_row_edit) TextView displayEdit;
|
|
@Bind(R.id.timer) Chronometer chronometer;
|
|
@Bind(R.id.timer_button) ImageView timerButton;
|
|
|
|
private TimeDurationControlSet estimated;
|
|
private TimeDurationControlSet elapsed;
|
|
private long timerStarted;
|
|
protected AlertDialog dialog;
|
|
private View dialogView;
|
|
private int elapsedSeconds;
|
|
private int estimatedSeconds;
|
|
private TimerControlSetCallback callback;
|
|
|
|
@Nullable
|
|
@Override
|
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
View view = super.onCreateView(inflater, container, savedInstanceState);
|
|
if (savedInstanceState != null) {
|
|
timerStarted = savedInstanceState.getLong(EXTRA_STARTED);
|
|
elapsedSeconds = savedInstanceState.getInt(EXTRA_ELAPSED);
|
|
estimatedSeconds = savedInstanceState.getInt(EXTRA_ESTIMATED);
|
|
}
|
|
|
|
dialogView = inflater.inflate(R.layout.control_set_timers_dialog, null);
|
|
estimated = new TimeDurationControlSet(context, dialogView, R.id.estimatedDuration, preferences);
|
|
elapsed = new TimeDurationControlSet(context, dialogView, R.id.elapsedDuration, preferences);
|
|
estimated.setTimeDuration(estimatedSeconds);
|
|
elapsed.setTimeDuration(elapsedSeconds);
|
|
refresh();
|
|
return view;
|
|
}
|
|
|
|
@Override
|
|
public void onAttach(Activity activity) {
|
|
super.onAttach(activity);
|
|
|
|
callback = (TimerControlSetCallback) activity;
|
|
}
|
|
|
|
@Override
|
|
public void onSaveInstanceState(Bundle outState) {
|
|
super.onSaveInstanceState(outState);
|
|
|
|
outState.putInt(EXTRA_ELAPSED, elapsed.getTimeDurationInSeconds());
|
|
outState.putInt(EXTRA_ESTIMATED, estimated.getTimeDurationInSeconds());
|
|
outState.putLong(EXTRA_STARTED, timerStarted);
|
|
}
|
|
|
|
@OnClick(R.id.display_row_edit)
|
|
void openPopup(View view) {
|
|
if (dialog == null) {
|
|
buildDialog();
|
|
}
|
|
dialog.show();
|
|
}
|
|
|
|
protected Dialog buildDialog() {
|
|
AlertDialog.Builder builder = dialogBuilder.newDialog()
|
|
.setView(dialogView)
|
|
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
refreshDisplayView();
|
|
}
|
|
})
|
|
.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
|
@Override
|
|
public void onCancel(DialogInterface dialog) {
|
|
refreshDisplayView();
|
|
}
|
|
});
|
|
dialog = builder.show();
|
|
return dialog;
|
|
}
|
|
|
|
@OnClick(R.id.timer_container)
|
|
void timerClicked(View view) {
|
|
if (timerActive()) {
|
|
Task task = callback.stopTimer();
|
|
elapsed.setTimeDuration(task.getElapsedSeconds());
|
|
timerStarted = 0;
|
|
chronometer.stop();
|
|
refreshDisplayView();
|
|
} else {
|
|
Task task = callback.startTimer();
|
|
timerStarted = task.getTimerStart();
|
|
chronometer.start();
|
|
}
|
|
updateChronometer();
|
|
}
|
|
|
|
@Override
|
|
protected int getLayout() {
|
|
return R.layout.control_set_timers;
|
|
}
|
|
|
|
@Override
|
|
public int getIcon() {
|
|
return R.drawable.ic_timer_24dp;
|
|
}
|
|
|
|
@Override
|
|
public int controlId() {
|
|
return TAG;
|
|
}
|
|
|
|
@Override
|
|
public void initialize(boolean isNewTask, Task task) {
|
|
timerStarted = task.getTimerStart();
|
|
elapsedSeconds = task.getElapsedSeconds();
|
|
estimatedSeconds = task.getEstimatedSeconds();
|
|
}
|
|
|
|
@Override
|
|
public boolean hasChanges(Task original) {
|
|
return elapsed.getTimeDurationInSeconds() != original.getElapsedSeconds() ||
|
|
estimated.getTimeDurationInSeconds() != original.getEstimatedSeconds();
|
|
}
|
|
|
|
@Override
|
|
public void apply(Task task) {
|
|
task.setElapsedSeconds(elapsed.getTimeDurationInSeconds());
|
|
task.setEstimatedSeconds(estimated.getTimeDurationInSeconds());
|
|
}
|
|
|
|
private void refresh() {
|
|
refreshDisplayView();
|
|
updateChronometer();
|
|
}
|
|
|
|
private void refreshDisplayView() {
|
|
String est = null;
|
|
int estimatedSeconds = estimated.getTimeDurationInSeconds();
|
|
if (estimatedSeconds > 0) {
|
|
est = getString(R.string.TEA_timer_est, DateUtils.formatElapsedTime(estimatedSeconds));
|
|
}
|
|
String elap = null;
|
|
int elapsedSeconds = elapsed.getTimeDurationInSeconds();
|
|
if (elapsedSeconds > 0) {
|
|
elap = getString(R.string.TEA_timer_elap, DateUtils.formatElapsedTime(elapsedSeconds));
|
|
}
|
|
|
|
String toDisplay;
|
|
|
|
if (!TextUtils.isEmpty(est) && !TextUtils.isEmpty(elap)) {
|
|
toDisplay = est + ", " + elap; //$NON-NLS-1$
|
|
} else if (!TextUtils.isEmpty(est)) {
|
|
toDisplay = est;
|
|
} else if (!TextUtils.isEmpty(elap)) {
|
|
toDisplay = elap;
|
|
} else {
|
|
toDisplay = null;
|
|
}
|
|
|
|
if (!TextUtils.isEmpty(toDisplay)) {
|
|
displayEdit.setText(toDisplay);
|
|
displayEdit.setAlpha(1.0f);
|
|
} else {
|
|
displayEdit.setText(R.string.TEA_timer_controls);
|
|
displayEdit.setAlpha(0.5f);
|
|
}
|
|
}
|
|
|
|
private void updateChronometer() {
|
|
timerButton.setImageResource(timerActive()
|
|
? R.drawable.ic_pause_24dp
|
|
: R.drawable.ic_play_arrow_24dp);
|
|
|
|
long elapsed = this.elapsed.getTimeDurationInSeconds() * 1000L;
|
|
if (timerActive()) {
|
|
chronometer.setVisibility(View.VISIBLE);
|
|
elapsed += DateUtilities.now() - timerStarted;
|
|
chronometer.setBase(SystemClock.elapsedRealtime() - elapsed);
|
|
if (elapsed > DateUtilities.ONE_DAY) {
|
|
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
|
|
@Override
|
|
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();
|
|
}
|
|
}
|
|
|
|
private boolean timerActive() {
|
|
return timerStarted > 0;
|
|
}
|
|
}
|