auto import from //branches/cupcake/...@130745
The Android Open Source Project [Tue, 10 Feb 2009 23:44:05 +0000 (15:44 -0800)]
41 files changed:
AndroidManifest.xml
res/anim/touch_lock_fade_in.xml [moved from res/drawable/dialtacts_highlight.xml with 52% similarity]
res/drawable-finger/dark_header.9.png [deleted file]
res/drawable-finger/dark_header_dithered.xml [deleted file]
res/drawable-finger/dialpad_lock.9.png [new file with mode: 0644]
res/drawable-finger/tray_handle.xml
res/drawable/dialtacts_highlight_active.9.png [deleted file]
res/drawable/dialtacts_highlight_inactive.9.png [deleted file]
res/drawable/dialtacts_highlight_pressed.9.png [deleted file]
res/drawable/picture_frame.png [deleted file]
res/layout-finger/dtmf_twelve_key_dialer.xml
res/layout/dialer.xml [deleted file]
res/layout/incall_screen.xml
res/layout/query_activity.xml [deleted file]
res/layout/single_line_icon_list_item.xml [deleted file]
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 [new file with mode: 0644]
res/values-nb/strings.xml [new file with mode: 0644]
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
res/values/strings.xml
res/xml/call_feature_setting.xml
res/xml/carrier_select.xml
res/xml/network_setting.xml
src/com/android/phone/BluetoothHandsfree.java
src/com/android/phone/BluetoothHeadsetService.java
src/com/android/phone/CallNotifier.java
src/com/android/phone/DTMFTwelveKeyDialer.java
src/com/android/phone/InCallScreen.java
src/com/android/phone/PhoneApp.java
src/com/android/phone/PhoneUtils.java
src/com/android/phone/Settings.java
src/com/android/phone/SimContacts.java

index cef2d6b..1d522ab 100644 (file)
             android:label="@string/phoneIconLabel"
             android:excludeFromRecents="true"
             android:launchMode="singleInstance"
+            android:screenOrientation="nosensor"
             android:exported="false" />
 
         <!-- general settings -->
                 android:label="@string/delete_fdn_contact">
         </activity>
         
-        <activity android:name="DataRoamingReenable" android:label="@string/roaming_reenable_title"
+        <activity android:name="DataRoamingReenable" android:label="@string/android:dialog_alert_title"
             android:theme="@android:style/Theme.Dialog">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
similarity index 52%
rename from res/drawable/dialtacts_highlight.xml
rename to res/anim/touch_lock_fade_in.xml
index 9d107e3..1f2cac1 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
+<!-- Copyright (C) 2009 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      limitations under the License.
 -->
 
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_pressed="true" android:drawable="@drawable/dialtacts_highlight_pressed" />
-    <item android:state_window_focused="false" android:drawable="@drawable/dialtacts_highlight_inactive" />
-    <item android:state_window_focused="true" android:drawable="@drawable/dialtacts_highlight_active" />
-</selector>
+<!-- Fade-in animation for the in-call "touch lock" overlay.
+     The "touch lock overlay" itself is semi-transparent over most of the screen,
+     so this animation (which runs from alpha=0 to alpha=1) will result in
+     a smooth fade from "invisible" to "semi-transparent".)
+ -->
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/decelerate_interpolator"
+    android:fromAlpha="0.0"
+    android:toAlpha="1.0"
+    android:duration="500" />
diff --git a/res/drawable-finger/dark_header.9.png b/res/drawable-finger/dark_header.9.png
deleted file mode 100644 (file)
index 5b1d71f..0000000
Binary files a/res/drawable-finger/dark_header.9.png and /dev/null differ
diff --git a/res/drawable-finger/dark_header_dithered.xml b/res/drawable-finger/dark_header_dithered.xml
deleted file mode 100644 (file)
index 36994a7..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/dark_header"
-    android:dither="true"
-/>
diff --git a/res/drawable-finger/dialpad_lock.9.png b/res/drawable-finger/dialpad_lock.9.png
new file mode 100644 (file)
index 0000000..103b4a9
Binary files /dev/null and b/res/drawable-finger/dialpad_lock.9.png differ
index 761e60a..b184a56 100644 (file)
 -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_pressed="true" 
-        android:drawable="@drawable/tray_handle_pressed" />
-    <item android:state_focused="true"
-        android:drawable="@drawable/tray_handle_selected" />
-    <item
-        android:drawable="@drawable/tray_handle_normal" />
+    <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/tray_handle_normal" />
+    <item android:state_pressed="true" android:drawable="@drawable/tray_handle_pressed" />
+    <item android:state_focused="true" android:state_enabled="true" android:drawable="@drawable/tray_handle_selected" />
+    <item android:state_enabled="true" android:drawable="@drawable/tray_handle_normal" />
+    <item android:state_focused="true" android:drawable="@drawable/tray_handle_selected" />
 </selector>
-
diff --git a/res/drawable/dialtacts_highlight_active.9.png b/res/drawable/dialtacts_highlight_active.9.png
deleted file mode 100644 (file)
index 9ffb8d7..0000000
Binary files a/res/drawable/dialtacts_highlight_active.9.png and /dev/null differ
diff --git a/res/drawable/dialtacts_highlight_inactive.9.png b/res/drawable/dialtacts_highlight_inactive.9.png
deleted file mode 100644 (file)
index ca30fd6..0000000
Binary files a/res/drawable/dialtacts_highlight_inactive.9.png and /dev/null differ
diff --git a/res/drawable/dialtacts_highlight_pressed.9.png b/res/drawable/dialtacts_highlight_pressed.9.png
deleted file mode 100644 (file)
index 644f53a..0000000
Binary files a/res/drawable/dialtacts_highlight_pressed.9.png and /dev/null differ
diff --git a/res/drawable/picture_frame.png b/res/drawable/picture_frame.png
deleted file mode 100644 (file)
index 8aad0f1..0000000
Binary files a/res/drawable/picture_frame.png and /dev/null differ
index 2d0e59a..ec309f7 100644 (file)
 <!-- Sliding drawer widget containing the DTMF dialer in portrait mode.  In
      landscape mode, the item is replaced with a simple <merge/>, so its
      never inflated. -->
-<com.android.internal.widget.SlidingDrawer
+<SlidingDrawer
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     android:id="@+id/dialer_container"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
-    androidprv:topOffset="5px"
-    androidprv:bottomOffset="7px"
-    androidprv:handle="@+id/dialer_tab"
-    androidprv:content="@+id/dtmf_dialer"
-    androidprv:allowSingleTap="false"
+    android:topOffset="5px"
+    android:bottomOffset="7px"
+    android:handle="@+id/dialer_tab"
+    android:content="@+id/dtmf_dialer"
+    android:allowSingleTap="false"
     >
 
     <!-- drawer handle imagebutton -->
@@ -36,7 +35,7 @@
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:src="@drawable/ic_dialpad_tray"
-        android:background="@drawable/tray_handle_normal"/>
+        android:background="@drawable/tray_handle"/>
 
     <!-- drawer content dialer view -->
     <com.android.phone.DTMFTwelveKeyDialerView
@@ -73,4 +72,4 @@
 
     </com.android.phone.DTMFTwelveKeyDialerView>
 
-</com.android.internal.widget.SlidingDrawer>
+</SlidingDrawer>
diff --git a/res/layout/dialer.xml b/res/layout/dialer.xml
deleted file mode 100644 (file)
index 726a8e8..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/dialerRoot"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical">
-
-<!--
-    <ViewSwitcher android:id="@+id/switcher"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:background="@android:drawable/screen_title_background_dark">
--->
-
-        <LinearLayout android:id="@+id/inputArea"
-            android:layout_width="fill_parent"
-            android:layout_height="80dip"
-            android:orientation="vertical"
-            android:padding="0dip"
-                       android:visibility="gone"
-            android:background="@*android:drawable/title_bar">
-
-            <DialerFilter android:id="@android:id/input"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="5dip"
-                android:layout_marginLeft="7dip"
-                android:layout_marginRight="5dip"
-                android:background="@drawable/lcd_background_stateful">
-
-                <EditText android:id="@android:id/hint"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:textSize="14sp"
-                    android:textStyle="bold"
-                    android:background="@null"
-                    android:autoText="false"
-                    android:capitalize="none"/>
-
-                <EditText android:id="@android:id/primary"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_below="@android:id/hint"
-                    android:textSize="24sp"
-                    android:background="@null"
-                    android:autoText="false"
-                    android:capitalize="none"/>
-
-                <ImageView android:id="@android:id/icon"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentRight="true"
-                    android:layout_centerVertical="true"
-                    android:src="@android:drawable/sym_action_call"/>
-            </DialerFilter>
-        </LinearLayout>
-
-        <TextView android:id="@+id/title"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/contactsIconLabel"
-            style="@*android:style/WindowTitle"
-            android:background="@*android:drawable/title_bar"
-            android:visibility="gone" />
-<!--
-    </ViewSwitcher>
--->
-
-    <ListView android:id="@android:id/list"
-        android:paddingTop="2dip"
-        android:layout_width="fill_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1"
-        android:drawSelectorOnTop="false" />
-
-    <TextView android:id="@android:id/empty"
-        android:layout_width="fill_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1"
-        android:visibility="gone"
-        android:paddingLeft="20dip"
-        android:paddingTop="5dip"
-        android:text="@string/dialer_emptyListWorking"
-        android:textSize="15sp"
-        android:textColor="#555555" />
-</LinearLayout>
index 127f404..81f5cc1 100644 (file)
                 android:layout_width="fill_parent"
                 android:layout_height="wrap_content"
                 android:gravity="center_vertical"
-                android:background="@drawable/dark_header_dithered"
+                android:background="@android:drawable/dark_header"
                 android:textColor="?android:attr/textColorSecondary"
                 android:textStyle="bold"
                 android:textSize="14sp"
             android:layout_height="54dip"
             android:gravity="center_vertical"
             android:layout_alignParentBottom="true"
-            android:background="@drawable/dark_header_dithered"/>
+            android:background="@android:drawable/dark_header"/>
 
         <!-- The "Back to call" button -->
         <Button android:id="@+id/manage_done"
 
     </RelativeLayout>  <!-- End of manageConferencePanel -->
 
-    <!-- The sliding drawer control containing the DTMF dialer.
+    <!-- The sliding drawer control containing the DTMF dialpad.
          Note this isn't a child of mainFrame, which ensures that it'll be
          able to use the full width of the screen.  (And a SlidingDrawer
          widget needs to be be a direct child of a FrameLayout anyway.)
          just an empty layout.-->
     <include layout="@layout/dtmf_twelve_key_dialer"/>
 
+    <!-- Finally, the "touch lock" overlay, drawn on top of the DTMF
+         dialpad (after some delay) to prevent false touches from
+         triggering DTMF tones.  (When the overlay is up, you need to
+         double-tap the "lock" icon to unlock the dialpad.) -->
+    <RelativeLayout android:id="@+id/touchLockOverlay"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:visibility="gone"
+        android:background="#8000"
+        >
+        <!-- Layout note: we could use android:layout_centerInParent="true"
+             here to center the lock icon exactly in the middle of the screen.
+             But it actually looks better to have the lock roughly in the
+             middle of the dialpad key area, so instead we position it a
+             fixed distance from the bottom of the screen. -->
+        <TextView android:id="@+id/touchLockIcon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="70dip"
+            android:text="@string/touchLockText"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:background="@drawable/dialpad_lock"
+            />
+    </RelativeLayout>
+
 </FrameLayout>
diff --git a/res/layout/query_activity.xml b/res/layout/query_activity.xml
deleted file mode 100644 (file)
index 93cfbab..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1">
-    <requestFocus/>
-    <EditText android:id="@+id/digit_entry"
-        android:paddingLeft="10dip" android:paddingRight="10dip"
-        android:paddingTop="2dip" android:paddingBottom="10dip"
-        android:textSize="28sp" android:textStyle="bold" android:textColor="#FF1D8047"
-        android:autoText="false"
-        android:capitalize="none"
-        android:layout_width="fill_parent" android:layout_height="wrap_content"
-        android:layout_marginTop="13dip" android:layout_marginBottom="5dip">
-    </EditText>
-</ListView>
diff --git a/res/layout/single_line_icon_list_item.xml b/res/layout/single_line_icon_list_item.xml
deleted file mode 100644 (file)
index 7b40bf8..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:paddingTop="2dip"
-    android:paddingBottom="2dip"
-    android:paddingLeft="2dip"
-    android:orientation="horizontal">
-
-    <ImageView android:id="@+id/icon"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:src="@android:drawable/sym_contact_card"/>
-
-    <TextView android:id="@android:id/text1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textSize="15sp"
-        android:textStyle="bold"/>
-</LinearLayout>
index b250a55..bf23f3c 100644 (file)
     <string name="labelCFU">"Přesměrovat vždy"</string>
     <string name="messageCFU">"Vždy používat toto číslo"</string>
     <string name="sum_cfu_enabled_indicator">"Všechny hovory budou přesměrovány"</string>
-    <string name="sum_cfu_enabled">"Všechny hovory budou přesměrovány na \\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"Všechny hovory budou přesměrovány na {0}"</string>
     <string name="sum_cfu_disabled">"Vypnuto"</string>
     <string name="labelCFB">"Přesměrovat, je-li obsazeno"</string>
     <string name="messageCFB">"Číslo při obsazené lince"</string>
     <string name="roaming_reenable_message">"Připojení datových služeb bylo přerušeno, protože jste opustili domovskou síť a datové služby při roamingu máte vypnuty."</string>
     <string name="roaming_turn_it_on_button">"Zapnout"</string>
     <string name="roaming_warning">"Opravdu chcete povolit datové služby při roamingu? Vystavujete se nebezpečí vysokých poplatků."</string>
-    <string name="roaming_reenable_title">"Upozornění"</string>
     <string name="prefer_2g">"Používat pouze sítě 2G"</string>
     <string name="prefer_2g_summary">"Šetří baterii"</string>
     <string name="fdn">"Povolená telefonní čísla"</string>
     <string name="sum_fdn">"Umožňuje spravovat povolená telefonní čísla"</string>
     <string name="sum_fdn_change_pin">"Umožňuje změnit kód PIN pro přístup k povoleným telefonním číslům"</string>
     <string name="sum_fdn_manage_list">"Správa telefonního seznamu"</string>
-    <string name="open_keyboard">"Otevřete klávesnici a zadejte údaje."</string>
     <string name="menu_add">"Přidat kontakt"</string>
     <string name="menu_edit">"Upravit kontakt"</string>
     <string name="menu_delete">"Smazat kontakt"</string>
     <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="importSimEntry">"Importovat"</string>
     <string name="importAllSimEntries">"Importovat vše"</string>
     <string name="importingSimContacts">"Importování kontaktů z karty SIM"</string>
index db8db84..ec6ad07 100644 (file)
@@ -45,8 +45,8 @@
     <string name="menu_mute">"Ton aus"</string>
     <string name="menu_hold">"Halten"</string>
     <string name="menu_endCall">"Beenden"</string>
-    <string name="menu_swapCalls">"Tauschen"</string>
-    <string name="menu_mergeCalls">"Verbinden"</string>
+    <string name="menu_swapCalls">"Wechseln"</string>
+    <string name="menu_mergeCalls">"Konferenz"</string>
     <string name="menu_addCall">"Hinzufügen"</string>
     <string name="menu_manageConference">"Telefonkonferenz verwalten"</string>
     <string name="menu_showDialpad">"Telefontasten zeigen"</string>
     <string name="labelCFU">"Immer weiterleiten"</string>
     <string name="messageCFU">"Diese Nummer immer verwenden"</string>
     <string name="sum_cfu_enabled_indicator">"Alle Anrufe weiterleiten"</string>
-    <string name="sum_cfu_enabled">"Alle Anrufe weiterleiten an \\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"Alle Anrufe weiterleiten an {0}"</string>
     <string name="sum_cfu_disabled">"Deaktiviert"</string>
     <string name="labelCFB">"Weiterleiten falls besetzt"</string>
     <string name="messageCFB">"Nummer falls besetzt"</string>
-    <string name="sum_cfb_enabled">"Weiterleitung an \\\\{0\\\\}"</string>
+    <string name="sum_cfb_enabled">"Weiterleitung an {0}"</string>
     <string name="sum_cfb_disabled">"Deaktiviert"</string>
     <string name="labelCFNRy">"Weiterleiten falls keine Antwort"</string>
     <string name="messageCFNRy">"Nummer falls keine Antwort"</string>
-    <string name="sum_cfnry_enabled">"Weiterleitung an \\\\{0\\\\}"</string>
+    <string name="sum_cfnry_enabled">"Weiterleitung an {0}"</string>
     <string name="sum_cfnry_disabled">"Deaktiviert"</string>
     <string name="labelCFNRc">"Weiterleiten falls nicht erreichbar"</string>
     <string name="messageCFNRc">"Nummer falls nicht erreichbar"</string>
-    <string name="sum_cfnrc_enabled">"Weiterleitung an \\\\{0\\\\}"</string>
+    <string name="sum_cfnrc_enabled">"Weiterleitung an {0}"</string>
     <string name="sum_cfnrc_disabled">"Deaktiviert"</string>
     <string name="updating_title">"Anrufeinstellungen"</string>
     <string name="error_updating_title">"Fehler bei Anrufeinstellungen"</string>
     <string name="roaming_reenable_message">"Die Datenkonnektivität wurde unterbrochen, da Sie Ihr Heimnetzwerk verlassen haben und Daten-Roaming nicht aktiviert ist."</string>
     <string name="roaming_turn_it_on_button">"Einschalten"</string>
     <string name="roaming_warning">"Daten-Roaming zulassen? Es können beträchtliche Roaming-Gebühren anfallen!"</string>
-    <string name="roaming_reenable_title">"Vorsicht"</string>
     <string name="prefer_2g">"Nur 2G-Netzwerke"</string>
     <string name="prefer_2g_summary">"Energiesparend"</string>
     <string name="fdn">"Beschränkte Rufnummern"</string>
     <string name="sum_fdn">"Beschränkte Rufnummern verwalten"</string>
     <string name="sum_fdn_change_pin">"PIN für Zugang zu eingeschränkten Nummern ändern"</string>
     <string name="sum_fdn_manage_list">"Telefonnummernliste verwalten"</string>
-    <string name="open_keyboard">"Öffnen Sie für die Eingabe die Tastatur."</string>
     <string name="menu_add">"Kontakt hinzufügen"</string>
     <string name="menu_edit">"Kontakt bearbeiten"</string>
     <string name="menu_delete">"Kontakt löschen"</string>
     <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="importSimEntry">"Importieren"</string>
     <string name="importAllSimEntries">"Alle importieren"</string>
     <string name="importingSimContacts">"SIM-Kontakte werden importiert"</string>
index 549c0cf..5125802 100644 (file)
     <string name="labelCFU">"Desviar siempre"</string>
     <string name="messageCFU">"Utilizar siempre este número"</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_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="messageCFB">"Número cuando la línea esté ocupada"</string>
     <string name="roaming_reenable_message">"Has perdido la conectividad de datos porque has dejado desactivada la itinerancia de datos de tu red doméstica."</string>
     <string name="roaming_turn_it_on_button">"Activarla"</string>
     <string name="roaming_warning">"¿Permitir itinerancia de datos? Los costes de itinerancia que deberás asumir pueden ser significativos."</string>
-    <string name="roaming_reenable_title">"Atención"</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="sum_fdn">"Administrar números de marcación fija"</string>
     <string name="sum_fdn_change_pin">"Cambiar PIN para acceso de FDN"</string>
     <string name="sum_fdn_manage_list">"Administrar lista de números de teléfono"</string>
-    <string name="open_keyboard">"Abrir teclado para escribir"</string>
     <string name="menu_add">"Añadir contacto"</string>
     <string name="menu_edit">"Editar contacto"</string>
     <string name="menu_delete">"Eliminar contacto"</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="importSimEntry">"Importar"</string>
     <string name="importAllSimEntries">"Importar todos"</string>
     <string name="importingSimContacts">"Importando contactos de tarjeta SIM..."</string>
index e7ce3b7..ebc9a48 100644 (file)
     <string name="labelCFU">"Toujours transférer"</string>
     <string name="messageCFU">"Toujours utiliser ce numéro"</string>
     <string name="sum_cfu_enabled_indicator">"Transfert de tous les appels"</string>
-    <string name="sum_cfu_enabled">"Transfert de tous les appels à \\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"Transfert de tous les appels à {0}"</string>
     <string name="sum_cfu_disabled">"Désactivé"</string>
     <string name="labelCFB">"Transférer quand la ligne est occupée"</string>
     <string name="messageCFB">"Numéro de renvoi lorsque la ligne est occupée"</string>
     <string name="roaming_reenable_message">"Vous avez été déconnecté car vous avez quitté votre réseau alors que l\'itinérance des données était désactivée."</string>
     <string name="roaming_turn_it_on_button">"Activer"</string>
     <string name="roaming_warning">"Autoriser l\'itinérance des données ? Des frais d\'itinérance importants peuvent s\'appliquer !"</string>
-    <string name="roaming_reenable_title">"Attention"</string>
     <string name="prefer_2g">"Utiliser uniquement les réseaux 2G"</string>
     <string name="prefer_2g_summary">"Économise la batterie"</string>
     <string name="fdn">"Numérotation fixe"</string>
     <string name="sum_fdn">"Gérer la numérotation fixe"</string>
     <string name="sum_fdn_change_pin">"Modifier le code PIN pour l\'accès à la numérotation fixe"</string>
     <string name="sum_fdn_manage_list">"Gérer la liste des numéros de téléphone"</string>
-    <string name="open_keyboard">"Ouvrez le clavier pour saisir le numéro ou le code."</string>
     <string name="menu_add">"Ajouter un contact"</string>
     <string name="menu_edit">"Modifier le contact"</string>
     <string name="menu_delete">"Supprimer le contact"</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="importSimEntry">"Importer"</string>
     <string name="importAllSimEntries">"Tout importer"</string>
     <string name="importingSimContacts">"Importation des contacts SIM"</string>
index 2721672..e815c31 100644 (file)
     <string name="labelCFU">"Devia sempre"</string>
     <string name="messageCFU">"Usa sempre questo numero"</string>
     <string name="sum_cfu_enabled_indicator">"Deviazione di tutte le chiamate"</string>
-    <string name="sum_cfu_enabled">"Deviazione di tutte le chiamate al numero \\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"Deviazione di tutte le chiamate al numero {0}"</string>
     <string name="sum_cfu_disabled">"Disattivato"</string>
     <string name="labelCFB">"Devia se occupato"</string>
     <string name="messageCFB">"Numero se occupato"</string>
     <string name="roaming_reenable_message">"Connettività dati persa: hai lasciato la rete del tuo operatore con il roaming dati disattivato."</string>
     <string name="roaming_turn_it_on_button">"Attiva"</string>
     <string name="roaming_warning">"Consenti il roaming dati? I costi potrebbero essere elevati."</string>
-    <string name="roaming_reenable_title">"Attenzione"</string>
     <string name="prefer_2g">"Usa solo reti 2G"</string>
     <string name="prefer_2g_summary">"Risparmia batteria"</string>
     <string name="fdn">"Numeri di selezione fissa"</string>
     <string name="sum_fdn">"Gestisci numeri di selezione fissa"</string>
     <string name="sum_fdn_change_pin">"Cambia PIN per accesso FDN"</string>
     <string name="sum_fdn_manage_list">"Gestisci elenco numeri"</string>
-    <string name="open_keyboard">"Apri la tastiera per digitare."</string>
     <string name="menu_add">"Aggiungi contatto"</string>
     <string name="menu_edit">"Modifica contatto"</string>
     <string name="menu_delete">"Elimina contatto"</string>
     <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="importSimEntry">"Importa"</string>
     <string name="importAllSimEntries">"Importa tutti"</string>
     <string name="importingSimContacts">"Importazione contatti SIM"</string>
index 2a00f87..e80d618 100644 (file)
     <string name="labelCFU">"常に転送"</string>
     <string name="messageCFU">"常にこの番号を使用"</string>
     <string name="sum_cfu_enabled_indicator">"電話をすべて転送する"</string>
-    <string name="sum_cfu_enabled">"電話をすべて\\\\{0\\\\}に転送する"</string>
+    <string name="sum_cfu_enabled">"電話をすべて{0}に転送する"</string>
     <string name="sum_cfu_disabled">"無効"</string>
     <string name="labelCFB">"通話時に転送"</string>
     <string name="messageCFB">"通話時の転送番号"</string>
     <string name="roaming_reenable_message">"データローミングをオフにしてホームネットワークを離れたため、データ接続が切断されました。"</string>
     <string name="roaming_turn_it_on_button">"オンにする"</string>
     <string name="roaming_warning">"データローミングを許可すると、ローミング料金が発生する場合があります。"</string>
-    <string name="roaming_reenable_title">"注意"</string>
     <string name="prefer_2g">"2Gネットワークのみ使用"</string>
     <string name="prefer_2g_summary">"バッテリ消費を抑える"</string>
     <string name="fdn">"発信番号制限"</string>
     <string name="sum_fdn">"発信番号制限の管理"</string>
     <string name="sum_fdn_change_pin">"FDNアクセス用のPINを変更"</string>
     <string name="sum_fdn_manage_list">"電話番号リストを管理"</string>
-    <string name="open_keyboard">"キーボードを表示して入力します。"</string>
     <string name="menu_add">"連絡先を追加"</string>
     <string name="menu_edit">"連絡先を編集"</string>
     <string name="menu_delete">"連絡先を削除"</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="importSimEntry">"インポート"</string>
     <string name="importAllSimEntries">"すべてインポート"</string>
     <string name="importingSimContacts">"SIMの連絡先をインポート中"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
new file mode 100644 (file)
index 0000000..2ea4589
--- /dev/null
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="contactsIconLabel">"연락처"</string>
+    <string name="contactsFavoritesLabel">"자주 거는 전화"</string>
+    <string name="dialerIconLabel">"전화걸기"</string>
+    <string name="emergencyDialerIconLabel">"비상 전화걸기"</string>
+    <string name="phoneIconLabel">"전화"</string>
+    <string name="recentCallsIconLabel">"통화기록"</string>
+    <string name="fdnListLabel">"FDN 목록"</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_limitExceeded">"ACM 제한을 초과했습니다."</string>
+    <string name="callFailed_powerOff">"무선 연결 끊김"</string>
+    <string name="callFailed_simError">"SIM이 없거나 SIM 오류입니다."</string>
+    <string name="callFailed_outOfService">"서비스 지역을 벗어났습니다."</string>
+    <string name="callFailed_fdn_only">"발신전화가 FDN으로 제한됩니다."</string>
+    <string name="callFailed_cb_enabled">"착발신 제한이 설정되어 있는 동안에는 전화를 걸 수 없습니다."</string>
+    <string name="confCall">"다자간 통화"</string>
+    <string name="mmiStarted">"MMI 코드 시작됨"</string>
+    <string name="ussdRunning">"USSD 코드 실행 중..."</string>
+    <string name="mmiCancelled">"MMI 코드 취소됨"</string>
+    <string name="cancel">"취소"</string>
+    <string name="menu_speaker">"스피커"</string>
+    <string name="menu_bluetooth">"Bluetooth"</string>
+    <string name="menu_mute">"음소거"</string>
+    <string name="menu_hold">"보류"</string>
+    <string name="menu_endCall">"통화종료"</string>
+    <string name="menu_swapCalls">"통화 교환"</string>
+    <string name="menu_mergeCalls">"통화 병합"</string>
+    <string name="menu_addCall">"통화 추가"</string>
+    <string name="menu_manageConference">"다자간 통화 관리"</string>
+    <string name="menu_showDialpad">"다이얼패드 표시"</string>
+    <string name="menu_hideDialpad">"다이얼패드 숨기기"</string>
+    <string name="menu_answerAndHold">"현재 통화를 보류하고"\n" 전화받기"</string>
+    <string name="menu_answerAndEnd">"현재 통화를 끊고"\n" 전화받기"</string>
+    <string name="ok">"확인"</string>
+    <string name="menuButtonHint">"통화 옵션을 보려면 메뉴를 누르세요."</string>
+    <string name="menuButtonKeyboardDialHint">"통화 옵션을 보려면 메뉴를 누르세요.  •  키보드를 사용하여 전화걸기"</string>
+    <string name="wait_prompt_str">"다음 톤을 보내시겠습니까?"\n</string>
+    <string name="send_button">"보내기"</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_msg">"SIM 카드에 저장된 음성메일 번호가 없습니다."</string>
+    <string name="add_vm_number_str">"번호 추가"</string>
+    <string name="dialer_emptyListWorking">"로드 중..."</string>
+    <string name="enterPin">"SIM 카드 잠금해제를 위해 PIN 코드 입력"</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="enterPuk">"SIM 카드 잠금해제를 위해 PUK 코드 입력"</string>
+    <string name="badPuk">"PUK 코드가 잘못되었습니다."</string>
+    <string name="buttonTxtContinue">"계속"</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_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="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="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="labelCW">"통화중 대기"</string>
+    <string name="sum_cw_enabled">"통화 중 수신 전화 알림"</string>
+    <string name="sum_cw_disabled">"통화 중 수신 전화 알림"</string>
+    <string name="call_forwarding_settings">"착신전환 설정"</string>
+    <string name="labelCF">"착신전환"</string>
+    <string name="labelCFU">"항상 착신전환"</string>
+    <string name="messageCFU">"항상 이 번호 사용"</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="sum_cfb_enabled">"\\\\{0\\\\}(으)로 착신전환"</string>
+    <string name="sum_cfb_disabled">"사용 안 함"</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="sum_cfnrc_enabled">"\\\\{0\\\\}(으)로 착신전환"</string>
+    <string name="sum_cfnrc_disabled">"사용 안 함"</string>
+    <string name="updating_title">"통화 설정"</string>
+    <string name="error_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="radio_off_error">"설정을 보려면 먼저 무선을 켜야 합니다."</string>
+    <string name="close_dialog">"확인"</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>
+  </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="mobile_networks">"모바일 네트워크 설정"</string>
+    <string name="label_available">"사용가능한 네트워크"</string>
+    <string name="load_networks_progress">"검색 중..."</string>
+    <string name="empty_networks_list">"네트워크를 찾을 수 없음"</string>
+    <string name="search_networks">"네트워크 검색"</string>
+    <string name="network_query_error">"네트워크를 검색하는 동안 오류가 발생했습니다."</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_search_networks">"사용가능한 모든 네트워크 검색"</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_warning">"데이터 로밍을 허용하시겠습니까? 많은 로밍 요금이 부과될 수 있습니다."</string>
+    <string name="prefer_2g">"2G 네트워크만 사용"</string>
+    <string name="prefer_2g_summary">"배터리 절약"</string>
+    <string name="fdn">"FDN(전화걸 수 있는 번호)"</string>
+    <string name="manage_fdn_list">"FDN 목록"</string>
+    <string name="fdn_activation">"FDN 활성화"</string>
+    <string name="fdn_enabled">"FDN(전화걸 수 있는 번호) 사용"</string>
+    <string name="fdn_disabled">"FDN(전화걸 수 있는 번호) 사용 안 함"</string>
+    <string name="enable_fdn">"FDN 사용"</string>
+    <string name="disable_fdn">"FDN 사용 안 함"</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">"FDN(전화걸 수 있는 번호) 관리"</string>
+    <string name="sum_fdn_change_pin">"FDN 액세스를 위한 PIN 변경"</string>
+    <string name="sum_fdn_manage_list">"전화번호 목록 관리"</string>
+    <string name="menu_add">"연락처 추가"</string>
+    <string name="menu_edit">"연락처 편집"</string>
+    <string name="menu_delete">"연락처 삭제"</string>
+    <string name="get_pin2">"PIN2 입력"</string>
+    <string name="name">"이름"</string>
+    <string name="number">"번호"</string>
+    <string name="save">"저장"</string>
+    <string name="add_fdn_contact">"FDN 연락처 추가"</string>
+    <string name="adding_fdn_contact">"FDN 연락처 추가 중..."</string>
+    <string name="fdn_contact_added">"FDN 연락처 추가됨"</string>
+    <string name="edit_fdn_contact">"FDN 연락처 편집"</string>
+    <string name="updating_fdn_contact">"FDN 연락처 업데이트 중..."</string>
+    <string name="fdn_contact_updated">"FDN 연락처 업데이트됨"</string>
+    <string name="delete_fdn_contact">"FDN 연락처 삭제"</string>
+    <string name="deleting_fdn_contact">"FDN 연락처 삭제 중..."</string>
+    <string name="fdn_contact_deleted">"FDN 연락처 삭제됨"</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="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="invalidPin">"4~8자리 숫자로 된 PIN을 입력하세요."</string>
+    <string name="disable_sim_pin">"SIM PIN 사용 안 함"</string>
+    <string name="enable_sim_pin">"SIM PIN 사용"</string>
+    <string name="enable_in_progress">"잠시 기다려 주세요..."</string>
+    <string name="enable_pin_ok">"SIM PIN 사용"</string>
+    <string name="disable_pin_ok">"SIM PIN 사용 안 함"</string>
+    <string name="pin_failed">"입력한 PIN이 올바르지 않습니다."</string>
+    <string name="pin_changed">"SIM PIN 변경됨"</string>
+    <string name="puk_requested">"비밀번호 틀림. SIM 잠겨 있음! PUK2 요청됨."</string>
+    <string name="enter_pin2_text">"PIN2"</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="invalidPin2">"4~8자리 숫자로 된 PIN2를 입력하세요."</string>
+    <string name="invalidPuk2">"8자리 숫자로 된 PUK2를 입력하세요."</string>
+    <string name="pin2_changed">"PIN2 변경됨"</string>
+    <string name="label_puk2_code">"PUK2 코드 입력"</string>
+    <string name="fdn_enable_puk2_requested">"비밀번호 틀림. PIN2를 변경한 후 다시 시도하세요."</string>
+    <string name="puk2_requested">"비밀번호 틀림. SIM 잠겨 있음! PUK2 요청됨."</string>
+    <string name="doneButton">"완료"</string>
+    <string name="caller_manage_header">"다자간 통화 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+    <string name="caller_manage_manage_done_text">"통화로 돌아가기"</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_status_text">"PIN을 인증하는 중..."</string>
+    <string name="voicemail_settings_number_label">"음성메일 번호"</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="card_title_call_ended">"통화종료됨"</string>
+    <string name="card_title_on_hold">"대기 중"</string>
+    <string name="card_title_hanging_up">"전화 끊는 중"</string>
+    <string name="notification_missedCallTitle">"부재중 전화"</string>
+    <string name="notification_missedCallsTitle">"부재중 전화"</string>
+    <string name="notification_missedCallsMsg">"부재중 전화 <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>통"</string>
+    <string name="notification_missedCallTicker">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>의 부재중 전화"</string>
+    <string name="notification_ongoing_call_format">"현재 통화(<xliff:g id="DURATION">%s</xliff:g>)"</string>
+    <string name="notification_on_hold">"대기 중"</string>
+    <string name="notification_voicemail_title">"새 음성메일"</string>
+    <string name="notification_voicemail_text_format">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>(으)로 전화걸기"</string>
+    <string name="notification_voicemail_no_vm_number">"음성메일 번호 알 수 없음"</string>
+    <string name="incall_error_power_off">"전화를 걸려면 먼저 에어플레인 모드를 끄세요."</string>
+    <string name="incall_error_emergency_only">"네트워크에 등록되지 않았습니다."</string>
+    <string name="incall_error_no_phone_number_supplied">"전화를 걸지 못했습니다. 입력한 번호가 잘못되었습니다."</string>
+    <string name="incall_error_call_failed">"전화를 걸지 못했습니다."</string>
+    <string name="incall_status_dialed_mmi">"MMI 시퀀스 시작 중..."</string>
+    <string name="incall_error_supp_service_unknown">"지원되지 않는 서비스입니다."</string>
+    <string name="incall_error_supp_service_switch">"통화를 전환할 수 없습니다."</string>
+    <string name="incall_error_supp_service_separate">"통화를 분리할 수 없습니다."</string>
+    <string name="incall_error_supp_service_transfer">"전화를 돌릴 수 없습니다."</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_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="dtmfDialpadHintText">"터치 톤 키패드"</string>
+    <!-- no translation found for touchLockText (566824588267376287) -->
+    <skip />
+    <string name="importSimEntry">"가져오기"</string>
+    <string name="importAllSimEntries">"모두 가져오기"</string>
+    <string name="importingSimContacts">"SIM 연락처 가져오는 중"</string>
+    <string name="importToFDNfromContacts">"연락처에서 가져오기"</string>
+</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
new file mode 100644 (file)
index 0000000..a03dca5
--- /dev/null
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="contactsIconLabel">"Kontakter"</string>
+    <string name="contactsFavoritesLabel">"Favoritter"</string>
+    <string name="dialerIconLabel">"Telefon"</string>
+    <string name="emergencyDialerIconLabel">"Nødnummer"</string>
+    <string name="phoneIconLabel">"Telefon"</string>
+    <string name="recentCallsIconLabel">"Logg"</string>
+    <string name="fdnListLabel">"Faste nummer"</string>
+    <string name="unknown">"Ukjent"</string>
+    <string name="private_num">"Hemmelig nummer"</string>
+    <string name="onHold">"Parkert"</string>
+    <string name="ongoing">"Aktiv samtale"</string>
+    <string name="callFailed_userBusy">"Opptatt"</string>
+    <string name="callFailed_congestion">"Nettverket er opptatt"</string>
+    <string name="callFailed_noSignal">"Mangler signal"</string>
+    <string name="callFailed_limitExceeded">"ACM-grense nådd"</string>
+    <string name="callFailed_powerOff">"Radioen er av"</string>
+    <string name="callFailed_simError">"Mangler SIM-kort, eller SIM-feil"</string>
+    <string name="callFailed_outOfService">"Utenfor dekningsområde"</string>
+    <string name="callFailed_fdn_only">"Utgående samtaler er begrenset til faste nummer."</string>
+    <string name="callFailed_cb_enabled">"Du kan ikke ringe ut mens samtaleblokkering er på."</string>
+    <string name="confCall">"Telefonmøte"</string>
+    <string name="mmiStarted">"MMI-kode påbegynt"</string>
+    <string name="ussdRunning">"USSD-kode kjører…"</string>
+    <string name="mmiCancelled">"MMI-kode avbrutt"</string>
+    <string name="cancel">"Avbrutt"</string>
+    <string name="menu_speaker">"Høyttaler"</string>
+    <string name="menu_bluetooth">"Bluetooth"</string>
+    <string name="menu_mute">"Demp"</string>
+    <string name="menu_hold">"Parker"</string>
+    <string name="menu_endCall">"Avslutt samtale"</string>
+    <string name="menu_swapCalls">"Bytt samtale"</string>
+    <string name="menu_mergeCalls">"Slå sammen samtaler"</string>
+    <string name="menu_addCall">"Legg til samtale"</string>
+    <string name="menu_manageConference">"Styr telefonmøte"</string>
+    <string name="menu_showDialpad">"Vis talltastatur"</string>
+    <string name="menu_hideDialpad">"Skjul talltastatur"</string>
+    <string name="menu_answerAndHold">"Parker denne samtalen"\n"og svar"</string>
+    <string name="menu_answerAndEnd">"Avslutt denne samtalen"\n"og svar"</string>
+    <string name="ok">"OK"</string>
+    <string name="menuButtonHint">"Trykk menyknappen for samtalevalg."</string>
+    <string name="menuButtonKeyboardDialHint">"Trykk menyknappen for samtalevalg  •  Bruk tastaturet for å ringe"</string>
+    <string name="wait_prompt_str">"Send disse tonene?"\n</string>
+    <string name="send_button">"Send"</string>
+    <string name="wild_prompt_str">"Erstatt jokertegnet med"</string>
+    <string name="bluetooth_headset_connected">"Bluetooth-høretelefoner tilkoblet."</string>
+    <string name="bluetooth_headset_disconnected">"Bluetooth-høretelefoner frakoblet."</string>
+    <string name="no_vm_number">"Mangler nummer til telefonsvarer"</string>
+    <string name="no_vm_number_msg">"Det er ikke lagret noe telefonsvarernummer på SIM-kortet."</string>
+    <string name="add_vm_number_str">"Legg til nummer"</string>
+    <string name="dialer_emptyListWorking">"Laster…"</string>
+    <string name="enterPin">"Skriv inn PIN-kode for å låse opp SIM-kortet."</string>
+    <string name="pinUnlocked">"SIM-kort låst opp"</string>
+    <string name="enterNewPin">"Ny PIN-kode for SIM-kort"</string>
+    <string name="verifyNewPin">"Skriv SIM-koden igjen for å bekrefte"</string>
+    <string name="verifyFailed">"PIN-kodene du skrev inn stemmer ikke overens. Prøv igjen."</string>
+    <string name="enterPuk">"Skriv inn PUK-kode for å låse opp SIM-kortet"</string>
+    <string name="badPuk">"Gal PUK-kode!"</string>
+    <string name="buttonTxtContinue">"Fortsett"</string>
+    <string name="puk_unlocked">"SIM-kortet er blitt avblokkert. Telefonen låses opp…"</string>
+    <string name="label_ndp">"PIN-kode for å fjerne operatørlås"</string>
+    <string name="sim_ndp_unlock_text">"Lås opp"</string>
+    <string name="sim_ndp_dismiss_text">"Skjul"</string>
+    <string name="requesting_unlock">"Spør om fjerning av operatørlås…"</string>
+    <string name="unlock_failed">"Fikk ikke fjerne operatørlås."</string>
+    <string name="unlock_success">"Operatørlåsen er fjernet."</string>
+    <string name="imei">"IMEI"</string>
+    <string name="labelMore">"Flere innstillinger"</string>
+    <string name="apn_settings">"Navn på aksesspunkt"</string>
+    <string name="settings_label">"Nettverksinnstillinger"</string>
+    <string name="voicemail">"Telefonsvarer"</string>
+    <string name="voicemail_abbreviated">"Svarer:"</string>
+    <string name="networks">"Nettoperatører"</string>
+    <string name="call_settings">"Samtaleinnstillinger"</string>
+    <string name="additional_call_settings">"Flere innstillinger"</string>
+    <string name="labelCallerId">"Nummervisning"</string>
+    <string name="sum_hide_caller_id">"Skjul nummer ved utgående samtaler"</string>
+    <string name="sum_show_caller_id">"Vis nummer ved utgående samtaler"</string>
+    <string name="sum_default_caller_id">"La operatøren bestemme om nummeret vises ved utgående samtaler"</string>
+    <string name="labelCW">"Samtale venter"</string>
+    <string name="sum_cw_enabled">"Under samtaler, varsle om innkommende anrop"</string>
+    <string name="sum_cw_disabled">"Under samtaler, ikke varsle om innkommende anrop"</string>
+    <string name="call_forwarding_settings">"Innstillinger for viderekobling"</string>
+    <string name="labelCF">"Viderekobling"</string>
+    <string name="labelCFU">"Alltid viderekoble"</string>
+    <string name="messageCFU">"Alltid bruk dette nummeret"</string>
+    <string name="sum_cfu_enabled_indicator">"Viderekoble alle anrop"</string>
+    <string name="sum_cfu_enabled">"Viderekoble alle anrop til {0}"</string>
+    <string name="sum_cfu_disabled">"Deaktivert"</string>
+    <string name="labelCFB">"Viderekoble når opptatt"</string>
+    <string name="messageCFB">"Nummer ved opptattsignal"</string>
+    <string name="sum_cfb_enabled">"Viderekoble til {0}"</string>
+    <string name="sum_cfb_disabled">"Deaktivert"</string>
+    <string name="labelCFNRy">"Viderekoble når det ikke svares"</string>
+    <string name="messageCFNRy">"Nummer for når det ikke svares"</string>
+    <string name="sum_cfnry_enabled">"Viderekobler til {0}"</string>
+    <string name="sum_cfnry_disabled">"Deaktivert"</string>
+    <string name="labelCFNRc">"Viderekoble ved manglende dekning"</string>
+    <string name="messageCFNRc">"Nummer ved manglende dekning"</string>
+    <string name="sum_cfnrc_enabled">"Viderekobler til {0}"</string>
+    <string name="sum_cfnrc_disabled">"Deaktivert"</string>
+    <string name="updating_title">"Samtaleinnstillinger"</string>
+    <string name="error_updating_title">"Feil ved samtaleinnstillinger"</string>
+    <string name="reading_settings">"Leser innstillinger…"</string>
+    <string name="updating_settings">"Oppdaterer innstillinger…"</string>
+    <string name="response_error">"Uventet svar fra nettverket,"</string>
+    <string name="exception_error">"Nettverks- eller SIM-kort-feil."</string>
+    <string name="radio_off_error">"Slå på radioen før du ser på disse innstillingene."</string>
+    <string name="close_dialog">"OK"</string>
+    <string name="enable">"Aktiver"</string>
+    <string name="disable">"Deaktiver"</string>
+    <string name="change_num">"Oppdater"</string>
+  <string-array name="clir_display_values">
+    <item>"Nettverksstandard"</item>
+    <item>"Skjul nummer"</item>
+    <item>"Vis nummer"</item>
+  </string-array>
+    <string name="vm_save_number">"Lagre nummer til telefonsvarer"</string>
+    <string name="vm_changed">"Telefonsvarernummeret ble endret."</string>
+    <string name="vm_change_failed">"Kunne ikke endre telefonsvarernummeret."</string>
+    <string name="no_change">"Ingen endringer ble utført."</string>
+    <string name="sum_voicemail">"Velg telefonsvarernummer"</string>
+    <string name="mobile_networks">"Innstillinger for mobilt nettverk"</string>
+    <string name="label_available">"Tilgjengelige nettverk"</string>
+    <string name="load_networks_progress">"Søker…"</string>
+    <string name="empty_networks_list">"Fant ingen nettverk."</string>
+    <string name="search_networks">"Søk etter nettverk"</string>
+    <string name="network_query_error">"Det oppsto en feil under søking etter nettverk."</string>
+    <string name="register_on_network">"Kobler til <xliff:g id="NETWORK">%s</xliff:g>…"</string>
+    <string name="not_allowed">"SIM-kortet tillater ikke tilkobling til dette nettverket."</string>
+    <string name="registration_done">"Registrert i nettverket."</string>
+    <string name="sum_carrier_select">"Velg en nettoperatør"</string>
+    <string name="sum_search_networks">"Søk etter alle tilgjengelige nettverk"</string>
+    <string name="select_automatically">"Velg automatisk"</string>
+    <string name="sum_select_automatically">"Velg foretrukket nettverk automatisk"</string>
+    <string name="register_automatically">"Registrerer automatisk…"</string>
+    <string name="roaming">"Dataroaming"</string>
+    <string name="roaming_enable">"Koble til datatjenester ved roaming"</string>
+    <string name="roaming_disable">"Koble til datatjenester ved roaming"</string>
+    <string name="roaming_reenable_message">"Du har mistet datakonnektivitet fordi du har forlatt hjemmenettet ditt med dataroaming slått av."</string>
+    <string name="roaming_turn_it_on_button">"Slå på"</string>
+    <string name="roaming_warning">"Tillat dataroaming? Dette kan koste mye penger!"</string>
+    <string name="prefer_2g">"Bruk kun 2G-nettverk"</string>
+    <string name="prefer_2g_summary">"Sparer batteri"</string>
+    <string name="fdn">"Faste nummer"</string>
+    <string name="manage_fdn_list">"Liste over faste nummer"</string>
+    <string name="fdn_activation">"Aktivering av faste nummer"</string>
+    <string name="fdn_enabled">"Kun faste nummer kan ringes"</string>
+    <string name="fdn_disabled">"Ikke-faste nummer kan ringes"</string>
+    <string name="enable_fdn">"Slå på faste nummer"</string>
+    <string name="disable_fdn">"Slå av faste nummer"</string>
+    <string name="change_pin2">"Endre PIN2"</string>
+    <string name="enable_fdn_ok">"Slå av faste nummer"</string>
+    <string name="disable_fdn_ok">"Slå av faste nummer"</string>
+    <string name="sum_fdn">"Vedlikehold liste over faste nummer"</string>
+    <string name="sum_fdn_change_pin">"Endre PIN-kode for å styre faste nummer"</string>
+    <string name="sum_fdn_manage_list">"Endre liste over telefonnummer"</string>
+    <string name="menu_add">"Legg til kontakt"</string>
+    <string name="menu_edit">"Rediger kontakt"</string>
+    <string name="menu_delete">"Fjern kontakt"</string>
+    <string name="get_pin2">"Skriv inn PIN2"</string>
+    <string name="name">"Navn"</string>
+    <string name="number">"Num,er"</string>
+    <string name="save">"Lagre"</string>
+    <string name="add_fdn_contact">"Legg til fast kontakt"</string>
+    <string name="adding_fdn_contact">"Legger til fast kontakt…"</string>
+    <string name="fdn_contact_added">"Den faste kontakten ble lagt til."</string>
+    <string name="edit_fdn_contact">"Rediger fast kontakt"</string>
+    <string name="updating_fdn_contact">"Oppdaterer fast kontakt…"</string>
+    <string name="fdn_contact_updated">"Den faste kontakten ble oppdatert."</string>
+    <string name="delete_fdn_contact">"Fjern fast kontakt"</string>
+    <string name="deleting_fdn_contact">"Fjerner fast kontakt…"</string>
+    <string name="fdn_contact_deleted">"Den faste kontakten ble fjernet."</string>
+    <string name="pin2_invalid">"Ugyldig PIN2!"</string>
+    <string name="fdn_invalid_number">"Tallet kan ikke være lengre enn 20 siffer."</string>
+    <string name="simContacts_emptyLoading">"Leser fra SIM-kort…"</string>
+    <string name="simContacts_empty">"Ingen kontakter på SIM-kortet."</string>
+    <string name="simContacts_title">"Velg kontakter som skal importeres"</string>
+    <string name="enable_pin">"Slå av/på PIN-kode for SIM-kort"</string>
+    <string name="change_pin">"Endre PIN-kode for SIM-kort"</string>
+    <string name="enter_pin_text">"SIM-kortets PIN-kode:"</string>
+    <string name="oldPinLabel">"Gammel PIN-kode"</string>
+    <string name="newPinLabel">"Ny PIN-kode"</string>
+    <string name="confirmPinLabel">"Bekreft ny PIN-kode"</string>
+    <string name="badPin">"Du skrev gal gammel PIN-kode. Prøv igjen."</string>
+    <string name="mismatchPin">"PIN-kodene du skrev inn, stemmer ikke overens. Prøv igjen."</string>
+    <string name="invalidPin">"Skriv inn en PIN-kode som er fra 4 til 8 siffer."</string>
+    <string name="disable_sim_pin">"Slå av PIN-kode for SIM-kort"</string>
+    <string name="enable_sim_pin">"Slå på PIN-kode for SIM-kort"</string>
+    <string name="enable_in_progress">"Vent litt…"</string>
+    <string name="enable_pin_ok">"PIN-kode for SIM-kort slått på"</string>
+    <string name="disable_pin_ok">"PIN-kode for SIM-kort slått av"</string>
+    <string name="pin_failed">"PIN-koden du skrev inn var gal"</string>
+    <string name="pin_changed">"PIN-koden for SIM-kortet ble endret"</string>
+    <string name="puk_requested">"Galt passord, SIM-kortet er låst! Skriv inn PUK2-koden."</string>
+    <string name="enter_pin2_text">"PIN2-kode"</string>
+    <string name="oldPin2Label">"Gammel PIN2-kode"</string>
+    <string name="newPin2Label">"Ny PIN2-kode"</string>
+    <string name="confirmPin2Label">"Bekreft ny PIN2-kode"</string>
+    <string name="badPuk2">"PUK2-koden er ikke riktig. Prøv igjen."</string>
+    <string name="badPin2">"Den gamle PIN2-koden du skrev er ikke riktig. Prøv igjen."</string>
+    <string name="mismatchPin2">"PIN2-kodene du skrev inn, stemmer ikke overens. Prøv igjen."</string>
+    <string name="invalidPin2">"Skriv inn en PIN2-kode som er mellom 4 og 8 siffer."</string>
+    <string name="invalidPuk2">"Skriv inn en PUK2-kode som er 8 siffer."</string>
+    <string name="pin2_changed">"PIN2-koden ble endret."</string>
+    <string name="label_puk2_code">"Skriv inn PUk2-kode"</string>
+    <string name="fdn_enable_puk2_requested">"Galt passord, endre PIN2-koden og prøv igjen!"</string>
+    <string name="puk2_requested">"Galt passord, SIM-kortet er låst! Skriv inn PUK2-koden."</string>
+    <string name="doneButton">"Ferdig"</string>
+    <string name="caller_manage_header">"Telefonmøte <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+    <string name="caller_manage_manage_done_text">"Tilbake til samtale"</string>
+    <string name="sim_missing_continueView_text">"Fortsett uten SIM-kort"</string>
+    <string name="sim_missing_msg_text">"Fant ikke noe SIM-kort. Sett et SIM-kort i telefonen."</string>
+    <string name="sim_unlock_dismiss_text">"Skjul"</string>
+    <string name="sim_unlock_unlock_text">"Lås opp"</string>
+    <string name="sim_unlock_status_text">"Godkjenner PIN-kode…"</string>
+    <string name="voicemail_settings_number_label">"Nummer til telefonsvarer"</string>
+    <string name="card_title_dialing">"Ringer"</string>
+    <string name="card_title_in_progress">"Aktiv samtale"</string>
+    <string name="card_title_conf_call">"Telefonmøte"</string>
+    <string name="card_title_incoming_call">"Innkommende anrop"</string>
+    <string name="card_title_call_ended">"Samtale avsluttet"</string>
+    <string name="card_title_on_hold">"Parkert"</string>
+    <string name="card_title_hanging_up">"Legger på"</string>
+    <string name="notification_missedCallTitle">"Tapt anrop"</string>
+    <string name="notification_missedCallsTitle">"Tapte anrop"</string>
+    <string name="notification_missedCallsMsg">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> tapte anrop"</string>
+    <string name="notification_missedCallTicker">"Tapt anrop fra <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+    <string name="notification_ongoing_call_format">"Aktiv samtale (<xliff:g id="DURATION">%s</xliff:g>)"</string>
+    <string name="notification_on_hold">"Parkert"</string>
+    <string name="notification_voicemail_title">"Nye beskjeder på telefonsvarer"</string>
+    <string name="notification_voicemail_text_format">"Ring <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+    <string name="notification_voicemail_no_vm_number">"Mangler nummer til telefonsvarer"</string>
+    <string name="incall_error_power_off">"For å ringe, slå av flymodus først."</string>
+    <string name="incall_error_emergency_only">"Ikke registrert på nettverket."</string>
+    <string name="incall_error_no_phone_number_supplied">"Samtalen ble ikke opprettet, mangler eller ugyldig nummer."</string>
+    <string name="incall_error_call_failed">"Samtalen ble ikke opprettet."</string>
+    <string name="incall_status_dialed_mmi">"Begynner MMI-sekvens…"</string>
+    <string name="incall_error_supp_service_unknown">"Ustøttet tjeneste."</string>
+    <string name="incall_error_supp_service_switch">"Kan ikke bytte samtale."</string>
+    <string name="incall_error_supp_service_separate">"Kan ikke skille samtale."</string>
+    <string name="incall_error_supp_service_transfer">"Kan ikke overføre samtale."</string>
+    <string name="incall_error_supp_service_conference">"Kan ikke opprette telefonmøte."</string>
+    <string name="incall_error_supp_service_reject">"Kan ikke avvise anrop."</string>
+    <string name="incall_error_supp_service_hangup">"Kan ikke legge på."</string>
+    <string name="emergency_enable_radio_dialog_title">"Nødanrop"</string>
+    <string name="emergency_enable_radio_dialog_message">"Slår på radio…"</string>
+    <string name="emergency_enable_radio_dialog_retry">"Utenfor dekningsområde, prøver igjen…"</string>
+    <string name="dial_emergency_error">"Samtalen ble ikke opprettet, <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ikke et nødnummer!"</string>
+    <string name="dial_emergency_empty_error">"Samtalen ble ikke opprettet, ring et nødnummer!"</string>
+    <string name="dialerKeyboardHintText">"Bruk tastaturet for å ringe"</string>
+    <string name="dtmfDialpadHintText">"Talltastatur for tastetoner"</string>
+    <!-- no translation found for touchLockText (566824588267376287) -->
+    <skip />
+    <string name="importSimEntry">"Importer"</string>
+    <string name="importAllSimEntries">"Importer alle"</string>
+    <string name="importingSimContacts">"Importerer kontakter fra SIM-kortet"</string>
+    <string name="importToFDNfromContacts">"Importer fra kontakter"</string>
+</resources>
index a3c5078..e70756b 100644 (file)
     <string name="labelCFU">"Altijd doorschakelen"</string>
     <string name="messageCFU">"Altijd dit nummer gebruiken"</string>
     <string name="sum_cfu_enabled_indicator">"Alle oproepen doorschakelen"</string>
-    <string name="sum_cfu_enabled">"Alle oproepen doorschakelen naar \\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"Alle oproepen doorschakelen naar {0}"</string>
     <string name="sum_cfu_disabled">"Uitgeschakeld"</string>
     <string name="labelCFB">"Doorschakelen indien in gesprek"</string>
     <string name="messageCFB">"Nummer indien in gesprek"</string>
     <string name="roaming_reenable_message">"De gegevensverbinding is verbroken, omdat u uw thuisnetwerk heeft verlaten terwijl gegevensroaming was uitgeschakeld."</string>
     <string name="roaming_turn_it_on_button">"Inschakelen"</string>
     <string name="roaming_warning">"Gegevensroaming toestaan? Er kunnen hoge roamingkosten in rekening worden gebracht."</string>
-    <string name="roaming_reenable_title">"Let op"</string>
     <string name="prefer_2g">"Alleen 2G-netwerken gebruiken"</string>
     <string name="prefer_2g_summary">"Energiespaarstand"</string>
     <string name="fdn">"Vaste nummers"</string>
     <string name="sum_fdn">"Vaste nummers beheren"</string>
     <string name="sum_fdn_change_pin">"PIN-code voor FDN-toegang wijzigen"</string>
     <string name="sum_fdn_manage_list">"Lijst met telefoonnummers beheren"</string>
-    <string name="open_keyboard">"Open het toetsenbord om te typen."</string>
     <string name="menu_add">"Contactpersoon toevoegen"</string>
     <string name="menu_edit">"Contactpersoon bewerken"</string>
     <string name="menu_delete">"Contactpersoon verwijderen"</string>
     <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="importSimEntry">"Importeren"</string>
     <string name="importAllSimEntries">"Alles importeren"</string>
     <string name="importingSimContacts">"SIM-contactpersonen importeren"</string>
index e7dcdfd..75b692a 100644 (file)
     <string name="labelCFU">"Zawsze przekierowuj"</string>
     <string name="messageCFU">"Zawsze używaj tego numeru"</string>
     <string name="sum_cfu_enabled_indicator">"Przekierowanie wszystkich rozmów"</string>
-    <string name="sum_cfu_enabled">"Przekierowanie wszystkich rozmów do \\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"Przekierowanie wszystkich rozmów do {0}"</string>
     <string name="sum_cfu_disabled">"Wyłączone"</string>
     <string name="labelCFB">"Przekieruj, gdy zajęty"</string>
     <string name="messageCFB">"Numer, gdy zajęty"</string>
     <string name="roaming_reenable_message">"Utracono łączność danych, ponieważ pozostawiono wyłączony roaming danych w sieci macierzystej."</string>
     <string name="roaming_turn_it_on_button">"Włącz usługę"</string>
     <string name="roaming_warning">"Czy pozwolić na wymianę danych w roamingu? Mogą zostać naliczone wysokie opłaty roamingowe!"</string>
-    <string name="roaming_reenable_title">"Uwaga"</string>
     <string name="prefer_2g">"Używaj tylko sieci 2G"</string>
     <string name="prefer_2g_summary">"Oszczędza baterię"</string>
     <string name="fdn">"Numery wybierania ustalonego"</string>
     <string name="sum_fdn">"Zarządzanie numerami wybierania ustalonego"</string>
     <string name="sum_fdn_change_pin">"Zmień kod PIN pozwalający na dostęp do usługi wybierania ustalonego (FDN)"</string>
     <string name="sum_fdn_manage_list">"Zarządzanie listą numerów telefonów"</string>
-    <string name="open_keyboard">"Otwórz klawiaturę, aby wprowadzić tekst."</string>
     <string name="menu_add">"Dodaj kontakt"</string>
     <string name="menu_edit">"Edytuj kontakt"</string>
     <string name="menu_delete">"Usuń kontakt"</string>
     <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="importSimEntry">"Importuj"</string>
     <string name="importAllSimEntries">"Importuj wszystko"</string>
     <string name="importingSimContacts">"Importowanie kontaktów z karty SIM"</string>
index 3dcff41..a1b8269 100644 (file)
     <string name="labelCFU">"Всегда перенаправлять"</string>
     <string name="messageCFU">"Всегда использовать этот номер"</string>
     <string name="sum_cfu_enabled_indicator">"Перенаправление всех вызовов"</string>
-    <string name="sum_cfu_enabled">"Перенаправление всех вызовов на номер \\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"Перенаправление всех вызовов на номер {0}"</string>
     <string name="sum_cfu_disabled">"Отключено"</string>
     <string name="labelCFB">"Перенаправлять, если занято"</string>
     <string name="messageCFB">"Номер, если занято"</string>
     <string name="roaming_reenable_message">"Подключение для передачи данных прервано. Вы покинули домашнюю сеть, не включив роуминг для передачи данных."</string>
     <string name="roaming_turn_it_on_button">"Включить"</string>
     <string name="roaming_warning">"Разрешить передачу данных в роуминге? Это очень дорого!"</string>
-    <string name="roaming_reenable_title">"Внимание"</string>
     <string name="prefer_2g">"Использовать только сети 2G"</string>
     <string name="prefer_2g_summary">"Экономит заряд батареи"</string>
     <string name="fdn">"Номера с фиксированным набором"</string>
     <string name="sum_fdn">"Управление номерами с фиксированным набором"</string>
     <string name="sum_fdn_change_pin">"Изменить PIN для доступа к фиксированному набору"</string>
     <string name="sum_fdn_manage_list">"Управление списком телефонных номеров"</string>
-    <string name="open_keyboard">"Откройте клавиатуру для ввода."</string>
     <string name="menu_add">"Добавить контакт"</string>
     <string name="menu_edit">"Изменить контакт"</string>
     <string name="menu_delete">"Удалить контакт"</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="importSimEntry">"Импортировать"</string>
     <string name="importAllSimEntries">"Импортировать все"</string>
     <string name="importingSimContacts">"Идет импорт контактов с SIM-карты"</string>
index f7b8f71..fc37b92 100644 (file)
     <string name="labelCFU">"始终进行呼叫转移"</string>
     <string name="messageCFU">"始终使用此号码"</string>
     <string name="sum_cfu_enabled_indicator">"正在转移所有呼叫"</string>
-    <string name="sum_cfu_enabled">"正在将所有呼叫转移至\\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"正在将所有呼叫转移至{0}"</string>
     <string name="sum_cfu_disabled">"已禁用"</string>
     <string name="labelCFB">"占线时进行呼叫转移"</string>
     <string name="messageCFB">"占线时拨号"</string>
     <string name="roaming_reenable_message">"您已断开数据连接,因为您离开了主网络并关闭了数据漫游。"</string>
     <string name="roaming_turn_it_on_button">"打开数据漫游"</string>
     <string name="roaming_warning">"是否允许数据漫游?您可能需要支付高额的漫游费!"</string>
-    <string name="roaming_reenable_title">"注意"</string>
     <string name="prefer_2g">"仅使用 2G 网络"</string>
     <string name="prefer_2g_summary">"节约电量"</string>
     <string name="fdn">"固定拨号"</string>
     <string name="sum_fdn">"管理固定拨号"</string>
     <string name="sum_fdn_change_pin">"更改 PIN 码以进行 FDN 访问"</string>
     <string name="sum_fdn_manage_list">"管理电话号码列表"</string>
-    <string name="open_keyboard">"打开键盘以键入。"</string>
     <string name="menu_add">"添加联系人"</string>
     <string name="menu_edit">"编辑联系人"</string>
     <string name="menu_delete">"删除联系人"</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="importSimEntry">"导入"</string>
     <string name="importAllSimEntries">"全部导入"</string>
     <string name="importingSimContacts">"正在导入 SIM 卡联系人"</string>
index ea7b7f5..fb3204c 100644 (file)
     <string name="labelCFU">"永遠轉接"</string>
     <string name="messageCFU">"永遠使用此號碼"</string>
     <string name="sum_cfu_enabled_indicator">"轉接所有來電"</string>
-    <string name="sum_cfu_enabled">"轉接所有來電到 \\\\{0\\\\}"</string>
+    <string name="sum_cfu_enabled">"轉接所有來電到 {0}"</string>
     <string name="sum_cfu_disabled">"停用"</string>
     <string name="labelCFB">"忙線時轉接"</string>
     <string name="messageCFB">"忙線時轉接號碼"</string>
     <string name="roaming_reenable_message">"由於您離開主要網路時關閉了資料漫遊,目前資料連線已中斷。"</string>
     <string name="roaming_turn_it_on_button">"開啟"</string>
     <string name="roaming_warning">"是否允許資料漫遊?您可能會支付許多漫遊費用!"</string>
-    <string name="roaming_reenable_title">"注意"</string>
     <string name="prefer_2g">"只使用 2G 網路"</string>
     <string name="prefer_2g_summary">"節省電力"</string>
     <string name="fdn">"限制撥號號碼"</string>
     <string name="sum_fdn">"管理限制撥號號碼"</string>
     <string name="sum_fdn_change_pin">"變更 PIN 以存取限制撥號號碼"</string>
     <string name="sum_fdn_manage_list">"管理電話號碼清單"</string>
-    <string name="open_keyboard">"開啟鍵盤以輸入內容。"</string>
     <string name="menu_add">"新增聯絡人"</string>
     <string name="menu_edit">"編輯聯絡人"</string>
     <string name="menu_delete">"刪除聯絡人"</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="importSimEntry">"匯入"</string>
     <string name="importAllSimEntries">"全部匯入"</string>
     <string name="importingSimContacts">"匯入 SIM 聯絡人"</string>
index a2bbe16..2fdb008 100644 (file)
     <string name="roaming_turn_it_on_button">Turn it on</string>
     <!-- Mobile network settings screen, dialog message when user selects the Data roaming check box -->
     <string name="roaming_warning">Allow data roaming? You may incur significant roaming charges!</string>
-    <!-- Mobile network settings screen, dialog title when user clears or selects the Data roaming check box -->
-    <string name="roaming_reenable_title">Attention</string>
     <!-- Mobile network settings screen, setting option name -->
     <string name="prefer_2g">Use only 2G networks</string>
     <!-- Mobile network settings screen, setting summary text -->
     <string name="sum_fdn_change_pin">Change PIN for FDN access</string>
     <!-- Call settings, FDN screen, setting option name -->
     <string name="sum_fdn_manage_list">Manage phone number list</string>
-    <!-- Call settings, message in dialog box when trying to change PIN2 or enable FDN with keyboard closed -->
-    <string name="open_keyboard">Open keyboard to type.</string>
 
     <!-- FDN list screen: menu item label -->
     <string name="menu_add">Add contact</string>
          dialpad is there to generate tones, not to add a new call.) -->
     <string name="dtmfDialpadHintText">Touch tone keypad</string>
 
+    <!-- Text displayed on the in-call screen's "touch lock" overlay,
+         instructing the user that they need to double-tap to unlock the
+         screen. -->
+    <string name="touchLockText">Double-tap\nto unlock</string>
+
     <!-- Menu item label in SIM Contacts: Import a single contact entry from the SIM card -->
     <string name="importSimEntry">Import</string>
     <!-- Menu item label in SIM Contacts: Import all contact entries from the SIM card -->
index c8a8007..a5cb1a5 100644 (file)
      limitations under the License.
 -->
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:phone="http://schemas.android.com/apk/res/com.android.phone">
-
-    <PreferenceCategory
-        android:title="@string/call_settings"/>
+    xmlns:phone="http://schemas.android.com/apk/res/com.android.phone"
+        android:title="@string/call_settings">
         
     <PreferenceScreen 
         android:key="button_fdn_key" 
index 0d8fe7c..bc223f1 100644 (file)
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <PreferenceCategory 
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         android:key="list_networks_key" 
-        android:title="@string/label_available"
-        android:persistent="false"/>
+        android:title="@string/label_available">
     <Preference 
         android:key="button_srch_netwrks_key" 
         android:title="@string/search_networks"
index b998efa..fb03fe5 100644 (file)
      limitations under the License.
 -->
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:phone="http://schemas.android.com/apk/res/com.android.phone">
-    
-    <PreferenceCategory
-        android:title="@string/mobile_networks"/>
+    xmlns:phone="http://schemas.android.com/apk/res/com.android.phone"
+        android:title="@string/mobile_networks">
     
     <CheckBoxPreference 
         android:key="button_roaming_key" 
index 5c57f5f..271ce92 100644 (file)
@@ -94,6 +94,9 @@ public class BluetoothHandsfree {
     private final BluetoothPhoneState mPhoneState;  // for CIND and CIEV updates
     private final BluetoothAtPhonebook mPhonebook;
 
+    private DebugThread mDebugThread;
+    private int mScoGain = Integer.MIN_VALUE;
+
     // Audio parameters
     private static final String HEADSET_NREC = "bt_headset_nrec";
     private static final String HEADSET_NAME = "bt_headset_name";
@@ -530,7 +533,9 @@ public class BluetoothHandsfree {
             if (mCallsetup != callsetup) {
                 mCallsetup = callsetup;
                 if (sendUpdate) {
-                    if (!(mCall == 1 && ((mRemoteBRSF & BRSF_HF_CW_THREE_WAY_CALLING) == 0x0))) {
+                    // don't send +CIEV for callsetup while in-call if 3way not supported
+                    if (!(mCall == 1 && mCallsetup != 0 &&
+                         (mRemoteBRSF & BRSF_HF_CW_THREE_WAY_CALLING) == 0x0)) {
                         result.addResponse("+CIEV: 3," + mCallsetup);
                     }
                 }
@@ -735,7 +740,7 @@ public class BluetoothHandsfree {
             if (DBG) log("audioOn(): user requested no audio, ignoring");
             return false;
         }
-        
+
         if (mOutgoingSco != null) {
             if (DBG) log("audioOn(): outgoing SCO already in progress");
             return true;
@@ -929,7 +934,7 @@ public class BluetoothHandsfree {
         }
 
         int direction = c.isIncoming() ? 1 : 0;
-        
+
         String number = c.getAddress();
         int type = -1;
         if (number != null) {
@@ -955,7 +960,7 @@ public class BluetoothHandsfree {
                 if (mRingingCall.isRinging()) {
                     // Answer the call
                     PhoneUtils.answerCall(mPhone);
-                    // If in-band ring tone is supported, SCO connection will already 
+                    // If in-band ring tone is supported, SCO connection will already
                     // be up and the following call will just return.
                     audioOn();
                 } else if (mForegroundCall.getState().isAlive()) {
@@ -998,7 +1003,7 @@ public class BluetoothHandsfree {
     private void initializeHandsfreeAtParser() {
         if (DBG) log("Registering Handsfree AT commands");
         AtParser parser = mHeadset.getAtParser();
-   
+
         // Answer
         parser.register('A', new AtCommandHandler() {
             @Override
@@ -1039,12 +1044,12 @@ public class BluetoothHandsfree {
         // Hang-up command
         parser.register("+CHUP", new AtCommandHandler() {
             @Override
-            public AtCommandResult handleActionCommand() { 
-                if (!mForegroundCall.isIdle()) {                 
+            public AtCommandResult handleActionCommand() {
+                if (!mForegroundCall.isIdle()) {
                     PhoneUtils.hangup(mForegroundCall);
-                } else if (!mRingingCall.isIdle()) {               
+                } else if (!mRingingCall.isIdle()) {
                     PhoneUtils.hangup(mRingingCall);
-                } else if (!mBackgroundCall.isIdle()) {                
+                } else if (!mBackgroundCall.isIdle()) {
                     PhoneUtils.hangup(mBackgroundCall);
                 }
                 return new AtCommandResult(AtCommandResult.OK);
@@ -1403,7 +1408,7 @@ public class BluetoothHandsfree {
                 return new AtCommandResult("+CGSN: " + mPhone.getDeviceId());
             }
         });
-        
+
         // AT+CGMM - Query Model Information
         parser.register("+CGMM", new AtCommandHandler() {
             @Override
@@ -1417,7 +1422,7 @@ public class BluetoothHandsfree {
                 }
             }
         });
-        
+
         // AT+CGMI - Query Manufacturer Information
         parser.register("+CGMI", new AtCommandHandler() {
             @Override
@@ -1431,7 +1436,7 @@ public class BluetoothHandsfree {
                 }
             }
         });
-        
+
         // Noise Reduction and Echo Cancellation control
         parser.register("+NREC", new AtCommandHandler() {
             @Override
@@ -1484,7 +1489,33 @@ public class BluetoothHandsfree {
                         PhoneNumberUtils.toaFromString(number) + ",,4");
             }
         });
-        
+
+        // Microphone Gain
+        parser.register("+VGM", new AtCommandHandler() {
+            @Override
+            public AtCommandResult handleSetCommand(Object[] args) {
+                // AT+VGM=<gain>    in range [0,15]
+                // Headset/Handsfree is reporting its current gain setting
+                return new AtCommandResult(AtCommandResult.OK);
+            }
+        });
+
+        // Speaker Gain
+        parser.register("+VGS", new AtCommandHandler() {
+            @Override
+            public AtCommandResult handleSetCommand(Object[] args) {
+                // AT+VGS=<gain>    in range [0,15]
+                if (args.length != 1 || !(args[0] instanceof Integer)) {
+                    return new AtCommandResult(AtCommandResult.ERROR);
+                }
+                mScoGain = (Integer) args[0];
+                int flag =  mAudioManager.isBluetoothScoOn() ? AudioManager.FLAG_SHOW_UI:0;
+
+                mAudioManager.setStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO, mScoGain, flag);
+                return new AtCommandResult(AtCommandResult.OK);
+            }
+        });
+
         // Phone activity status
         parser.register("+CPAS", new AtCommandHandler() {
             @Override
@@ -1506,7 +1537,14 @@ public class BluetoothHandsfree {
         });
         mPhonebook.register(parser);
     }
-    
+
+    public void sendScoGainUpdate(int gain) {
+        if (mScoGain != gain && (mRemoteBRSF & BRSF_HF_REMOTE_VOL_CONTROL) != 0x0) {
+            sendURC("+VGS:" + gain);
+            mScoGain = gain;
+        }
+    }
+
     public AtCommandResult reportCmeError(int error) {
         if (mCmee) {
             AtCommandResult result = new AtCommandResult(AtCommandResult.UNSOLICITED);
@@ -1571,8 +1609,6 @@ public class BluetoothHandsfree {
         return true;
     }
 
-    private DebugThread mDebugThread;
-
     private boolean inDebug() {
         return DBG && SystemProperties.getBoolean(DebugThread.DEBUG_HANDSFREE, false);
     }
@@ -1626,14 +1662,14 @@ public class BluetoothHandsfree {
 
         /** Debug AT+CLCC: print +CLCC result */
         private static final String DEBUG_HANDSFREE_CLCC = "debug.bt.hfp.clcc";
-        
-        /** Debug AT+BSIR - Send In Band Ringtones Unsolicited AT command. 
+
+        /** Debug AT+BSIR - Send In Band Ringtones Unsolicited AT command.
          * debug.bt.unsol.inband = 0 => AT+BSIR = 0 sent by the AG
          * debug.bt.unsol.inband = 1 => AT+BSIR = 0 sent by the AG
          * Other values are ignored.
          */
-        
-        private static final String DEBUG_UNSOL_INBAND_RINGTONE = 
+
+        private static final String DEBUG_UNSOL_INBAND_RINGTONE =
             "debug.bt.unsol.inband";
 
         @Override
@@ -1691,11 +1727,11 @@ public class BluetoothHandsfree {
                 } catch (InterruptedException e) {
                     break;
                 }
-                
-                int inBandRing = 
+
+                int inBandRing =
                     SystemProperties.getInt(DEBUG_UNSOL_INBAND_RINGTONE, -1);
                 if (inBandRing == 0 || inBandRing == 1) {
-                    AtCommandResult result = 
+                    AtCommandResult result =
                         new AtCommandResult(AtCommandResult.UNSOLICITED);
                     result.addResponse("+BSIR: " + inBandRing);
                     sendURC(result.toString());
index d27ee7d..bc2f6aa 100644 (file)
@@ -19,34 +19,32 @@ package com.android.phone;
 import android.app.Service;
 import android.bluetooth.BluetoothAudioGateway;
 import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
 import android.bluetooth.BluetoothError;
+import android.bluetooth.BluetoothHeadset;
 import android.bluetooth.BluetoothIntent;
+import android.bluetooth.HeadsetBase;
 import android.bluetooth.IBluetoothDeviceCallback;
 import android.bluetooth.IBluetoothHeadset;
-import android.bluetooth.HeadsetBase;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.os.RemoteException;
+import android.media.AudioManager;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.PowerManager;
+import android.os.RemoteException;
 import android.os.SystemProperties;
-import android.os.SystemService;
 import android.provider.Settings;
+import android.util.Log;
+
 import com.android.internal.telephony.Call;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
-import android.util.Log;
 
 import java.util.HashMap;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.ListIterator;
 
 /**
@@ -101,12 +99,12 @@ public class BluetoothHeadsetService extends Service {
         if (mBluetooth.isEnabled()) {
             mHeadsetPriority.load();
         }
-
         IntentFilter filter = new IntentFilter(
                 BluetoothIntent.REMOTE_DEVICE_DISCONNECT_REQUESTED_ACTION);
         filter.addAction(BluetoothIntent.ENABLED_ACTION);
         filter.addAction(BluetoothIntent.DISABLED_ACTION);
         filter.addAction(BluetoothIntent.BOND_STATE_CHANGED_ACTION);
+        filter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
         registerReceiver(mBluetoothIntentReceiver, filter);
 
         mPhone.registerForPhoneStateChanged(mStateChangeHandler, PHONE_STATE_CHANGED, null);
@@ -292,6 +290,13 @@ public class BluetoothHeadsetService extends Service {
                     mHeadsetPriority.set(address, BluetoothHeadset.PRIORITY_OFF);
                     break;
                 }
+            } else if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) {
+                int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
+                if (streamType == AudioManager.STREAM_BLUETOOTH_SCO) {
+                    mBtHandsfree.sendScoGainUpdate(intent.getIntExtra(
+                            AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0));
+                }
+
             }
         }
     };
@@ -422,7 +427,7 @@ public class BluetoothHeadsetService extends Service {
 
             switch (msg.what) {
             case SDP_RESULT:
-                if (DBG) log("SDP request returned " + msg.arg1 + " (" + 
+                if (DBG) log("SDP request returned " + msg.arg1 + " (" +
                         (System.currentTimeMillis() - mTimestamp + " ms)"));
                 if (!((String)msg.obj).equals(mHeadsetAddress)) {
                     return;  // stale SDP result
@@ -580,7 +585,7 @@ public class BluetoothHeadsetService extends Service {
                         mHeadset = null;
                     }
                     setState(BluetoothHeadset.STATE_DISCONNECTED,
-                             BluetoothHeadset.RESULT_CANCELLED);
+                             BluetoothHeadset.RESULT_CANCELED);
                     break;
                 case BluetoothHeadset.STATE_CONNECTED:
                     if (mHeadset != null) {
@@ -588,7 +593,7 @@ public class BluetoothHeadsetService extends Service {
                         mHeadset = null;
                     }
                     setState(BluetoothHeadset.STATE_DISCONNECTED,
-                             BluetoothHeadset.RESULT_CANCELLED);
+                             BluetoothHeadset.RESULT_CANCELED);
                     break;
                 }
             }
@@ -638,7 +643,7 @@ public class BluetoothHeadsetService extends Service {
         mBtHandsfree.onBluetoothDisabled();
         mAg.stop();
         sHasStarted = false;
-        setState(BluetoothHeadset.STATE_DISCONNECTED, BluetoothHeadset.RESULT_CANCELLED);
+        setState(BluetoothHeadset.STATE_DISCONNECTED, BluetoothHeadset.RESULT_CANCELED);
         mHeadsetType = BluetoothHandsfree.TYPE_UNKNOWN;
     }
 
index 2673220..0024e98 100644 (file)
@@ -759,7 +759,14 @@ public class CallNotifier extends Handler
             // a local audio signal, and is not as important.
             ToneGenerator toneGenerator;
             try {
-                toneGenerator = new ToneGenerator(AudioManager.STREAM_VOICE_CALL, toneVolume);
+                int stream;
+                if (mBluetoothHandsfree != null) {
+                    stream = mBluetoothHandsfree.isAudioOn() ? AudioManager.STREAM_BLUETOOTH_SCO:
+                        AudioManager.STREAM_VOICE_CALL;
+                } else {
+                    stream = AudioManager.STREAM_VOICE_CALL;
+                }
+                toneGenerator = new ToneGenerator(stream, toneVolume);
                 // if (DBG) log("- created toneGenerator: " + toneGenerator);
             } catch (RuntimeException e) {
                 Log.w(TAG, "InCallTonePlayer: Exception caught while creating ToneGenerator: " + e);
index ed2042f..a08bba0 100644 (file)
@@ -20,7 +20,7 @@ package com.android.phone;
 import com.android.internal.telephony.CallerInfo;
 import com.android.internal.telephony.CallerInfoAsyncQuery;
 import com.android.internal.telephony.Phone;
-import com.android.internal.widget.SlidingDrawer;
+import android.widget.SlidingDrawer;
 
 import android.media.AudioManager;
 import android.media.ToneGenerator;
@@ -143,6 +143,11 @@ public class DTMFTwelveKeyDialer implements
         }
 
         /**Return false since we are NOT consuming the input.*/
+        public boolean onKeyOther(TextView view, Spannable text, KeyEvent event) {
+            return false;
+        }
+        
+        /**Return false since we are NOT consuming the input.*/
         public boolean onTrackballEvent(TextView widget, Spannable buffer, MotionEvent event) {
             return false;
         }
@@ -602,7 +607,7 @@ public class DTMFTwelveKeyDialer implements
      * This includes layout changes, etc, and just prepares the dialer model for use.
      */
     void onDialerOpen() {
-        if (DBG) log("initMenu()...");
+        if (DBG) log("onDialerOpen()...");
 
         // inflate the view.
         mDialerView = (DTMFTwelveKeyDialerView) mInCallScreen.findViewById(R.id.dtmf_dialer);
@@ -640,6 +645,9 @@ public class DTMFTwelveKeyDialer implements
 
         // setup the local tone generator.
         startDialerSession();
+
+        // Give the InCallScreen a chance to do any necessary UI updates.
+        mInCallScreen.onDialerOpen();
     }
 
     /**
@@ -673,6 +681,8 @@ public class DTMFTwelveKeyDialer implements
      * This releases resources acquired when we start the dialer.
      */
     public void onDialerClose() {
+        if (DBG) log("onDialerClose()...");
+
         // reset back to a short delay for the poke lock.
         PhoneApp app = PhoneApp.getInstance();
         app.updateWakeState();
@@ -680,6 +690,9 @@ public class DTMFTwelveKeyDialer implements
         mPhone.unregisterForDisconnect(mHandler);
 
         stopDialerSession();
+
+        // Give the InCallScreen a chance to do any necessary UI updates.
+        mInCallScreen.onDialerClose();
     }
 
     /**
index dc43d04..1e8d2e9 100644 (file)
@@ -22,7 +22,7 @@ import com.android.internal.telephony.CallerInfoAsyncQuery;
 import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.MmiCode;
 import com.android.internal.telephony.Phone;
-import com.android.internal.widget.SlidingDrawer;
+import android.widget.SlidingDrawer;
 
 import android.app.Activity;
 import android.app.AlertDialog;
@@ -45,6 +45,7 @@ import android.os.Message;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.provider.Checkin;
+import android.provider.Settings;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.ServiceState;
 import android.text.TextUtils;
@@ -52,10 +53,14 @@ import android.text.method.DialerKeyListener;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.Menu;
+import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewConfiguration;
 import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
 import android.widget.Button;
 import android.widget.Chronometer;
 import android.widget.EditText;
@@ -70,7 +75,8 @@ import java.util.List;
  * Phone app "in call" screen.
  */
 public class InCallScreen extends Activity
-        implements View.OnClickListener, CallerInfoAsyncQuery.OnQueryCompleteListener {
+        implements View.OnClickListener, View.OnTouchListener,
+                CallerInfoAsyncQuery.OnQueryCompleteListener {
     private static final String LOG_TAG = "PHONE/InCallScreen";
 
     // this debug flag is now attached to the "userdebuggable" builds
@@ -113,6 +119,9 @@ public class InCallScreen extends Activity
     // *after* the user changes the state of one of the toggle buttons.
     private static final int MENU_DISMISS_DELAY =  1000;  // msec
 
+    // The "touch lock" overlay timeout comes from Gservices; this is the default.
+    private static final int TOUCH_LOCK_DELAY_DEFAULT =  6000;  // msec
+
     // See CallTracker.MAX_CONNECTIONS_PER_CALL
     private static final int MAX_CALLERS_IN_CONFERENCE = 5;
 
@@ -129,6 +138,7 @@ public class InCallScreen extends Activity
     private static final int SUPP_SERVICE_FAILED = 110;
     private static final int DISMISS_MENU = 111;
     private static final int ALLOW_SCREEN_ON = 112;
+    private static final int TOUCH_LOCK_TIMER = 113;
 
 
     // High-level "modes" of the in-call UI.
@@ -206,6 +216,12 @@ public class InCallScreen extends Activity
 
     private EditText mWildPromptText;
 
+    // "Touch lock" overlay graphic
+    private View mTouchLockOverlay;  // The overlay over the whole screen
+    private View mTouchLockIcon;  // The "lock" icon in the middle of the screen
+    private Animation mTouchLockFadeIn;
+    private long mTouchLockLastTouchTime;  // in SystemClock.uptimeMillis() time base
+
     // Various dialogs we bring up (see dismissAllDialogs())
     // The MMI started dialog can actually be one of 2 items:
     //   1. An alert dialog if the MMI code is a normal MMI
@@ -324,6 +340,11 @@ public class InCallScreen extends Activity
                     PhoneApp app = PhoneApp.getInstance();
                     app.preventScreenOn(false);
                     break;
+
+                case TOUCH_LOCK_TIMER:
+                    if (DBG) log("TOUCH_LOCK_TIMER...");
+                    touchLockTimerExpired();
+                    break;
             }
         }
     };
@@ -482,7 +503,11 @@ public class InCallScreen extends Activity
         }
 
         // Set the volume control handler while we are in the foreground.
-        setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
+        if (isBluetoothAudioConnected()) {
+            setVolumeControlStream(AudioManager.STREAM_BLUETOOTH_SCO);
+        } else {
+            setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
+        }
 
         takeKeyEvents(true);
 
@@ -553,6 +578,14 @@ public class InCallScreen extends Activity
         }
         app.updateWakeState();
 
+        // The "touch lock" overlay is NEVER visible when we resume.
+        // (In particular, this check ensures that we won't still be
+        // locked after the user wakes up the screen by pressing MENU.)
+        enableTouchLock(false);
+        // ...but if the dialpad is open we DO need to start the timer
+        // that will eventually bring up the "touch lock" overlay.
+        if (mDialer.isOpened()) resetTouchLockTimer();
+
         // Restore the mute state if the last mute state change was NOT
         // done by the user.
         if (app.getRestoreMuteOnInCallResume()) {
@@ -912,6 +945,10 @@ public class InCallScreen extends Activity
         // in-call UI:
 
         if (mDialer.isOpened()) {
+            // Take down the "touch lock" overlay *immediately* to let the
+            // user clearly see the DTMF dialpad's closing animation.
+            enableTouchLock(false);
+
             mDialer.closeDialer(true);  // do the "closing" animation
             return true;
         }
@@ -1002,9 +1039,37 @@ public class InCallScreen extends Activity
     }
 
     @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        // if (DBG) log("dispatchKeyEvent(event " + event + ")...");
+
+        // Intercept some events before they get dispatched to our views.
+        switch (event.getKeyCode()) {
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+            case KeyEvent.KEYCODE_DPAD_UP:
+            case KeyEvent.KEYCODE_DPAD_DOWN:
+            case KeyEvent.KEYCODE_DPAD_LEFT:
+            case KeyEvent.KEYCODE_DPAD_RIGHT:
+                // Disable DPAD keys and trackball clicks if the touch lock
+                // overlay is up, since "touch lock" really means "disable
+                // the DTMF dialpad" (rather than only disabling touch events.)
+                if (mDialer.isOpened() && isTouchLocked()) {
+                    if (DBG) log("- ignoring DPAD event while touch-locked...");
+                    return true;
+                }
+                break;
+
+            default:
+                break;
+        }
+
+        return super.dispatchKeyEvent(event);
+    }
+
+    @Override
     public boolean onKeyUp(int keyCode, KeyEvent event) {
+        // if (DBG) log("onKeyUp(keycode " + keyCode + ")...");
+
         // push input to the dialer.
-        if (DBG) log("handling key up event...");
         if ((mDialer != null) && (mDialer.onDialerKeyUp(event))){
             return true;
         } else if (keyCode == KeyEvent.KEYCODE_CALL) {
@@ -1019,6 +1084,8 @@ public class InCallScreen extends Activity
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
+        // if (DBG) log("onKeyDown(keycode " + keyCode + ")...");
+
         switch (keyCode) {
             case KeyEvent.KEYCODE_CALL:
                 // consume KEYCODE_CALL so PhoneWindow doesn't do anything with it
@@ -1060,6 +1127,27 @@ public class InCallScreen extends Activity
                 }
                 break;
 
+            case KeyEvent.KEYCODE_MENU:
+                // Special case for the MENU key: if the "touch lock"
+                // overlay is up (over the DTMF dialpad), allow MENU to
+                // dismiss the overlay just as if you had double-tapped
+                // the onscreen icon.
+                // (We do this because MENU is normally used to bring the
+                // UI back after the screen turns off, and the touch lock
+                // overlay "feels" very similar to the screen going off.
+                // This is also here to be "backward-compatibile" with the
+                // 1.0 behavior, where you *needed* to hit MENU to bring
+                // back the dialpad after 6 seconds of idle time.)
+                if (mDialer.isOpened() && isTouchLocked()) {
+                    if (DBG) log("- allowing MENU to dismiss touch lock overlay...");
+                    // Take down the touch lock overlay, but post a
+                    // message in the future to bring it back later.
+                    enableTouchLock(false);
+                    resetTouchLockTimer();
+                    return true;
+                }
+                break;
+
             // Various testing/debugging features, enabled ONLY when DBG == true.
             case KeyEvent.KEYCODE_SLASH:
                 if (DBG) {
@@ -1348,8 +1436,8 @@ public class InCallScreen extends Activity
                     (cause == Connection.DisconnectCause.LOCAL)
                     ? CALL_ENDED_SHORT_DELAY : CALL_ENDED_LONG_DELAY;
             mHandler.removeMessages(DELAYED_CLEANUP_AFTER_DISCONNECT);
-            Message message = Message.obtain(mHandler, DELAYED_CLEANUP_AFTER_DISCONNECT);
-            mHandler.sendMessageDelayed(message, callEndedDisplayDelay);
+            mHandler.sendEmptyMessageDelayed(DELAYED_CLEANUP_AFTER_DISCONNECT,
+                                             callEndedDisplayDelay);
         }
     }
 
@@ -2019,6 +2107,19 @@ public class InCallScreen extends Activity
                     disconnectBluetoothAudio();
                 }
                 PhoneUtils.turnOnSpeaker(context, newSpeakerState);
+
+                if (newSpeakerState) {
+                    // The "touch lock" overlay is NEVER used when the speaker is on.
+                    enableTouchLock(false);
+                } else {
+                    // User just turned the speaker *off*.  If the dialpad
+                    // is open, we need to start the timer that will
+                    // eventually bring up the "touch lock" overlay.
+                    if (mDialer.isOpened() && !isTouchLocked()) {
+                        resetTouchLockTimer();
+                    }
+                }
+
                 // This is a "toggle" button; let the user see the new state for a moment.
                 dismissMenuImmediate = false;
                 break;
@@ -2840,6 +2941,30 @@ public class InCallScreen extends Activity
     }
 
     /**
+     * Called any time the DTMF dialpad is opened.
+     * @see DTMFTwelveKeyDialer.onDialerOpen()
+     */
+    /* package */ void onDialerOpen() {
+        if (DBG) log("onDialerOpen()...");
+
+        // ANY time the dialpad becomes visible, start the timer that will
+        // eventually bring up the "touch lock" overlay.
+        resetTouchLockTimer();
+    }
+
+    /**
+     * Called any time the DTMF dialpad is closed.
+     * @see DTMFTwelveKeyDialer.onDialerClose()
+     */
+    /* package */ void onDialerClose() {
+        if (DBG) log("onDialerClose()...");
+
+        // Dismiss the "touch lock" overlay if it was visible.
+        // (The overlay is only ever used on top of the dialpad).
+        enableTouchLock(false);
+    }
+
+    /**
      * Get the DTMF dialer display field.
      */
     EditText getDialerDisplay() {
@@ -3032,8 +3157,7 @@ public class InCallScreen extends Activity
             closeOptionsMenu();
         } else {
             mHandler.removeMessages(DISMISS_MENU);
-            Message message = Message.obtain(mHandler, DISMISS_MENU);
-            mHandler.sendMessageDelayed(message, MENU_DISMISS_DELAY);
+            mHandler.sendEmptyMessageDelayed(DISMISS_MENU, MENU_DISMISS_DELAY);
             // This will result in a dismissMenu(true) call shortly.
         }
     }
@@ -3199,6 +3323,242 @@ public class InCallScreen extends Activity
         mBluetoothConnectionPending = false;
     }
 
+    //
+    // "Touch lock" UI.
+    //
+    // When the DTMF dialpad is up, after a certain amount of idle time we
+    // display an overlay graphic on top of the dialpad and "lock" the
+    // touch UI.  (UI Rationale: We need *some* sort of screen lock, with
+    // a fairly short timeout, to avoid false touches from the user's face
+    // while in-call.  But we *don't* want to do this by turning off the
+    // screen completely, since that's confusing (the user can't tell
+    // what's going on) *and* it's fairly cumbersome to have to hit MENU
+    // to bring the screen back, rather than using some gesture on the
+    // touch screen.)
+    //
+    // The user can dismiss the touch lock overlay by double-tapping on
+    // the central "lock" icon.  Also, the touch lock overlay will go away
+    // by itself if the DTMF dialpad is dismissed for any reason, such as
+    // the current call getting disconnected (see onDialerClose()).
+    //
+
+    /**
+     * Initializes the "touch lock" UI widgets.  We do this lazily
+     * to avoid slowing down the initial launch of the InCallScreen.
+     */
+    private void initTouchLock() {
+        if (DBG) log("initTouchLock()...");
+        if (mTouchLockOverlay != null) {
+            Log.w(LOG_TAG, "initTouchLock: already initialized!");
+            return;
+        }
+
+        mTouchLockOverlay = (View) findViewById(R.id.touchLockOverlay);
+        // Note mTouchLockOverlay's visibility is initially GONE.
+        mTouchLockIcon = (View) findViewById(R.id.touchLockIcon);
+
+        // Handle touch events.  (Basically mTouchLockOverlay consumes and
+        // discards any touch events it sees, and mTouchLockIcon listens
+        // for the "double-tap to unlock" gesture.)
+        mTouchLockOverlay.setOnTouchListener(this);
+        mTouchLockIcon.setOnTouchListener(this);
+
+        mTouchLockFadeIn = AnimationUtils.loadAnimation(this, R.anim.touch_lock_fade_in);
+    }
+
+    private boolean isTouchLocked() {
+        return (mTouchLockOverlay != null) && (mTouchLockOverlay.getVisibility() == View.VISIBLE);
+    }
+
+    /**
+     * Enables or disables the "touch lock" overlay on top of the DTMF dialpad.
+     *
+     * If enable=true, bring up the overlay immediately using an animated
+     * fade-in effect.  (Or do nothing if the overlay isn't appropriate
+     * right now, like if the dialpad isn't up, or the speaker is on.)
+     *
+     * If enable=false, immediately take down the overlay.  (Or do nothing
+     * if the overlay isn't actually up right now.)
+     *
+     * Note that with enable=false this method will *not* automatically
+     * start the touch lock timer.  (So when taking down the overlay while
+     * the dialer is still up, the caller is also responsible for calling
+     * resetTouchLockTimer(), to make sure the overlay will get
+     * (re-)enabled later.)
+     *
+     */
+    private void enableTouchLock(boolean enable) {
+        if (DBG) log("enableTouchLock(" + enable + ")...");
+        if (enable) {
+            // The "touch lock" overlay is only ever used on top of the
+            // DTMF dialpad.
+            if (!mDialer.isOpened()) {
+                if (DBG) log("enableTouchLock: dialpad isn't up, no need to lock screen.");
+                return;
+            }
+
+            // Also, the "touch lock" overlay NEVER appears if the speaker is in use.
+            if (PhoneUtils.isSpeakerOn(getApplicationContext())) {
+                if (DBG) log("enableTouchLock: speaker is on, no need to lock screen.");
+                return;
+            }
+
+            // Initialize the UI elements if necessary.
+            if (mTouchLockOverlay == null) {
+                initTouchLock();
+            }
+
+            // First take down the menu if it's up (since it's confusing
+            // to see a touchable menu *above* the touch lock overlay.)
+            // Note dismissMenu() has no effect if the menu is already closed.
+            dismissMenu(true);  // dismissImmediate = true
+
+            // Bring up the touch lock overlay (with an animated fade)
+            mTouchLockOverlay.setVisibility(View.VISIBLE);
+            mTouchLockOverlay.startAnimation(mTouchLockFadeIn);
+        } else {
+            // TODO: it might be nice to immediately kill the animation if
+            // we're in the middle of fading-in:
+            //   if (mTouchLockFadeIn.hasStarted() && !mTouchLockFadeIn.hasEnded()) {
+            //      mTouchLockOverlay.clearAnimation();
+            //   }
+            // but the fade-in is so quick that this probably isn't necessary.
+
+            // Take down the touch lock overlay (immediately)
+            if (mTouchLockOverlay != null) mTouchLockOverlay.setVisibility(View.GONE);
+        }
+    }
+
+    /**
+     * Schedule the "touch lock" overlay to begin fading in after a short
+     * delay, but only if the DTMF dialpad is currently visible.
+     *
+     * (This is designed to be triggered on any user activity
+     * while the dialpad is up but not locked, and also
+     * whenever the user "unlocks" the touch lock overlay.)
+     *
+     * Calling this method supersedes any previous resetTouchLockTimer()
+     * calls (i.e. we first clear any pending TOUCH_LOCK_TIMER messages.)
+     */
+    private void resetTouchLockTimer() {
+        if (DBG) log("resetTouchLockTimer()...");
+        mHandler.removeMessages(TOUCH_LOCK_TIMER);
+        if (mDialer.isOpened() && !isTouchLocked()) {
+            // The touch lock delay value comes from Gservices; we use
+            // the same value that's used for the PowerManager's
+            // POKE_LOCK_SHORT_TIMEOUT flag (i.e. the fastest possible
+            // screen timeout behavior.)
+
+            // Do a fresh lookup each time, since Gservices values can
+            // change on the fly.  (The Settings.Gservices helper class
+            // caches these values so this call is usually cheap.)
+            int touchLockDelay = Settings.Gservices.getInt(
+                    getContentResolver(),
+                    Settings.Gservices.SHORT_KEYLIGHT_DELAY_MS,
+                    TOUCH_LOCK_DELAY_DEFAULT);
+            mHandler.sendEmptyMessageDelayed(TOUCH_LOCK_TIMER, touchLockDelay);
+        }
+    }
+
+    /**
+     * Handles the TOUCH_LOCK_TIMER event.
+     * @see resetTouchLockTimer
+     */
+    private void touchLockTimerExpired() {
+        // Ok, it's been long enough since we had any user activity with
+        // the DTMF dialpad up.  If the dialpad is still up, start fading
+        // in the "touch lock" overlay.
+        enableTouchLock(true);
+    }
+
+    // View.OnTouchListener implementation
+    public boolean onTouch(View v, MotionEvent event) {
+        if (DBG) log ("onTouch(View " + v + ")...");
+
+        //
+        // Handle touch events on the "touch lock" overlay.
+        // (v == mTouchLockIcon) means the user hit the lock icon in the
+        // middle of the screen, and (v == mTouchLockOverlay) is a touch
+        // anywhere else on the overlay.
+        //
+
+        // Sanity-check: We should only get touch events when the
+        // touch lock UI is visible (including the time during the
+        // fade-in animation.)
+        if (((v == mTouchLockIcon) || (v == mTouchLockOverlay)) && !isTouchLocked()) {
+            Log.w(LOG_TAG, "onTouch: got event from the touch lock UI, but we're not locked!");
+            return false;
+        }
+
+        if (v == mTouchLockIcon) {
+            // Direct hit on the "lock" icon.  Handle the double-tap gesture.
+            if (event.getAction() == MotionEvent.ACTION_DOWN) {
+                long now = SystemClock.uptimeMillis();
+                if (DBG) log("- touch lock icon: handling a DOWN event, t = " + now);
+
+                // Look for the double-tap (aka "jump tap") gesture:
+                if (now < mTouchLockLastTouchTime + ViewConfiguration.getJumpTapTimeout()) {
+                    if (DBG) log("==> touch lock icon: DOUBLE-TAP!");
+                    // This was the 2nd tap of a double-tap gesture.
+                    // Take down the touch lock overlay, but post a
+                    // message in the future to bring it back later.
+                    enableTouchLock(false);
+                    resetTouchLockTimer();
+                } else {
+                    // Stash away the current time, since this might
+                    // be the first tap of a double-tap gesture.
+                    mTouchLockLastTouchTime = now;
+                }
+            }
+
+            // And regardless of what just happened, we *always* consume
+            // touch events while the touch lock UI is (or was) visible.
+            return true;
+
+        } else if (v == mTouchLockOverlay) {
+            // User touched the "background" area of the touch lock overlay.
+
+            // TODO: If we're in the middle of the fade-in animation,
+            // consider making a touch *anywhere* immediately unlock the
+            // UI.  This could be risky, though, if the user tries to
+            // *double-tap* during the fade-in (in which case the 2nd tap
+            // might 't become a false touch on the dialpad!)
+            //
+            //if (event.getAction() == MotionEvent.ACTION_DOWN) {
+            //    if (DBG) log("- touch lock overlay background: handling a DOWN event.");
+            //
+            //    if (mTouchLockFadeIn.hasStarted() && !mTouchLockFadeIn.hasEnded()) {
+            //        // If we're still fading-in, a touch *anywhere* onscreen
+            //        // immediately unlocks.
+            //        if (DBG) log("==> touch lock: tap during fade-in!");
+            //
+            //        mTouchLockOverlay.clearAnimation();
+            //        enableTouchLock(false);
+            //        // ...but post a message in the future to bring it
+            //        // back later.
+            //        resetTouchLockTimer();
+            //    }
+            //}
+
+            // And regardless of what just happened, we *always* consume
+            // touch events while the touch lock UI is (or was) visible.
+            return true;
+
+        } else {
+            Log.w(LOG_TAG, "onTouch: event from unexpected View: " + v);
+            return false;
+        }
+    }
+
+    // Any user activity while the dialpad is up, but not locked, should
+    // reset the touch lock timer back to the full delay amount.
+    @Override
+    public void onUserInteraction() {
+        if (mDialer.isOpened() && !isTouchLocked()) {
+            resetTouchLockTimer();
+        }
+    }
+
 
     private void log(String msg) {
         Log.d(LOG_TAG, msg);
index 197390c..4bd1693 100644 (file)
@@ -736,23 +736,46 @@ public class PhoneApp extends Application {
                        + ", isDialerOpened " + isDialerOpened
                        + ", isSpeakerInUse " + isSpeakerInUse + "...");
 
+        //
+        // (1) Set the screen timeout.
+        //
+        // Note that the "screen timeout" value we determine here is
+        // meaningless if the screen is forced on (see (2) below.)
+        //
         if (!isShowingCallScreen || isSpeakerInUse) {
             // Use the system-wide default timeout.
             setScreenTimeout(ScreenTimeoutDuration.DEFAULT);
         } else {
-            // Ok, use a special in-call-specific screen timeout value
-            // instead of the system-wide default.  (This timeout is very
-            // short if the DTMF dialpad is up, and medium otherwise.)
+            // We're on the in-call screen, and *not* using the speakerphone.
             if (isDialerOpened) {
-                setScreenTimeout(ScreenTimeoutDuration.SHORT);
+                // The DTMF dialpad is up.  This case is special because
+                // the in-call UI has its own "touch lock" mechanism to
+                // disable the dialpad after a very short amount of idle
+                // time (to avoid false touches from the user's face while
+                // in-call.)
+                //
+                // In this case the *physical* screen just uses the
+                // system-wide default timeout.
+                setScreenTimeout(ScreenTimeoutDuration.DEFAULT);
             } else {
+                // We're on the in-call screen, and not using the DTMF dialpad.
+                // There's actually no touchable UI onscreen at all in
+                // this state.  Also, the user is (most likely) not
+                // looking at the screen at all, since they're probably
+                // holding the phone up to their face.  Here we use a
+                // special screen timeout value specific to the in-call
+                // screen, purely to save battery life.
                 setScreenTimeout(ScreenTimeoutDuration.MEDIUM);
             }
         }
 
+        //
+        // (2) Decide whether to force the screen on or not.
+        //
         // Force the screen to be on if the phone is ringing, or if we're
         // displaying the "Call ended" UI for a connection in the
         // "disconnected" state.
+        //
         boolean isRinging = (state == Phone.State.RINGING);
         boolean showingDisconnectedConnection =
                 PhoneUtils.hasDisconnectedConnections(phone) && isShowingCallScreen;
index 9e3e3af..935e36f 100644 (file)
@@ -39,7 +39,6 @@ import android.os.Message;
 import android.provider.Contacts;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
-import android.text.method.DigitsKeyListener;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -607,7 +606,6 @@ public class PhoneUtils {
 
                 // get the input field.
                 final EditText inputText = (EditText) dialogView.findViewById(R.id.input_field);
-                inputText.setKeyListener(DigitsKeyListener.getInstance());
 
                 // specify the dialog's click listener, with SEND and CANCEL logic.
                 final DialogInterface.OnClickListener mUSSDDialogListener =
index 9824369..d53122e 100644 (file)
@@ -82,8 +82,8 @@ public class Settings extends PreferenceActivity implements DialogInterface.OnCl
                 mOkClicked = false;
                 new AlertDialog.Builder(this).setMessage(
                         getResources().getString(R.string.roaming_warning))
-                        .setTitle(R.string.roaming_reenable_title)
-                        .setIcon(com.android.internal.R.drawable.ic_dialog_alert)
+                        .setTitle(android.R.string.dialog_alert_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
                         .setPositiveButton(android.R.string.yes, this)
                         .setNegativeButton(android.R.string.no, this)
                         .show()
index 281dd62..c852ab9 100644 (file)
@@ -27,17 +27,21 @@ import android.content.DialogInterface.OnClickListener;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
 import android.net.Uri;
+import android.os.Bundle;
 import android.provider.Contacts;
 import android.provider.Contacts.People;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.ContextMenu;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.widget.AdapterView;
 import android.widget.CursorAdapter;
 import android.widget.ListView;
 import android.widget.SimpleCursorAdapter;
+import android.widget.TextView;
 
 /**
  * SIM Address Book UI for the Phone app.
@@ -46,6 +50,12 @@ public class SimContacts extends ADNList {
     private static final int MENU_IMPORT_ONE = 1;
     private static final int MENU_IMPORT_ALL = 2;
     private ProgressDialog mProgressDialog;
+    
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        registerForContextMenu(getListView());
+    }
 
     private class ImportAllThread extends Thread implements OnCancelListener, OnClickListener {
         boolean mCanceled = false;
@@ -127,26 +137,13 @@ public class SimContacts extends ADNList {
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
-        menu.add(0, MENU_IMPORT_ONE, 0, R.string.importSimEntry);
         menu.add(0, MENU_IMPORT_ALL, 0, R.string.importAllSimEntries);
         return true;
     }
 
     @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
-        super.onPrepareOptionsMenu(menu);
-        int count = mCursor != null ? mCursor.getCount() : 0;
-        menu.findItem(MENU_IMPORT_ONE).setVisible(getSelectedItemPosition() >= 0);
-        menu.findItem(MENU_IMPORT_ALL).setVisible(count > 0);
-        return true;
-    }
-
-    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
-            case MENU_IMPORT_ONE:
-                importOne(getSelectedItemPosition());
-                return true;
             case MENU_IMPORT_ALL:
                 CharSequence title = getString(R.string.importAllSimEntries);
                 CharSequence message = getString(R.string.importingSimContacts); 
@@ -168,6 +165,30 @@ public class SimContacts extends ADNList {
         }
         return super.onOptionsItemSelected(item);
     }
+    
+    @Override
+    public boolean onContextItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case MENU_IMPORT_ONE:
+                importOne(getSelectedItemPosition());
+                return true;
+        }
+        return super.onContextItemSelected(item);
+    }
+
+    
+    public void onCreateContextMenu(ContextMenu menu, View v,
+            ContextMenu.ContextMenuInfo menuInfo) {
+        if (menuInfo instanceof AdapterView.AdapterContextMenuInfo) {
+            AdapterView.AdapterContextMenuInfo itemInfo =
+                    (AdapterView.AdapterContextMenuInfo) menuInfo;
+            TextView textView = (TextView) itemInfo.targetView.findViewById(android.R.id.text1);
+            if (textView != null) {
+                menu.setHeaderTitle(textView.getText());
+            }
+        }
+        menu.add(0, MENU_IMPORT_ONE, 0, R.string.importSimEntry);
+    }
 
     @Override
     public void onListItemClick(ListView l, View v, int position, long id) {