Updated advanced prefs patches
[webos-internals:skurriers-modifications.git] / advanced / advanced-system-prefs-phone-prefs.patch
1 --- .orig/etc/palm/db/permissions/com.palm.person.speeddialbackup
2 +++ /etc/palm/db/permissions/com.palm.person.speeddialbackup
3 @@ -31,5 +31,16 @@
4                         "delete": "allow",
5                         "update": "allow"
6                 }
7 -       }
8 +       },
9 +       {
10 +               "type": "db.kind",
11 +               "object": "com.palm.person.speeddialbackup:1",
12 +               "caller": "com.palm.app.phone",
13 +               "operations": {
14 +                       "read": "allow",
15 +                       "create": "allow",
16 +                       "delete": "allow",
17 +                       "update": "allow"
18 +               }
19 +       }       
20  ]
21 --- .orig/usr/palm/applications/com.palm.app.phone/sources.json
22 +++ /usr/palm/applications/com.palm.app.phone/sources.json
23 @@ -141,6 +141,9 @@
24      "source": "app/controllers/pin-assistant.js"
25    },
26    {
27 +    "source": "app/controllers/prefs-assistant.js"
28 +  },
29 +  {
30      "source": "app/models/DBModels.js"
31    },
32    {
33 @@ -172,6 +175,9 @@
34      "source": "app/models/states/Abstract.js"
35    },
36    {
37 +    "source": "app/models/states/Prefs.js"
38 +  },
39 +  {
40      "source": "app/models/states/Start.js"
41    },
42    {
43 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/app-assistant.js
44 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/app-assistant.js
45 @@ -2,6 +2,10 @@
46  
47  function AppAssistant(appController) {
48         var libraries;
49 +
50 +       this.phonePrefs = {};
51 +       this.rejectedPrefs = {};
52 +       this.notificationPrefs = {};
53         
54     // Mojo.Log.info( "AppAssistant");
55  
56 @@ -77,6 +81,8 @@
57                 Mojo.Log.error("PHONE APP FAILED TO LOAD BECAUSE AN EXCEPTION WAS THROWN BY A DEPENDENCY. EXCEPTION DETAILS TO FOLLOW.");
58                 throw e;
59         }
60 +
61 +       this.loadPreferences();
62  };
63  
64  AppAssistant.prototype.setup = function() {
65 @@ -108,6 +114,10 @@
66         } else if (event.type == Mojo.Event.command) {
67                 // handle app menu items common to all scenes
68                 switch (event.command) {
69 +                       case MenuController.kPrefsMenuItem.command:
70 +                               UIStateMachine.enter('prefs', this.phonePrefs, this.rejectedPrefs, this.notificationPrefs);
71 +                               break;
72 +
73                         case Mojo.Menu.prefsCmd:
74                                 MenuController.showPrefs();
75                                 break;
76 @@ -134,6 +144,50 @@
77         }
78  };
79  
80 +AppAssistant.prototype.loadPreferences = function() {
81 +       var cookieContainer = new Mojo.Model.Cookie("phone");
82 +
83 +       this.phonePrefs = cookieContainer.get();
84 +       
85 +       if(!this.phonePrefs) {
86 +               this.phonePrefs = {
87 +                       version: 1,
88 +                       closeApp: false,
89 +                       startView: "default",
90 +                       onCallView: "contact",
91 +                       autoDialing: "call",
92 +                       powerButton: "none",
93 +                       sliderOpened: "answer",
94 +                       sliderClosed: "hangup",
95 +                       removedFromTS: "answer",
96 +                       proximityAction: "none"
97 +               };
98 +               
99 +               cookieContainer.put(this.phonePrefs);
100 +       }
101 +
102 +       this.rejectedPrefs = {
103 +               rejectAction: "none",
104 +               rejectTemplate: "Sorry, I am currently busy and will call you back later..."
105 +       };
106 +       
107 +       this.notificationPrefs = {
108 +               notificationBlink: true,
109 +               repeatInterval: 0,
110 +               repeatLimit: 3
111 +       };
112 +
113 +       this.getPreferencesSubscription = new Mojo.Service.Request('palm://com.palm.systemservice/', {
114 +               method: 'getPreferences', parameters: {subscribe: true, keys: ["callRejection", "callNotification"]},
115 +               onSuccess: function(response) {
116 +                       if(response.callRejection)
117 +                               this.rejectedPrefs = response.callRejection;
118 +                       
119 +                       if(response.callNotification)
120 +                               this.notificationPrefs = response.callNotification;
121 +               }.bind(this)});
122 +}
123 +
124  AppAssistant.prototype.loadProperties = function() {
125         var sourcesText = palmGetResource(Mojo.appPath + "properties.json", true);
126         if (sourcesText) {
127 @@ -271,11 +325,17 @@
128                         this.createLockStage();
129                         this.loadSettings();
130                         return;
131 +               } else if (args.closeMissedCall) {
132 +                       Mojo.Controller.getAppController().closeStage("missed");
133 +               } else if (args.playNotificationSound) {
134 +                       // Delay playing to go around WebOS bug (sound not playing).
135 +
136 +                       setTimeout(this.playNotificationSound.bind(this, args.playNotificationSound), 1000);
137                 } else {
138                         // when in first use, always default to doing nothing for invalid args; 
139                         // otherwise default to showing dialpad
140                         if ( ! PalmSystem.isMinimal ) {
141 -                               UIStateMachine.event("launch");
142 +                               UIStateMachine.event("launch", this.phonePrefs.startView);
143                         }
144                 }
145      } else {
146 @@ -283,8 +343,8 @@
147                 if (!(this.telephonyEventListener.isPendingOrActive())) {
148                         if (this.initialLaunch === false) {
149                                 Mojo.Log.info( "handleLaunch", "no args, no calls: focusing stage");
150 -                               
151 -                               UIStateMachine.event("launch");
152 +
153 +                               UIStateMachine.event("launch", this.phonePrefs.startView);
154                         } else {
155                                 Mojo.Log.info( "handleLaunch", "initial launch, so doing nothing");
156                                 this.initialLaunch = false;
157 @@ -297,6 +357,16 @@
158      }
159  };
160  
161 +AppAssistant.prototype.playNotificationSound = function(count) {
162 +       var stageController = Mojo.Controller.getAppController().getStageController("misseddash");
163 +
164 +       if (stageController) {
165 +               stageController.delegateToSceneAssistant("playNotificationSound");
166 +
167 +               stageController.delegateToSceneAssistant("schedulePlayNotificationSoundTask", count);
168 +       }
169 +};
170 +
171  // Public API way of launching the phone app to a number (or opening skypevm)
172  AppAssistant.prototype.launchURI = function(uri) {
173         var uriNoPrefix = uri.replace(/^((tel:)|(wtai:)|(skypevm:\/\/))/,''),
174 @@ -394,7 +464,10 @@
175                                 || contact.addr.charAt(0) === '#'
176                                 || ! this.telephonyEventListener.serviced)) {
177                         
178 -                       UIStateMachine.event("dial", {"action": "dial", "number": contact.addr});
179 +                       if(this.phonePrefs.autoDialing != "none")
180 +                               UIStateMachine.event("dial", {"action": "dial", "number": contact.addr});
181 +                       else
182 +                               UIStateMachine.event("dial", {"action": "fill", "number": contact.addr});
183                 
184                 // CASE: just dial
185                 } else {
186 @@ -407,11 +480,16 @@
187                                 } else {
188                                         this.focusOnActiveCallSceneCreation = true;
189                                 }
190 -                               contact.placeCall(this.dialFailure.bind(this), parseResult);
191 -                       
192 +                               if(this.phonePrefs.autoDialing != "none")
193 +                                       contact.placeCall(this.dialFailure.bind(this), parseResult);
194 +                               else
195 +                                       UIStateMachine.event("dial", {"action": "fill", "number": contact.addr});
196                         // CASE: not immediately dialable. Let dialpad try it
197                         } else {
198 -                               UIStateMachine.event("dial", {"action": "dial", "number": contact.addr});
199 +                               if(this.phonePrefs.autoDialing != "none")
200 +                                       UIStateMachine.event("dial", {"action": "dial", "number": contact.addr});
201 +                               else
202 +                                       UIStateMachine.event("dial", {"action": "fill", "number": contact.addr});
203                         }
204                 }
205                 
206 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
207 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
208 @@ -29,7 +29,30 @@
209                 this.announcer = this.appAssistant.announcer;
210                 this.contacts = this.appAssistant.contacts; 
211          Mojo.Log.info( "activecall initialize");
212 +
213 +               this.audioPreviousProfile = null;
214 +               this.sliderState = "down";
215 +
216 +      var sliderStateRequest = new Mojo.Service.Request('palm://com.palm.keys/switches/', {
217 +                       method: 'status', parameters: {"get" : "slider"},
218 +                       onSuccess: function(response) {
219 +                               if(response.key === "slider")
220 +                                       this.sliderState = response.state;
221 +                       }.bind(this)});
222 +
223 +               this.sliderSubscription = TelephonyCommands.sliderSubscribe(
224 +                       this.onSliderEventDuringCall.bind(this));
225                 
226 +               if(this.appAssistant.phonePrefs.powerButton == "hangup") {
227 +                       this.powerButtonSubscription = TelephonyCommands.powerButtonSubscribe(
228 +                       true, 'activecall', this.onPowerButtonEventDuringCall.bind(this));
229 +               }
230 +
231 +               if(this.appAssistant.phonePrefs.proximityAction == "change") {
232 +                       this.displayStatusSubscription = TelephonyCommands.displayStatusSubscribe(
233 +                               this.onDisplayEventDuringCall.bind(this));
234 +               }
235 +                               
236                 this.lastLines = [];
237                 this.pauseWaitDigits = [];
238                 this.showWaitButtonOnActive = [];
239 @@ -151,7 +174,7 @@
240                 this.appAssistant.telephonyEventListener.addCallStateListener(this);
241                 this.appAssistant.telephonyEventListener.addAudioStateListener(this);
242                 
243 -               var appMenuModel = {
244 +/*             var appMenuModel = {
245                         visible: true,
246              items: [{
247                  label: $L('Sounds & Ringtones'),
248 @@ -159,6 +182,8 @@
249              }]
250                 }; 
251                 this.controller.setupWidget(Mojo.Menu.appMenu, undefined, appMenuModel);
252 +*/             
253 +               MenuController.setupAppMenu(this.controller);
254                 
255                 if (!this.abridged && this.appAssistant.focusOnActiveCallSceneCreation === true) {
256                         UIStateMachine.event('focus');
257 @@ -558,7 +583,9 @@
258                 if (this.showDTMF === true && lineState.length > 0 && !(lineState.length == 1 && this.lastLines.length == 1 
259                         && (lineState[0].state == TelephonyCallState.ACTIVE || lineState[0].state == TelephonyCallState.DIALPENDING)
260                         && (this.lastLines[0].state == TelephonyCallState.DIALING || this.lastLines[0].state == TelephonyCallState.DIALPENDING))) {
261 -                               this.setDTMFPadVisibility(false);
262 +                                       
263 +                               if(this.appAssistant.phonePrefs.onCallView != "keypad")
264 +                                       this.setDTMFPadVisibility(false);
265                 } 
266         },
267         
268 @@ -1242,6 +1269,9 @@
269                 // clear dial debounce
270                 DialStringParser.clearDebounceTimeout();
271                 this.activated = true;
272 +               
273 +               if(this.appAssistant.phonePrefs.onCallView == "keypad")
274 +                       this.setDTMFPadVisibility(true);
275         },
276      
277         incomingDialogLaunch: function() {
278 @@ -1303,6 +1333,22 @@
279          this.controller.document.removeEventListener('keydown', this.boundStartDTMFHardKey);
280          this.controller.document.removeEventListener('keyup', this.boundEndDTMFHardKey);
281                 
282 +      // remove slider listener
283 +               this.sliderSubscription.cancel();
284 +               delete this.sliderSubscription;
285 +               
286 +                // remove power button listener
287 +               if(this.appAssistant.phonePrefs.powerButton == "hangup") {
288 +                       this.powerButtonSubscription.cancel();
289 +                       delete this.powerButtonSubscription;
290 +               }
291 +
292 +                // remove display status listener
293 +               if(this.appAssistant.phonePrefs.proximityAction == "change") {
294 +                       this.displayStatusSubscription.cancel();
295 +                       delete this.displayStatusSubscription;
296 +               }
297 +       
298                 // drop puck subscription
299                 this.puckSubscription.cancel();
300                 delete this.puckSubscription;
301 @@ -1519,7 +1565,8 @@
302      },
303      
304      enableSpeakerphoneOnPuck: function(){
305 -        if (this.puckConnected === true && this.audioActiveProfile !== "phone_back_speaker") {
306 +        if (this.puckConnected === true && this.audioActiveProfile === "phone_front_speaker")
307 +        {
308              this.onAudioRouteChangeClick("phone_back_speaker");
309          }
310         },
311 @@ -2059,4 +2106,86 @@
312                 }
313         },
314      
315 +       onSliderEventDuringCall: function(response) {
316 +               if((!response) || (!response.key) || (!response.state))
317 +                       return;
318 +
319 +               if(this.appAssistant.phonePrefs.sliderClosed == "none")
320 +                       return;
321 +
322 +               if((response.key == "slider") && (this.audioActiveProfile == "phone_front_speaker")) {
323 +                       if((this.sliderState == "up") && (response.state == "down")) {
324 +                               // First, "tap" each Disconnect Button.
325 +
326 +                               for(i = 0; i < 3; i++) {
327 +                                       if(this.controller.get("disc_button_" + i))
328 +                                               Mojo.Event.send(this.controller.get("disc_button_" + i), Mojo.Event.tap);
329 +                               }
330 +
331 +                               // In case there are calls not disconnected, just call the function to disconnect all calls.
332 +                               // The reason we don't just do this one function is that the screen redraw is not pretty.
333 +
334 +                               this.eventListener.disconnectAllCalls();
335 +                       }
336 +               
337 +                       this.sliderState = response.state;
338 +               } 
339 +       },
340 +
341 +       onPowerButtonEventDuringCall: function(response) {
342 +               if((!response) || (!response.powerKey))
343 +                       return;
344 +
345 +               if(this.appAssistant.phonePrefs.powerButton == "none")
346 +                       return;
347 +
348 +               if((response.powerKey == 'released') && 
349 +                       ((this.audioActiveProfile == "phone_front_speaker") ||
350 +                       (this.appAssistant.phonePrefs.proximityAction == "change")))
351 +               {
352 +                       // First, "tap" each Disconnect Button.
353 +
354 +                       for(i = 0; i < 3; i++) {
355 +                               if(this.controller.get("disc_button_" + i))
356 +                                       Mojo.Event.send(this.controller.get("disc_button_" + i), Mojo.Event.tap);
357 +                       }
358 +
359 +                       // In case there are calls not disconnected, just call the function to disconnect all calls.
360 +                       // The reason we don't just do this one function is that the screen redraw is not pretty.
361 +
362 +                       this.eventListener.disconnectAllCalls();
363 +               }
364 +       },
365 +       
366 +       onDisplayEventDuringCall: function(response) {
367 +               if(this.appAssistant.screenLocked)
368 +                       return;
369 +
370 +               if(this.appAssistant.phonePrefs.proximityAction != "change")
371 +                       return;
372 +
373 +               if(this.eventListener.proxEnabled) {
374 +                       var callStateMessage = this.eventListener.getCallState();
375 +                       var lineState = callStateMessage.lines;
376 +                       
377 +                       var scenarios = this.eventListener.getAvailableAudioScenarios();
378 +                       
379 +                       if(response && (response.event || response.state)) {
380 +                               if(response.event == "displayOn" || response.state == "on") {
381 +                                       if(this.audioActiveProfile !== this.audioPreviousProfile) {
382 +                                               if(this.audioPreviousProfile !== null)
383 +                                                       this.onAudioRouteChangeClick(this.audioPreviousProfile);
384 +                                       }
385 +                               } else if(response.event == "displayOff" || response.state == "off") {
386 +                                       if(this.audioActiveProfile !== "phone_front_speaker") {
387 +                                               this.audioPreviousProfile = this.audioActiveProfile;
388 +                                               
389 +                                               this.onAudioRouteChangeClick("phone_front_speaker");                                            
390 +                                       }
391 +                                       else if(this.audioPreviousProfile === null)
392 +                                               this.audioPreviousProfile = "phone_back_speaker";
393 +                               }
394 +                       }
395 +               }
396 +       }
397  });
398 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
399 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
400 @@ -47,7 +47,7 @@
401         onAnnounceCreated: function(windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate, stagecontrol) {
402                 Mojo.Log.info( "onAnnounceCreated");
403                 
404 -               stagecontrol.pushScene({"name": "dashannounce"}, windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate);
405 +               stagecontrol.pushScene({"name": "dashannounce"}, windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate, this.appAssistant.notificationPrefs);
406         },
407  
408         announceClear: function(windowName) {
409 @@ -471,6 +471,9 @@
410                         soundClass = "ringtones";
411                 }
412                 
413 +               if(contact.callAlert)
414 +                       soundClass = contact.callAlert;
415 +               
416                 /* TODO if you want to override the ringer switch when a charger connected, 
417                         (puck or USB) comment out the code above and replace it with this.
418                 
419 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/dashannounce-assistant.js
420 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/dashannounce-assistant.js
421 @@ -1,7 +1,7 @@
422  /* Copyright 2009 Palm, Inc.  All rights reserved. */
423  
424  var DashannounceAssistant = Class.create({
425 -       initialize: function(windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate) {
426 +       initialize: function(windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate, notificationPrefs) {
427             Mojo.Log.info( "DashannounceAssistant::initialize");
428                 this.windowName = windowName;
429                 this.single = single;
430 @@ -11,6 +11,7 @@
431                 this.message = message;
432                 this.iconCallback = iconCallback;
433                 this.badgeTemplate = badgeTemplate;
434 +               this.notificationPrefs = notificationPrefs;
435                 if (messageCallback) {
436                         this.messageCallback = messageCallback;
437                 } else {
438 @@ -40,7 +41,11 @@
439            this.controller.get('title').innerHTML = this.title;
440            this.controller.get('message').innerHTML = this.message;
441            this.controller.listen(this.controller.document, Mojo.Event.windowActivate, this.onFocus.bindAsEventListener(this));
442 -          this.controller.stageController.indicateNewContent(true);
443 +
444 +               if(this.notificationPrefs.notificationBlink)
445 +                  this.controller.stageController.indicateNewContent(true);
446 +
447 +               this.schedulePlayNotificationSoundTask(0);
448    },
449    onFocus:function() {
450         if (this.missedTimeStamp && this.windowName == 'misseddash') {
451 @@ -57,11 +62,15 @@
452    deactivate:function(){
453         this.controller.stopListening(this.controller.document, Mojo.Event.windowActivate, this.onFocus);
454         
455 +       this.removePlayNotificationSoundTask(); 
456    },
457  
458    // run callback and close this
459    onIconTap: function () {
460         Mojo.Log.info( "DashannounceAssistant::onTap", "windowName:" , this.windowName);
461 +
462 +       this.removePlayNotificationSoundTask(); 
463 +       
464         if (this.iconCallback) {
465                 this.iconCallback();
466         } else {
467 @@ -71,6 +80,9 @@
468    
469    onMessageTap: function () {
470         Mojo.Log.info( "DashannounceAssistant::onTap", "windowName:" , this.windowName);
471 +
472 +       this.removePlayNotificationSoundTask(); 
473 +       
474         if (this.messageCallback) {
475                 this.messageCallback();
476         } else {
477 @@ -91,7 +103,11 @@
478         this.itemcount = itemcount;
479         this.badgeTemplate = badgeTemplate;
480         this.updateBadge();
481 -       this.controller.stageController.indicateNewContent(true);
482 +
483 +       if(this.notificationPrefs.notificationBlink)
484 +               this.controller.stageController.indicateNewContent(true);
485 +
486 +       this.schedulePlayNotificationSoundTask(0);
487    },
488    
489    updateBadge: function() {
490 @@ -115,7 +131,45 @@
491                 this.controller.get('badge').innerHTML = "";
492                 this.controller.get('notification').addClassName("single");
493         }
494 -  }
495 +  },
496    
497 +       schedulePlayNotificationSoundTask: function(count) {
498 +               if((this.notificationPrefs.repeatInterval > 0) && (count++ < this.notificationPrefs.repeatLimit)) {
499 +                       var currentTime = new Date();
500 +               
501 +                       var repeatInterval = this.notificationPrefs.repeatInterval;                             
502 +                       
503 +                       var playSoundTime = new Date(currentTime.getTime() + (parseInt(repeatInterval) * 1000));
504 +
505 +                       var month = playSoundTime.getUTCMonth()+1;
506 +                       if(month < 10) month = "0" + month;
507 +                       var day = playSoundTime.getUTCDate();
508 +                       if(day < 10) day = "0" + day;
509 +                       var year = playSoundTime.getUTCFullYear();
510 +
511 +                       var hours = playSoundTime.getUTCHours();
512 +                       if(hours < 10) hours = "0" + hours;
513 +                       var minutes = playSoundTime.getUTCMinutes();
514 +                       if(minutes < 10) minutes = "0" + minutes;
515 +                       var seconds = playSoundTime.getUTCSeconds();
516 +                       if(seconds < 10) seconds = "0" + seconds;
517 +
518 +                       var scheduledTimeStr = month + "/" + day + "/" + year + " " + hours + ":" + minutes + ":" + seconds;
519 +                       
520 +                       this.updateTimeoutRequest = new Mojo.Service.Request('palm://com.palm.power/timeout/', {
521 +                               'method': "set", 'parameters': {'key': 'phonePlayNotificationSound',
522 +                               'wakeup': true, 'at': scheduledTimeStr, 'uri': "palm://com.palm.applicationManager/open",
523 +                               'params': {'id': 'com.palm.app.phone', 'params': {'playNotificationSound': count}}} }); 
524 +               }
525 +       },
526 +       
527 +       removePlayNotificationSoundTask: function() {
528 +               this.removeTimeoutRequest = new Mojo.Service.Request("palm://com.palm.power/timeout/", {
529 +                       'method': "clear", 'parameters': {"key": 'phonePlayNotificationSound'} });
530 +       },
531 +
532 +       playNotificationSound: function() {
533 +               Mojo.Controller.getAppController().playSoundNotification("notifications");
534 +       }
535  });
536  
537 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
538 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
539 @@ -258,6 +258,9 @@
540                         Mojo.Log.info( "DialpadAssistant#handleSceneArgs", "fill: " , params.number);
541                         // TODO: can't immediately set it if setup hasn't been finished since
542                         // formatAndUpdateDialString will change visibility only to have it undone by the rest of setup
543 +
544 +                       DialStringParser.clearDebounceTimeout();
545 +               
546                         if (this.setupComplete) {
547                                 this.clear();
548                                 this.hidePicker();
549 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/menu-controller.js
550 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/menu-controller.js
551 @@ -8,7 +8,7 @@
552         that = this;
553         originalHandleCommand = controller.handleCommand;
554         
555 -       controller.setupWidget(Mojo.Menu.appMenu, undefined, {
556 +       controller.setupWidget(Mojo.Menu.appMenu, {omitDefaultItems: true}, {
557                 visible: true,
558          items: appMenuItems
559         });
560 @@ -34,7 +34,12 @@
561  };
562  
563  MenuController._getAppMenuItems = function(prefixItems) {
564 -       var items = prefixItems ? prefixItems.slice(0) : []; // always clone array
565 +       var items = [];
566 +       
567 +       items.push(Mojo.Menu.editItem);
568 +
569 +       if(prefixItems)
570 +               items = items.concat(prefixItems);      
571         
572         // add 'Check Skype Balance' if we have a skype account
573         if ( CallSynergy.isSkypeCapable() && CallSynergy.hasSkypeAccount() ) {
574 @@ -42,6 +47,9 @@
575         }
576         
577         items.push(MenuController.kRingtonesMenuItem);
578 +       items.push(MenuController.kServicesMenuItem);
579 +       items.push(MenuController.kPrefsMenuItem);      
580 +       items.push(Mojo.Menu.helpItem);
581         
582         return items;
583  };
584 @@ -86,4 +94,6 @@
585  };
586  
587  MenuController.kSkypeBalanceMenuItem = {label: $L('Check Skype Credit'), command: 'skypebalance'};
588 -MenuController.kRingtonesMenuItem = {label: $L('Sounds & Ringtones'), command: 'ringtones'};
589 \ No newline at end of file
590 +MenuController.kRingtonesMenuItem = {label: $L('Ringtone Settings'), command: 'ringtones'};
591 +MenuController.kServicesMenuItem = {label: $L('Network Services'), command: Mojo.Menu.prefsCmd};
592 +MenuController.kPrefsMenuItem = {label: $L('Preferences'), command: 'phoneprefs'};
593 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
594 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
595 @@ -30,11 +30,37 @@
596                 this.setupScene();
597                 
598                 // stay up for 1 minute
599 -               this.missedTimeout = window.setTimeout(this.closeWindow.bind(this), MissedcallAssistant.kTimeoutMs);
600 +//             this.missedTimeout = window.setTimeout(this.closeWindow.bind(this), MissedcallAssistant.kTimeoutMs);
601                 
602                 this.controller.listen(this.controller.stageController.document, Mojo.Event.windowDeactivate, this.onBlur);
603                 this.telListener.displayStateRegisterCallback(this.onDisplayEvent);
604 -               this.controller.stageController.indicateNewContent(true);
605 +
606 +               if(this.appAssistant.notificationPrefs.notificationBlink)
607 +                       this.controller.stageController.indicateNewContent(true);
608 +
609 +               var missedTimeout = new Date();
610 +               
611 +               missedTimeout = new Date(missedTimeout.getTime() + MissedcallAssistant.kTimeoutMs);
612 +
613 +               var month = missedTimeout.getUTCMonth()+1;
614 +               if(month < 10) month = "0" + month;
615 +               var day = missedTimeout.getUTCDate();
616 +               if(day < 10) day = "0" + day;
617 +               var year = missedTimeout.getUTCFullYear();
618 +
619 +               var hours = missedTimeout.getUTCHours();
620 +               if(hours < 10) hours = "0" + hours;
621 +               var minutes = missedTimeout.getUTCMinutes();
622 +               if(minutes < 10) minutes = "0" + minutes;
623 +               var seconds = missedTimeout.getUTCSeconds();
624 +               if(seconds < 10) seconds = "0" + seconds;
625 +
626 +               var scheduledTimeStr = month + "/" + day + "/" + year + " " + hours + ":" + minutes + ":" + seconds;
627 +
628 +               this.controller.serviceRequest('palm://com.palm.power/timeout/', {'method': "set", 
629 +                       'parameters': {'key': 'phoneMissedTimeout', 'wakeup': true, 'at': scheduledTimeStr, 
630 +                       'uri': "palm://com.palm.applicationManager/open", 'params': {
631 +                               'id': 'com.palm.app.phone', 'params': {'closeMissedCall': true}}} }); 
632      },
633         
634         cleanup: function() {
635 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
636 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
637 @@ -69,8 +69,9 @@
638                 }
639                 
640                 try {
641 -                       this.sceneCtrl.get('answer_button').addEventListener(Mojo.Event.tap, this.answerCall.bind(this));
642 -                       this.sceneCtrl.get('reject_button').addEventListener(Mojo.Event.tap, this.rejectCall.bind(this));
643 +                       this.sceneCtrl.get('answer_button').addEventListener(Mojo.Event.tap, this.answerCall.bindAsEventListener(this));
644 +                       this.sceneCtrl.get('reject_button').addEventListener(Mojo.Event.tap, this.rejectCall.bindAsEventListener(this, false));
645 +                       this.sceneCtrl.get('reject_button').addEventListener(Mojo.Event.hold, this.rejectCall.bindAsEventListener(this, true));
646                         
647                 this.exposed = true;
648                         // turn display on and lock it there
649 @@ -333,10 +334,14 @@
650                 
651                 if (response.key === "slider") {
652                         var newSliderOpenState = (response.state === "up");
653 -                       if (this.exposed
654 -                               && this.sliderOpen === false 
655 -                               && newSliderOpenState === true) {
656 -                                       this.answerCall();
657 +                       if((this.sliderOpen === false) && (newSliderOpenState === true)) {
658 +                               if(this.appAssistant.phonePrefs.sliderOpened != "none") {
659 +                                       if(this.exposed)
660 +                  this.answerCall(); 
661 +                                       
662 +                                       if(this.appAssistant.phonePrefs.sliderOpened == "speaker")
663 +                                               TelephonyCommands.setAudioScenario("phone", "phone_back_speaker");
664 +                               }
665                         }
666                         this.sliderOpen = newSliderOpenState;
667                 } 
668 @@ -372,8 +377,10 @@
669                 // answer the call after a delay if we're exposed, set to do so, 
670                 // and we were previously on the puck
671                 if (response && response.type == "inductive") {
672 -                       if (this.appAssistant.puckMode && this.exposed && this.puckConnected === true && response.connected === false) {
673 -                               this.answerIfStillOffPuck.bind(this).delay(0.750);
674 +                       if(this.appAssistant.phonePrefs.removedFromTS == "answer") {
675 +                               if (this.appAssistant.puckMode && this.exposed && this.puckConnected === true && response.connected === false) {
676 +                                       this.answerIfStillOffPuck.bind(this).delay(1.000);
677 +                               }
678                         }
679                         this.puckConnected = response.connected;
680                 }
681 @@ -416,7 +423,9 @@
682      },
683      
684         // hide alert and instruct blur handler to disconnect call & show ignored UI
685 -       rejectCall: function(event){
686 +       rejectCall: function(event, hold){
687 +               event.stop();
688 +               
689          if (this.blockIgnore) {
690                         Mojo.Log.error( "IncomingcallAssistant#rejectCall tapped too soon");
691                         this.unblockIgnore();
692 @@ -426,6 +435,17 @@
693          this.mute();
694                 this.exitStatus = "rejected";
695                 
696 +               if((this.contact.canBeCalled()) && (this.contact.service != CallSynergy.SERVICES.SKYPE)) {
697 +                       if((hold) && (this.appAssistant.rejectedPrefs.rejectAction == "autoreply")) {   
698 +                               this.controller.serviceRequest('palm://com.palm.applicationManager/', {
699 +                                       method: 'launch', parameters: { id: 'com.palm.app.messaging',
700 +                                               params: {composeRecipients: [{address: this.contact.addressFormatted}],
701 +                                               messageText: this.appAssistant.rejectedPrefs.rejectTemplate
702 +                                               }
703 +                               }});
704 +                       }
705 +               }
706 +
707         this.closeWindow();
708      },
709         
710 --- .orig/usr/palm/applications/com.palm.app.phone/stylesheets/phone.css
711 +++ /usr/palm/applications/com.palm.app.phone/stylesheets/phone.css
712 @@ -365,4 +365,13 @@
713  
714  .palm-dark .favorites-list .palm-drag-spacer {
715    -webkit-border-image: url(../images/empty.png) 15 15 15 15 repeat repeat;
716 -}
717 \ No newline at end of file
718 +}
719 +
720 +body.prefs {
721 +       background-image: none;
722 +       background-color: rgba(228,228,228,1.0);
723 +}
724 +
725 +.palm-page-header .icon.phone {
726 +       background-image: url(../images/header-icon-phone.png);
727 +}
728 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/ActiveCallCard.js
729 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/ActiveCallCard.js
730 @@ -70,9 +70,13 @@
731                 if ( okToGoBackToStates.indexOf(prevState) < 0 ) {
732                         prevState = this.machine.STATE_DIALPAD_CARD;
733                 }
734 +       
735 +               var cookieContainer = new Mojo.Model.Cookie("phone");
736 +
737 +               var prefs = cookieContainer.get();
738                 
739                 // if stage was hidden when active call started (and not firstuse), hide it
740 -               if ( this.wasHidden && stageController && stageController.fullInit && ! PalmSystem.isMinimal ) {
741 +               if ( ((prefs.closeApp) || (this.wasHidden && stageController && stageController.fullInit)) && ! PalmSystem.isMinimal ) {
742                         stageController.window.PalmSystem.hide();
743                 }
744                 
745 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/CallLog.js
746 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/CallLog.js
747 @@ -14,6 +14,14 @@
748         cleanup: function() {
749                 
750         },
751 +       event_launch: function(view) {
752 +               if(view == "calllog")
753 +                       this.machine.enter('calllog');
754 +               else if(view == "favorites")
755 +                       this.machine.enter('favorites');
756 +               else if(view == "dialpad")
757 +                       this.machine.enter('dialpad_card');
758 +       },
759         event_back: function(commandEvent) {
760                 this.machine.enter('dialpad_card');
761         },
762 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/CallSynergyContact.js
763 +++ /usr/palm/applications/com.palm.app.phone/app/models/CallSynergyContact.js
764 @@ -40,7 +40,9 @@
765                 this.locationFormatted = undefined; // for unknown phone numbers only, eg "N. California"
766                 this.personGivenName = undefined; // known person only, for call log
767                 this.personFamilyName = undefined; // known person only, for call log
768 -               this.ringtoneLoc = undefined; // known person only
769 +               this.callAction = undefined; // known person only
770 +               this.callAlert = undefined; // known person only
771 +               this.callRingtonePath = undefined; // known person only
772                 this.pictureLoc = undefined; // known person only
773                 this.pictureObj = undefined; // known person only
774                 this.pictureFormat = undefined; // known person only
775 @@ -394,8 +396,12 @@
776                         this.label = "service_skype";
777                         this.labelFormatted = $L("Skype");
778                 }
779 +
780 +               this.callAction = person.getCallAction().getAction();
781 +       
782 +               this.callAlert = person.getCallAlert().getAlert();
783                 
784 -               this.ringtoneLoc = person.getRingtone().getLocation();
785 +               this.callRingtonePath = person.getRingtone().getLocation();
786                 
787                 // these attributes are NOT displayed but are passed through to
788                 // the call log for the bluetooth service. This shouldn't be needed but
789 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/DialpadCard.js
790 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/DialpadCard.js
791 @@ -10,6 +10,14 @@
792                         stageController.delegateToSceneAssistant("resetOnHide");
793                 }
794         },
795 +       event_launch: function(view) {
796 +               if(view == "calllog")
797 +                       this.machine.enter('calllog');
798 +               else if(view == "favorites")
799 +                       this.machine.enter('favorites');
800 +               else if(view == "dialpad")
801 +                       this.machine.enter('dialpad_card');
802 +       },
803         event_back: function(commandEvent) {
804          if ( this.appAssistant.telephonyEventListener.callExists() ) {
805              this.machine.enter("activecall_card");
806 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/Favorites.js
807 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/Favorites.js
808 @@ -8,6 +8,14 @@
809         cleanup: function() {
810                 
811         },
812 +       event_launch: function(view) {
813 +               if(view == "calllog")
814 +                       this.machine.enter('calllog');
815 +               else if(view == "favorites")
816 +                       this.machine.enter('favorites');
817 +               else if(view == "dialpad")
818 +                       this.machine.enter('dialpad_card');
819 +       },
820         event_back: function(commandEvent) {
821                 this.machine.enter('dialpad_card');
822         },
823 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/FavoritesAdd.js
824 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/FavoritesAdd.js
825 @@ -48,7 +48,8 @@
826                         scenesToPush: [ContactsUI.FavoritePersonWidget.SCENES.PERSON_PICKER, ContactsUI.FavoritePersonWidget.SCENES.CONTACT_POINT_PICKER],
827                         defaultType: this._getDefaultType(),
828                         callback: function() {
829 -                               this.machine.enter("favorites");
830 +//                             this.machine.enter("favorites");        
831 +                               this.machine.currentState = this.machine._states[this.machine.STATE_FAVORITES];
832                         }.bind(this)
833                 }).pushScene();
834         },
835 @@ -62,7 +63,8 @@
836                         listIndexForDefault: lastIndex,
837                         defaultType: this._getDefaultType(),
838                         callback: function() {
839 -                               this.machine.enter("favorites");
840 +//                             this.machine.enter("favorites");        
841 +                               this.machine.currentState = this.machine._states[this.machine.STATE_FAVORITES];
842                         }.bind(this)
843                 }).pushScene();
844         },
845 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/Start.js
846 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/Start.js
847 @@ -7,8 +7,13 @@
848                 
849         },
850         // always launch to dialpad first
851 -       event_launch: function() {
852 -               this.machine.enter('dialpad_card');
853 +       event_launch: function(view) {
854 +               if(view == "calllog")
855 +                       this.machine.enter('calllog');
856 +               else if(view == "favorites")
857 +                       this.machine.enter('favorites');
858 +               else
859 +                       this.machine.enter('dialpad_card');
860         },
861         event_emergency: function(isEnabled) {
862                 if ( isEnabled ) {
863 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/TelephonyEventListener.js
864 +++ /usr/palm/applications/com.palm.app.phone/app/models/TelephonyEventListener.js
865 @@ -506,6 +506,10 @@
866                                         && Object.keys(profiles).length == 2                            
867                                         && profiles["phone_front_speaker"] == true) {
868                                         scenario = "phone_front_speaker";
869 +                               } else if (!this.puckConnected && 
870 +                                       Object.keys(profiles).length == 2
871 +                                       && profiles["phone_back_speaker"] == true) {
872 +                                       scenario = "phone_back_speaker";
873                                 } else {
874                                         return;
875                                 }
876 @@ -513,7 +517,7 @@
877                 }
878                 
879                 if (this.isPendingOrActive()) {
880 -                       if (scenario == "phone_front_speaker") {
881 +                       if ((scenario == "phone_front_speaker") || (this.appAssistant.phonePrefs.proximityAction == "change")) {
882                                 this.proxOn();
883                         } else {
884                                 Mojo.Log.info( "TEL#enableProxOnCallAndAudio", "not enabled: " , scenario);
885 @@ -525,8 +529,12 @@
886         },
887         
888         proxOn: function() {
889 +               if(this.appAssistant.screenLocked)
890 +                       return;
891 +
892                 if (!(this.proxSubscription)) {
893                         this.proxSubscription = TelephonyCommands.proxSet(true, this.onProxOn);
894 +                       this.diplayBlockReq = TelephonyCommands.displayDNAST(true, undefined);
895                 } else {
896                         Mojo.Log.info( "TEL#proxOn", "already on");
897                 }
898 @@ -537,6 +545,9 @@
899                 if (this.proxSubscription) {
900                         this.proxSubscription.cancel();
901                         delete this.proxSubscription;
902 +                       this.diplayBlockReq = TelephonyCommands.displayDNAST(false, undefined);
903 +                       this.diplayBlockReq.cancel();
904 +                       delete this.diplayBlockReq;
905                 }
906         },
907         
908 @@ -724,7 +735,32 @@
909                 // wait to show incoming popup until the contact has been decorated
910                 future = this.incomingPending.contact.decorated();
911                 future.then(this, function() {
912 -                       this.announcer.announceIncoming(callState.affectedCallId, future.result, this.isConnected());
913 +                       this.contactPrefs = new window.Contacts.AppPrefs(function(contact) {
914 +                               var blockedNumbers = this.contactPrefs.get(Contacts.AppPrefs.Pref.blockedNumbers);
915 +
916 +                               var unknownNumbers = this.contactPrefs.get(Contacts.AppPrefs.Pref.unknownNumbers);
917 +
918 +                               var unknownPrefs = contact;
919 +
920 +                               if(((blockedNumbers) && (!contact.canBeCalled())) || ((unknownNumbers) && (!contact.personId)))
921 +                                       unknownPrefs = this.contactPrefs.get(Contacts.AppPrefs.Pref.unknownContacts);
922 +                               
923 +                               if((unknownPrefs) && (unknownPrefs.callAction) && (unknownPrefs.callAction == "direct2vm"))
924 +                                       this.flagCallRejected(callState.affectedCallId);
925 +                               else if((unknownPrefs) && (unknownPrefs.callAction) && (unknownPrefs.callAction == "autohangup"))
926 +                                       TelephonyCommands.disconnect(callState.affectedCallId);
927 +                               else {
928 +                                       if((unknownPrefs) && (unknownPrefs.callAlert) && (unknownPrefs.callAlert != "default")) {
929 +                                               contact.callAlert = unknownPrefs.callAlert;
930 +                                       
931 +                                               if((unknownPrefs.callAlert == "ringtone") && (unknownPrefs.callRingtonePath))
932 +                                                       contact.ringtoneLoc = unknownPrefs.callRingtonePath;
933 +                                       }
934 +                               
935 +                                       this.announcer.announceIncoming(callState.affectedCallId, contact, this.isConnected());
936 +                               }
937 +                       }.bind(this, future.result));
938 +
939                         return true; // continue
940                 });
941                 
942 @@ -1210,6 +1246,13 @@
943                 if (response && response.locked !== undefined) {
944                         this.appAssistant.screenLocked = response.locked;
945                         
946 +                       if((this.isPendingOrActive()) && (this.appAssistant.phonePrefs.proximityAction == "change")) {
947 +                               if(response.locked)
948 +                                       this.proxOff();
949 +                               else
950 +                                       this.proxOn();
951 +                       }
952 +                       
953                         // issue unlock event if 
954                         if ( ! response.locked && this.appAssistant.screenLockSecured ) {
955                                 UIStateMachine.event('lock', false); // let the current state know we're locked/unlocked
956 @@ -1264,7 +1307,7 @@
957                 if (response.extended) {
958                         var state = response.extended.state;
959                         switch (state) {
960 -                               case simready:
961 +                               case "simready":
962                                         this.simready = true;
963                                         break;
964                                 default:
965 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/UIStateMachine.js
966 +++ /usr/palm/applications/com.palm.app.phone/app/models/UIStateMachine.js
967 @@ -28,6 +28,8 @@
968         /**
969           * Phone UI states.
970          **/
971 +       STATE_PREFS: 'prefs',
972 +
973         STATE_START: 'start',
974         STATE_PIN: 'pin', // pin scene
975         STATE_PIN_UNLOCKED: 'pin_unlocked',
976 @@ -67,6 +69,8 @@
977         
978      initialize: function() {
979                 this._states = {};
980 +
981 +               this._states[this.STATE_PREFS] = UIStateMachine.STATES.PrefsState;
982                 
983                 this._states[this.STATE_START] = UIStateMachine.STATES.StartState;
984                 this._states[this.STATE_PIN] = UIStateMachine.STATES.PinState;
985 --- .orig/usr/palm/applications/com.palm.app.phone/resources/de/strings.json
986 +++ /usr/palm/applications/com.palm.app.phone/resources/de/strings.json
987 @@ -403,5 +403,48 @@
988         "synchronous circuit data switch": "Switch für Synchronschaltungsdaten",
989         "via Email": "per E-Mail",
990         "via Messaging": "per Messaging",
991 -       "voice": "Sprache"
992 +       "voice": "Sprache",
993 +       "Phone Services": "",
994 +       "Sound Settings": "",
995 +       "Default View": "",
996 +       "On Call View": "",
997 +       "No Default View": "",
998 +       "Slider Opened": "",
999 +       "Slider Closed": "",
1000 +       "Power Button": "",
1001 +       "On Dial Select": "",
1002 +       "On TS Removal": "",
1003 +       "On Proximity": "",
1004 +       "On Call Reject": "",
1005 +       "Repeat": "",
1006 +       "Limitation": "",
1007 +       "Dialpad": "",
1008 +       "Call Log": "",
1009 +       "Favorites: "",
1010 +       "Contact": "",
1011 +       "Keypad": "",
1012 +       "Do Nothing": "",
1013 +       "Answer Call": "",
1014 +       "Speakerphone": "",
1015 +       "Hangup Call": "",
1016 +       "Start Call": "",
1017 +       "Change Audio": "",
1018 +       "Send SMS Reply": "",
1019 +  "Sorry, I am currently busy and will call you back later...": "",
1020 +       "Disabled": "",
1021 +       "Every 2 minutes": "",
1022 +       "Every 5 minutes": "",
1023 +       "Every 15 minutes": "",
1024 +       "Every 30 minutes": "",
1025 +       "Every 60 minutes": "",
1026 +       "Infinite": "",
1027 +       "Repeat 3 times": "",
1028 +       "Repeat 5 times": "",
1029 +       "Repeat 10 times": "",
1030 +       "Repeat 15 times": "",
1031 +       "Repeat 30 times": "",
1032 +       "Off": "",
1033 +       "On": "",
1034 +       "No": "",
1035 +       "Yes": ""
1036  }
1037 --- .orig/usr/palm/applications/com.palm.app.phone/resources/es/strings.json
1038 +++ /usr/palm/applications/com.palm.app.phone/resources/es/strings.json
1039 @@ -407,5 +407,48 @@
1040         "synchronous circuit data switch": "conmutador de datos de circuito sincrónicos",
1041         "via Email": "por correo electrónico",
1042         "via Messaging": "por mensajería",
1043 -       "voice": "voz"
1044 +       "voice": "voz",
1045 +       "Phone Services": "",
1046 +       "Sound Settings": "",
1047 +       "Default View": "",
1048 +       "On Call View": "",
1049 +       "No Default View": "",
1050 +       "Slider Opened": "",
1051 +       "Slider Closed": "",
1052 +       "Power Button": "",
1053 +       "On Dial Select": "",
1054 +       "On TS Removal": "",
1055 +       "On Proximity": "",
1056 +       "On Call Reject": "",
1057 +       "Repeat": "",
1058 +       "Limitation": "",
1059 +       "Dialpad": "",
1060 +       "Call Log": "",
1061 +       "Favorites: "",
1062 +       "Contact": "",
1063 +       "Keypad": "",
1064 +       "Do Nothing": "",
1065 +       "Answer Call": "",
1066 +       "Speakerphone": "",
1067 +       "Hangup Call": "",
1068 +       "Start Call": "",
1069 +       "Change Audio": "",
1070 +       "Send SMS Reply": "",
1071 +  "Sorry, I am currently busy and will call you back later...": "",
1072 +       "Disabled": "",
1073 +       "Every 2 minutes": "",
1074 +       "Every 5 minutes": "",
1075 +       "Every 15 minutes": "",
1076 +       "Every 30 minutes": "",
1077 +       "Every 60 minutes": "",
1078 +       "Infinite": "",
1079 +       "Repeat 3 times": "",
1080 +       "Repeat 5 times": "",
1081 +       "Repeat 10 times": "",
1082 +       "Repeat 15 times": "",
1083 +       "Repeat 30 times": "",
1084 +       "Off": "",
1085 +       "On": "",
1086 +       "No": "",
1087 +       "Yes": ""
1088  }
1089 --- .orig/usr/palm/applications/com.palm.app.phone/resources/fr/strings.json
1090 +++ /usr/palm/applications/com.palm.app.phone/resources/fr/strings.json
1091 @@ -398,5 +398,48 @@
1092         "synchronous circuit data switch": "interrupteur des données de circuit synchrones",
1093         "via Email": "par email",
1094         "via Messaging": "par messagerie",
1095 -       "voice": "voix"
1096 +       "voice": "voix",
1097 +       "Phone Services": "",
1098 +       "Sound Settings": "",
1099 +       "Default View": "",
1100 +       "On Call View": "",
1101 +       "No Default View": "",
1102 +       "Slider Opened": "",
1103 +       "Slider Closed": "",
1104 +       "Power Button": "",
1105 +       "On Dial Select": "",
1106 +       "On TS Removal": "",
1107 +       "On Proximity": "",
1108 +       "On Call Reject": "",
1109 +       "Repeat": "",
1110 +       "Limitation": "",
1111 +       "Dialpad": "",
1112 +       "Call Log": "",
1113 +       "Favorites: "",
1114 +       "Contact": "",
1115 +       "Keypad": "",
1116 +       "Do Nothing": "",
1117 +       "Answer Call": "",
1118 +       "Speakerphone": "",
1119 +       "Hangup Call": "",
1120 +       "Start Call": "",
1121 +       "Change Audio": "",
1122 +       "Send SMS Reply": "",
1123 +  "Sorry, I am currently busy and will call you back later...": "",
1124 +       "Disabled": "",
1125 +       "Every 2 minutes": "",
1126 +       "Every 5 minutes": "",
1127 +       "Every 15 minutes": "",
1128 +       "Every 30 minutes": "",
1129 +       "Every 60 minutes": "",
1130 +       "Infinite": "",
1131 +       "Repeat 3 times": "",
1132 +       "Repeat 5 times": "",
1133 +       "Repeat 10 times": "",
1134 +       "Repeat 15 times": "",
1135 +       "Repeat 30 times": "",
1136 +       "Off": "",
1137 +       "On": "",
1138 +       "No": "",
1139 +       "Yes": ""
1140  }
1141 --- .orig/usr/palm/applications/com.palm.app.phone/resources/it/strings.json
1142 +++ /usr/palm/applications/com.palm.app.phone/resources/it/strings.json
1143 @@ -401,5 +401,48 @@
1144         "synchronous circuit data switch": "switch dati circuiti sincroni",
1145         "via Email": "tramite e-mail",
1146         "via Messaging": "tramite messaggistica",
1147 -       "voice": "voce"
1148 +       "voice": "voce",
1149 +       "Phone Services": "",
1150 +       "Sound Settings": "",
1151 +       "Default View": "",
1152 +       "On Call View": "",
1153 +       "No Default View": "",
1154 +       "Slider Opened": "",
1155 +       "Slider Closed": "",
1156 +       "Power Button": "",
1157 +       "On Dial Select": "",
1158 +       "On TS Removal": "",
1159 +       "On Proximity": "",
1160 +       "On Call Reject": "",
1161 +       "Repeat": "",
1162 +       "Limitation": "",
1163 +       "Dialpad": "",
1164 +       "Call Log": "",
1165 +       "Favorites: "",
1166 +       "Contact": "",
1167 +       "Keypad": "",
1168 +       "Do Nothing": "",
1169 +       "Answer Call": "",
1170 +       "Speakerphone": "",
1171 +       "Hangup Call": "",
1172 +       "Start Call": "",
1173 +       "Change Audio": "",
1174 +       "Send SMS Reply": "",
1175 +  "Sorry, I am currently busy and will call you back later...": "",
1176 +       "Disabled": "",
1177 +       "Every 2 minutes": "",
1178 +       "Every 5 minutes": "",
1179 +       "Every 15 minutes": "",
1180 +       "Every 30 minutes": "",
1181 +       "Every 60 minutes": "",
1182 +       "Infinite": "",
1183 +       "Repeat 3 times": "",
1184 +       "Repeat 5 times": "",
1185 +       "Repeat 10 times": "",
1186 +       "Repeat 15 times": "",
1187 +       "Repeat 30 times": "",
1188 +       "Off": "",
1189 +       "On": "",
1190 +       "No": "",
1191 +       "Yes": ""
1192  }