001: /**
002:    Connects a phone to the mail system. The purpose of this
003:    class is to keep track of the state of a connection, since
004:    the phone itself is just a source of individual key presses.
005: */
006: public class Connection
007: {
008:    /**
009:       Construct a Connection object.
010:       @param s a MailSystem object
011:       @param p a Telephone object
012:    */
013:    public Connection(MailSystem s, Telephone p)
014:    {
015:       system = s;
016:       phone = p;
017:       resetConnection();
018:    }
019: 
020:    /**
021:       Respond to the user's pressing a key on the phone touchpad
022:       @param key the phone key pressed by the user
023:    */
024:    public void dial(String key)
025:    {
026:       if (state == CONNECTED)
027:          connect(key);
028:       else if (state == RECORDING)
029:          login(key);
030:       else if (state == CHANGE_PASSCODE)
031:          changePasscode(key);
032:       else if (state == CHANGE_GREETING)
033:          changeGreeting(key);
034:       else if (state == MAILBOX_MENU)
035:          mailboxMenu(key);
036:       else if (state == MESSAGE_MENU)
037:          messageMenu(key);
038:    }
039: 
040:    /**
041:       Record voice.
042:       @param voice voice spoken by the user
043:    */
044:    public void record(String voice)
045:    {
046:       if (state == RECORDING || state == CHANGE_GREETING)
047:          currentRecording += voice;
048:    }
049: 
050:    /**
051:       The user hangs up the phone.
052:    */
053:    public void hangup()
054:    {
055:       if (state == RECORDING)
056:          currentMailbox.addMessage(new Message(currentRecording));
057:       resetConnection();
058:    }
059: 
060:    /**
061:       Reset the connection to the initial state and prompt
062:       for mailbox number
063:    */
064:    private void resetConnection()
065:    {
066:       currentRecording = "";
067:       accumulatedKeys = "";
068:       state = CONNECTED;
069:       phone.speak(INITIAL_PROMPT);
070:    }
071: 
072:    /**
073:       Try to connect the user with the specified mailbox.
074:       @param key the phone key pressed by the user
075:    */
076:    private void connect(String key)
077:    {
078:       if (key.equals("#"))
079:       {
080:          currentMailbox = system.findMailbox(accumulatedKeys);
081:          if (currentMailbox != null)
082:          {
083:             state = RECORDING;
084:             phone.speak(currentMailbox.getGreeting());
085:          }
086:          else
087:             phone.speak("Incorrect mailbox number. Try again!");
088:          accumulatedKeys = "";
089:       }
090:       else
091:          accumulatedKeys += key;
092:    }
093: 
094:    /**
095:       Try to log in the user.
096:       @param key the phone key pressed by the user
097:    */
098:    private void login(String key)
099:    {
100:       if (key.equals("#"))
101:       {
102:          if (currentMailbox.checkPasscode(accumulatedKeys))
103:          {
104:             state = MAILBOX_MENU;
105:             phone.speak(MAILBOX_MENU_TEXT);
106:          }
107:          else
108:             phone.speak("Incorrect passcode. Try again!");
109:          accumulatedKeys = "";
110:       }
111:       else
112:          accumulatedKeys += key;
113:    }
114: 
115:    /**
116:       Change passcode.
117:       @param key the phone key pressed by the user
118:    */
119:    private void changePasscode(String key)
120:    {
121:       if (key.equals("#"))
122:       {
123:          currentMailbox.setPasscode(accumulatedKeys);
124:          state = MAILBOX_MENU;
125:          phone.speak(MAILBOX_MENU_TEXT);
126:          accumulatedKeys = "";
127:       }
128:       else
129:          accumulatedKeys += key;
130:    }
131: 
132:    /**
133:       Change greeting.
134:       @param key the phone key pressed by the user
135:    */
136:    private void changeGreeting(String key)
137:    {
138:       if (key.equals("#"))
139:       {
140:          currentMailbox.setGreeting(currentRecording);
141:          currentRecording = "";
142:          state = MAILBOX_MENU;
143:          phone.speak(MAILBOX_MENU_TEXT);
144:       }
145:    }
146: 
147:    /**
148:       Respond to the user's selection from mailbox menu.
149:       @param key the phone key pressed by the user
150:    */
151:    private void mailboxMenu(String key)
152:    {
153:       if (key.equals("1"))
154:       {
155:          state = MESSAGE_MENU;
156:          phone.speak(MESSAGE_MENU_TEXT);
157:       }
158:       else if (key.equals("2"))
159:       {
160:          state = CHANGE_PASSCODE;
161:          phone.speak("Enter new passcode followed by the # key");
162:       }
163:       else if (key.equals("3"))
164:       {
165:          state = CHANGE_GREETING;
166:          phone.speak("Record your greeting, then press the # key");
167:       }
168:    }
169: 
170:    /**
171:       Respond to the user's selection from message menu.
172:       @param key the phone key pressed by the user
173:    */
174:    private void messageMenu(String key)
175:    {
176:       if (key.equals("1"))
177:       {
178:          String output = "";
179:          Message m = currentMailbox.getCurrentMessage();
180:          if (m == null) output += "No messages." + "\n";
181:          else output += m.getText() + "\n";
182:          output += MESSAGE_MENU_TEXT;
183:          phone.speak(output);
184:       }
185:       else if (key.equals("2"))
186:       {
187:          currentMailbox.saveCurrentMessage();
188:          phone.speak(MESSAGE_MENU_TEXT);
189:       }
190:       else if (key.equals("3"))
191:       {
192:          currentMailbox.removeCurrentMessage();
193:          phone.speak(MESSAGE_MENU_TEXT);
194:       }
195:       else if (key.equals("4"))
196:       {
197:          state = MAILBOX_MENU;
198:          phone.speak(MAILBOX_MENU_TEXT);
199:       }
200:    }
201: 
202:    private MailSystem system;
203:    private Mailbox currentMailbox;
204:    private String currentRecording;
205:    private String accumulatedKeys;
206:    private Telephone phone;
207:    private int state;
208: 
209:    private static final int DISCONNECTED = 0;
210:    private static final int CONNECTED = 1;
211:    private static final int RECORDING = 2;
212:    private static final int MAILBOX_MENU = 3;
213:    private static final int MESSAGE_MENU = 4;
214:    private static final int CHANGE_PASSCODE = 5;
215:    private static final int CHANGE_GREETING = 6;
216: 
217:    private static final String INITIAL_PROMPT = 
218:       "Enter mailbox number followed by #";      
219:    private static final String MAILBOX_MENU_TEXT = 
220:       "Enter 1 to listen to your messages\n"
221:       + "Enter 2 to change your passcode\n"
222:       + "Enter 3 to change your greeting";
223:    private static final String MESSAGE_MENU_TEXT = 
224:       "Enter 1 to listen to the current message\n"
225:       + "Enter 2 to save the current message\n"
226:       + "Enter 3 to delete the current message\n"
227:       + "Enter 4 to return to the main menu";
228: }
229: 
230: 
231: 
232: 
233: 
234: 
235: 
236: 
237: 
238: 
239: