package com.orgzly.android; import com.orgzly.org.datetime.OrgDateTime; import com.orgzly.org.datetime.OrgRange; import java.util.Set; /** * State setting logic. */ public class StateChangeLogic { final private Set<String> todoKeywords; final private Set<String> doneKeywords; private String state; private OrgRange scheduled; private OrgRange deadline; private OrgRange closed; public StateChangeLogic(Set<String> todoKeywords, Set<String> doneKeywords) { this.todoKeywords = todoKeywords; this.doneKeywords = doneKeywords; } public void setState(String targetState, String originalState, OrgRange scheduledTime, OrgRange deadlineTime) { if (targetState == null) { throw new IllegalArgumentException("Target state cannot be null"); } this.scheduled = scheduledTime; this.deadline = deadlineTime; if (doneKeywords.contains(targetState)) { /* Target state is a done state. */ if (todoKeywords.contains(originalState)) { boolean shifted = false; if (scheduled != null) { if (scheduled.shift()) { shifted = true; } } if (deadline != null) { if (deadline.shift()) { shifted = true; } } if (shifted) { /* Keep the original state and remove the closed time */ state = originalState; closed = null; } else { /* Set state and closed time. */ state = targetState; closed = OrgRange.getInstance(OrgDateTime.getInstance(false)); } } else { /* Set state and update closed time. */ state = targetState; closed = OrgRange.getInstance(OrgDateTime.getInstance(false)); } } else { /* Target keyword is a to-do state. /* Set state and remove closed time. */ state = targetState; closed = null; } } public String getState() { return state; } public OrgRange getScheduled() { return scheduled; } public OrgRange getDeadline() { return deadline; } public OrgRange getClosed() { return closed; } }