Small update for my patch
[webos-internals: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: $L("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,20 @@
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 +                               if(UIStateMachine.get().currentState.getName() == "start")
143 +                                       UIStateMachine.event("launch", this.phonePrefs.startView);
144 +                               else
145 +                                       UIStateMachine.event("launch");
146                         }
147                 }
148      } else {
149 @@ -283,8 +346,8 @@
150                 if (!(this.telephonyEventListener.isPendingOrActive())) {
151                         if (this.initialLaunch === false) {
152                                 Mojo.Log.info( "handleLaunch", "no args, no calls: focusing stage");
153 -                               
154 -                               UIStateMachine.event("launch");
155 +
156 +                               UIStateMachine.event("launch", this.phonePrefs.startView);
157                         } else {
158                                 Mojo.Log.info( "handleLaunch", "initial launch, so doing nothing");
159                                 this.initialLaunch = false;
160 @@ -297,6 +360,16 @@
161      }
162  };
163  
164 +AppAssistant.prototype.playNotificationSound = function(count) {
165 +       var stageController = Mojo.Controller.getAppController().getStageController("misseddash");
166 +
167 +       if (stageController) {
168 +               stageController.delegateToSceneAssistant("playNotificationSound");
169 +
170 +               stageController.delegateToSceneAssistant("schedulePlayNotificationSoundTask", count);
171 +       }
172 +};
173 +
174  // Public API way of launching the phone app to a number (or opening skypevm)
175  AppAssistant.prototype.launchURI = function(uri) {
176         var uriNoPrefix = uri.replace(/^((tel:)|(wtai:)|(skypevm:\/\/))/,''),
177 @@ -394,7 +467,10 @@
178                                 || contact.addr.charAt(0) === '#'
179                                 || ! this.telephonyEventListener.serviced)) {
180                         
181 -                       UIStateMachine.event("dial", {"action": "dial", "number": contact.addr});
182 +                       if(this.phonePrefs.autoDialing != "none")
183 +                               UIStateMachine.event("dial", {"action": "dial", "number": contact.addr});
184 +                       else
185 +                               UIStateMachine.event("dial", {"action": "fill", "number": contact.addr});
186                 
187                 // CASE: just dial
188                 } else {
189 @@ -407,11 +483,16 @@
190                                 } else {
191                                         this.focusOnActiveCallSceneCreation = true;
192                                 }
193 -                               contact.placeCall(this.dialFailure.bind(this), parseResult);
194 -                       
195 +                               if(this.phonePrefs.autoDialing != "none")
196 +                                       contact.placeCall(this.dialFailure.bind(this), parseResult);
197 +                               else
198 +                                       UIStateMachine.event("dial", {"action": "fill", "number": contact.addr});
199                         // CASE: not immediately dialable. Let dialpad try it
200                         } else {
201 -                               UIStateMachine.event("dial", {"action": "dial", "number": contact.addr});
202 +                               if(this.phonePrefs.autoDialing != "none")
203 +                                       UIStateMachine.event("dial", {"action": "dial", "number": contact.addr});
204 +                               else
205 +                                       UIStateMachine.event("dial", {"action": "fill", "number": contact.addr});
206                         }
207                 }
208                 
209 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
210 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
211 @@ -29,7 +29,31 @@
212                 this.announcer = this.appAssistant.announcer;
213                 this.contacts = this.appAssistant.contacts; 
214          Mojo.Log.info( "activecall initialize");
215 +
216 +               this.appAssistant.audioSourceChangedManually = false;
217 +               this.audioPreviousProfile = null;
218 +               this.sliderState = "down";
219 +
220 +      var sliderStateRequest = new Mojo.Service.Request('palm://com.palm.keys/switches/', {
221 +                       method: 'status', parameters: {"get" : "slider"},
222 +                       onSuccess: function(response) {
223 +                               if(response.key === "slider")
224 +                                       this.sliderState = response.state;
225 +                       }.bind(this)});
226 +
227 +               this.sliderSubscription = TelephonyCommands.sliderSubscribe(
228 +                       this.onSliderEventDuringCall.bind(this));
229                 
230 +               if(this.appAssistant.phonePrefs.powerButton == "hangup") {
231 +                       this.powerButtonSubscription = TelephonyCommands.powerButtonSubscribe(
232 +                       true, 'activecall', this.onPowerButtonEventDuringCall.bind(this));
233 +               }
234 +
235 +               if(this.appAssistant.phonePrefs.proximityAction == "change") {
236 +                       this.displayStatusSubscription = TelephonyCommands.displayStatusSubscribe(
237 +                               this.onDisplayEventDuringCall.bind(this));
238 +               }
239 +                               
240                 this.lastLines = [];
241                 this.pauseWaitDigits = [];
242                 this.showWaitButtonOnActive = [];
243 @@ -151,7 +175,7 @@
244                 this.appAssistant.telephonyEventListener.addCallStateListener(this);
245                 this.appAssistant.telephonyEventListener.addAudioStateListener(this);
246                 
247 -               var appMenuModel = {
248 +/*             var appMenuModel = {
249                         visible: true,
250              items: [{
251                  label: $L('Sounds & Ringtones'),
252 @@ -159,6 +183,8 @@
253              }]
254                 }; 
255                 this.controller.setupWidget(Mojo.Menu.appMenu, undefined, appMenuModel);
256 +*/             
257 +               MenuController.setupAppMenu(this.controller);
258                 
259                 if (!this.abridged && this.appAssistant.focusOnActiveCallSceneCreation === true) {
260                         UIStateMachine.event('focus');
261 @@ -558,7 +584,9 @@
262                 if (this.showDTMF === true && lineState.length > 0 && !(lineState.length == 1 && this.lastLines.length == 1 
263                         && (lineState[0].state == TelephonyCallState.ACTIVE || lineState[0].state == TelephonyCallState.DIALPENDING)
264                         && (this.lastLines[0].state == TelephonyCallState.DIALING || this.lastLines[0].state == TelephonyCallState.DIALPENDING))) {
265 -                               this.setDTMFPadVisibility(false);
266 +                                       
267 +                               if(this.appAssistant.phonePrefs.onCallView != "keypad")
268 +                                       this.setDTMFPadVisibility(false);
269                 } 
270         },
271         
272 @@ -1242,6 +1270,9 @@
273                 // clear dial debounce
274                 DialStringParser.clearDebounceTimeout();
275                 this.activated = true;
276 +               
277 +               if(this.appAssistant.phonePrefs.onCallView == "keypad")
278 +                       this.setDTMFPadVisibility(true);
279         },
280      
281         incomingDialogLaunch: function() {
282 @@ -1303,6 +1334,22 @@
283          this.controller.document.removeEventListener('keydown', this.boundStartDTMFHardKey);
284          this.controller.document.removeEventListener('keyup', this.boundEndDTMFHardKey);
285                 
286 +      // remove slider listener
287 +               this.sliderSubscription.cancel();
288 +               delete this.sliderSubscription;
289 +               
290 +                // remove power button listener
291 +               if(this.appAssistant.phonePrefs.powerButton == "hangup") {
292 +                       this.powerButtonSubscription.cancel();
293 +                       delete this.powerButtonSubscription;
294 +               }
295 +
296 +                // remove display status listener
297 +               if(this.appAssistant.phonePrefs.proximityAction == "change") {
298 +                       this.displayStatusSubscription.cancel();
299 +                       delete this.displayStatusSubscription;
300 +               }
301 +       
302                 // drop puck subscription
303                 this.puckSubscription.cancel();
304                 delete this.puckSubscription;
305 @@ -1519,7 +1566,8 @@
306      },
307      
308      enableSpeakerphoneOnPuck: function(){
309 -        if (this.puckConnected === true && this.audioActiveProfile !== "phone_back_speaker") {
310 +        if (this.puckConnected === true && this.audioActiveProfile === "phone_front_speaker")
311 +        {
312              this.onAudioRouteChangeClick("phone_back_speaker");
313          }
314         },
315 @@ -1628,6 +1676,9 @@
316          if (!scenarios) 
317              return;
318         
319 +               if(this.appAssistant.phonePrefs.proximityAction == "change")
320 +                       this.appAssistant.audioSourceChangedManually = true;
321 +       
322             // Create the list of available routes
323          var that = this;
324                 Object.keys(scenarios).each(function(route){
325 @@ -2059,4 +2110,90 @@
326                 }
327         },
328      
329 +       onSliderEventDuringCall: function(response) {
330 +               if((!response) || (!response.key) || (!response.state))
331 +                       return;
332 +
333 +               if(this.appAssistant.phonePrefs.sliderClosed == "none")
334 +                       return;
335 +
336 +               if((response.key == "slider") && (this.audioActiveProfile == "phone_front_speaker")) {
337 +                       if((this.sliderState == "up") && (response.state == "down")) {
338 +                               // First, "tap" each Disconnect Button.
339 +
340 +                               for(i = 0; i < 3; i++) {
341 +                                       if(this.controller.get("disc_button_" + i))
342 +                                               Mojo.Event.send(this.controller.get("disc_button_" + i), Mojo.Event.tap);
343 +                               }
344 +
345 +                               // In case there are calls not disconnected, just call the function to disconnect all calls.
346 +                               // The reason we don't just do this one function is that the screen redraw is not pretty.
347 +
348 +                               this.eventListener.disconnectAllCalls();
349 +                       }
350 +               
351 +                       this.sliderState = response.state;
352 +               } 
353 +       },
354 +
355 +       onPowerButtonEventDuringCall: function(response) {
356 +               if((!response) || (!response.powerKey))
357 +                       return;
358 +
359 +               if(this.appAssistant.phonePrefs.powerButton == "none")
360 +                       return;
361 +
362 +               if((response.powerKey == 'released') && 
363 +                       ((this.audioActiveProfile == "phone_front_speaker") ||
364 +                       ((!this.appAssistant.audioSourceChangedManually) &&
365 +                       (this.appAssistant.phonePrefs.proximityAction == "change"))))
366 +               {
367 +                       // First, "tap" each Disconnect Button.
368 +
369 +                       for(i = 0; i < 3; i++) {
370 +                               if(this.controller.get("disc_button_" + i))
371 +                                       Mojo.Event.send(this.controller.get("disc_button_" + i), Mojo.Event.tap);
372 +                       }
373 +
374 +                       // In case there are calls not disconnected, just call the function to disconnect all calls.
375 +                       // The reason we don't just do this one function is that the screen redraw is not pretty.
376 +
377 +                       this.eventListener.disconnectAllCalls();
378 +               }
379 +       },
380 +       
381 +       onDisplayEventDuringCall: function(response) {
382 +               if(this.appAssistant.screenLocked)
383 +                       return;
384 +
385 +               if(this.appAssistant.audioSourceChangedManually)
386 +                       return;
387 +
388 +               if(this.appAssistant.phonePrefs.proximityAction != "change")
389 +                       return;
390 +
391 +               if(this.eventListener.proxEnabled) {
392 +                       var callStateMessage = this.eventListener.getCallState();
393 +                       var lineState = callStateMessage.lines;
394 +                       
395 +                       var scenarios = this.eventListener.getAvailableAudioScenarios();
396 +                       
397 +                       if(response && (response.event || response.state)) {
398 +                               if(response.event == "displayOn" || response.state == "on") {
399 +                                       if(this.audioActiveProfile !== this.audioPreviousProfile) {
400 +                                               if(this.audioPreviousProfile !== null)
401 +                                                       this.onAudioRouteChangeClick(this.audioPreviousProfile);
402 +                                       }
403 +                               } else if(response.event == "displayOff" || response.state == "off") {
404 +                                       if(this.audioActiveProfile !== "phone_front_speaker") {
405 +                                               this.audioPreviousProfile = this.audioActiveProfile;
406 +                                               
407 +                                               this.onAudioRouteChangeClick("phone_front_speaker");                                            
408 +                                       }
409 +                                       else if(this.audioPreviousProfile === null)
410 +                                               this.audioPreviousProfile = "phone_back_speaker";
411 +                               }
412 +                       }
413 +               }
414 +       }
415  });
416 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
417 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
418 @@ -47,7 +47,7 @@
419         onAnnounceCreated: function(windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate, stagecontrol) {
420                 Mojo.Log.info( "onAnnounceCreated");
421                 
422 -               stagecontrol.pushScene({"name": "dashannounce"}, windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate);
423 +               stagecontrol.pushScene({"name": "dashannounce"}, windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate, this.appAssistant.notificationPrefs);
424         },
425  
426         announceClear: function(windowName) {
427 @@ -471,6 +471,9 @@
428                         soundClass = "ringtones";
429                 }
430                 
431 +               if(contact.callAlert)
432 +                       soundClass = contact.callAlert;
433 +               
434                 /* TODO if you want to override the ringer switch when a charger connected, 
435                         (puck or USB) comment out the code above and replace it with this.
436                 
437 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/dashannounce-assistant.js
438 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/dashannounce-assistant.js
439 @@ -1,7 +1,7 @@
440  /* Copyright 2009 Palm, Inc.  All rights reserved. */
441  
442  var DashannounceAssistant = Class.create({
443 -       initialize: function(windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate) {
444 +       initialize: function(windowName, single, icon, itemcount, title, message, iconCallback, messageCallback, timestamp, badgeTemplate, notificationPrefs) {
445             Mojo.Log.info( "DashannounceAssistant::initialize");
446                 this.windowName = windowName;
447                 this.single = single;
448 @@ -11,6 +11,7 @@
449                 this.message = message;
450                 this.iconCallback = iconCallback;
451                 this.badgeTemplate = badgeTemplate;
452 +               this.notificationPrefs = notificationPrefs;
453                 if (messageCallback) {
454                         this.messageCallback = messageCallback;
455                 } else {
456 @@ -40,7 +41,11 @@
457            this.controller.get('title').innerHTML = this.title;
458            this.controller.get('message').innerHTML = this.message;
459            this.controller.listen(this.controller.document, Mojo.Event.windowActivate, this.onFocus.bindAsEventListener(this));
460 -          this.controller.stageController.indicateNewContent(true);
461 +
462 +               if(this.notificationPrefs.notificationBlink)
463 +                  this.controller.stageController.indicateNewContent(true);
464 +
465 +               this.schedulePlayNotificationSoundTask(0);
466    },
467    onFocus:function() {
468         if (this.missedTimeStamp && this.windowName == 'misseddash') {
469 @@ -57,11 +62,15 @@
470    deactivate:function(){
471         this.controller.stopListening(this.controller.document, Mojo.Event.windowActivate, this.onFocus);
472         
473 +       this.removePlayNotificationSoundTask(); 
474    },
475  
476    // run callback and close this
477    onIconTap: function () {
478         Mojo.Log.info( "DashannounceAssistant::onTap", "windowName:" , this.windowName);
479 +
480 +       this.removePlayNotificationSoundTask(); 
481 +       
482         if (this.iconCallback) {
483                 this.iconCallback();
484         } else {
485 @@ -71,6 +80,9 @@
486    
487    onMessageTap: function () {
488         Mojo.Log.info( "DashannounceAssistant::onTap", "windowName:" , this.windowName);
489 +
490 +       this.removePlayNotificationSoundTask(); 
491 +       
492         if (this.messageCallback) {
493                 this.messageCallback();
494         } else {
495 @@ -91,7 +103,11 @@
496         this.itemcount = itemcount;
497         this.badgeTemplate = badgeTemplate;
498         this.updateBadge();
499 -       this.controller.stageController.indicateNewContent(true);
500 +
501 +       if(this.notificationPrefs.notificationBlink)
502 +               this.controller.stageController.indicateNewContent(true);
503 +
504 +       this.schedulePlayNotificationSoundTask(0);
505    },
506    
507    updateBadge: function() {
508 @@ -115,7 +131,48 @@
509                 this.controller.get('badge').innerHTML = "";
510                 this.controller.get('notification').addClassName("single");
511         }
512 -  }
513 +  },
514    
515 +       schedulePlayNotificationSoundTask: function(count) {
516 +               if((this.notificationPrefs.repeatInterval > 0) && (count++ < this.notificationPrefs.repeatLimit)) {
517 +                       var currentTime = new Date();
518 +               
519 +                       var repeatInterval = this.notificationPrefs.repeatInterval;                             
520 +
521 +                       if(count == 0)                  
522 +                               var playSoundTime = new Date(currentTime.getTime() + (parseInt(repeatInterval) * 1000) - 60000);
523 +                       else
524 +                               var playSoundTime = new Date(currentTime.getTime() + (parseInt(repeatInterval) * 1000));
525 +                               
526 +                       var month = playSoundTime.getUTCMonth()+1;
527 +                       if(month < 10) month = "0" + month;
528 +                       var day = playSoundTime.getUTCDate();
529 +                       if(day < 10) day = "0" + day;
530 +                       var year = playSoundTime.getUTCFullYear();
531 +
532 +                       var hours = playSoundTime.getUTCHours();
533 +                       if(hours < 10) hours = "0" + hours;
534 +                       var minutes = playSoundTime.getUTCMinutes();
535 +                       if(minutes < 10) minutes = "0" + minutes;
536 +                       var seconds = playSoundTime.getUTCSeconds();
537 +                       if(seconds < 10) seconds = "0" + seconds;
538 +
539 +                       var scheduledTimeStr = month + "/" + day + "/" + year + " " + hours + ":" + minutes + ":" + seconds;
540 +                       
541 +                       this.updateTimeoutRequest = new Mojo.Service.Request('palm://com.palm.power/timeout/', {
542 +                               'method': "set", 'parameters': {'key': 'phonePlayNotificationSound',
543 +                               'wakeup': true, 'at': scheduledTimeStr, 'uri': "palm://com.palm.applicationManager/open",
544 +                               'params': {'id': 'com.palm.app.phone', 'params': {'playNotificationSound': count}}} }); 
545 +               }
546 +       },
547 +       
548 +       removePlayNotificationSoundTask: function() {
549 +               this.removeTimeoutRequest = new Mojo.Service.Request("palm://com.palm.power/timeout/", {
550 +                       'method': "clear", 'parameters': {"key": 'phonePlayNotificationSound'} });
551 +       },
552 +
553 +       playNotificationSound: function() {
554 +               Mojo.Controller.getAppController().playSoundNotification("alerts");
555 +       }
556  });
557  
558 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
559 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
560 @@ -258,6 +258,9 @@
561                         Mojo.Log.info( "DialpadAssistant#handleSceneArgs", "fill: " , params.number);
562                         // TODO: can't immediately set it if setup hasn't been finished since
563                         // formatAndUpdateDialString will change visibility only to have it undone by the rest of setup
564 +
565 +                       DialStringParser.clearDebounceTimeout();
566 +               
567                         if (this.setupComplete) {
568                                 this.clear();
569                                 this.hidePicker();
570 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/menu-controller.js
571 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/menu-controller.js
572 @@ -8,7 +8,7 @@
573         that = this;
574         originalHandleCommand = controller.handleCommand;
575         
576 -       controller.setupWidget(Mojo.Menu.appMenu, undefined, {
577 +       controller.setupWidget(Mojo.Menu.appMenu, {omitDefaultItems: true}, {
578                 visible: true,
579          items: appMenuItems
580         });
581 @@ -34,7 +34,12 @@
582  };
583  
584  MenuController._getAppMenuItems = function(prefixItems) {
585 -       var items = prefixItems ? prefixItems.slice(0) : []; // always clone array
586 +       var items = [];
587 +       
588 +       items.push(Mojo.Menu.editItem);
589 +
590 +       if(prefixItems)
591 +               items = items.concat(prefixItems);      
592         
593         // add 'Check Skype Balance' if we have a skype account
594         if ( CallSynergy.isSkypeCapable() && CallSynergy.hasSkypeAccount() ) {
595 @@ -42,6 +47,9 @@
596         }
597         
598         items.push(MenuController.kRingtonesMenuItem);
599 +       items.push(MenuController.kServicesMenuItem);
600 +       items.push(MenuController.kPrefsMenuItem);      
601 +       items.push(Mojo.Menu.helpItem);
602         
603         return items;
604  };
605 @@ -86,4 +94,6 @@
606  };
607  
608  MenuController.kSkypeBalanceMenuItem = {label: $L('Check Skype Credit'), command: 'skypebalance'};
609 -MenuController.kRingtonesMenuItem = {label: $L('Sounds & Ringtones'), command: 'ringtones'};
610 \ No newline at end of file
611 +MenuController.kRingtonesMenuItem = {label: $L('Sound Settings'), command: 'ringtones'};
612 +MenuController.kServicesMenuItem = {label: $L('Network Services'), command: Mojo.Menu.prefsCmd};
613 +MenuController.kPrefsMenuItem = {label: $L('Preferences'), command: 'phoneprefs'};
614 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
615 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
616 @@ -30,11 +30,37 @@
617                 this.setupScene();
618                 
619                 // stay up for 1 minute
620 -               this.missedTimeout = window.setTimeout(this.closeWindow.bind(this), MissedcallAssistant.kTimeoutMs);
621 +//             this.missedTimeout = window.setTimeout(this.closeWindow.bind(this), MissedcallAssistant.kTimeoutMs);
622                 
623                 this.controller.listen(this.controller.stageController.document, Mojo.Event.windowDeactivate, this.onBlur);
624                 this.telListener.displayStateRegisterCallback(this.onDisplayEvent);
625 -               this.controller.stageController.indicateNewContent(true);
626 +
627 +               if(this.appAssistant.notificationPrefs.notificationBlink)
628 +                       this.controller.stageController.indicateNewContent(true);
629 +
630 +               var missedTimeout = new Date();
631 +               
632 +               missedTimeout = new Date(missedTimeout.getTime() + MissedcallAssistant.kTimeoutMs);
633 +
634 +               var month = missedTimeout.getUTCMonth()+1;
635 +               if(month < 10) month = "0" + month;
636 +               var day = missedTimeout.getUTCDate();
637 +               if(day < 10) day = "0" + day;
638 +               var year = missedTimeout.getUTCFullYear();
639 +
640 +               var hours = missedTimeout.getUTCHours();
641 +               if(hours < 10) hours = "0" + hours;
642 +               var minutes = missedTimeout.getUTCMinutes();
643 +               if(minutes < 10) minutes = "0" + minutes;
644 +               var seconds = missedTimeout.getUTCSeconds();
645 +               if(seconds < 10) seconds = "0" + seconds;
646 +
647 +               var scheduledTimeStr = month + "/" + day + "/" + year + " " + hours + ":" + minutes + ":" + seconds;
648 +
649 +               this.controller.serviceRequest('palm://com.palm.power/timeout/', {'method': "set", 
650 +                       'parameters': {'key': 'phoneMissedTimeout', 'wakeup': true, 'at': scheduledTimeStr, 
651 +                       'uri': "palm://com.palm.applicationManager/open", 'params': {
652 +                               'id': 'com.palm.app.phone', 'params': {'closeMissedCall': true}}} }); 
653      },
654         
655         cleanup: function() {
656 --- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
657 +++ /usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
658 @@ -48,6 +48,8 @@
659         },
660      
661      setup: function(){
662 +               this.rejectedCallTimeout = null;
663 +                       
664                 this.sceneCtrl = this.dialogSceneController || this.controller;
665                 this.unblockIgnore.delay(IncomingcallAssistant.kBlockIgnoreDelay);
666                 
667 @@ -69,8 +71,9 @@
668                 }
669                 
670                 try {
671 -                       this.sceneCtrl.get('answer_button').addEventListener(Mojo.Event.tap, this.answerCall.bind(this));
672 -                       this.sceneCtrl.get('reject_button').addEventListener(Mojo.Event.tap, this.rejectCall.bind(this));
673 +                       this.sceneCtrl.get('answer_button').addEventListener(Mojo.Event.tap, this.answerCall.bindAsEventListener(this));
674 +                       this.sceneCtrl.get('reject_button').addEventListener(Mojo.Event.tap, this.rejectCall.bindAsEventListener(this, false));
675 +                       this.sceneCtrl.get('reject_button').addEventListener(Mojo.Event.hold, this.rejectCall.bindAsEventListener(this, true));
676                         
677                 this.exposed = true;
678                         // turn display on and lock it there
679 @@ -333,10 +336,14 @@
680                 
681                 if (response.key === "slider") {
682                         var newSliderOpenState = (response.state === "up");
683 -                       if (this.exposed
684 -                               && this.sliderOpen === false 
685 -                               && newSliderOpenState === true) {
686 -                                       this.answerCall();
687 +                       if((this.sliderOpen === false) && (newSliderOpenState === true)) {
688 +                               if(this.appAssistant.phonePrefs.sliderOpened != "none") {
689 +                                       if(this.exposed)
690 +                  this.answerCall(); 
691 +                                       
692 +                                       if(this.appAssistant.phonePrefs.sliderOpened == "speaker")
693 +                                               TelephonyCommands.setAudioScenario("phone", "phone_back_speaker");
694 +                               }
695                         }
696                         this.sliderOpen = newSliderOpenState;
697                 } 
698 @@ -372,8 +379,10 @@
699                 // answer the call after a delay if we're exposed, set to do so, 
700                 // and we were previously on the puck
701                 if (response && response.type == "inductive") {
702 -                       if (this.appAssistant.puckMode && this.exposed && this.puckConnected === true && response.connected === false) {
703 -                               this.answerIfStillOffPuck.bind(this).delay(0.750);
704 +                       if(this.appAssistant.phonePrefs.removedFromTS == "answer") {
705 +                               if (this.appAssistant.puckMode && this.exposed && this.puckConnected === true && response.connected === false) {
706 +                                       this.answerIfStillOffPuck.bind(this).delay(1.000);
707 +                               }
708                         }
709                         this.puckConnected = response.connected;
710                 }
711 @@ -393,6 +402,18 @@
712         // detect lock status to hide/show buttons
713         onLockStatusEvent: function(response) {
714                 Mojo.Log.info( "IncomingcallAssistant#onLockStatusEvent");
715 +
716 +               if((this.rejectedCallTimeout) && (!response.locked)) {
717 +                       this.rejectedCallTimeout = null;
718 +                       
719 +                       this.controller.serviceRequest('palm://com.palm.applicationManager/', {
720 +                               method: 'launch', parameters: { id: 'com.palm.app.messaging',
721 +                                       params: {composeRecipients: [{address: this.contact.addressFormatted}],
722 +                                       messageText: this.appAssistant.rejectedPrefs.rejectTemplate
723 +                                       }
724 +                               }});
725 +               }
726 +               
727                 this.buttonsSetVisible(response.locked, undefined);
728         },
729         // detect lock status to hide/show buttons
730 @@ -416,7 +437,10 @@
731      },
732      
733         // hide alert and instruct blur handler to disconnect call & show ignored UI
734 -       rejectCall: function(event){
735 +       rejectCall: function(event, hold){
736 +               if(event)
737 +                       event.stop();
738 +               
739          if (this.blockIgnore) {
740                         Mojo.Log.error( "IncomingcallAssistant#rejectCall tapped too soon");
741                         this.unblockIgnore();
742 @@ -426,9 +450,31 @@
743          this.mute();
744                 this.exitStatus = "rejected";
745                 
746 +               if((this.contact.canBeCalled()) && (this.contact.service != CallSynergy.SERVICES.SKYPE)) {
747 +                       if((event) && (!hold) && (this.appAssistant.rejectedPrefs.rejectAction == "autoreply")) {       
748 +                               this.controller.serviceRequest('palm://com.palm.applicationManager/', {
749 +                                       method: 'launch', parameters: { id: 'com.palm.app.messaging',
750 +                                               params: {composeRecipients: [{address: this.contact.addressFormatted}],
751 +                                               messageText: this.appAssistant.rejectedPrefs.rejectTemplate
752 +                                               }
753 +                                       }});
754 +                       }
755 +                       else if((!event) && (this.appAssistant.rejectedPrefs.rejectAction == "autoreply")) {    
756 +                               this.activityRequest = this.controller.serviceRequest("palm://com.palm.power/com/palm/power", {
757 +                                'method': "activityStart", 'parameters': {'id': Mojo.Controller.appInfo.id,
758 +                                'duration_ms': 30000} });
759 +
760 +                               this.rejectedCallTimeout = setTimeout(this.cancelRejectedCall.bind(this), 15000);
761 +                       }
762 +               }
763 +
764         this.closeWindow();
765      },
766         
767 +       cancelRejectedCall: function() {
768 +               this.rejectedCallTimeout = null;
769 +       },
770 +       
771         // hide alert and instruct blur handler to show ignore UI
772         ignoreCall: function(event) {
773                 Mojo.Log.info( "IncomingcallAssistant#ignoreCall", this.callId);
774 --- .orig/usr/palm/applications/com.palm.app.phone/stylesheets/phone.css
775 +++ /usr/palm/applications/com.palm.app.phone/stylesheets/phone.css
776 @@ -365,4 +365,13 @@
777  
778  .palm-dark .favorites-list .palm-drag-spacer {
779    -webkit-border-image: url(../images/empty.png) 15 15 15 15 repeat repeat;
780 -}
781 \ No newline at end of file
782 +}
783 +
784 +body.prefs {
785 +       background-image: none;
786 +       background-color: rgba(228,228,228,1.0);
787 +}
788 +
789 +.palm-page-header .icon.phone {
790 +       background-image: url(../images/header-icon-phone.png);
791 +}
792 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/Abstract.js
793 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/Abstract.js
794 @@ -146,7 +146,7 @@
795         },
796         
797         // default launch event just focuses phone stage
798 -       event_launch: function() {
799 +       event_launch: function(view) {
800                 var stageController = this.appController.getStageController(this.machine.STAGE_MAIN);
801                 
802                 // CASE: stage exists, show
803 @@ -158,6 +158,13 @@
804                 } else {
805                         this.machine.currentState.setup();
806                 }
807 +
808 +               if(view == "calllog")
809 +                       this.machine.enter('calllog');
810 +               else if(view == "favorites")
811 +                       this.machine.enter('favorites');
812 +               else if(view == "dialpad")
813 +                       this.machine.enter('dialpad_card');             
814         },
815         // default lock event puts the phone into the pin state 
816         event_lock: function(enabled) {
817 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/ActiveCallCard.js
818 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/ActiveCallCard.js
819 @@ -70,9 +70,13 @@
820                 if ( okToGoBackToStates.indexOf(prevState) < 0 ) {
821                         prevState = this.machine.STATE_DIALPAD_CARD;
822                 }
823 +       
824 +               var cookieContainer = new Mojo.Model.Cookie("phone");
825 +
826 +               var prefs = cookieContainer.get();
827                 
828                 // if stage was hidden when active call started (and not firstuse), hide it
829 -               if ( this.wasHidden && stageController && stageController.fullInit && ! PalmSystem.isMinimal ) {
830 +               if ( ((prefs.closeApp) || (this.wasHidden && stageController && stageController.fullInit)) && ! PalmSystem.isMinimal ) {
831                         stageController.window.PalmSystem.hide();
832                 }
833                 
834 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/CallLog.js
835 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/CallLog.js
836 @@ -15,7 +15,10 @@
837                 
838         },
839         event_back: function(commandEvent) {
840 -               this.machine.enter('dialpad_card');
841 +               if ( this.appAssistant.telephonyEventListener.callExists() )
842 +                       this.machine.enter("activecall_card");
843 +               commandEvent.stopPropagation();
844 +//             this.machine.enter('dialpad_card');
845         },
846         event_focus: function() {
847                 this.focusStage(this.machine.STAGE_MAIN);
848 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/CallSynergyContact.js
849 +++ /usr/palm/applications/com.palm.app.phone/app/models/CallSynergyContact.js
850 @@ -40,7 +40,9 @@
851                 this.locationFormatted = undefined; // for unknown phone numbers only, eg "N. California"
852                 this.personGivenName = undefined; // known person only, for call log
853                 this.personFamilyName = undefined; // known person only, for call log
854 -               this.ringtoneLoc = undefined; // known person only
855 +               this.callAction = undefined; // known person only
856 +               this.callAlert = undefined; // known person only
857 +               this.callRingtonePath = undefined; // known person only
858                 this.pictureLoc = undefined; // known person only
859                 this.pictureObj = undefined; // known person only
860                 this.pictureFormat = undefined; // known person only
861 @@ -394,8 +396,12 @@
862                         this.label = "service_skype";
863                         this.labelFormatted = $L("Skype");
864                 }
865 +
866 +               this.callAction = person.getCallAction().getAction();
867 +       
868 +               this.callAlert = person.getCallAlert().getAlert();
869                 
870 -               this.ringtoneLoc = person.getRingtone().getLocation();
871 +               this.callRingtonePath = person.getRingtone().getLocation();
872                 
873                 // these attributes are NOT displayed but are passed through to
874                 // the call log for the bluetooth service. This shouldn't be needed but
875 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/Favorites.js
876 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/Favorites.js
877 @@ -9,7 +9,10 @@
878                 
879         },
880         event_back: function(commandEvent) {
881 -               this.machine.enter('dialpad_card');
882 +               if ( this.appAssistant.telephonyEventListener.callExists() )
883 +                       this.machine.enter("activecall_card");
884 +               commandEvent.stopPropagation();
885 +//             this.machine.enter('dialpad_card');
886         },
887         event_emergency: function(isEnabled) {
888                 if ( isEnabled ) {
889 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/FavoritesAdd.js
890 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/FavoritesAdd.js
891 @@ -48,7 +48,8 @@
892                         scenesToPush: [ContactsUI.FavoritePersonWidget.SCENES.PERSON_PICKER, ContactsUI.FavoritePersonWidget.SCENES.CONTACT_POINT_PICKER],
893                         defaultType: this._getDefaultType(),
894                         callback: function() {
895 -                               this.machine.enter("favorites");
896 +//                             this.machine.enter("favorites");        
897 +                               this.machine.currentState = this.machine._states[this.machine.STATE_FAVORITES];
898                         }.bind(this)
899                 }).pushScene();
900         },
901 @@ -62,7 +63,8 @@
902                         listIndexForDefault: lastIndex,
903                         defaultType: this._getDefaultType(),
904                         callback: function() {
905 -                               this.machine.enter("favorites");
906 +//                             this.machine.enter("favorites");        
907 +                               this.machine.currentState = this.machine._states[this.machine.STATE_FAVORITES];
908                         }.bind(this)
909                 }).pushScene();
910         },
911 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/states/Start.js
912 +++ /usr/palm/applications/com.palm.app.phone/app/models/states/Start.js
913 @@ -7,8 +7,13 @@
914                 
915         },
916         // always launch to dialpad first
917 -       event_launch: function() {
918 -               this.machine.enter('dialpad_card');
919 +       event_launch: function(view) {
920 +               if(view == "calllog")
921 +                       this.machine.enter('calllog');
922 +               else if(view == "favorites")
923 +                       this.machine.enter('favorites');
924 +               else
925 +                       this.machine.enter('dialpad_card');
926         },
927         event_emergency: function(isEnabled) {
928                 if ( isEnabled ) {
929 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/TelephonyEventListener.js
930 +++ /usr/palm/applications/com.palm.app.phone/app/models/TelephonyEventListener.js
931 @@ -506,6 +506,10 @@
932                                         && Object.keys(profiles).length == 2                            
933                                         && profiles["phone_front_speaker"] == true) {
934                                         scenario = "phone_front_speaker";
935 +                               } else if (!this.puckConnected && 
936 +                                       Object.keys(profiles).length == 2
937 +                                       && profiles["phone_back_speaker"] == true) {
938 +                                       scenario = "phone_back_speaker";
939                                 } else {
940                                         return;
941                                 }
942 @@ -513,7 +517,10 @@
943                 }
944                 
945                 if (this.isPendingOrActive()) {
946 -                       if (scenario == "phone_front_speaker") {
947 +                       if ((scenario == "phone_front_speaker") || 
948 +                               ((!this.appAssistant.audioSourceChangedManually) && 
949 +                               (this.appAssistant.phonePrefs.proximityAction == "change")))
950 +                       {
951                                 this.proxOn();
952                         } else {
953                                 Mojo.Log.info( "TEL#enableProxOnCallAndAudio", "not enabled: " , scenario);
954 @@ -525,8 +532,12 @@
955         },
956         
957         proxOn: function() {
958 +               if(this.appAssistant.screenLocked)
959 +                       return;
960 +
961                 if (!(this.proxSubscription)) {
962                         this.proxSubscription = TelephonyCommands.proxSet(true, this.onProxOn);
963 +                       this.diplayBlockReq = TelephonyCommands.displayDNAST(true, undefined);
964                 } else {
965                         Mojo.Log.info( "TEL#proxOn", "already on");
966                 }
967 @@ -537,6 +548,8 @@
968                 if (this.proxSubscription) {
969                         this.proxSubscription.cancel();
970                         delete this.proxSubscription;
971 +                       this.diplayBlockReq.cancel();
972 +                       delete this.diplayBlockReq;
973                 }
974         },
975         
976 @@ -724,7 +737,32 @@
977                 // wait to show incoming popup until the contact has been decorated
978                 future = this.incomingPending.contact.decorated();
979                 future.then(this, function() {
980 -                       this.announcer.announceIncoming(callState.affectedCallId, future.result, this.isConnected());
981 +                       this.contactPrefs = new window.Contacts.AppPrefs(function(contact) {
982 +                               var blockedNumbers = this.contactPrefs.get(Contacts.AppPrefs.Pref.blockedNumbers);
983 +
984 +                               var unknownNumbers = this.contactPrefs.get(Contacts.AppPrefs.Pref.unknownNumbers);
985 +
986 +                               var unknownPrefs = contact;
987 +
988 +                               if(((blockedNumbers) && (!contact.canBeCalled())) || ((unknownNumbers) && (!contact.personId)))
989 +                                       unknownPrefs = this.contactPrefs.get(Contacts.AppPrefs.Pref.unknownContacts);
990 +                               
991 +                               if((unknownPrefs) && (unknownPrefs.callAction) && (unknownPrefs.callAction == "direct2vm"))
992 +                                       this.flagCallRejected(callState.affectedCallId);
993 +                               else if((unknownPrefs) && (unknownPrefs.callAction) && (unknownPrefs.callAction == "autohangup"))
994 +                                       TelephonyCommands.disconnect(callState.affectedCallId);
995 +                               else {
996 +                                       if((unknownPrefs) && (unknownPrefs.callAlert) && (unknownPrefs.callAlert != "default")) {
997 +                                               contact.callAlert = unknownPrefs.callAlert;
998 +                                       
999 +                                               if((unknownPrefs.callAlert == "ringtone") && (unknownPrefs.callRingtonePath))
1000 +                                                       contact.ringtoneLoc = unknownPrefs.callRingtonePath;
1001 +                                       }
1002 +                               
1003 +                                       this.announcer.announceIncoming(callState.affectedCallId, contact, this.isConnected());
1004 +                               }
1005 +                       }.bind(this, future.result));
1006 +
1007                         return true; // continue
1008                 });
1009                 
1010 @@ -1210,6 +1248,13 @@
1011                 if (response && response.locked !== undefined) {
1012                         this.appAssistant.screenLocked = response.locked;
1013                         
1014 +                       if((this.isPendingOrActive()) && (this.appAssistant.phonePrefs.proximityAction == "change")) {
1015 +                               if(response.locked)
1016 +                                       this.proxOff();
1017 +                               else
1018 +                                       this.proxOn();
1019 +                       }
1020 +                       
1021                         // issue unlock event if 
1022                         if ( ! response.locked && this.appAssistant.screenLockSecured ) {
1023                                 UIStateMachine.event('lock', false); // let the current state know we're locked/unlocked
1024 @@ -1264,7 +1309,7 @@
1025                 if (response.extended) {
1026                         var state = response.extended.state;
1027                         switch (state) {
1028 -                               case simready:
1029 +                               case "simready":
1030                                         this.simready = true;
1031                                         break;
1032                                 default:
1033 --- .orig/usr/palm/applications/com.palm.app.phone/app/models/UIStateMachine.js
1034 +++ /usr/palm/applications/com.palm.app.phone/app/models/UIStateMachine.js
1035 @@ -28,6 +28,8 @@
1036         /**
1037           * Phone UI states.
1038          **/
1039 +       STATE_PREFS: 'prefs',
1040 +
1041         STATE_START: 'start',
1042         STATE_PIN: 'pin', // pin scene
1043         STATE_PIN_UNLOCKED: 'pin_unlocked',
1044 @@ -67,6 +69,8 @@
1045         
1046      initialize: function() {
1047                 this._states = {};
1048 +
1049 +               this._states[this.STATE_PREFS] = UIStateMachine.STATES.PrefsState;
1050                 
1051                 this._states[this.STATE_START] = UIStateMachine.STATES.StartState;
1052                 this._states[this.STATE_PIN] = UIStateMachine.STATES.PinState;
1053 --- .orig/usr/palm/applications/com.palm.app.phone/resources/de/strings.json
1054 +++ /usr/palm/applications/com.palm.app.phone/resources/de/strings.json
1055 @@ -403,5 +403,51 @@
1056         "synchronous circuit data switch": "Switch für Synchronschaltungsdaten",
1057         "via Email": "per E-Mail",
1058         "via Messaging": "per Messaging",
1059 -       "voice": "Sprache"
1060 +       "voice": "Sprache",
1061 +       "Preferences": "Einstellungen",
1062 +       "Network Services": "Netzwerk Dienste",
1063 +       "Sound Settings": "Töne und Klingeltöne",
1064 +       "Default View": "Standardansicht",
1065 +       "On Call View": "auf-Anruf-Ansicht",
1066 +       "No Default View": "Keine",
1067 +       "Slider Opened": "Tastatur herausziehen",
1068 +       "Slider Closed": "Tastatur zuklappen",
1069 +       "Power Button": "Ein/Aus-Taste",
1070 +       "On Dial Select": "bei Anruf auswahl",
1071 +       "On TS Removal": "bei TS Entfernung",
1072 +       "On Proximity": "bei Näherung",
1073 +       "On Call Reject": "bei Anrufverwurf",
1074 +       "Repeat": "Wiederholung",
1075 +       "Limitation": "Begrenzung",
1076 +       "Dialpad": "Bildschirmtastatur",
1077 +       "Call Log": "Anrufsverlauf",
1078 +       "Favorites": "Favoriten",
1079 +       "Contact": "Kontakte",
1080 +       "Keypad": "Bildschirmtastatur",
1081 +       "Do Nothing": "Nichts tun",
1082 +       "Answer Call": "Antworten",
1083 +       "Speakerphone": "Freisprechen",
1084 +       "Hangup Call": "Auflegen",
1085 +       "Start Call": "Anruf starten",
1086 +       "Change Audio": "Freisprechen",
1087 +       "Send SMS Reply": "SMS-Antwort senden",
1088 +       "Template text for auto reply...": "Text für autom. Antwort...",
1089 +       "Sorry, I am currently busy and will call you back later...": "Tut mir leid, ich bin gerade beschäftigt. Ich rufe später zurück.",
1090 +       "Disabled": "Keine",
1091 +       "Every 2 minutes": "Alle 2 Minuten",
1092 +       "Every 5 minutes": "Alle 5 Minuten",
1093 +       "Every 15 minutes": "Alle 15 Minuten",
1094 +       "Every 30 minutes": "Alle 30 Minuten",
1095 +       "Every 60 minutes": "Alle 60 Minuten",
1096 +       "Infinite": "Unendlich",
1097 +       "Repeat 3 times": "3 Mal",
1098 +       "Repeat 5 times": "5 Mal",
1099 +       "Repeat 10 times": "10 Mal",
1100 +       "Repeat 15 times": "15 Mal",
1101 +       "Repeat 30 times": "30 Mal",
1102 +       "Off": "Aus",
1103 +       "On": "Ein",
1104 +       "No": "Nein",
1105 +       "Yes": "Ja",
1106 +       "Unknown Contacts Notification": "Benachricht. für Unbekannte"
1107  }
1108 --- .orig/usr/palm/applications/com.palm.app.phone/resources/es/strings.json
1109 +++ /usr/palm/applications/com.palm.app.phone/resources/es/strings.json
1110 @@ -407,5 +407,51 @@
1111         "synchronous circuit data switch": "conmutador de datos de circuito sincrónicos",
1112         "via Email": "por correo electrónico",
1113         "via Messaging": "por mensajería",
1114 -       "voice": "voz"
1115 +       "voice": "voz",
1116 +       "Preferences": "Preferencias",
1117 +       "Network Services": "Servicios de red",
1118 +       "Sound Settings": "Ajustes de sonido",
1119 +       "Default View": "Vista defecto",
1120 +       "On Call View": "Vista en llamada",
1121 +       "No Default View": "Sin vista",
1122 +       "Slider Opened": "Abrir teclado",
1123 +       "Slider Closed": "Cerrar teclado",
1124 +       "Power Button": "Btn. encendido",
1125 +       "On Dial Select": "Al seleccionar",
1126 +       "On TS Removal": "Al quitar del TS",
1127 +       "On Proximity": "En proximidad",
1128 +       "On Call Reject": "Al rechazar",
1129 +       "Repeat": "Repetir",
1130 +       "Limitation": "Límite",
1131 +       "Dialpad": "Teclado",
1132 +       "Call Log": "Registro",
1133 +       "Favorites": "Favoritos",
1134 +       "Contact": "Contactos",
1135 +       "Keypad": "Teclado",
1136 +       "Do Nothing": "Nada",
1137 +       "Answer Call": "Responder",
1138 +       "Speakerphone": "Altavoz",
1139 +       "Hangup Call": "Colgar",
1140 +       "Start Call": "Iniciar",
1141 +       "Change Audio": "Cambiar audio",
1142 +       "Send SMS Reply": "Enviar SMS",
1143 +       "Template text for auto reply...": "Plantilla para auto respuesta...",
1144 +       "Sorry, I am currently busy and will call you back later...": "Lo siento pero estoy ocupado. Ya te llamaré más tarde...",
1145 +       "Disabled": "Desactivado",
1146 +       "Every 2 minutes": "Cada 2 minutos",
1147 +       "Every 5 minutes": "Cada 5 minutos",
1148 +       "Every 15 minutes": "Cada 15 minutos",
1149 +       "Every 30 minutes": "Cada 30 minutos",
1150 +       "Every 60 minutes": "Cada 60 minutos",
1151 +       "Infinite": "Indefinidamente",
1152 +       "Repeat 3 times": "Repetir 3 veces",
1153 +       "Repeat 5 times": "Repetir 5 veces",
1154 +       "Repeat 10 times": "Repetir 10 veces",
1155 +       "Repeat 15 times": "Repetir 15 veces",
1156 +       "Repeat 30 times": "Repetir 30 veces",
1157 +       "Off": "No",
1158 +       "On": "Sí",
1159 +       "No": "No",
1160 +       "Yes": "Sí",
1161 +       "Unknown Contacts Notification": "Aviso contactos desconocidos"
1162  }
1163 --- .orig/usr/palm/applications/com.palm.app.phone/resources/fr/strings.json
1164 +++ /usr/palm/applications/com.palm.app.phone/resources/fr/strings.json
1165 @@ -398,5 +398,51 @@
1166         "synchronous circuit data switch": "interrupteur des données de circuit synchrones",
1167         "via Email": "par email",
1168         "via Messaging": "par messagerie",
1169 -       "voice": "voix"
1170 +       "voice": "voix",
1171 +       "Preferences": "Préférences",
1172 +       "Network Services": "Services réseau",
1173 +       "Sound Settings": "Sons et notifications",
1174 +       "Default View": "Vue par défaut",
1175 +       "On Call View": "Vue sur appel",
1176 +       "No Default View": "Aucune",
1177 +       "Slider Opened": "Ouverture clavier",
1178 +       "Slider Closed": "Fermeture clavier",
1179 +       "Power Button": "Bouton M/A",
1180 +       "On Dial Select": "Sélection appel",
1181 +       "On TS Removal": "Enlèvement TS",
1182 +       "On Proximity": "Capteur proximité",
1183 +       "On Call Reject": "Sur rejet appel",
1184 +       "Repeat": "Répétition",
1185 +       "Limitation": "Limite",
1186 +       "Dialpad": "Clavier tél.",
1187 +       "Call Log": "Historique",
1188 +       "Favorites": "Favoris",
1189 +       "Contact": "Contact",
1190 +       "Keypad": "Clavier tél.",
1191 +       "Do Nothing": "Pas d’action",
1192 +       "Answer Call": "Répondre",
1193 +       "Speakerphone": "Mains libres",
1194 +       "Hangup Call": "Raccrocher",
1195 +       "Start Call": "Lancer Appel",
1196 +       "Change Audio": "Mains libres",
1197 +       "Send SMS Reply": "Envoyer SMS",
1198 +       "Template text for auto reply...": "Texte de réponse automatique...",
1199 +       "Sorry, I am currently busy and will call you back later...": "Désolé, je ne peux pas répondre. Je rappellerai plus tard.",
1200 +       "Disabled": "Aucune",
1201 +       "Every 2 minutes": "Toutes les 2 min.",
1202 +       "Every 5 minutes": "Toutes les 5 min.",
1203 +       "Every 15 minutes": "Toutes les 15 min.",
1204 +       "Every 30 minutes": "Toutes les 30 min.",
1205 +       "Every 60 minutes": "Toutes les 60 min.",
1206 +       "Infinite": "Indéfiniment",
1207 +       "Repeat 3 times": "3 fois",
1208 +       "Repeat 5 times": "5 fois",
1209 +       "Repeat 10 times": "10 fois",
1210 +       "Repeat 15 times": "15 fois",
1211 +       "Repeat 30 times": "30 fois",
1212 +       "Off": "Non",
1213 +       "On": "Oui",
1214 +       "No": "Non",
1215 +       "Yes": "Oui",
1216 +       "Unknown Contacts Notification": "Gestion des contacts inconnus"
1217  }
1218 --- .orig/usr/palm/applications/com.palm.app.phone/resources/it/strings.json
1219 +++ /usr/palm/applications/com.palm.app.phone/resources/it/strings.json
1220 @@ -401,5 +401,51 @@
1221         "synchronous circuit data switch": "switch dati circuiti sincroni",
1222         "via Email": "tramite e-mail",
1223         "via Messaging": "tramite messaggistica",
1224 -       "voice": "voce"
1225 +       "voice": "voce",
1226 +       "Preferences": "",
1227 +       "Network Services": "",
1228 +       "Sound Settings": "",
1229 +       "Default View": "",
1230 +       "On Call View": "",
1231 +       "No Default View": "",
1232 +       "Slider Opened": "",
1233 +       "Slider Closed": "",
1234 +       "Power Button": "",
1235 +       "On Dial Select": "",
1236 +       "On TS Removal": "",
1237 +       "On Proximity": "",
1238 +       "On Call Reject": "",
1239 +       "Repeat": "",
1240 +       "Limitation": "",
1241 +       "Dialpad": "",
1242 +       "Call Log": "",
1243 +       "Favorites": "",
1244 +       "Contact": "",
1245 +       "Keypad": "",
1246 +       "Do Nothing": "",
1247 +       "Answer Call": "",
1248 +       "Speakerphone": "",
1249 +       "Hangup Call": "",
1250 +       "Start Call": "",
1251 +       "Change Audio": "",
1252 +       "Send SMS Reply": "",
1253 +       "Template text for auto reply...": "",
1254 +       "Sorry, I am currently busy and will call you back later...": "",
1255 +       "Disabled": "",
1256 +       "Every 2 minutes": "",
1257 +       "Every 5 minutes": "",
1258 +       "Every 15 minutes": "",
1259 +       "Every 30 minutes": "",
1260 +       "Every 60 minutes": "",
1261 +       "Infinite": "",
1262 +       "Repeat 3 times": "",
1263 +       "Repeat 5 times": "",
1264 +       "Repeat 10 times": "",
1265 +       "Repeat 15 times": "",
1266 +       "Repeat 30 times": "",
1267 +       "Off": "",
1268 +       "On": "",
1269 +       "No": "",
1270 +       "Yes": "",
1271 +       "Unknown Contacts Notification": ""
1272  }