auto import from //branches/cupcake/...@132276
The Android Open Source Project [Thu, 19 Feb 2009 18:57:36 +0000 (10:57 -0800)]
17 files changed:
AndroidManifest.xml
res/values-cs/strings.xml
res/values-de/strings.xml
res/values-es/strings.xml
res/values-fr/strings.xml
res/values-it/strings.xml
res/values-ja/strings.xml
res/values-ko/strings.xml
res/values-nl/strings.xml
res/values-pl/strings.xml
res/values-ru/strings.xml
res/values-zh-rCN/strings.xml
res/values-zh-rTW/strings.xml
src/com/android/phone/CallNotifier.java
src/com/android/phone/InCallScreen.java
src/com/android/phone/PhoneApp.java
src/com/android/phone/PhoneInterfaceManager.java

index 1d522ab..5811d40 100644 (file)
@@ -17,6 +17,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.android.phone"
         android:sharedUserId="android.uid.phone"
+        android:sharedUserLabel="@string/dialerIconLabel"
 >
 
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
index bf23f3c..64be046 100644 (file)
     <string name="dial_emergency_empty_error">"Hovor nebyl spojen, vytočte číslo tísňového volání."</string>
     <string name="dialerKeyboardHintText">"Číslo vytočíte pomocí klávesnice."</string>
     <string name="dtmfDialpadHintText">"Tónová klávesnice"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"Dvojitým klepnutím"\n"odemkněte"</string>
     <string name="importSimEntry">"Importovat"</string>
     <string name="importAllSimEntries">"Importovat vše"</string>
     <string name="importingSimContacts">"Importování kontaktů z karty SIM"</string>
index ec6ad07..47ec5da 100644 (file)
     <string name="dial_emergency_empty_error">"Anruf nicht verbunden. Wählen Sie eine Notrufnummer!"</string>
     <string name="dialerKeyboardHintText">"Zum Wählen Tastatur verwenden"</string>
     <string name="dtmfDialpadHintText">"Tastatur für Tastentöne"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"Zum Entsperren"\n"zweimal berühren"</string>
     <string name="importSimEntry">"Importieren"</string>
     <string name="importAllSimEntries">"Alle importieren"</string>
     <string name="importingSimContacts">"SIM-Kontakte werden importiert"</string>
index 5125802..99c0242 100644 (file)
@@ -54,8 +54,8 @@
     <string name="menu_answerAndHold">"Retener llamada actual"\n"y responder"</string>
     <string name="menu_answerAndEnd">"Finalizar llamada actual"\n"y responder"</string>
     <string name="ok">"Aceptar"</string>
-    <string name="menuButtonHint">"Pulsa \"Menú\" para ver las opciones de llamada."</string>
-    <string name="menuButtonKeyboardDialHint">"Pulsa \"Menú\" para ver las opciones de llamada.  •  Utiliza el teclado para marcar"</string>
+    <string name="menuButtonHint">"Pulsa MENU para ver las opciones de llamada."</string>
+    <string name="menuButtonKeyboardDialHint">"Pulsa MENU para ver las opciones de llamada. \225 Utiliza el teclado para marcar"</string>
     <string name="wait_prompt_str">"¿Deseas enviar los siguientes tonos?"\n</string>
     <string name="send_button">"Enviar"</string>
     <string name="wild_prompt_str">"Sustituir el carácter comodín por"</string>
     <string name="unlock_failed">"La solicitud de desbloqueo de red no se ha realizado correctamente."</string>
     <string name="unlock_success">"El desbloqueo de red se ha realizado correctamente."</string>
     <string name="imei">"IMEI"</string>
-    <string name="labelMore">"Configuración adicional de llamada"</string>
-    <string name="apn_settings">"Nombres de punto de acceso"</string>
+    <string name="labelMore">"Configuración adicional"</string>
+    <string name="apn_settings">"APN"</string>
     <string name="settings_label">"Configuración de red"</string>
     <string name="voicemail">"Buzón de voz"</string>
     <string name="voicemail_abbreviated">"Buzón de voz:"</string>
     <string name="networks">"Operadores de red"</string>
-    <string name="call_settings">"Configuración de llamada"</string>
-    <string name="additional_call_settings">"Configuración adicional de llamada"</string>
+    <string name="call_settings">"Ajustes de llamadas"</string>
+    <string name="additional_call_settings">"Configuración adicional"</string>
     <string name="labelCallerId">"ID del emisor"</string>
     <string name="sum_hide_caller_id">"Número oculto en llamadas salientes"</string>
     <string name="sum_show_caller_id">"Número mostrado en llamadas salientes"</string>
     <string name="sum_cfu_enabled_indicator">"Desviar todas las llamadas"</string>
     <string name="sum_cfu_enabled">"Desviar todas las llamadas a {0}"</string>
     <string name="sum_cfu_disabled">"Inhabilitado"</string>
-    <string name="labelCFB">"Desviar cuando la línea esté ocupada"</string>
+    <string name="labelCFB">"Línea ocupada"</string>
     <string name="messageCFB">"Número cuando la línea esté ocupada"</string>
     <string name="sum_cfb_enabled">"Desviando a \\\\{0\\\\}"</string>
     <string name="sum_cfb_disabled">"Inhabilitado"</string>
-    <string name="labelCFNRy">"Desviar cuando la llamada no se responda"</string>
+    <string name="labelCFNRy">"Llamada sin respuesta"</string>
     <string name="messageCFNRy">"Número cuando no se responde la llamada"</string>
     <string name="sum_cfnry_enabled">"Desviando a \\\\{0\\\\}"</string>
     <string name="sum_cfnry_disabled">"Inhabilitado"</string>
-    <string name="labelCFNRc">"Desviar cuando no se pueda establecer la llamada"</string>
+    <string name="labelCFNRc">"No se establece la llamada"</string>
     <string name="messageCFNRc">"Número cuando no se puede establecer la llamada"</string>
     <string name="sum_cfnrc_enabled">"Desviando a \\\\{0\\\\}"</string>
     <string name="sum_cfnrc_disabled">"Inhabilitado"</string>
-    <string name="updating_title">"Configuración de llamada"</string>
+    <string name="updating_title">"Ajustes de llamadas"</string>
     <string name="error_updating_title">"Error de configuración de llamada"</string>
     <string name="reading_settings">"Leyendo configuración..."</string>
     <string name="updating_settings">"Actualizando configuración..."</string>
     <string name="roaming_warning">"¿Permitir itinerancia de datos? Los costes de itinerancia que deberás asumir pueden ser significativos."</string>
     <string name="prefer_2g">"Utilizar sólo redes 2G"</string>
     <string name="prefer_2g_summary">"Ahorra batería"</string>
-    <string name="fdn">"Números de marcación fija"</string>
+    <string name="fdn">"Marcación fija"</string>
     <string name="manage_fdn_list">"Lista de FDN"</string>
     <string name="fdn_activation">"Activación de FDN"</string>
     <string name="fdn_enabled">"Los números de marcación fija están habilitados."</string>
     <string name="sim_unlock_unlock_text">"Desbloquear"</string>
     <string name="sim_unlock_status_text">"Autenticando PIN..."</string>
     <string name="voicemail_settings_number_label">"Número del buzón de voz"</string>
-    <string name="card_title_dialing">"Marcando..."</string>
+    <string name="card_title_dialing">"Llamando\205"</string>
     <string name="card_title_in_progress">"Llamada actual"</string>
     <string name="card_title_conf_call">"Conferencia telefónica"</string>
     <string name="card_title_incoming_call">"Llamada entrante"</string>
     <string name="dial_emergency_empty_error">"La llamada no se ha enviado; marca un número de emergencia."</string>
     <string name="dialerKeyboardHintText">"Utilizar teclado para marcar"</string>
     <string name="dtmfDialpadHintText">"Teclado de tonos táctiles"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"Pulsa dos veces"\n"para desbloquear"</string>
     <string name="importSimEntry">"Importar"</string>
     <string name="importAllSimEntries">"Importar todos"</string>
     <string name="importingSimContacts">"Importando contactos de tarjeta SIM..."</string>
index ebc9a48..d7032b2 100644 (file)
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="contactsIconLabel">"Contacts"</string>
     <string name="contactsFavoritesLabel">"Favoris"</string>
-    <string name="dialerIconLabel">"Numérotation"</string>
-    <string name="emergencyDialerIconLabel">"Numéroteur d\'urgence"</string>
+    <string name="dialerIconLabel">"Composer"</string>
+    <string name="emergencyDialerIconLabel">"Appels d\'urgence"</string>
     <string name="phoneIconLabel">"Téléphone"</string>
-    <string name="recentCallsIconLabel">"Journal des appels"</string>
+    <string name="recentCallsIconLabel">"Appels"</string>
     <string name="fdnListLabel">"Liste des numérotations fixes"</string>
     <string name="unknown">"Inconnu"</string>
     <string name="private_num">"Numéro privé"</string>
@@ -54,8 +54,8 @@
     <string name="menu_answerAndHold">"Suspendre l\'appel en cours"\n"et répondre"</string>
     <string name="menu_answerAndEnd">"Terminer l\'appel en cours"\n"et répondre"</string>
     <string name="ok">"OK"</string>
-    <string name="menuButtonHint">"Appuyez sur Menu pour afficher les options d\'appel."</string>
-    <string name="menuButtonKeyboardDialHint">"Appuyez sur Menu pour afficher les options d\'appel  •  Utilisez le clavier pour composer un numéro"</string>
+    <string name="menuButtonHint">"Appuyez sur \"Menu\" pour afficher les options d\'appel."</string>
+    <string name="menuButtonKeyboardDialHint">"Appuyez sur \"Menu\" pour afficher les options d\'appel \225 Utilisez le clavier pour composer un numéro"</string>
     <string name="wait_prompt_str">"Envoyer les tonalités suivantes ?"\n</string>
     <string name="send_button">"Envoyer"</string>
     <string name="wild_prompt_str">"Remplacer le caractère générique par"</string>
     <string name="voicemail_abbreviated">"MV :"</string>
     <string name="networks">"Opérateur de réseau"</string>
     <string name="call_settings">"Paramètres d\'appel"</string>
-    <string name="additional_call_settings">"Paramètres d\'appel supplémentaires"</string>
+    <string name="additional_call_settings">"Paramètres supplémentaires"</string>
     <string name="labelCallerId">"Identifiant d\'appelant"</string>
     <string name="sum_hide_caller_id">"Numéro masqué pour les appels sortants"</string>
     <string name="sum_show_caller_id">"Numéro affiché pour les appels sortants"</string>
-    <string name="sum_default_caller_id">"Utiliser les paramètres d\'opérateur par défaut pour afficher mon numéro pour les appels sortants."</string>
+    <string name="sum_default_caller_id">"Utiliser les paramètres opérateur pour afficher mon n° pour les appels sortants"</string>
     <string name="labelCW">"Appel en attente"</string>
     <string name="sum_cw_enabled">"Me signaler les appels entrants lorsque je suis en communication"</string>
     <string name="sum_cw_disabled">"Me signaler les appels entrants lorsque je suis en communication"</string>
     <string name="sum_cfnry_disabled">"Désactivé"</string>
     <string name="labelCFNRc">"Transférer lorsque vous êtes injoignable"</string>
     <string name="messageCFNRc">"Numéro de renvoi lorsque vous n\'êtes pas joignable"</string>
-    <string name="sum_cfnrc_enabled">"Transfert vers le \\\\{0\\\\}"</string>
+    <string name="sum_cfnrc_enabled">"Transfert vers le {0}"</string>
     <string name="sum_cfnrc_disabled">"Désactivé"</string>
     <string name="updating_title">"Paramètres d\'appel"</string>
     <string name="error_updating_title">"Erreur des paramètres d\'appel"</string>
     <string name="adding_fdn_contact">"Ajout d\'un contact à numérotation fixe..."</string>
     <string name="fdn_contact_added">"Le contact à numérotation fixe a été ajouté."</string>
     <string name="edit_fdn_contact">"Modifier un contact à numérotation fixe"</string>
-    <string name="updating_fdn_contact">"Mise à jour du contact à numérotation fixe…"</string>
+    <string name="updating_fdn_contact">"Mise à jour du contact à numérotation fixe\205"</string>
     <string name="fdn_contact_updated">"Contact à numérotation fixe mis à jour."</string>
     <string name="delete_fdn_contact">"Supprimer le contact à numérotation fixe"</string>
-    <string name="deleting_fdn_contact">"Suppression du contact à numérotation fixe…"</string>
+    <string name="deleting_fdn_contact">"Suppression du contact à numérotation fixe\205"</string>
     <string name="fdn_contact_deleted">"Le contact à numérotation fixe a été supprimé."</string>
     <string name="pin2_invalid">"Le code PIN2 n\'est pas valide !"</string>
     <string name="fdn_invalid_number">"Le numéro doit comporter 20 chiffres au maximum."</string>
     <string name="simContacts_emptyLoading">"Lecture de la carte SIM…"</string>
     <string name="simContacts_empty">"Aucun contact n\'a été trouvé sur votre carte SIM."</string>
-    <string name="simContacts_title">"Sélectionner les contacts à importer"</string>
+    <string name="simContacts_title">"Sélection des contacts à importer"</string>
     <string name="enable_pin">"Activer/désactiver le code PIN de la carte SIM"</string>
     <string name="change_pin">"Modifier le code PIN de la carte SIM"</string>
     <string name="enter_pin_text">"Code PIN de la carte SIM :"</string>
     <string name="label_puk2_code">"Saisissez le code PUK2."</string>
     <string name="fdn_enable_puk2_requested">"Le mot de passe est incorrect. Veuillez modifier le code PIN2 et réessayez."</string>
     <string name="puk2_requested">"Mot de passe incorrect. La carte SIM est bloquée ! Code PUK2 requis."</string>
-    <string name="doneButton">"Terminé"</string>
+    <string name="doneButton">"OK"</string>
     <string name="caller_manage_header">"Conférence téléphonique à <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
     <string name="caller_manage_manage_done_text">"Retour à l\'appel"</string>
     <string name="sim_missing_continueView_text">"Continuer sans carte SIM"</string>
     <string name="sim_unlock_unlock_text">"Débloquer"</string>
     <string name="sim_unlock_status_text">"Authentification du code PIN..."</string>
     <string name="voicemail_settings_number_label">"Numéro de la messagerie vocale"</string>
-    <string name="card_title_dialing">"Numérotation"</string>
+    <string name="card_title_dialing">"Appel en cours\205"</string>
     <string name="card_title_in_progress">"Appel en cours"</string>
     <string name="card_title_conf_call">"Conférence téléphonique"</string>
     <string name="card_title_incoming_call">"Appel entrant"</string>
     <string name="dial_emergency_empty_error">"L\'appel n\'a pas été effectué. Veuillez composer un numéro d\'urgence !"</string>
     <string name="dialerKeyboardHintText">"Utilisez le clavier pour composer un numéro."</string>
     <string name="dtmfDialpadHintText">"Clavier à touches sonores"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"Double-cliquez"\n"pour déverrouiller"</string>
     <string name="importSimEntry">"Importer"</string>
     <string name="importAllSimEntries">"Tout importer"</string>
     <string name="importingSimContacts">"Importation des contacts SIM"</string>
index e815c31..db0bd30 100644 (file)
     <string name="dial_emergency_empty_error">"Chiamata non inviata. Comporre un numero di emergenza."</string>
     <string name="dialerKeyboardHintText">"Usa tastiera"</string>
     <string name="dtmfDialpadHintText">"Tocca tastierino numerico"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"Tocca due volte"\n"per sbloccare"</string>
     <string name="importSimEntry">"Importa"</string>
     <string name="importAllSimEntries">"Importa tutti"</string>
     <string name="importingSimContacts">"Importazione contatti SIM"</string>
index e80d618..3ee8a5f 100644 (file)
     <string name="contactsIconLabel">"連絡先"</string>
     <string name="contactsFavoritesLabel">"お気に入り"</string>
     <string name="dialerIconLabel">"電話"</string>
-    <string name="emergencyDialerIconLabel">"緊急発信"</string>
+    <string name="emergencyDialerIconLabel">"緊急呼"</string>
     <string name="phoneIconLabel">"電話"</string>
     <string name="recentCallsIconLabel">"通話履歴"</string>
-    <string name="fdnListLabel">"FDNリスト"</string>
+    <string name="fdnListLabel">"発信番号制限リスト"</string>
     <string name="unknown">"不明"</string>
     <string name="private_num">"番号非通知"</string>
     <string name="onHold">"保留中"</string>
     <string name="ongoing">"現在の通話"</string>
     <string name="callFailed_userBusy">"話し中"</string>
     <string name="callFailed_congestion">"ネットワークがビジーです"</string>
-    <string name="callFailed_noSignal">"信号なし"</string>
+    <string name="callFailed_noSignal">"圏外"</string>
     <string name="callFailed_limitExceeded">"ACMの制限を超えています"</string>
     <string name="callFailed_powerOff">"無線通信をオフ"</string>
-    <string name="callFailed_simError">"SIMがないか、エラーが発生しました"</string>
-    <string name="callFailed_outOfService">"サービス圏外"</string>
-    <string name="callFailed_fdn_only">"FDNにより発信は制限されています。"</string>
-    <string name="callFailed_cb_enabled">"発信が制限されているため発信できません。"</string>
+    <string name="callFailed_simError">"エラーまたはSIMなし"</string>
+    <string name="callFailed_outOfService">"圏外"</string>
+    <string name="callFailed_fdn_only">"発信番号制限により発信が制限されています。"</string>
+    <string name="callFailed_cb_enabled">"発信できません。発信制限がかかっています。"</string>
     <string name="confCall">"電話会議"</string>
     <string name="mmiStarted">"MMIコードの開始"</string>
     <string name="ussdRunning">"USSDコードを実行中..."</string>
     <string name="wild_prompt_str">"ワイルド文字と入れ替える文字"</string>
     <string name="bluetooth_headset_connected">"Bluetoothヘッドセットが接続されました。"</string>
     <string name="bluetooth_headset_disconnected">"Bluetoothヘッドセットの接続が切断されました。"</string>
-    <string name="no_vm_number">"ボイスメールの番号が不明"</string>
+    <string name="no_vm_number">"ボイスメールの番号不明"</string>
     <string name="no_vm_number_msg">"SIMカードにボイスメールの番号がありません。"</string>
     <string name="add_vm_number_str">"番号を追加"</string>
     <string name="dialer_emptyListWorking">"読み込み中..."</string>
     <string name="enterPin">"PINコードを入力してSIMカードのロックを解除します。"</string>
-    <string name="pinUnlocked">"SIMのロックを解除しました"</string>
+    <string name="pinUnlocked">"SIMロックを解除しました"</string>
     <string name="enterNewPin">"新しいSIM PINコード"</string>
     <string name="verifyNewPin">"確認のため新しいSIM PINコードを再入力"</string>
-    <string name="verifyFailed">"入力したSIM PINが一致しません。再入力してください。"</string>
+    <string name="verifyFailed">"SIM PINと一致しません。入力し直してください。"</string>
     <string name="enterPuk">"SIMカードのロック解除のためPUKコードを入力"</string>
     <string name="badPuk">"PUKコードが正しくありません。"</string>
     <string name="buttonTxtContinue">"次へ"</string>
-    <string name="puk_unlocked">"SIMカードのブロックが解除されました。電話のロックを解除中..."</string>
+    <string name="puk_unlocked">"SIMカードロックを解除しました。端末のロックを解除しています..."</string>
     <string name="label_ndp">"SIMネットワークのロック解除PIN"</string>
-    <string name="sim_ndp_unlock_text">"ロックを解除"</string>
+    <string name="sim_ndp_unlock_text">"ロック解除"</string>
     <string name="sim_ndp_dismiss_text">"無効"</string>
     <string name="requesting_unlock">"ネットワークのロック解除をリクエスト中..."</string>
-    <string name="unlock_failed">"ネットワークのロック解除リクエストが拒否されました。"</string>
-    <string name="unlock_success">"ネットワークのロックが解除されました。"</string>
-    <string name="imei">"IMEI"</string>
+    <string name="unlock_failed">"ネットワークロックを解除できませんでした。"</string>
+    <string name="unlock_success">"ネットワークロックを解除しました。"</string>
+    <string name="imei">"IMEI(端末識別番号)"</string>
     <string name="labelMore">"その他の通話設定"</string>
     <string name="apn_settings">"アクセスポイント名"</string>
     <string name="settings_label">"ネットワーク設定"</string>
     <string name="voicemail">"ボイスメール"</string>
     <string name="voicemail_abbreviated">"VM:"</string>
-    <string name="networks">"ネットワークオペレータ"</string>
+    <string name="networks">"ネットワークオペレーター"</string>
     <string name="call_settings">"通話設定"</string>
     <string name="additional_call_settings">"その他の通話設定"</string>
     <string name="labelCallerId">"発信者番号"</string>
     <string name="sum_hide_caller_id">"発信時に番号を通知しない"</string>
     <string name="sum_show_caller_id">"発信時に番号を通知する"</string>
-    <string name="sum_default_caller_id">"デフォルトのオペレータ設定に従って発信時に番号を通知する"</string>
+    <string name="sum_default_caller_id">"発信者番号表示にオペレータの既定値を使用"</string>
     <string name="labelCW">"通話中着信"</string>
     <string name="sum_cw_enabled">"通話中も着信を知らせる"</string>
     <string name="sum_cw_disabled">"通話中も着信を知らせる"</string>
     <string name="sum_cfu_enabled_indicator">"電話をすべて転送する"</string>
     <string name="sum_cfu_enabled">"電話をすべて{0}に転送する"</string>
     <string name="sum_cfu_disabled">"無効"</string>
-    <string name="labelCFB">"通話時に転送"</string>
-    <string name="messageCFB">"通話時の転送番号"</string>
+    <string name="labelCFB">"通話中の着信時に転送"</string>
+    <string name="messageCFB">"通話中着信の転送番号"</string>
     <string name="sum_cfb_enabled">"\\\\{0\\\\}に転送する"</string>
     <string name="sum_cfb_disabled">"無効"</string>
-    <string name="labelCFNRy">"不在時に転送"</string>
-    <string name="messageCFNRy">"不在時の転送番号"</string>
+    <string name="labelCFNRy">"不在着信時に転送"</string>
+    <string name="messageCFNRy">"不在着信時の転送番号"</string>
     <string name="sum_cfnry_enabled">"\\\\{0\\\\}に転送する"</string>
     <string name="sum_cfnry_disabled">"無効"</string>
-    <string name="labelCFNRc">"接続不能時に転送"</string>
-    <string name="messageCFNRc">"接続不能時の転送番号"</string>
+    <string name="labelCFNRc">"着信不能時に転送"</string>
+    <string name="messageCFNRc">"着信不能時の転送番号"</string>
     <string name="sum_cfnrc_enabled">"\\\\{0\\\\}に転送する"</string>
     <string name="sum_cfnrc_disabled">"無効"</string>
     <string name="updating_title">"通話設定"</string>
     <string name="reading_settings">"設定を読み取り中..."</string>
     <string name="updating_settings">"設定を更新中..."</string>
     <string name="response_error">"ネットワークから予期しない応答がありました。"</string>
-    <string name="exception_error">"ネットワークまたはSIMカードでエラーが発生しました。"</string>
+    <string name="exception_error">"ネットマークまたはSIMカードのエラーです。"</string>
     <string name="radio_off_error">"無線通信をオンにしてから設定を表示してください。"</string>
     <string name="close_dialog">"OK"</string>
     <string name="enable">"有効にする"</string>
     <string name="disable">"無効にする"</string>
     <string name="change_num">"更新"</string>
   <string-array name="clir_display_values">
-    <item>"ネットワークのデフォルト"</item>
+    <item>"ネットワーク既定"</item>
     <item>"番号を非通知"</item>
     <item>"番号を通知"</item>
   </string-array>
     <string name="vm_save_number">"ボイスメールの番号の保存"</string>
     <string name="vm_changed">"ボイスメールの番号が変更されました。"</string>
     <string name="vm_change_failed">"ボイスメールの番号を変更できませんでした。"</string>
-    <string name="no_change">"変更されませんでした。"</string>
-    <string name="sum_voicemail">"ボイスメールの番号を設定する"</string>
+    <string name="no_change">"変更されていません。"</string>
+    <string name="sum_voicemail">"ボイスメールの番号設定"</string>
     <string name="mobile_networks">"モバイルネットワーク設定"</string>
     <string name="label_available">"利用可能なネットワーク"</string>
     <string name="load_networks_progress">"検索中..."</string>
     <string name="register_on_network">"<xliff:g id="NETWORK">%s</xliff:g>に登録中..."</string>
     <string name="not_allowed">"このSIMカードではこのネットワークに接続できません。"</string>
     <string name="registration_done">"ネットワークに登録されました。"</string>
-    <string name="sum_carrier_select">"ネットワークオペレータを選択"</string>
+    <string name="sum_carrier_select">"ネットワークオペレーターの選択"</string>
     <string name="sum_search_networks">"利用可能なすべてのネットワークを検索する"</string>
-    <string name="select_automatically">"自動的に選択"</string>
+    <string name="select_automatically">"自動選択"</string>
     <string name="sum_select_automatically">"最適なネットワークを自動的に選択する"</string>
     <string name="register_automatically">"自動登録中..."</string>
     <string name="roaming">"データローミング"</string>
     <string name="roaming_enable">"ローミング時にデータサービスに接続する"</string>
     <string name="roaming_disable">"ローミング時にデータサービスに接続する"</string>
     <string name="roaming_reenable_message">"データローミングをオフにしてホームネットワークを離れたため、データ接続が切断されました。"</string>
-    <string name="roaming_turn_it_on_button">"オンにする"</string>
+    <string name="roaming_turn_it_on_button">"ONにする"</string>
     <string name="roaming_warning">"データローミングを許可すると、ローミング料金が発生する場合があります。"</string>
     <string name="prefer_2g">"2Gネットワークのみ使用"</string>
-    <string name="prefer_2g_summary">"バッテリ消費を抑える"</string>
+    <string name="prefer_2g_summary">"電池節約"</string>
     <string name="fdn">"発信番号制限"</string>
-    <string name="manage_fdn_list">"FDNリスト"</string>
-    <string name="fdn_activation">"FDNの有効化"</string>
-    <string name="fdn_enabled">"発信番号制限が有効"</string>
-    <string name="fdn_disabled">"発信番号制限が無効"</string>
-    <string name="enable_fdn">"FDNを有効にする"</string>
-    <string name="disable_fdn">"FDNを無効にする"</string>
+    <string name="manage_fdn_list">"発信番号制限リスト"</string>
+    <string name="fdn_activation">"発信番号制限の有効化"</string>
+    <string name="fdn_enabled">"発信番号制限はONになっています"</string>
+    <string name="fdn_disabled">"発信番号制限はOFFになっています"</string>
+    <string name="enable_fdn">"発信番号制限をONにする"</string>
+    <string name="disable_fdn">"発信番号制限をOFFにする"</string>
     <string name="change_pin2">"PIN2を変更"</string>
-    <string name="enable_fdn_ok">"FDNを無効にする"</string>
-    <string name="disable_fdn_ok">"FDNを有効にする"</string>
-    <string name="sum_fdn">"発信番号制限の管理"</string>
-    <string name="sum_fdn_change_pin">"FDNアクセス用のPINを変更"</string>
+    <string name="enable_fdn_ok">"発信番号制限をOFFにする"</string>
+    <string name="disable_fdn_ok">"発信番号制限をONにする"</string>
+    <string name="sum_fdn">"固定番号の指定による発信制限"</string>
+    <string name="sum_fdn_change_pin">"発信番号制限のPINを変更"</string>
     <string name="sum_fdn_manage_list">"電話番号リストを管理"</string>
     <string name="menu_add">"連絡先を追加"</string>
     <string name="menu_edit">"連絡先を編集"</string>
     <string name="name">"名前"</string>
     <string name="number">"電話番号"</string>
     <string name="save">"保存"</string>
-    <string name="add_fdn_contact">"固定ダイヤルの追加"</string>
-    <string name="adding_fdn_contact">"固定ダイヤルを追加中..."</string>
-    <string name="fdn_contact_added">"固定ダイヤルが追加されました。"</string>
-    <string name="edit_fdn_contact">"固定ダイヤルの編集"</string>
-    <string name="updating_fdn_contact">"固定ダイヤルを更新中..."</string>
-    <string name="fdn_contact_updated">"固定ダイヤルが更新されました。"</string>
-    <string name="delete_fdn_contact">"固定ダイヤルの削除"</string>
-    <string name="deleting_fdn_contact">"固定ダイヤルを削除中..."</string>
-    <string name="fdn_contact_deleted">"固定ダイヤルが削除されました。"</string>
+    <string name="add_fdn_contact">"発信番号制限の追加"</string>
+    <string name="adding_fdn_contact">"発信番号制限を追加中..."</string>
+    <string name="fdn_contact_added">"発信番号制限を追加しました。"</string>
+    <string name="edit_fdn_contact">"発信番号制限の編集"</string>
+    <string name="updating_fdn_contact">"発信番号制限を更新中..."</string>
+    <string name="fdn_contact_updated">"発信番号制限を更新しました。"</string>
+    <string name="delete_fdn_contact">"発信番号制限の削除"</string>
+    <string name="deleting_fdn_contact">"発信番号制限を削除中..."</string>
+    <string name="fdn_contact_deleted">"発信番号制限を削除しました。"</string>
     <string name="pin2_invalid">"PIN2が無効です。"</string>
     <string name="fdn_invalid_number">"20桁を超える番号は無効です。"</string>
     <string name="simContacts_emptyLoading">"SIMカードから読み取り中..."</string>
     <string name="simContacts_empty">"SIMカードに連絡先がありません。"</string>
     <string name="simContacts_title">"インポートする連絡先の選択"</string>
     <string name="enable_pin">"SIM PINの有効/無効"</string>
-    <string name="change_pin">"SIM PINを変更"</string>
+    <string name="change_pin">"SIM PINの変更"</string>
     <string name="enter_pin_text">"SIM PIN:"</string>
     <string name="oldPinLabel">"古いPIN"</string>
     <string name="newPinLabel">"新しいPIN"</string>
     <string name="confirmPinLabel">"新しいPINを確認"</string>
-    <string name="badPin">"入力した古いPINは正しくありません。再入力してください。"</string>
-    <string name="mismatchPin">"入力したPINが一致しません。再入力してください。"</string>
+    <string name="badPin">"PINが正しくありません。入力し直してください。"</string>
+    <string name="mismatchPin">"PINと一致しません。入力し直してください。"</string>
     <string name="invalidPin">"4~8桁の数字のPINを入力してください。"</string>
     <string name="disable_sim_pin">"SIM PINを無効にする"</string>
     <string name="enable_sim_pin">"SIM PINを有効にする"</string>
     <string name="oldPin2Label">"古いPIN2"</string>
     <string name="newPin2Label">"新しいPIN2"</string>
     <string name="confirmPin2Label">"新しいPIN2の確認"</string>
-    <string name="badPuk2">"入力したPUK2は正しくありません。再入力してください。"</string>
-    <string name="badPin2">"入力した古いPIN2は正しくありません。再入力してください。"</string>
-    <string name="mismatchPin2">"入力したPIN2が一致しません。再入力してください。"</string>
+    <string name="badPuk2">"PUK2が正しくありません。入力し直してください。"</string>
+    <string name="badPin2">"PIN2が正しくありません。入力し直してください。"</string>
+    <string name="mismatchPin2">"PIN2と一致しません。入力し直してください。"</string>
     <string name="invalidPin2">"PIN2を4~8桁の数字で入力してください。"</string>
     <string name="invalidPuk2">"8桁の数字のPUK2を入力してください。"</string>
     <string name="pin2_changed">"PIN2が変更されました"</string>
     <string name="sim_missing_continueView_text">"SIMカードなしで続ける"</string>
     <string name="sim_missing_msg_text">"SIMカードが見つかりません。SIMカードを携帯電話に挿入してください。"</string>
     <string name="sim_unlock_dismiss_text">"無効"</string>
-    <string name="sim_unlock_unlock_text">"ロックを解除"</string>
+    <string name="sim_unlock_unlock_text">"ロック解除"</string>
     <string name="sim_unlock_status_text">"PINを認証中..."</string>
     <string name="voicemail_settings_number_label">"ボイスメールの番号"</string>
-    <string name="card_title_dialing">"ダイヤル中"</string>
+    <string name="card_title_dialing">"発信中"</string>
     <string name="card_title_in_progress">"現在の通話"</string>
     <string name="card_title_conf_call">"電話会議"</string>
     <string name="card_title_incoming_call">"着信"</string>
     <string name="incall_error_supp_service_conference">"電話会議ができません。"</string>
     <string name="incall_error_supp_service_reject">"着信を拒否できません。"</string>
     <string name="incall_error_supp_service_hangup">"通話を解放できません。"</string>
-    <string name="emergency_enable_radio_dialog_title">"緊急電話"</string>
+    <string name="emergency_enable_radio_dialog_title">"緊急呼"</string>
     <string name="emergency_enable_radio_dialog_message">"無線通信をオンにしています..."</string>
-    <string name="emergency_enable_radio_dialog_retry">"サービス圏外、再試行中..."</string>
-    <string name="dial_emergency_error">"発信できません。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g>は緊急電話番号ではありません。"</string>
-    <string name="dial_emergency_empty_error">"発信できません。緊急電話番号をダイヤルしてください。"</string>
-    <string name="dialerKeyboardHintText">"キーボードからダイヤルする"</string>
+    <string name="emergency_enable_radio_dialog_retry">"圏外 - 再試行中..."</string>
+    <string name="dial_emergency_error">"発信エラー: <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g>は緊急呼番号ではありません。"</string>
+    <string name="dial_emergency_empty_error">"発信エラー: 緊急呼番号をダイヤルしてください。"</string>
+    <string name="dialerKeyboardHintText">"キーボードで番号を入力してください"</string>
     <string name="dtmfDialpadHintText">"タッチトーンキーパッド"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"ロックを解除するには"\n"をダブルタップ"</string>
     <string name="importSimEntry">"インポート"</string>
     <string name="importAllSimEntries">"すべてインポート"</string>
     <string name="importingSimContacts">"SIMの連絡先をインポート中"</string>
index 2ea4589..e8ef960 100644 (file)
     <string name="dial_emergency_empty_error">"전화를 걸지 못했습니다. 비상 전화번호를 직접 누르세요."</string>
     <string name="dialerKeyboardHintText">"키보드를 사용하여 전화걸기"</string>
     <string name="dtmfDialpadHintText">"터치 톤 키패드"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"잠금해제하려면"\n"두 번 누르세요."</string>
     <string name="importSimEntry">"가져오기"</string>
     <string name="importAllSimEntries">"모두 가져오기"</string>
     <string name="importingSimContacts">"SIM 연락처 가져오는 중"</string>
index e70756b..5f2c584 100644 (file)
     <string name="dial_emergency_empty_error">"Oproep niet verzonden, kies een alarmnummer!"</string>
     <string name="dialerKeyboardHintText">"Toetsen gebruiken om te bellen"</string>
     <string name="dtmfDialpadHintText">"Toetsenblok voor toetsgeluid"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"Tik twee keer"\n"om te ontgrendelen"</string>
     <string name="importSimEntry">"Importeren"</string>
     <string name="importAllSimEntries">"Alles importeren"</string>
     <string name="importingSimContacts">"SIM-contactpersonen importeren"</string>
index 75b692a..1934fe3 100644 (file)
     <string name="dial_emergency_empty_error">"Połączenie niezrealizowane, należy wybrać numer alarmowy!"</string>
     <string name="dialerKeyboardHintText">"Aby zadzwonić, użyj klawiatury."</string>
     <string name="dtmfDialpadHintText">"Dotykowa klawiatura tonowa"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"Dotknij dwukrotnie,"\n" aby odblokować"</string>
     <string name="importSimEntry">"Importuj"</string>
     <string name="importAllSimEntries">"Importuj wszystko"</string>
     <string name="importingSimContacts">"Importowanie kontaktów z karty SIM"</string>
index a1b8269..aeff6ae 100644 (file)
     <string name="dial_emergency_empty_error">"Вызов не отправлен. Наберите экстренный номер!"</string>
     <string name="dialerKeyboardHintText">"Для набора воспользуйтесь клавиатурой"</string>
     <string name="dtmfDialpadHintText">"Панель тонального набора"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"Нажмите дважды"\n"для разблокировки"</string>
     <string name="importSimEntry">"Импортировать"</string>
     <string name="importAllSimEntries">"Импортировать все"</string>
     <string name="importingSimContacts">"Идет импорт контактов с SIM-карты"</string>
index fc37b92..908b78a 100644 (file)
     <string name="dial_emergency_empty_error">"呼叫未发送,请拨打紧急号码!"</string>
     <string name="dialerKeyboardHintText">"使用键盘拨号"</string>
     <string name="dtmfDialpadHintText">"按键式键盘"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"轻击两下"\n"解锁"</string>
     <string name="importSimEntry">"导入"</string>
     <string name="importAllSimEntries">"全部导入"</string>
     <string name="importingSimContacts">"正在导入 SIM 卡联系人"</string>
index fb3204c..ba01e58 100644 (file)
     <string name="dial_emergency_empty_error">"撥號未送出,請撥打緊急電話號碼!"</string>
     <string name="dialerKeyboardHintText">"使用鍵盤撥號"</string>
     <string name="dtmfDialpadHintText">"觸碰音按鍵"</string>
-    <!-- no translation found for touchLockText (566824588267376287) -->
-    <skip />
+    <string name="touchLockText">"點兩下"\n"即可解鎖"</string>
     <string name="importSimEntry">"匯入"</string>
     <string name="importAllSimEntries">"全部匯入"</string>
     <string name="importingSimContacts">"匯入 SIM 聯絡人"</string>
index 0024e98..817c81e 100644 (file)
@@ -87,7 +87,6 @@ public class CallNotifier extends Handler
 
     private PhoneApp mApplication;
     private Phone mPhone;
-    private InCallScreen mCallScreen;
     private Ringer mRinger;
     private BluetoothHandsfree mBluetoothHandsfree;
     private boolean mSilentRingerRequested;
@@ -495,12 +494,14 @@ public class CallNotifier extends Handler
 
             NotificationMgr.getDefault().cancelCallInProgressNotification();
 
-            // if the call screen never called finish (it's still in activity
-            // history, call finish() on it so it can be removed from the
-            // activity history
-            if (mCallScreen != null) {
-                if (DBG) log("onDisconnect: force mCallScreen.finish()");
-                mCallScreen.finish();
+            // If the InCallScreen is *not* in the foreground, forcibly
+            // dismiss it to make sure it won't still be in the activity
+            // history.  (But if it *is* in the foreground, don't mess
+            // with it; it needs to be visible, displaying the "Call
+            // ended" state.)
+            if (!mApplication.isShowingCallScreen()) {
+                if (DBG) log("onDisconnect: force InCallScreen to finish()");
+                mApplication.dismissCallScreen();
             }
         }
 
@@ -634,11 +635,6 @@ public class CallNotifier extends Handler
         NotificationMgr.getDefault().updateCfi(visible);
     }
 
-    void setCallScreen(InCallScreen callScreen) {
-        if (DBG) log("setCallScreen: " + callScreen);
-        mCallScreen = callScreen;
-    }
-
     /**
      * Indicates whether or not this ringer is ringing.
      */
index 1e8d2e9..ba7b02d 100644 (file)
@@ -255,6 +255,14 @@ public class InCallScreen extends Activity
                 if (DBG) log("Handler: ignoring message " + msg + "; we're destroyed!");
                 return;
             }
+            if (!mIsForegroundActivity) {
+                if (DBG) log("Handler: handling message " + msg + " while not in foreground");
+                // Continue anyway; some of the messages below *want* to
+                // be handled even if we're not the foreground activity
+                // (like DELAYED_CLEANUP_AFTER_DISCONNECT), and they all
+                // should at least be safe to handle if we're not in the
+                // foreground...
+            }
 
             switch (msg.what) {
                 case SUPP_SERVICE_FAILED:
@@ -382,12 +390,6 @@ public class InCallScreen extends Activity
 
         setPhone(app.phone);  // Sets mPhone and mForegroundCall/mBackgroundCall/mRingingCall
 
-        // allow the call notifier to handle the disconnect event for us
-        // while we are setting up.  This is a catch-all in case the
-        // handler used in registerForDisconnect does NOT get the
-        // disconnect signal in time.
-        app.notifier.setCallScreen(this);
-
         mBluetoothHandsfree = app.getBluetoothHandsfree();
         if (DBG) log("- mBluetoothHandsfree: " + mBluetoothHandsfree);
 
@@ -473,13 +475,15 @@ public class InCallScreen extends Activity
 
         mIsForegroundActivity = true;
 
+        PhoneApp app = PhoneApp.getInstance();
+
         // Disable the keyguard the entire time the InCallScreen is
         // active.  (This is necessary only for the case of receiving an
         // incoming call while the device is locked; we need to disable
         // the keyguard so you can answer the call and use the in-call UI,
         // but we always re-enable the keyguard as soon as you leave this
         // screen (see onPause().))
-        PhoneApp.getInstance().disableKeyguard();
+        app.disableKeyguard();
 
         // Disable the status bar "window shade" the entire time we're on
         // the in-call screen.
@@ -538,11 +542,6 @@ public class InCallScreen extends Activity
                              PHONE_UI_EVENT_ENTER);
         }
 
-        // Now we can handle the finish() call ourselves instead of relying on
-        // the call notifier to do so.
-        PhoneApp app = PhoneApp.getInstance();
-        app.notifier.setCallScreen(null);
-
         // Update the poke lock and wake lock when we move to
         // the foreground.
         //
@@ -649,7 +648,7 @@ public class InCallScreen extends Activity
         // end up causing the sleep request to be ignored.
         if (mHandler.hasMessages(DELAYED_CLEANUP_AFTER_DISCONNECT)) {
             if (DBG) log("DELAYED_CLEANUP_AFTER_DISCONNECT detected, moving UI to background.");
-            moveTaskToBack(false);
+            finish();
         }
 
         if (ENABLE_PHONE_UI_EVENT_LOGGING) {
@@ -700,9 +699,6 @@ public class InCallScreen extends Activity
             // if there are not active or ringing calls.
             if (DBG) log("- onStop: calling finish() to clear activity history...");
             finish();
-        } else {
-            if (DBG) log("onStop: keep call screen in history");
-            PhoneApp.getInstance().notifier.setCallScreen(this);
         }
     }
 
@@ -751,12 +747,28 @@ public class InCallScreen extends Activity
         }
     }
 
+    /**
+     * Dismisses the in-call screen.
+     *
+     * We never *really* finish() the InCallScreen, since we don't want to
+     * get destroyed and then have to be re-created from scratch for the
+     * next call.  Instead, we just move ourselves to the back of the
+     * activity stack.
+     *
+     * This also means that we'll no longer be reachable via the BACK
+     * button (since moveTaskToBack() puts us behind the Home app, but the
+     * home app doesn't allow the BACK key to move you any farther down in
+     * the history stack.)
+     *
+     * (Since the Phone app itself is never killed, this basically means
+     * that we'll keep a single InCallScreen instance around for the
+     * entire uptime of the device.  This noticeably improves the UI
+     * responsiveness for incoming calls.)
+     */
     @Override
     public void finish() {
         if (DBG) log("finish()...");
-        super.finish();
-
-        PhoneApp.getInstance().notifier.setCallScreen(null);
+        moveTaskToBack(true);
     }
 
     /* package */ boolean isForegroundActivity() {
@@ -923,18 +935,13 @@ public class InCallScreen extends Activity
     private boolean handleBackKey() {
         if (DBG) log("handleBackKey()...");
 
-        // If the user presses BACK while an incoming call is ringing, we
-        // silence the ringer (just like with VOLUME_UP or VOLUME_DOWN)
-        // *without* sending the call to voicemail (like ENDCALL would),
-        // *and* also bail out of the "Incoming call" UI.
+        // While an incoming call is ringing, BACK behaves just like
+        // ENDCALL: it stops the ringing and rejects the current call.
         CallNotifier notifier = PhoneApp.getInstance().notifier;
         if (notifier.isRinging()) {
-            PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_IDLE);
-            if (DBG) log("BACK key: silence ringer");
-            notifier.silenceRinger();
-            if (mBluetoothHandsfree != null) {
-                mBluetoothHandsfree.ignoreRing();
-            }
+            if (DBG) log("BACK key while ringing: reject the call");
+            internalHangupRingingCall();
+
             // Don't consume the key; instead let the BACK event *also*
             // get handled normally by the framework (which presumably
             // will cause us to exit out of this activity.)
@@ -976,6 +983,21 @@ public class InCallScreen extends Activity
         final boolean hasHoldingCall = !mBackgroundCall.isIdle();
 
         if (hasRingingCall) {
+            // If an incoming call is ringing, the CALL button is actually
+            // handled by the PhoneWindowManager.  (We do this to make
+            // sure that we'll respond to the key even if the InCallScreen
+            // hasn't come to the foreground yet.)
+            //
+            // We'd only ever get here in the extremely rare case that the
+            // incoming call started ringing *after*
+            // PhoneWindowManager.interceptKeyTq() but before the event
+            // got here, or else if the PhoneWindowManager had some
+            // problem connecting to the ITelephony service.
+            Log.w(LOG_TAG, "handleCallKey: incoming call is ringing!"
+                  + " (PhoneWindowManager should have handled this key.)");
+            // But go ahead and handle the key as normal, since the
+            // PhoneWindowManager presumably did NOT handle it:
+
             // There's an incoming ringing call: CALL means "Answer".
             if (hasActiveCall && hasHoldingCall) {
                 if (DBG) log("handleCallKey: ringing (both lines in use) ==> answer!");
@@ -1073,11 +1095,8 @@ public class InCallScreen extends Activity
         if ((mDialer != null) && (mDialer.onDialerKeyUp(event))){
             return true;
         } else if (keyCode == KeyEvent.KEYCODE_CALL) {
-            if (handleCallKey()) {
-                return true;
-            } else {
-                Log.w(LOG_TAG, "InCallScreen should always handle KEYCODE_CALL in onKeyUp");
-            }
+            // Always consume CALL to be sure the PhoneWindow won't do anything with it
+            return true;
         }
         return super.onKeyUp(keyCode, event);
     }
@@ -1088,7 +1107,11 @@ public class InCallScreen extends Activity
 
         switch (keyCode) {
             case KeyEvent.KEYCODE_CALL:
-                // consume KEYCODE_CALL so PhoneWindow doesn't do anything with it
+                boolean handled = handleCallKey();
+                if (!handled) {
+                    Log.w(LOG_TAG, "InCallScreen should always handle KEYCODE_CALL in onKeyDown");
+                }
+                // Always consume CALL to be sure the PhoneWindow won't do anything with it
                 return true;
 
             // Note there's no KeyEvent.KEYCODE_ENDCALL case here.
@@ -1111,18 +1134,32 @@ public class InCallScreen extends Activity
 
             case KeyEvent.KEYCODE_VOLUME_UP:
             case KeyEvent.KEYCODE_VOLUME_DOWN:
-                // Use the CallNotifier's ringer reference to keep things tidy
-                // when we are requesting that the ringer be silenced.  Also, as
-                // long as we're in ringing mode, we should consume the Volume
-                // Up/Down events.
-                CallNotifier notifier = PhoneApp.getInstance().notifier;
                 if (mPhone.getState() == Phone.State.RINGING) {
+                    // If an incoming call is ringing, the VOLUME buttons are
+                    // actually handled by the PhoneWindowManager.  (We do
+                    // this to make sure that we'll respond to them even if
+                    // the InCallScreen hasn't come to the foreground yet.)
+                    //
+                    // We'd only ever get here in the extremely rare case that the
+                    // incoming call started ringing *after*
+                    // PhoneWindowManager.interceptKeyTq() but before the event
+                    // got here, or else if the PhoneWindowManager had some
+                    // problem connecting to the ITelephony service.
+                    Log.w(LOG_TAG, "VOLUME key: incoming call is ringing!"
+                          + " (PhoneWindowManager should have handled this key.)");
+                    // But go ahead and handle the key as normal, since the
+                    // PhoneWindowManager presumably did NOT handle it:
+
+                    CallNotifier notifier = PhoneApp.getInstance().notifier;
                     if (notifier.isRinging()) {
                         // ringer is actually playing, so silence it.
                         PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_IDLE);
                         if (DBG) log("VOLUME key: silence ringer");
                         notifier.silenceRinger();
                     }
+
+                    // As long as an incoming call is ringing, we always
+                    // consume the VOLUME keys.
                     return true;
                 }
                 break;
@@ -1447,13 +1484,13 @@ public class InCallScreen extends Activity
     private void onMMIInitiate(AsyncResult r) {
         if (DBG) log("onMMIInitiate()...  AsyncResult r = " + r);
 
-        // Watch out: don't do this if we're in the middle of bailing out
-        // of this activity, since in the Dialog.show() will just fail
-        // because we don't have a valid window token any more...
-        // (That exact sequence can happen if you try to start an MMI code
-        // while the radio is off or out of service.)
-        if (isFinishing()) {
-            if (DBG) log("Activity finishing! Bailing out...");
+        // Watch out: don't do this if we're not the foreground activity,
+        // mainly since in the Dialog.show() might fail if we don't have a
+        // valid window token any more...
+        // (Note that this exact sequence can happen if you try to start
+        // an MMI code while the radio is off or out of service.)
+        if (!mIsForegroundActivity) {
+            if (DBG) log("Activity not in foreground! Bailing out...");
             return;
         }
 
@@ -1655,11 +1692,13 @@ public class InCallScreen extends Activity
     private void updateScreen() {
         if (DBG) log("updateScreen()...");
 
-        // Watch out: don't update anything if we're in the middle of
-        // bailing out of this activity, since that'll cause a visible
-        // glitch in the "activity ending" transition.
-        if (isFinishing()) {
-            if (DBG) log("- updateScreen: Activity finishing! Bailing out...");
+        // Don't update anything if we're not in the foreground (there's
+        // no point updating our UI widgets since we're not visible!)
+        // Also note this check also ensures we won't update while we're
+        // in the middle of pausing, which could cause a visible glitch in
+        // the "activity ending" transition.
+        if (!mIsForegroundActivity) {
+            if (DBG) log("- updateScreen: not the foreground Activity! Bailing out...");
             return;
         }
 
@@ -2003,10 +2042,8 @@ public class InCallScreen extends Activity
             // that happens in onPause() when we actually exit.
 
             // And (finally!) exit from the in-call screen
-            // (but not if we're already in the process of finishing...)
-            if (isFinishing()) {
-                if (DBG) log("- delayedCleanupAfterDisconnect: already finished, doing nothing.");
-            } else {
+            // (but not if we're already in the process of pausing...)
+            if (mIsForegroundActivity) {
                 if (DBG) log("- delayedCleanupAfterDisconnect: finishing...");
 
                 // If this is a call that was initiated by the user, and
@@ -2548,15 +2585,13 @@ public class InCallScreen extends Activity
         // here to end the on-hold call instead.
     }
 
-    //
-    // One last "answer" option I don't yet use here, but might eventually
-    // need: "hang up the ringing call", aka "Don't answer":
-    //     PhoneUtils.hangupRingingCall(phone);
-    // With the current UI specs, this action only ever happens
-    // from the ENDCALL button, so we don't have any UI elements
-    // in *this* activity that need to do this.
-    //
-
+    /**
+     * Hang up the ringing call (aka "Don't answer").
+     */
+    /* package */ void internalHangupRingingCall() {
+        if (DBG) log("internalHangupRingingCall()...");
+        PhoneUtils.hangupRingingCall(mPhone);
+    }
 
     //
     // "Manage conference" UI.
index 4bd1693..d6867b6 100644 (file)
@@ -399,9 +399,7 @@ public class PhoneApp extends Application {
     }
 
     /**
-     * Return the intent used to bring up the in-call screen while a call
-     * is already in progress (like when you return to the current call
-     * after previously bailing out of the in-call UI.)
+     * Return an Intent that can be used to bring up the in-call screen.
      *
      * This intent can only be used from within the Phone app, since the
      * InCallScreen is not exported from our AndroidManifest.
@@ -495,6 +493,19 @@ public class PhoneApp extends Application {
     }
 
     /**
+     * Dismisses the in-call UI.
+     *
+     * This also ensures that you won't be able to get back to the in-call
+     * UI via the BACK button (since this call removes the InCallScreen
+     * from the activity history.)
+     */
+    void dismissCallScreen() {
+        if (mInCallScreen != null) {
+            mInCallScreen.finish();
+        }
+    }
+
+    /**
      * Sets the activity responsible for un-PUK-blocking the device
      * so that we may close it when we receive a positive result.
      * mPUKEntryActivity is also used to indicate to the device that
index 23301ff..487a9c0 100644 (file)
@@ -43,9 +43,13 @@ import java.util.ArrayList;
 public class PhoneInterfaceManager extends ITelephony.Stub {
     private static final String LOG_TAG = PhoneApp.LOG_TAG;
 
+    // Message codes used with mMainThreadHandler
     private static final int CMD_HANDLE_PIN_MMI = 1;
     private static final int CMD_HANDLE_NEIGHBORING_CELL = 2;
     private static final int EVENT_NEIGHBORING_CELL_DONE = 3;
+    private static final int CMD_ANSWER_RINGING_CALL = 4;
+    private static final int CMD_END_CALL = 5;  // not used yet
+    private static final int CMD_SILENCE_RINGER = 6;
 
     PhoneApp mApp;
     Phone mPhone;
@@ -69,12 +73,13 @@ public class PhoneInterfaceManager extends ITelephony.Stub {
     /**
      * A handler that processes messages on the main thread in the phone process. Since many
      * of the Phone calls are not thread safe this is needed to shuttle the requests from the
-     * inbound binder threads to the main thread in the phone process. The Binder threads
-     * need provide a {@link MainThreadRequest} object in the msg.obj field that they are waiting
+     * inbound binder threads to the main thread in the phone process.  The Binder thread
+     * may provide a {@link MainThreadRequest} object in the msg.obj field that they are waiting
      * on, which will be notified when the operation completes and will contain the result of the
      * request.
      *
-     * <p>Note that request.result must be set to something non-null for the calling thread to
+     * <p>If a MainThreadRequest object is provided in the msg.obj field,
+     * note that request.result must be set to something non-null for the calling thread to
      * unblock.
      */
     private final class MainThreadHandler extends Handler {
@@ -85,7 +90,7 @@ public class PhoneInterfaceManager extends ITelephony.Stub {
             AsyncResult ar;
 
             switch (msg.what) {
-                case CMD_HANDLE_PIN_MMI: 
+                case CMD_HANDLE_PIN_MMI:
                     request = (MainThreadRequest) msg.obj;
                     request.result = Boolean.valueOf(
                             mPhone.handlePinMmi((String) request.argument));
@@ -94,14 +99,14 @@ public class PhoneInterfaceManager extends ITelephony.Stub {
                         request.notifyAll();
                     }
                     break;
-                
+
                 case CMD_HANDLE_NEIGHBORING_CELL:
                     request = (MainThreadRequest) msg.obj;
-                    onCompleted = obtainMessage(EVENT_NEIGHBORING_CELL_DONE, 
+                    onCompleted = obtainMessage(EVENT_NEIGHBORING_CELL_DONE,
                             request);
                     mPhone.getNeighboringCids(onCompleted);
                     break;
-                    
+
                 case EVENT_NEIGHBORING_CELL_DONE:
                     ar = (AsyncResult) msg.obj;
                     request = (MainThreadRequest) ar.userObj;
@@ -116,11 +121,27 @@ public class PhoneInterfaceManager extends ITelephony.Stub {
                         request.notifyAll();
                     }
                     break;
-            }
 
+                case CMD_ANSWER_RINGING_CALL:
+                    answerRingingCallInternal();
+                    break;
+
+                case CMD_SILENCE_RINGER:
+                    silenceRingerInternal();
+                    break;
+
+                default:
+                    Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what);
+                    break;
+            }
         }
     }
 
+    /**
+     * Posts the specified command to be executed on the main thread,
+     * waits for the request to complete, and returns the result.
+     * @see sendRequestAsync
+     */
     private Object sendRequest(int command, Object argument) {
         if (Looper.myLooper() == mMainThreadHandler.getLooper()) {
             throw new RuntimeException("This method will deadlock if called from the main thread.");
@@ -143,6 +164,16 @@ public class PhoneInterfaceManager extends ITelephony.Stub {
         return request.result;
     }
 
+    /**
+     * Asynchronous ("fire and forget") version of sendRequest():
+     * Posts the specified command to be executed on the main thread, and
+     * returns immediately.
+     * @see sendRequest
+     */
+    private void sendRequestAsync(int command) {
+        mMainThreadHandler.sendEmptyMessage(command);
+    }
+
     public PhoneInterfaceManager(PhoneApp app, Phone phone) {
         mApp = app;
         mPhone = phone;
@@ -232,11 +263,85 @@ public class PhoneInterfaceManager extends ITelephony.Stub {
         return showCallScreenInternal(true, showDialpad);
     }
 
+    // TODO: Watch out: it's dangerous to call into the telephony code
+    // directly from here (we're running in a random binder thread, but
+    // the telephony code expects to always be called from the phone app
+    // main thread.)  We should instead wrap this in a sendRequest() call
+    // (just like with answerRingingCall() / answerRingingCallInternal()).
     public boolean endCall() {
         enforceCallPermission();
         return PhoneUtils.hangup(mPhone);
     }
 
+    public void answerRingingCall() {
+        // TODO: there should eventually be a separate "ANSWER_PHONE" permission,
+        // but that can probably wait till the big TelephonyManager API overhaul.
+        // For now, protect this call with the MODIFY_PHONE_STATE permission.
+        enforceModifyPermission();
+        sendRequestAsync(CMD_ANSWER_RINGING_CALL);
+    }
+
+    /**
+     * Make the actual telephony calls to implement answerRingingCall().
+     * This should only be called from the main thread of the Phone app.
+     * @see answerRingingCall
+     *
+     * TODO: it would be nice to return true if we answered the call, or
+     * false if there wasn't actually a ringing incoming call, or some
+     * other error occurred.  (In other words, pass back the return value
+     * from PhoneUtils.answerCall() or PhoneUtils.answerAndEndActive().)
+     * But that would require calling this method via sendRequest() rather
+     * than sendRequestAsync(), and right now we don't actually *need* that
+     * return value, so let's just return void for now.
+     */
+    private void answerRingingCallInternal() {
+        final boolean hasRingingCall = !mPhone.getRingingCall().isIdle();
+        if (hasRingingCall) {
+            final boolean hasActiveCall = !mPhone.getForegroundCall().isIdle();
+            final boolean hasHoldingCall = !mPhone.getBackgroundCall().isIdle();
+            if (hasActiveCall && hasHoldingCall) {
+                // Both lines are in use!
+                // TODO: provide a flag to let the caller specify what
+                // policy to use if both lines are in use.  (The current
+                // behavior is hardwired to "answer incoming, end ongoing",
+                // which is how the CALL button is specced to behave.)
+                PhoneUtils.answerAndEndActive(mPhone);
+                return;
+            } else {
+                // answerCall() will automatically hold the current active
+                // call, if there is one.
+                PhoneUtils.answerCall(mPhone);
+                return;
+            }
+        } else {
+            // No call was ringing.
+            return;
+        }
+    }
+
+    public void silenceRinger() {
+        // TODO: find a more appropriate permission to check here.
+        // (That can probably wait till the big TelephonyManager API overhaul.
+        // For now, protect this call with the MODIFY_PHONE_STATE permission.)
+        enforceModifyPermission();
+        sendRequestAsync(CMD_SILENCE_RINGER);
+    }
+
+    /**
+     * Internal implemenation of silenceRinger().
+     * This should only be called from the main thread of the Phone app.
+     * @see silenceRinger
+     */
+    private void silenceRingerInternal() {
+        if ((mPhone.getState() == Phone.State.RINGING)
+            && mApp.notifier.isRinging()) {
+            // Ringer is actually playing, so silence it.
+            if (PhoneApp.DBG) log("silenceRingerInternal: silencing...");
+            PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_IDLE);
+            mApp.notifier.silenceRinger();
+        }
+    }
+
     public boolean isOffhook() {
         return (mPhone.getState() == Phone.State.OFFHOOK);
     }