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: