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