summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrint E. Kriebel <bekit@cyngn.com>2014-11-03 19:11:11 -0800
committerBrint E. Kriebel <bekit@cyngn.com>2014-11-03 19:11:11 -0800
commitf9db81424082ebe5fd4f47754fc58697379054ca (patch)
tree6b0629099bccbd862f88ab0ae04037fb88703166
parent637e2f0cb94337d77c3fd054fd184446d56d8988 (diff)
parentb6783c46c27a987f5b50b6f77b95af16ed0c6030 (diff)
downloadandroid_packages_apps_Dialer-f9db81424082ebe5fd4f47754fc58697379054ca.tar.gz
android_packages_apps_Dialer-f9db81424082ebe5fd4f47754fc58697379054ca.tar.bz2
android_packages_apps_Dialer-f9db81424082ebe5fd4f47754fc58697379054ca.zip
Merge branch 'cm-11.0' into stable/cm-11.0
Conflicts: res/values-in/cm_strings.xml res/values-ja/cm_strings.xml res/values-lt/cm_strings.xml res/values-nb/cm_strings.xml res/values-pl/cm_strings.xml res/values-th/cm_strings.xml Change-Id: I152152f769d34de37787a15e157da12aa01a8b66
-rw-r--r--res/values-de/cm_strings.xml1
-rw-r--r--res/values-in/cm_strings.xml1
-rw-r--r--res/values-iw/cm_strings.xml19
-rw-r--r--res/values-ja/cm_strings.xml6
-rw-r--r--res/values-lb/cm_plurals.xml35
-rw-r--r--res/values-lb/cm_strings.xml18
-rw-r--r--res/values-lb/strings.xml111
-rw-r--r--res/values-lt/cm_strings.xml2
-rw-r--r--res/values-lv/cm_arrays.xml28
-rw-r--r--res/values-lv/cm_plurals.xml39
-rw-r--r--res/values-lv/cm_strings.xml72
-rw-r--r--res/values-nb/cm_strings.xml1
-rw-r--r--res/values-pl/cm_strings.xml1
-rw-r--r--res/values-sv/cm_strings.xml1
-rw-r--r--res/values-th/cm_strings.xml1
-rw-r--r--res/values-ug/strings.xml193
-rw-r--r--res/values-uk/cm_strings.xml19
-rw-r--r--src/com/android/dialer/CallDetailHeader.java8
-rw-r--r--src/com/android/dialer/DialtactsActivity.java11
-rwxr-xr-xsrc/com/android/dialer/PhoneCallDetailsHelper.java6
-rw-r--r--src/com/android/dialer/calllog/IntentProvider.java3
-rw-r--r--src/com/android/dialer/lookup/ContactBuilder.java39
-rw-r--r--src/com/android/dialer/lookup/LookupProvider.java37
-rw-r--r--src/com/android/dialer/lookup/LookupSettings.java1
-rw-r--r--src/com/android/dialer/lookup/LookupUtils.java84
-rw-r--r--src/com/android/dialer/lookup/ReverseLookup.java16
-rw-r--r--src/com/android/dialer/lookup/ReverseLookupThread.java29
-rw-r--r--src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java39
-rw-r--r--src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java108
-rw-r--r--src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java39
-rw-r--r--src/com/android/dialer/lookup/google/GoogleForwardLookup.java17
-rw-r--r--src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java60
-rw-r--r--src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java36
-rw-r--r--src/com/android/dialer/lookup/paginebianche/PagineBiancheApi.java82
-rw-r--r--src/com/android/dialer/lookup/paginebianche/PagineBiancheReverseLookup.java70
-rw-r--r--src/com/android/dialer/lookup/whitepages/WhitePagesApi.java180
-rw-r--r--src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java31
-rw-r--r--src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java43
-rw-r--r--src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java197
-rw-r--r--src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java39
-rw-r--r--src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java99
-rw-r--r--src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java42
42 files changed, 1059 insertions, 805 deletions
diff --git a/res/values-de/cm_strings.xml b/res/values-de/cm_strings.xml
index 651961fa3..ee469ff83 100644
--- a/res/values-de/cm_strings.xml
+++ b/res/values-de/cm_strings.xml
@@ -66,6 +66,7 @@
<string name="call_log_show_all_slots">Alle SIM-Karten</string>
<string name="yes">Ja</string>
<string name="no">Nein</string>
+ <string name="call_duration_active">Aktive Dauer:</string>
<string name="call_duration_call_out">Gesprächsdauer:</string>
<string name="call_log_all_calls_header">Alle Anrufe</string>
</resources>
diff --git a/res/values-in/cm_strings.xml b/res/values-in/cm_strings.xml
index 97a2db475..9b659199e 100644
--- a/res/values-in/cm_strings.xml
+++ b/res/values-in/cm_strings.xml
@@ -59,6 +59,7 @@
<string name="speed_dial_replace">Ganti</string>
<string name="speed_dial_delete">Hapus</string>
<string name="speed_dial_unassigned_dialog_title">Tombol belum ditetapkan</string>
+ <string name="speed_dial_unassigned_dialog_message">Tidak ada kontak panggil cepat yang ditetapkan ke tombol angka \'<xliff:g id="number">%s</xliff:g>\'. Apakah Anda ingin menetapkan sebuah kontak sekarang?</string>
<string name="dialog_speed_dial_airplane_mode_message">"Untuk menggunakan panggilan cepat, pertama matikan mode Pesawat."</string>
<string name="msim_ime_dialog_title">Identifikasi perangkat</string>
<string name="multi_sim_slot_name">SIM <xliff:g id="index">%d</xliff:g></string>
diff --git a/res/values-iw/cm_strings.xml b/res/values-iw/cm_strings.xml
index 23862f852..3bb61007e 100644
--- a/res/values-iw/cm_strings.xml
+++ b/res/values-iw/cm_strings.xml
@@ -50,4 +50,23 @@
<string name="start_call_playback">נגן הקלטה</string>
<string name="stop_call_playback">עצור</string>
<string name="call_playback_error_message">נכשל בניגון הקלטה</string>
+ <string name="calllog_search_hint">חיפוש ביומן שיחות</string>
+ <string name="video_call">שיחת וידאו</string>
+ <string name="video_call_settings">הגדרות שיחת וידאו</string>
+ <string name="description_videocall">שיחת וידאו <xliff:g id="name">%1$s</xliff:g></string>
+ <string name="speed_dial_settings">הגדרות חיוג מהיר</string>
+ <string name="speed_dial_not_set">(לא מוגדר)</string>
+ <string name="speed_dial_replace">החלף</string>
+ <string name="speed_dial_delete">מחק</string>
+ <string name="speed_dial_unassigned_dialog_title">לא הוגדר מקש</string>
+ <string name="speed_dial_unassigned_dialog_message">שום איש קשר מהיר אינו מחובר למספר \'<xliff:g id="number">%s</xliff:g>\'. האם ברצונך להגדיר איש קשר?</string>
+ <string name="dialog_speed_dial_airplane_mode_message">"כדי להשתמש בחיוג מהיר, בטל תחילה את מצב טיסה."</string>
+ <string name="msim_ime_dialog_title">מזהה התקן</string>
+ <string name="multi_sim_slot_name">סים <xliff:g id="index">%d</xliff:g></string>
+ <string name="call_log_show_all_slots">כל הסימים</string>
+ <string name="yes">כן</string>
+ <string name="no">לא</string>
+ <string name="call_duration_active">זמן שיחה פעילה:</string>
+ <string name="call_duration_call_out">משך השיחה:</string>
+ <string name="call_log_all_calls_header">כל השיחות</string>
</resources>
diff --git a/res/values-ja/cm_strings.xml b/res/values-ja/cm_strings.xml
index d410938de..7185b6a36 100644
--- a/res/values-ja/cm_strings.xml
+++ b/res/values-ja/cm_strings.xml
@@ -39,8 +39,8 @@
<string name="date_qs_lastmonth">先月</string>
<string name="date_qs_lastquarter">下四半期</string>
<string name="date_qs_lastyear">昨年</string>
- <string name="call_stats_date_filter">時間の範囲を調整</string>
- <string name="call_stats_reset_filter">時間の範囲をリセット</string>
+ <string name="call_stats_date_filter">時間範囲を調整</string>
+ <string name="call_stats_reset_filter">時間範囲をリセット</string>
<string name="call_stats_sort_by_duration">通話時間で並べ替え</string>
<string name="call_stats_sort_by_count">通話回数で並べ替え</string>
<string name="menu_add_to_blacklist">ブラックリストに追加</string>
@@ -58,7 +58,7 @@
<string name="speed_dial_not_set">(未設定)</string>
<string name="speed_dial_replace">書き換える</string>
<string name="speed_dial_delete">削除</string>
- <string name="speed_dial_unassigned_dialog_title">キーが割り当てられていません</string>
+ <string name="speed_dial_unassigned_dialog_title">キーに割り当てがありません</string>
<string name="speed_dial_unassigned_dialog_message">数字キー「<xliff:g id="number">%s</xliff:g>」にはスピードダイヤルの連絡先が割り当てられていません。連絡先を割り当てますか?</string>
<string name="dialog_speed_dial_airplane_mode_message">"スピードダイヤルを使用するには、機内モードをOFFにしてください。"</string>
<string name="msim_ime_dialog_title">端末識別子</string>
diff --git a/res/values-lb/cm_plurals.xml b/res/values-lb/cm_plurals.xml
new file mode 100644
index 000000000..2bf4fd50a
--- /dev/null
+++ b/res/values-lb/cm_plurals.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2013-2014 The CyanogenMod 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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <plurals name="hour">
+ <item quantity="one">%d Stonn</item>
+ <item quantity="other">%d Stonnen</item>
+ </plurals>
+ <plurals name="minute">
+ <item quantity="one">%d Minutt</item>
+ <item quantity="other">%d Minutten</item>
+ </plurals>
+ <plurals name="second">
+ <item quantity="one">%d Sekonn</item>
+ <item quantity="other">%d Sekonnen</item>
+ </plurals>
+ <plurals name="call">
+ <item quantity="one">%d Uruff</item>
+ <item quantity="other">%d Uriff</item>
+ </plurals>
+</resources>
diff --git a/res/values-lb/cm_strings.xml b/res/values-lb/cm_strings.xml
index 8ae6968b5..75c062146 100644
--- a/res/values-lb/cm_strings.xml
+++ b/res/values-lb/cm_strings.xml
@@ -16,9 +16,27 @@
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_log_stats_title">Statistiken</string>
+ <string name="callStatsDetailTitle">Detailer vun den Uruffstatistiken</string>
+ <string name="call_stats_nav_all">All</string>
+ <string name="call_stats_nav_incoming">Erakommend</string>
+ <string name="call_stats_nav_outgoing">Erausgoend</string>
<string name="call_stats_nav_missed">Verpasst</string>
+ <string name="call_stats_incoming">Erakommend: <xliff:g id="percent">%d</xliff:g>%%</string>
+ <string name="call_stats_outgoing">Erausgoend: <xliff:g id="percent">%d</xliff:g>%%</string>
+ <string name="call_stats_missed">Verpasst</string>
+ <string name="call_stats_missed_percent">Verpasst: <xliff:g id="percent">%d</xliff:g>%%</string>
+ <string name="call_stats_filter_from">Startdatum</string>
+ <string name="call_stats_filter_to">Schlussdatum</string>
+ <string name="call_stats_filter_picker_title">Zäitfënster</string>
+ <string name="date_quick_selection">Séier Auswiel</string>
+ <string name="date_qs_currentmonth">Aktuelle Mount</string>
+ <string name="date_qs_currentquarter">Aktuellt Trimester</string>
<string name="date_qs_currentyear">Aktuellt Joer</string>
<string name="date_qs_lastweek">Lescht Woch</string>
<string name="date_qs_lastmonth">Leschte Mount</string>
+ <string name="date_qs_lastquarter">Lescht Trimester</string>
<string name="date_qs_lastyear">Lescht Joer</string>
+ <string name="call_stats_date_filter">Zäitfënster ajustéieren</string>
+ <string name="menu_add_to_blacklist">Op d\'schwaarz Lëscht setzen</string>
</resources>
diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml
index 94d6651a5..cf86882fc 100644
--- a/res/values-lb/strings.xml
+++ b/res/values-lb/strings.xml
@@ -26,18 +26,47 @@
<string name="recentCalls_addToContact">Bei d\'Kontakter dobäisetzen</string>
<string name="recentCalls_removeFromRecentList">Aus der Urufflëscht läschen</string>
<string name="recentCalls_deleteAll">Urufflëscht eidel maachen</string>
+ <string name="recentCalls_trashVoicemail">Mailbox-Opnam läschen</string>
+ <string name="recentCalls_shareVoicemail">Mailbox deelen</string>
<string name="recentCalls_empty">Urufflëscht ass eidel.</string>
<string name="clearCallLogConfirmation_title">Urufflëscht eidel maachen?</string>
+ <string name="clearCallLogConfirmation">Deng ganz Urufflëscht gëtt geläscht.</string>
+ <string name="clearCallLogProgress_title">Urufflëscht gëtt eidel gemaach\u2026</string>
+ <plurals name="notification_voicemail_title">
+ <item quantity="one">Mailbox-Opnam</item>
+ <item quantity="other">
+ <xliff:g id="count">%1$d</xliff:g>
+ Mailbox-Opnamen
+ </item>
+ </plurals>
<string name="notification_action_voicemail_play">Ofspillen</string>
<string name="notification_voicemail_callers_list"><xliff:g id="newer_callers">%1$s</xliff:g>,
<xliff:g id="older_caller">%2$s</xliff:g>
    </string>
+ <string name="notification_new_voicemail_ticker">Nei Mailbox-Opnam vum <xliff:g id="caller">%1$s</xliff:g></string>
+ <string name="voicemail_playback_error">Konnt d\'Mailbox-Opnam net ofspillen.</string>
<string name="voicemail_buffering">Pufferung\u2026</string>
+ <string name="voicemail_fetching_content">Mailbox-Opnam gëtt erofgelueden\u2026</string>
+ <string name="voicemail_fetching_timout">Mailbox konnt net geluede ginn.</string>
+ <string name="call_log_voicemail_header">Just Mailbox-Uriff</string>
+ <string name="call_log_incoming_header">Just erakommend Uriff</string>
+ <string name="call_log_outgoing_header">Just erausgoend Uriff</string>
+ <string name="call_log_missed_header">Just verpasst Uriff</string>
+ <string name="voicemail_status_voicemail_not_available">Kann net mam Mailbox-Server connectéieren.</string>
+ <string name="voicemail_status_messages_waiting">Kann net mam Mailbox-Server connectéieren. Nei Opname waarden.</string>
+ <string name="voicemail_status_configure_voicemail">Deng Mailbox astellen. </string>
+ <string name="voicemail_status_audio_not_available">Toun net disponibel.</string>
<string name="voicemail_status_action_configure">Ariichten</string>
+ <string name="voicemail_status_action_call_server">Mailbox uruffen</string>
+ <string name="voicemail_speed_slowest">Luest Vitess</string>
<string name="voicemail_speed_slower">Lues Vitesse</string>
<string name="voicemail_speed_normal">Normal Vitesse</string>
+ <string name="voicemail_speed_faster">Séier Vitess</string>
+ <string name="voicemail_speed_fastest">Séierst Vitess</string>
+ <string name="call_log_item_count_and_date">(<xliff:g id="count">%1$d</xliff:g>) <xliff:g id="date">%2$s</xliff:g></string>
<string name="sms_disambig_title">Nummer auswielen</string>
<string name="call_disambig_title">Nummer auswielen</string>
+ <string name="make_primary">Dëse Choix verhalen</string>
<string name="description_image_button_one">een</string>
<string name="description_image_button_two">zwee</string>
<string name="description_image_button_three">dräi</string>
@@ -47,26 +76,87 @@
<string name="description_image_button_seven">siwen</string>
<string name="description_image_button_eight">aacht</string>
<string name="description_image_button_nine">néng</string>
+ <string name="description_image_button_star">Stär</string>
<string name="description_image_button_zero">null</string>
<string name="description_image_button_pound">Pond</string>
+ <string name="description_voicemail_button">Mailbox</string>
<string name="description_search_button">sichen</string>
<string name="description_dial_button">wielen</string>
<string name="description_delete_button">Récktast</string>
+ <string name="description_digits_edittext">Nummer déi ze wielen ass</string>
<string name="action_menu_call_history_description">Urufffhistorique</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">Méi Optiounen</string>
+ <string name="action_menu_dialpad_button">Wieltasten</string>
<string name="menu_copy">Kopéieren</string>
+ <string name="menu_show_outgoing_only">Just déi erausgoend uweisen</string>
+ <string name="menu_show_incoming_only">Just déi erakommend uweisen</string>
+ <string name="menu_show_missed_only">Just déi verpasst uweisen</string>
+ <string name="menu_show_voicemails_only">Just Mailbox-Opnamen uweisen</string>
+ <string name="menu_show_all_calls">All Uriff uweisen</string>
+ <string name="add_2sec_pause">2-Sek.-Paus dobäisetzen</string>
+ <string name="add_wait">Paus dobäisetzen</string>
<string name="call_settings">Astellungen</string>
<string name="menu_newContact">Neie Kontakt</string>
- <string name="menu_allContacts">All Kontakter</string>
+ <string name="menu_allContacts">All d\'Kontakter</string>
+ <string name="callDetailTitle">Uruffdetailer</string>
+ <string name="toast_call_detail_error">Konnt d\'Detailer fir de gefroten Uruff net liesen.</string>
+ <string name="dialer_useDtmfDialpad">Telefonstastatur benotzen</string>
+ <string name="dialer_returnToInCallScreen">Zréck bei den aktuellen Uruff</string>
+ <string name="dialer_addAnotherCall">Uruff dobäisetzen</string>
+ <string name="type_incoming">Erakommenden Uruff</string>
+ <string name="type_outgoing">Erausgoenden Uruff</string>
<string name="type_missed">Verpassten Uruff</string>
+ <string name="type_voicemail">Sproochopnam</string>
+ <string name="actionIncomingCall">Erakommend Uriff</string>
+ <string name="description_call_log_play_button">Mailbox-Opnam ofspillen</string>
+ <string name="description_call_log_incoming_call">Erakommenden Uruff</string>
+ <string name="description_call_log_outgoing_call">Erausgoenden Uruff</string>
<string name="description_call_log_missed_call">Verpassten Uruff</string>
+ <string name="description_call_log_voicemail">Sproochopnam</string>
<string name="description_add_contact">Kontakt dobäisetzen</string>
+ <string name="description_view_contact">Kontakt <xliff:g id="name">%1$s</xliff:g> uweisen</string>
+ <string name="description_call"><xliff:g id="name">%1$s</xliff:g> uruffen</string>
+ <string name="description_contact_details">Kontaktdetailer fir <xliff:g id="nameOrNumber">%1$s</xliff:g></string>
+ <string name="description_call_details">Uruffdetailer</string>
+ <string name="description_new_voicemail">Nei Mailbox-Opnam.</string>
+ <string name="description_num_calls"><xliff:g id="numberOfCalls">%1$s</xliff:g> Uriff.</string>
+ <string name="description_return_missed_call">Réckruff fir de verpassten Uruff vum <xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> <xliff:g id="timeOfCall">%3$s</xliff:g></string>
+ <string name="description_return_answered_call">Réckruff fir de beäntwerten Uruff vum <xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> <xliff:g id="timeOfCall">%3$s</xliff:g></string>
+ <string name="description_unknown_missed_call">Verpassten Uruff vum <xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> <xliff:g id="timeOfCall">%3$s</xliff:g></string>
+ <string name="description_unknown_answered_call">Beäntwerten Uruff vum <xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> <xliff:g id="timeOfCall">%3$s</xliff:g></string>
+ <string name="description_call_last_multiple"><xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> uruffen. Fir d\'lescht ugeruff <xliff:g id="timeOfCall">%3$s</xliff:g>.</string>
+ <string name="description_call_last"><xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> uruffen. Ugeruff <xliff:g id="timeOfCall">%3$s</xliff:g>.</string>
+ <string name="description_send_text_message">Dem <xliff:g id="name">%1$s</xliff:g> eng SMS schécken</string>
+ <string name="description_call_log_unheard_voicemail">Ongelauschtert Mailbox-Opnam</string>
+ <string name="description_clear_search">Sich läschen</string>
+ <string name="description_start_voice_search">Sich mat der Stëmm starten</string>
+ <string name="menu_callNumber"><xliff:g id="number">%s</xliff:g> uruffen</string>
<string name="unknown">Onbekannt</string>
+ <string name="voicemail">Sproochopnam</string>
+ <string name="private_num">Privat Nummer</string>
+ <string name="payphone">Telefonskabinn</string>
+ <string name="dialerKeyboardHintText">D\'Tastatur benotze fir ze wielen</string>
+ <string name="dialerDialpadHintText">Nummer wielen</string>
+ <string name="callDetailsDurationFormat"><xliff:g id="minutes" example="42">%s</xliff:g> Min. <xliff:g id="seconds" example="28">%s</xliff:g> Sek.</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="4313552620858880999">Uruff net ofgesat</string>
+ <string name="dialog_voicemail_not_ready_message">Konfiguréier deng Mailbox ënner Menü &gt; Astellungen.</string>
+ <string name="dialog_voicemail_airplane_mode_message">Schalt de Fligermodus aus fir d\'Mailbox unzeruffen.</string>
<string name="contact_list_loading">Gëtt gelueden\u2026</string>
<string name="imei">IMEI</string>
<string name="meid">MEID</string>
+ <string name="simContacts_emptyLoading">Gëtt vun der SIM-Kaart gelueden\u2026</string>
+ <string name="simContacts_title">Kontakter vun der SIM-Kaart</string>
+ <string name="add_contact_not_available">Reaktivéier d\'\"Leit\"-App fir dës Funktioun ze benotzen.</string>
+ <string name="voice_search_not_available">Stëmmsich ass net disponibel.</string>
+ <string name="dialer_hint_find_contact">Tipp en Numm oder eng Telefonsnummer</string>
<string name="call_log_all_title">All</string>
+ <string name="call_log_missed_title">Verpasst</string>
+ <string name="call_log_activity_title_font_family">sans-serif-light</string>
+ <string name="show_all_contacts_title_font_family">sans-serif-light</string>
+ <string name="recentMissed_empty">Keng rezent verpasst Uriff.</string>
+ <string name="recentVoicemails_empty">Keng rezent Mailbox-Opnamen.</string>
<string name="show_all_contacts">All d\'Kontakter uweisen</string>
+ <string name="show_favorites_only">Just Favoritten uweisen</string>
<string name="call_log_activity_title">Historique</string>
<string name="dialpad_0_number">0</string>
<string name="dialpad_1_number">1</string>
@@ -89,8 +179,23 @@
<string name="dialpad_7_letters">PQRS</string>
<string name="dialpad_8_letters">TUV</string>
<string name="dialpad_9_letters">WXYZ</string>
- <string name="show_all_contacts_title">All Kontakter</string>
- <string name="show_all_contacts_button_text">All Kontakter</string>
+ <string name="show_all_contacts_title">All d\'Kontakter</string>
+ <string name="show_all_contacts_button_text">All d\'Kontakter</string>
+ <string name="favorite_hidden">Aus de Favoritte läschen</string>
+ <string name="favorite_hidden_undo">Réckgängeg maachen</string>
+ <string name="search_shortcut_call_number"><xliff:g id="number">%s</xliff:g>
+ uruffen
+    </string>
+ <string name="search_shortcut_add_to_contacts">Bei d\'Kontakter dobäisetzen</string>
+ <string name="num_missed_calls"><xliff:g id="number">%s</xliff:g> nei verpasst Uriff</string>
+ <string name="no_favorites">Favoritten a Kontakter déi s du\ndacks uriffs ginn hei ugewisen.\nAlso, fänk u mat Uruffen.</string>
+ <string name="contact_tooltip">Op d\'Bild drécke fir all d\'Nummeren ze gesinn oder gedréckt hale fir anescht ze zortéieren</string>
<string name="description_dismiss">Verwerfen</string>
<string name="remove_contact">Ewechhuelen</string>
+ <string name="favorites_menu_speed_dial">Séiert Wielen</string>
+ <string name="favorites_menu_all_contacts">ALL D\'KONTAKTER</string>
+ <string name="favorites_menu_speed_dial_font_family">sans-serif-light</string>
+ <string name="favorites_menu_all_contacts_font_family">sans-serif</string>
+ <string name="search_font_family">sans-serif</string>
+ <string name="tab_font_family">sans-serif</string>
</resources>
diff --git a/res/values-lt/cm_strings.xml b/res/values-lt/cm_strings.xml
index 33f72b272..39913a5ea 100644
--- a/res/values-lt/cm_strings.xml
+++ b/res/values-lt/cm_strings.xml
@@ -59,7 +59,7 @@
<string name="speed_dial_replace">Pakeisti</string>
<string name="speed_dial_delete">Ištrinti</string>
<string name="speed_dial_unassigned_dialog_title">Klavišas nepriskirtas</string>
- <string name="speed_dial_unassigned_dialog_message">Joks kontaktas šiam greito rinkimo numeriui nepriskirtas \'<xliff:g id="number">%s</xliff:g>\'. Ar norite priskirti kontaktą dabar?</string>
+ <string name="speed_dial_unassigned_dialog_message">Joks kontaktas šiam greitojo rinkimo numeriui nepriskirtas „<xliff:g id="number">%s</xliff:g>“. Ar norite priskirti kontaktą dabar?</string>
<string name="dialog_speed_dial_airplane_mode_message">"Norėdami naudotis greituoju rinkimu, pirmiausiai išjunkite lėktuvo režimą."</string>
<string name="msim_ime_dialog_title">Įrenginio identifikavimo kodas</string>
<string name="multi_sim_slot_name">SIM <xliff:g id="index">%d</xliff:g></string>
diff --git a/res/values-lv/cm_arrays.xml b/res/values-lv/cm_arrays.xml
new file mode 100644
index 000000000..ef9790556
--- /dev/null
+++ b/res/values-lv/cm_arrays.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2013-2014 The CyanogenMod 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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="call_stats_duration">
+ <item><xliff:g id="seconds" example="2 sekundes">%3$s</xliff:g></item>
+ <item><xliff:g id="minutes" example="2 minūtes">%2$s</xliff:g></item>
+ <item><xliff:g id="minutes" example="2 minūtes">%2$s</xliff:g> <xliff:g id="seconds" example="2 sekundes">%3$s</xliff:g></item>
+ <item><xliff:g id="hours" example="2 stundas">%1$s</xliff:g></item>
+ <item><xliff:g id="hours" example="2 stundas">%1$s</xliff:g> <xliff:g id="seconds" example="2 sekundes">%3$s</xliff:g></item>
+ <item><xliff:g id="hours" example="2 stundas">%1$s</xliff:g> <xliff:g id="minutes" example="2 minūtes">%2$s</xliff:g></item>
+ <item><xliff:g id="hours" example="2 stundas">%1$s</xliff:g> <xliff:g id="minutes" example="2 minūtes">%2$s</xliff:g> <xliff:g id="seconds" example="2 sekundes">%3$s</xliff:g></item>
+ </string-array>
+</resources>
diff --git a/res/values-lv/cm_plurals.xml b/res/values-lv/cm_plurals.xml
new file mode 100644
index 000000000..4f0649df6
--- /dev/null
+++ b/res/values-lv/cm_plurals.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2013-2014 The CyanogenMod 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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <plurals name="hour">
+ <item quantity="zero">%d stunda</item>
+ <item quantity="one">%d stunda</item>
+ <item quantity="other">%d stundas</item>
+ </plurals>
+ <plurals name="minute">
+ <item quantity="zero">%d minūte</item>
+ <item quantity="one">%d minūte</item>
+ <item quantity="other">%d minūtes</item>
+ </plurals>
+ <plurals name="second">
+ <item quantity="zero">%d s</item>
+ <item quantity="one">%d s</item>
+ <item quantity="other">%d s</item>
+ </plurals>
+ <plurals name="call">
+ <item quantity="zero">%d zvans</item>
+ <item quantity="one">%d zvans</item>
+ <item quantity="other">%d zvani</item>
+ </plurals>
+</resources>
diff --git a/res/values-lv/cm_strings.xml b/res/values-lv/cm_strings.xml
new file mode 100644
index 000000000..c635a731b
--- /dev/null
+++ b/res/values-lv/cm_strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ Copyright (C) 2013-2014 The CyanogenMod 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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="call_log_stats_title">Statistika</string>
+ <string name="callStatsDetailTitle">Zvanu statistikas detaļas</string>
+ <string name="call_stats_nav_all">Visi</string>
+ <string name="call_stats_nav_incoming">Ienākošie</string>
+ <string name="call_stats_nav_outgoing">Izejošie</string>
+ <string name="call_stats_nav_missed">Neatbildēti</string>
+ <string name="call_stats_incoming">Ienākošie: <xliff:g id="percent">%d</xliff:g>%%</string>
+ <string name="call_stats_outgoing">Izejošie: <xliff:g id="percent">%d</xliff:g>%%</string>
+ <string name="call_stats_missed">Neatbildēti</string>
+ <string name="call_stats_missed_percent">Neatbildēti: <xliff:g id="percent">%d</xliff:g>%%</string>
+ <string name="call_stats_header_total">Kopā: <xliff:g id="call_count">%s</xliff:g>, <xliff:g id="duration">%s</xliff:g></string>
+ <string name="call_stats_header_total_callsonly">Kopā: <xliff:g id="call_count">%s</xliff:g></string>
+ <string name="call_stats_filter_from">Sākuma datums</string>
+ <string name="call_stats_filter_to">Beigu datums</string>
+ <string name="call_stats_filter_picker_title">Filtra diapazons</string>
+ <string name="date_quick_selection">Ātrā izvēle</string>
+ <string name="date_qs_currentmonth">Tekošais mēnesis</string>
+ <string name="date_qs_currentquarter">Tekošais ceturksnis</string>
+ <string name="date_qs_currentyear">Tekošais gads</string>
+ <string name="date_qs_lastweek">Iepriekšējā nedēļa</string>
+ <string name="date_qs_lastmonth">Iepriekšējais mēnesis</string>
+ <string name="date_qs_lastquarter">Iepriekšējais ceturksnis</string>
+ <string name="date_qs_lastyear">Iepriekšējais gads</string>
+ <string name="call_stats_date_filter">Pielāgot laika diapazonu</string>
+ <string name="call_stats_reset_filter">Atstatīt laika diapazonu</string>
+ <string name="call_stats_sort_by_duration">Kārtot pēc zvana ilguma</string>
+ <string name="call_stats_sort_by_count">Kārtot pēc zvanu skaita</string>
+ <string name="menu_add_to_blacklist">Pievienot melnajam sarakstam</string>
+ <string name="toast_added_to_blacklist"><xliff:g id="number">%s</xliff:g> pievienots melnajam sarakstam</string>
+ <string name="nearby_places">Tuvākās vietas</string>
+ <string name="people">Cilvēki</string>
+ <string name="start_call_playback">Atskaņot ierakstu</string>
+ <string name="stop_call_playback">Apturēt</string>
+ <string name="call_playback_error_message">Neizdevās atskaņot ierakstu</string>
+ <string name="calllog_search_hint">Meklēt zvanu žurnālā</string>
+ <string name="video_call">Videozvans</string>
+ <string name="video_call_settings">Videozvana iestatījumi</string>
+ <string name="description_videocall">Videozvans <xliff:g id="name">%1$s</xliff:g></string>
+ <string name="speed_dial_settings">Ātrās zvanīšanas iestatījumi</string>
+ <string name="speed_dial_not_set">(nav iestatīts)</string>
+ <string name="speed_dial_replace">Aizstāt</string>
+ <string name="speed_dial_delete">Dzēst</string>
+ <string name="speed_dial_unassigned_dialog_title">Neiestatīts taustiņš</string>
+ <string name="speed_dial_unassigned_dialog_message">Cipara taustiņam \'<xliff:g id="number">%s</xliff:g>\' nav piešķirts ātrā zvana kontakts. Vai vēlaties piešķirt kontaktu tagad?</string>
+ <string name="dialog_speed_dial_airplane_mode_message">"Lai izmantotu ātro zvanu, vispirms atslēdziet lidmašīnas režīmu."</string>
+ <string name="msim_ime_dialog_title">Iekārtas identifikators</string>
+ <string name="multi_sim_slot_name">SIM <xliff:g id="index">%d</xliff:g></string>
+ <string name="call_log_show_all_slots">Visas SIM kartes</string>
+ <string name="yes">Jā</string>
+ <string name="no">Nē</string>
+ <string name="call_duration_active">Aktīvais ilgums:</string>
+ <string name="call_duration_call_out">Zvana ilgums:</string>
+ <string name="call_log_all_calls_header">Visi zvani</string>
+</resources>
diff --git a/res/values-nb/cm_strings.xml b/res/values-nb/cm_strings.xml
index a368d4f05..33ffda30c 100644
--- a/res/values-nb/cm_strings.xml
+++ b/res/values-nb/cm_strings.xml
@@ -59,6 +59,7 @@
<string name="speed_dial_replace">Erstatt</string>
<string name="speed_dial_delete">Slett</string>
<string name="speed_dial_unassigned_dialog_title">Nøkkel utilordnet</string>
+ <string name="speed_dial_unassigned_dialog_message">Ingen hurtigoppringerkontakt er tilegnet nummertasten \'<xliff:g id="number">%s</xliff:g>\'. Vil du tilegne en kontakt nå?</string>
<string name="dialog_speed_dial_airplane_mode_message">"For å bruke hurtigoppringing må du skru av flymodus."</string>
<string name="msim_ime_dialog_title">Enhetsidentifikator</string>
<string name="multi_sim_slot_name">SIM <xliff:g id="index"> %d </xliff:g></string>
diff --git a/res/values-pl/cm_strings.xml b/res/values-pl/cm_strings.xml
index 8216af96a..c19c16ada 100644
--- a/res/values-pl/cm_strings.xml
+++ b/res/values-pl/cm_strings.xml
@@ -59,6 +59,7 @@
<string name="speed_dial_replace">Zastąp</string>
<string name="speed_dial_delete">Usuń</string>
<string name="speed_dial_unassigned_dialog_title">Klawisz nieprzypisany</string>
+ <string name="speed_dial_unassigned_dialog_message">Brak kontaktu szybkiego wybierania przypisanego do klawisza \"<xliff:g id="number">%s</xliff:g>\". Czy chcesz przypisać kontakt teraz?</string>
<string name="dialog_speed_dial_airplane_mode_message">"Aby korzystać z szybkiego wybierania, najpierw należy wyłączyć tryb samolotowy."</string>
<string name="msim_ime_dialog_title">Identyfikator urządzenia</string>
<string name="multi_sim_slot_name">SIM <xliff:g id="index">%d</xliff:g></string>
diff --git a/res/values-sv/cm_strings.xml b/res/values-sv/cm_strings.xml
index 05d5ae1eb..45e0c0e02 100644
--- a/res/values-sv/cm_strings.xml
+++ b/res/values-sv/cm_strings.xml
@@ -50,4 +50,5 @@
<string name="start_call_playback">Spela inspelning</string>
<string name="stop_call_playback">Stoppa</string>
<string name="call_playback_error_message">Det gick inte att spela inspelningen</string>
+ <string name="no">Nej</string>
</resources>
diff --git a/res/values-th/cm_strings.xml b/res/values-th/cm_strings.xml
index 3b0df394d..d96c703c1 100644
--- a/res/values-th/cm_strings.xml
+++ b/res/values-th/cm_strings.xml
@@ -59,6 +59,7 @@
<string name="speed_dial_replace">แทน​ที่</string>
<string name="speed_dial_delete">ลบ</string>
<string name="speed_dial_unassigned_dialog_title">ไม่ได้ระบุปุ่ม</string>
+ <string name="speed_dial_unassigned_dialog_message">ไม่มีทางลัดถูกกำหนดไว้ที่หมายเลข \'<xliff:g id="number">%s</xliff:g>\' คุณต้องการสร้างทางลัดหรือไม่</string>
<string name="dialog_speed_dial_airplane_mode_message">"เพื่อใช้การโทรอย่างรวดเร็ว, ต้องปิดโหมดเครื่องบินก่อน"</string>
<string name="msim_ime_dialog_title">รหัสอุปกรณ์</string>
<string name="multi_sim_slot_name">ซิม<xliff:g id="index">%d</xliff:g></string>
diff --git a/res/values-ug/strings.xml b/res/values-ug/strings.xml
new file mode 100644
index 000000000..cecf03fc9
--- /dev/null
+++ b/res/values-ug/strings.xml
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!--
+ ~ Copyright (C) 2012 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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="applicationLabel">نومۇر بۇرىغۇچ</string>
+ <string name="launcherDialer">تېلېفون</string>
+ <string name="dialerIconLabel">تېلېفون</string>
+ <string name="recentCallsIconLabel">چاقىرىش خاتىرىسى</string>
+ <string name="menu_sendTextMessage">تېكست ئۇچۇر يوللا</string>
+ <string name="recentCalls_callNumber"><xliff:g id="NAME">%s</xliff:g> نى چاقىر</string>
+ <string name="recentCalls_editNumberBeforeCall">چىقىرىشتىن ئىلگىرى نومۇر تەھرىر</string>
+ <string name="recentCalls_addToContact">ئالاقەداشقا قوش</string>
+ <string name="recentCalls_removeFromRecentList">چاقىرىش خاتىرىسىدىن چىقىرىۋەت</string>
+ <string name="recentCalls_deleteAll">چاقىرىش خاتىرىسىنى تازىلا</string>
+ <string name="recentCalls_trashVoicemail">ئۈنخەت ئۆچۈر</string>
+ <string name="recentCalls_shareVoicemail">ئۈنخەت ھەمبەھىر</string>
+ <string name="recentCalls_empty">چاقىرىش خاتىرىسى بوش.</string>
+ <string name="clearCallLogConfirmation_title">چاقىرىش خاتىرىسىنى تازىلامدۇ؟</string>
+ <string name="clearCallLogConfirmation">ھەممە چاقىرىش خاتىرىسى ئۆچۈرۈلىدۇ.</string>
+ <string name="clearCallLogProgress_title">چاقىرىش خاتىرىسىنى تازىلاۋاتىدۇ…</string>
+ <plurals name="notification_voicemail_title">
+ <item quantity="other">ئۈنخەت</item>
+ </plurals>
+ <string name="notification_action_voicemail_play">چال</string>
+ <string name="notification_voicemail_callers_list"><xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g></string>
+ <string name="notification_new_voicemail_ticker"><xliff:g id="CALLER">%1$s</xliff:g> دىن كەلگەن يېڭى ئۈنخەت</string>
+ <string name="voicemail_playback_error">ئۈنخەتنى چالالمىدى.</string>
+ <string name="voicemail_buffering">يىغلەككە يىغىۋاتىدۇ…</string>
+ <string name="voicemail_fetching_content">ئۈنخەتنى تۇتۇۋاتىدۇ…</string>
+ <string name="voicemail_fetching_timout">ئۈنخەتنى تۇتالمايدۇ.</string>
+ <string name="call_log_voicemail_header">ئۈنخەتتىكىلا چاقىرىشلار</string>
+ <string name="call_log_incoming_header">چاقىرىلىشلارلا</string>
+ <string name="call_log_outgoing_header">چاقىرىشلارلا</string>
+ <string name="call_log_missed_header">‪سۆزلەشمىگەن چاقىرىشلارلا</string>
+ <string name="voicemail_status_voicemail_not_available">ئۈنخەت مۇلازىمېتىرىغا باغلىنالمايدۇ.</string>
+ <string name="voicemail_status_messages_waiting">ئۈنخەت مۇلازىمېتىرىغا باغلىنالمايدۇ. يېڭى ئۈنخەت كۈتۈۋاتىدۇ.</string>
+ <string name="voicemail_status_configure_voicemail">ئۈنخېتىڭىزنى تەڭشەيدۇ.</string>
+ <string name="voicemail_status_audio_not_available">ئۈننى ئىشلەتكىلى بولمايدۇ.</string>
+ <string name="voicemail_status_action_configure">تەڭشەك</string>
+ <string name="voicemail_status_action_call_server">ئۈنخەتنى چاقىر</string>
+ <string name="voicemail_speed_slowest">ئەڭ ئاستا سۈرئەت</string>
+ <string name="voicemail_speed_slower">ئاستا سۈرئەت</string>
+ <string name="voicemail_speed_normal">ئادەتتىكى سۈرئەت</string>
+ <string name="voicemail_speed_faster">تېز سۈرئەت</string>
+ <string name="voicemail_speed_fastest"> ئەڭ تېز سۈرئەت</string>
+ <string name="call_log_item_count_and_date">(<xliff:g id="COUNT">%1$d</xliff:g>) <xliff:g id="DATE">%2$s</xliff:g></string>
+ <string name="sms_disambig_title">نومۇر تاللاڭ</string>
+ <string name="call_disambig_title">نومۇر تاللاڭ</string>
+ <string name="make_primary">بۇ تاللاشنى ئەستە تۇت</string>
+ <string name="description_image_button_one">بىر</string>
+ <string name="description_image_button_two">ئىككى</string>
+ <string name="description_image_button_three">ئۈچ</string>
+ <string name="description_image_button_four">تۆت</string>
+ <string name="description_image_button_five">بەش</string>
+ <string name="description_image_button_six">ئالتە</string>
+ <string name="description_image_button_seven">يەتتە</string>
+ <string name="description_image_button_eight">سەككىز</string>
+ <string name="description_image_button_nine">توققۇز</string>
+ <string name="description_image_button_star">يۇلتۇز</string>
+ <string name="description_image_button_zero">نۆل</string>
+ <string name="description_image_button_pound">چارچاپ</string>
+ <string name="description_voicemail_button">ئۈنخەت</string>
+ <string name="description_search_button">ئىزدە</string>
+ <string name="description_dial_button">نومۇر بۇراش</string>
+ <string name="description_delete_button">backspace</string>
+ <string name="description_digits_edittext">ئۇرىدىغان نومۇر</string>
+ <string name="action_menu_call_history_description">چاقىرىش خاتىرىسى</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">تېخىمۇ كۆپ تاللانما</string>
+ <string name="action_menu_dialpad_button">نومۇر تاختا</string>
+ <string name="menu_copy">كۆچۈر</string>
+ <string name="menu_show_outgoing_only">چاقىرىشنىلا كۆرسەت</string>
+ <string name="menu_show_incoming_only">چاقىرىلىشنىلا كۆرسەت</string>
+ <string name="menu_show_missed_only">سۆزلەشمىگەنلەرنىلا كۆرسەت</string>
+ <string name="menu_show_voicemails_only">ئۈنخەتنىلا كۆرسەت</string>
+ <string name="menu_show_all_calls">ھەممە چاقىرىشنى كۆرسەت</string>
+ <string name="add_2sec_pause">ۋاقىتلىق توختاشقا 2 سېكۇنت قوش</string>
+ <string name="add_wait">كۈتۈش ۋاقتى قوش</string>
+ <string name="call_settings">تەڭشەكلەر</string>
+ <string name="menu_newContact">يېڭى ئالاقەداش</string>
+ <string name="menu_allContacts">ھەممە ئالاقەداشلار</string>
+ <string name="callDetailTitle">چاقىرىش تەپسىلاتى</string>
+ <string name="toast_call_detail_error">ئىلتىماس قىلغان چاقىرىشنىڭ تەپسىلاتىنى ئوقۇيالمىدى.</string>
+ <string name="dialer_useDtmfDialpad">كۇنۇپكىلىق ھەرپتاختا ئىشلىتىش</string>
+ <string name="dialer_returnToInCallScreen">چاقىرىشقا قايتىش</string>
+ <string name="dialer_addAnotherCall">چاقىرىش قوش</string>
+ <string name="type_incoming">چاقىرىلىش</string>
+ <string name="type_outgoing">چاقىرىش</string>
+ <string name="type_missed">سۆزلەشمىگەن چاقىرىش</string>
+ <string name="type_voicemail">ئۈنخەت</string>
+ <string name="actionIncomingCall">چاقىرىلىش</string>
+ <string name="description_call_log_play_button">ئۈنخەت چال</string>
+ <string name="description_call_log_incoming_call">چاقىرىلىش</string>
+ <string name="description_call_log_outgoing_call">چاقىرىش</string>
+ <string name="description_call_log_missed_call">سۆزلەشمىگەن چاقىرىش</string>
+ <string name="description_call_log_voicemail">ئۈنخەت</string>
+ <string name="description_add_contact">ئالاقەداش قوش</string>
+ <string name="description_view_contact"><xliff:g id="NAME">%1$s</xliff:g> ئالاقەداش كۆرسەت</string>
+ <string name="description_call"><xliff:g id="NAME">%1$s</xliff:g> نى چاقىر</string>
+ <string name="description_contact_details"><xliff:g id="nameOrNumber">%1$s</xliff:g> نىڭ ئالاقەداش تەپسىلاتى</string>
+ <string name="description_call_details">چاقىرىش تەپسىلاتى</string>
+ <string name="description_new_voicemail">يېڭى ئۈنخەت.</string>
+ <string name="description_num_calls"><xliff:g id="numberOfCalls">%1$s</xliff:g> چاقىرىش.</string>
+ <string name="description_return_missed_call"><xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> <xliff:g id="timeOfCall">%3$s</xliff:g> سۆزلەشمىگەن چاقىرىشقا قايتىدۇ</string>
+ <string name="description_return_answered_call"><xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> <xliff:g id="timeOfCall">%3$s</xliff:g> جاۋاب چاقىرىشقا قايتىدۇ</string>
+ <string name="description_unknown_missed_call"><xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> <xliff:g id="timeOfCall">%3$s</xliff:g> سۆزلەشمىگەن چاقىرىش</string>
+ <string name="description_unknown_answered_call"><xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> <xliff:g id="timeOfCall">%3$s</xliff:g> جاۋاب چاقىرىش</string>
+ <string name="description_call_last_multiple"><xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> چاقىرىش. ئاخىرقى چاقىرغان ۋاقىت <xliff:g id="timeOfCall">%3$s</xliff:g>.</string>
+ <string name="description_call_last"><xliff:g id="nameOrNumber">%1$s</xliff:g> <xliff:g id="typeOrLocation">%2$s</xliff:g> چاقىرىش. چاقىرغان ۋاقىت <xliff:g id="timeOfCall">%3$s</xliff:g>.</string>
+ <string name="description_send_text_message"><xliff:g id="NAME">%1$s</xliff:g> غا تېكىست ئۇچۇر يوللا</string>
+ <string name="description_call_log_unheard_voicemail">ئاڭلىمىغان ئۈنخەت</string>
+ <string name="description_clear_search">ئىزدەشنى تازىلا</string>
+ <string name="description_start_voice_search">تاۋۇش ئىزدەشنى باشلا</string>
+ <string name="menu_callNumber"><xliff:g id="NUMBER">%s</xliff:g> نى چاقىر</string>
+ <string name="unknown">يوچۇن</string>
+ <string name="voicemail">ئۈنخەت</string>
+ <string name="private_num">شەخسىي نومۇر</string>
+ <string name="payphone">ئاممىۋى تېلېفون</string>
+ <string name="dialerKeyboardHintText">ھەرپتاختىدا نومۇر بۇراش</string>
+ <string name="dialerDialpadHintText">نومۇر بۇراپ چاقىرىشقا قوش</string>
+ <string name="callDetailsDurationFormat"><xliff:g id="MINUTES">%1$s</xliff:g> مىنۇت <xliff:g id="SECONDS">%2$s</xliff:g> سېكۇنت</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="4313552620858880999">چاقىرىش يوللانمىدى</string>
+ <string name="dialog_voicemail_not_ready_message">ئۈنخەت تەڭشەشتە، تىزىملىك›تەڭشەكلەرگە يۆتكىلىڭ.</string>
+ <string name="dialog_voicemail_airplane_mode_message">ئۈنخەتنى چاقىرىشتا ئالدى بىلەن ئايروپىلان ھالىتىنى تاقاڭ.</string>
+ <string name="contact_list_loading">يۈكلەۋاتىدۇ…</string>
+ <string name="imei">IMEI</string>
+ <string name="meid">MEID</string>
+ <string name="simContacts_emptyLoading">SIM كارتىدىن يۈكلەۋاتىدۇ…</string>
+ <string name="simContacts_title">SIM كارتىدىكى ئالاقەداشلار</string>
+ <string name="add_contact_not_available">كىشىلەر ئەپنى قايتا قوزغاتقاندىلا ئاندىن بۇ ئىقتىدارنى ئىشلەتكىلى بولىدۇ.</string>
+ <string name="voice_search_not_available">ئاۋازلىق ئىزدەشنى ئىشلەتكىلى بولمايدۇ.</string>
+ <string name="dialer_hint_find_contact">ئىسىم ياكى تېلېفون نومۇرىنى كىرگۈزۈڭ</string>
+ <string name="call_log_all_title">ھەممىسى</string>
+ <string name="call_log_missed_title">سۆزلەشمىگەنلىرى</string>
+ <string name="call_log_activity_title_font_family">sans-serif-light</string>
+ <string name="show_all_contacts_title_font_family">sans-serif-light</string>
+ <string name="recentMissed_empty">يېقىنقى سۆزلەشمىگەن چاقىرىشلار يوق.</string>
+ <string name="recentVoicemails_empty">يېقىنقى ئۈنخەتلەر يوق.</string>
+ <string name="show_all_contacts">ھەممە ئالاقەداشنى كۆرسەت</string>
+ <string name="show_favorites_only">دائىملىق ئالاقەداشلارنىلا كۆرسەت</string>
+ <string name="call_log_activity_title">تارىخ</string>
+ <string name="dialpad_0_number">0</string>
+ <string name="dialpad_1_number">1</string>
+ <string name="dialpad_2_number">2</string>
+ <string name="dialpad_3_number">3</string>
+ <string name="dialpad_4_number">4</string>
+ <string name="dialpad_5_number">5</string>
+ <string name="dialpad_6_number">6</string>
+ <string name="dialpad_7_number">7</string>
+ <string name="dialpad_8_number">8</string>
+ <string name="dialpad_9_number">9</string>
+ <string name="dialpad_star_number">*</string>
+ <string name="dialpad_pound_number">#</string>
+ <string name="dialpad_0_letters">+</string>
+ <string name="dialpad_2_letters">ABC</string>
+ <string name="dialpad_3_letters">DEF</string>
+ <string name="dialpad_4_letters">GHI</string>
+ <string name="dialpad_5_letters">JKL</string>
+ <string name="dialpad_6_letters">MNO</string>
+ <string name="dialpad_7_letters">PQRS</string>
+ <string name="dialpad_8_letters">TUV</string>
+ <string name="dialpad_9_letters">WXYZ</string>
+ <string name="show_all_contacts_title">ھەممە ئالاقەداشلار</string>
+ <string name="show_all_contacts_button_text">ھەممە ئالاقەداشلار</string>
+ <string name="favorite_hidden">دائىملىق ئالاقەداشلاردىن چىقىرىۋەتتى</string>
+ <string name="favorite_hidden_undo">يېنىۋال</string>
+ <string name="search_shortcut_call_number"><xliff:g id="NUMBER">%s</xliff:g> نى چاقىر</string>
+ <string name="search_shortcut_add_to_contacts">ئالاقەداشقا قوش</string>
+ <string name="num_missed_calls"><xliff:g id="NUMBER">%s</xliff:g> يېڭى سۆزلەشمىگەن چاقىرىش</string>
+ <string name="no_favorites">سىز يىغقۇچقا قوشقان ئالاقەداش ۋە دائىملىق\nئالاقەداشلارنىڭ ھەممىسى مۇشۇ جايدا كۆرسىتىلىدۇ.\nشۇڭا ھازىرلا سۆزلىشىشنى باشلاڭ.</string>
+ <string name="contact_tooltip">سۈرەت چېكىلسە ھەممە نومۇرنى كۆرسىتىدۇ ياكى سۈرەت بېسىپ تۇرۇلسا قايتا تەرتىپلەيدۇ</string>
+ <string name="description_dismiss">تاقا</string>
+ <string name="remove_contact">چىقىرىۋەت</string>
+ <string name="favorites_menu_speed_dial">تېز نومۇر بۇراش</string>
+ <string name="favorites_menu_all_contacts">ھەممە ئالاقەداشلار</string>
+ <string name="favorites_menu_speed_dial_font_family">sans-serif-light</string>
+ <string name="favorites_menu_all_contacts_font_family">sans-serif</string>
+ <string name="search_font_family">sans-serif</string>
+ <string name="tab_font_family">sans-serif</string>
+</resources>
diff --git a/res/values-uk/cm_strings.xml b/res/values-uk/cm_strings.xml
index 83314af12..84fdd61b9 100644
--- a/res/values-uk/cm_strings.xml
+++ b/res/values-uk/cm_strings.xml
@@ -50,4 +50,23 @@
<string name="start_call_playback">Відтворення запису</string>
<string name="stop_call_playback">Зупинити</string>
<string name="call_playback_error_message">Не вдалося відтворити запис</string>
+ <string name="calllog_search_hint">Шукати в журналі викликів</string>
+ <string name="video_call">Відео-дзвінок</string>
+ <string name="video_call_settings">Налаштування відео-дзвінка</string>
+ <string name="description_videocall">Відео-дзвінок <xliff:g id="name">%1$s</xliff:g></string>
+ <string name="speed_dial_settings">Налаштування швидкого набору</string>
+ <string name="speed_dial_not_set">(не вказано)</string>
+ <string name="speed_dial_replace">Замінити</string>
+ <string name="speed_dial_delete">Видалити</string>
+ <string name="speed_dial_unassigned_dialog_title">Ключ непризначений</string>
+ <string name="speed_dial_unassigned_dialog_message">Клавіші \'<xliff:g id="number">%s</xliff:g>\' не присвоєно номер швидкого набору. Призначити його?</string>
+ <string name="dialog_speed_dial_airplane_mode_message">"Щоб використовувати швидкий набір, спершу вимкніть режим польоту."</string>
+ <string name="msim_ime_dialog_title">Ідентифікатор пристрою</string>
+ <string name="multi_sim_slot_name">SIM <xliff:g id="index">%d</xliff:g></string>
+ <string name="call_log_show_all_slots">Усі SIM</string>
+ <string name="yes">Так</string>
+ <string name="no">Ні</string>
+ <string name="call_duration_active">Тривалість активних:</string>
+ <string name="call_duration_call_out">Тривалість виклику:</string>
+ <string name="call_log_all_calls_header">Усі дзвінки</string>
</resources>
diff --git a/src/com/android/dialer/CallDetailHeader.java b/src/com/android/dialer/CallDetailHeader.java
index 9381b1d59..1247b6d10 100644
--- a/src/com/android/dialer/CallDetailHeader.java
+++ b/src/com/android/dialer/CallDetailHeader.java
@@ -338,10 +338,6 @@ public class CallDetailHeader {
dataNumber, data.getNumberPresentation(), data.getFormattedNumber());
Intent intent = CallUtil.getCallIntent(mNumber);
- if (mSubscription != -1) {
- intent.putExtra(MSimConstants.SUBSCRIPTION_KEY, mSubscription);
- Log.d(TAG, "Start the activity and the call log sub is: " + mSubscription);
- }
ViewEntry entry = new ViewEntry(
mResources.getString(R.string.menu_callNumber,
@@ -542,10 +538,6 @@ public class CallDetailHeader {
if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) {
Intent intent = CallUtil.getCallIntent(
Uri.fromParts(CallUtil.SCHEME_TEL, mNumber, null));
- if (mSubscription != -1) {
- intent.putExtra(MSimConstants.SUBSCRIPTION_KEY, mSubscription);
- Log.d(TAG, "Start the activity and the call log sub is: " + mSubscription);
- }
mActivity.startActivity(intent);
return true;
}
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 67ccaf15c..654972a75 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -120,9 +120,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
private static final String PREF_LAST_T9_LOCALE = "smart_dial_prefix_last_t9_locale";
public static final String PREFERRED_SIM_ICON_INDEX = "preferred_sim_icon_index";
- public static final String[] MULTI_SIM_NAME = {
- "perferred_name_sub1", "perferred_name_sub2"
- };
/** Used to open Call Setting */
@@ -1150,12 +1147,8 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
return null;
}
- String name = Settings.System.getString(context.getContentResolver(),
- MULTI_SIM_NAME[subscription]);
- if (TextUtils.isEmpty(name)) {
- return context.getString(R.string.multi_sim_slot_name, subscription + 1);
- }
- return name;
+ return Settings.Global.getSimNameForSubscription(context, subscription,
+ context.getString(R.string.multi_sim_slot_name, subscription + 1));
}
/**
diff --git a/src/com/android/dialer/PhoneCallDetailsHelper.java b/src/com/android/dialer/PhoneCallDetailsHelper.java
index 394b4d6e0..64907055f 100755
--- a/src/com/android/dialer/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/PhoneCallDetailsHelper.java
@@ -85,8 +85,10 @@ public class PhoneCallDetailsHelper {
// Display the icon for the last call sub.
if (MSimTelephonyManager.getDefault().isMultiSimEnabled()) {
views.subIconView.setVisibility(View.VISIBLE);
- views.subIconView.setImageDrawable(
- DialtactsActivity.getMultiSimIcon(mContext, details.subscription));
+ if (details.subscription >= 0) {
+ views.subIconView.setImageDrawable(
+ DialtactsActivity.getMultiSimIcon(mContext, details.subscription));
+ }
} else {
views.subIconView.setVisibility(View.GONE);
}
diff --git a/src/com/android/dialer/calllog/IntentProvider.java b/src/com/android/dialer/calllog/IntentProvider.java
index c7d5594fa..6c23e9996 100644
--- a/src/com/android/dialer/calllog/IntentProvider.java
+++ b/src/com/android/dialer/calllog/IntentProvider.java
@@ -55,8 +55,7 @@ public abstract class IntentProvider {
intent = new Intent(Intent.ACTION_DIAL,
Uri.fromParts(CallUtil.SCHEME_SIP, number, null));
} else {
- intent = new Intent(Intent.ACTION_DIAL,
- Uri.fromParts(CallUtil.SCHEME_TEL, number, null));
+ intent = CallUtil.getCallIntent(number);
}
return intent;
} else {
diff --git a/src/com/android/dialer/lookup/ContactBuilder.java b/src/com/android/dialer/lookup/ContactBuilder.java
index 43668ae26..069045db2 100644
--- a/src/com/android/dialer/lookup/ContactBuilder.java
+++ b/src/com/android/dialer/lookup/ContactBuilder.java
@@ -84,7 +84,7 @@ public class ContactBuilder {
}
public void addAddress(Address address) {
- if (DEBUG) Log.d(TAG, "Adding address: " + address);
+ if (DEBUG) Log.d(TAG, "Adding address");
if (address != null) {
mAddresses.add(address);
}
@@ -95,7 +95,7 @@ public class ContactBuilder {
}
public void addPhoneNumber(PhoneNumber phoneNumber) {
- if (DEBUG) Log.d(TAG, "Adding phone number: " + phoneNumber);
+ if (DEBUG) Log.d(TAG, "Adding phone number");
if (phoneNumber != null) {
mPhoneNumbers.add(phoneNumber);
}
@@ -107,7 +107,7 @@ public class ContactBuilder {
}
public void addWebsite(WebsiteUrl website) {
- if (DEBUG) Log.d(TAG, "Adding website: " + website);
+ if (DEBUG) Log.d(TAG, "Adding website");
if (website != null) {
mWebsites.add(website);
}
@@ -118,7 +118,7 @@ public class ContactBuilder {
}
public void setName(Name name) {
- if (DEBUG) Log.d(TAG, "Setting name: " + name);
+ if (DEBUG) Log.d(TAG, "Setting name");
if (name != null) {
mName = name;
}
@@ -133,7 +133,7 @@ public class ContactBuilder {
}
public void setPhotoUri(Uri photoUri) {
- if (DEBUG) Log.d(TAG, "Setting photo URI: " + photoUri);
+ if (DEBUG) Log.d(TAG, "Setting photo URI");
mPhotoUri = photoUri;
}
@@ -142,7 +142,7 @@ public class ContactBuilder {
}
public void setIsBusiness(boolean isBusiness) {
- if (DEBUG) Log.d(TAG, "Setting isBusiness to: " + isBusiness);
+ if (DEBUG) Log.d(TAG, "Setting isBusiness to " + isBusiness);
mIsBusiness = isBusiness;
}
@@ -259,6 +259,13 @@ public class ContactBuilder {
public String postCode;
public String country;
+ public static Address createFormattedHome(String address) {
+ Address a = new Address();
+ a.formattedAddress = address;
+ a.type = StructuredPostal.TYPE_HOME;
+ return a;
+ }
+
public JSONObject getJsonObject() throws JSONException {
JSONObject json = new JSONObject();
json.putOpt(StructuredPostal.FORMATTED_ADDRESS,
@@ -301,6 +308,12 @@ public class ContactBuilder {
public String phoneticMiddleName;
public String phoneticFamilyName;
+ public static Name createDisplayName(String displayName) {
+ Name name = new Name();
+ name.displayName = displayName;
+ return name;
+ }
+
public JSONObject getJsonObject() throws JSONException {
JSONObject json = new JSONObject();
json.putOpt(StructuredName.DISPLAY_NAME, displayName);
@@ -337,6 +350,13 @@ public class ContactBuilder {
public int type;
public String label;
+ public static PhoneNumber createMainNumber(String number) {
+ PhoneNumber n = new PhoneNumber();
+ n.number = number;
+ n.type = Phone.TYPE_MAIN;
+ return n;
+ }
+
public JSONObject getJsonObject() throws JSONException {
JSONObject json = new JSONObject();
json.put(Phone.NUMBER, number);
@@ -358,6 +378,13 @@ public class ContactBuilder {
public int type;
public String label;
+ public static WebsiteUrl createProfile(String url) {
+ WebsiteUrl u = new WebsiteUrl();
+ u.url = url;
+ u.type = Website.TYPE_PROFILE;
+ return u;
+ }
+
public JSONObject getJsonObject() throws JSONException {
JSONObject json = new JSONObject();
json.put(Website.URL, url);
diff --git a/src/com/android/dialer/lookup/LookupProvider.java b/src/com/android/dialer/lookup/LookupProvider.java
index fc966baa3..2c6ead0e2 100644
--- a/src/com/android/dialer/lookup/LookupProvider.java
+++ b/src/com/android/dialer/lookup/LookupProvider.java
@@ -253,26 +253,31 @@ public class LookupProvider extends ContentProvider {
LocationManager locationManager = (LocationManager)
getContext().getSystemService(Context.LOCATION_SERVICE);
- locationManager.requestSingleUpdate(new Criteria(),
- new LocationListener() {
- @Override
- public void onLocationChanged(Location location) {
- }
+ try {
+ locationManager.requestSingleUpdate(new Criteria(),
+ new LocationListener() {
+ @Override
+ public void onLocationChanged(Location location) {
+ }
- @Override
- public void onProviderDisabled(String provider) {
- }
+ @Override
+ public void onProviderDisabled(String provider) {
+ }
- @Override
- public void onProviderEnabled(String provider) {
- }
+ @Override
+ public void onProviderEnabled(String provider) {
+ }
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
- }, Looper.getMainLooper());
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) {
+ }
+ }, Looper.getMainLooper());
- return locationManager.getLastLocation();
+ return locationManager.getLastLocation();
+ } catch (IllegalArgumentException e) {
+ // If no location service exists, IllegalArgument exception is thrown
+ return null;
+ }
}
/**
diff --git a/src/com/android/dialer/lookup/LookupSettings.java b/src/com/android/dialer/lookup/LookupSettings.java
index 3d969a32d..b52bff7ef 100644
--- a/src/com/android/dialer/lookup/LookupSettings.java
+++ b/src/com/android/dialer/lookup/LookupSettings.java
@@ -45,6 +45,7 @@ public final class LookupSettings {
public static final String RLP_ZABASEARCH = "ZabaSearch";
public static final String RLP_CYNGN_CHINESE = "CyngnChinese";
public static final String RLP_DASTELEFONBUCH = "DasTelefonbuch";
+ public static final String RLP_PAGINEBIANCHE = "PagineBianche";
public static final String RLP_DEFAULT = RLP_OPENCNAM;
private LookupSettings() {
diff --git a/src/com/android/dialer/lookup/LookupUtils.java b/src/com/android/dialer/lookup/LookupUtils.java
new file mode 100644
index 000000000..c0b84dc38
--- /dev/null
+++ b/src/com/android/dialer/lookup/LookupUtils.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2014 The CyanogenMod 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.
+ */
+
+package com.android.dialer.lookup;
+
+import android.text.Html;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class LookupUtils {
+ private static final String USER_AGENT =
+ "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0";
+
+ public static String httpGet(HttpGet request) throws IOException {
+ HttpClient client = new DefaultHttpClient();
+
+ request.setHeader("User-Agent", USER_AGENT);
+
+ HttpResponse response = client.execute(request);
+ int status = response.getStatusLine().getStatusCode();
+
+ // Android's org.apache.http doesn't have the RedirectStrategy class
+ if (status == HttpStatus.SC_MOVED_PERMANENTLY
+ || status == HttpStatus.SC_MOVED_TEMPORARILY) {
+ Header[] headers = response.getHeaders("Location");
+
+ if (headers != null && headers.length != 0) {
+ HttpGet newGet = new HttpGet(headers[headers.length - 1].getValue());
+ for (Header header : request.getAllHeaders()) {
+ newGet.addHeader(header);
+ }
+ return httpGet(newGet);
+ } else {
+ throw new IOException("Empty redirection header");
+ }
+ }
+
+ if (status != HttpStatus.SC_OK) {
+ throw new IOException("HTTP failure (status " + status + ")");
+ }
+
+ return EntityUtils.toString(response.getEntity());
+ }
+
+ public static String firstRegexResult(String input, String regex, boolean dotall) {
+ if (input == null) {
+ return null;
+ }
+ Pattern pattern = Pattern.compile(regex, dotall ? Pattern.DOTALL : 0);
+ Matcher m = pattern.matcher(input);
+ return m.find() ? m.group(1).trim() : null;
+ }
+
+ public static String fromHtml(String input) {
+ if (input == null) {
+ return null;
+ }
+ return Html.fromHtml(input).toString().trim();
+ }
+}
+
diff --git a/src/com/android/dialer/lookup/ReverseLookup.java b/src/com/android/dialer/lookup/ReverseLookup.java
index 7009f93c7..041b6ffba 100644
--- a/src/com/android/dialer/lookup/ReverseLookup.java
+++ b/src/com/android/dialer/lookup/ReverseLookup.java
@@ -19,6 +19,7 @@ package com.android.dialer.lookup;
import com.android.dialer.calllog.ContactInfo;
import com.android.dialer.lookup.cyngn.CyngnChineseReverseLookup;
import com.android.dialer.lookup.dastelefonbuch.TelefonbuchReverseLookup;
+import com.android.dialer.lookup.paginebianche.PagineBiancheReverseLookup;
import com.android.dialer.lookup.opencnam.OpenCnamReverseLookup;
import com.android.dialer.lookup.whitepages.WhitePagesReverseLookup;
import com.android.dialer.lookup.yellowpages.YellowPagesReverseLookup;
@@ -28,7 +29,8 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.util.Log;
-import android.util.Pair;
+
+import java.io.IOException;
public abstract class ReverseLookup {
private static final String TAG = ReverseLookup.class.getSimpleName();
@@ -55,6 +57,8 @@ public abstract class ReverseLookup {
INSTANCE = new CyngnChineseReverseLookup(context);
} else if (provider.equals(LookupSettings.RLP_DASTELEFONBUCH)) {
INSTANCE = new TelefonbuchReverseLookup(context);
+ } else if (provider.equals(LookupSettings.RLP_PAGINEBIANCHE)) {
+ INSTANCE = new PagineBiancheReverseLookup(context);
}
}
@@ -82,6 +86,9 @@ public abstract class ReverseLookup {
} else if (provider.equals(LookupSettings.RLP_DASTELEFONBUCH)
&& INSTANCE instanceof TelefonbuchReverseLookup) {
return true;
+ } else if (provider.equals(LookupSettings.RLP_PAGINEBIANCHE)
+ && INSTANCE instanceof PagineBiancheReverseLookup) {
+ return true;
} else {
return false;
}
@@ -92,9 +99,8 @@ public abstract class ReverseLookup {
*
* @param context The application context
* @param uri The image URI
- * @param data Extra data (a authentication token, perhaps)
*/
- public Bitmap lookupImage(Context context, Uri uri, Object data) {
+ public Bitmap lookupImage(Context context, Uri uri) {
return null;
}
@@ -106,6 +112,6 @@ public abstract class ReverseLookup {
* @param formattedNumber The formatted phone number
* @return The phone number info object
*/
- public abstract Pair<ContactInfo, Object> lookupNumber(Context context,
- String normalizedNumber, String formattedNumber);
+ public abstract ContactInfo lookupNumber(Context context,
+ String normalizedNumber, String formattedNumber) throws IOException;
}
diff --git a/src/com/android/dialer/lookup/ReverseLookupThread.java b/src/com/android/dialer/lookup/ReverseLookupThread.java
index 95173764b..31c344265 100644
--- a/src/com/android/dialer/lookup/ReverseLookupThread.java
+++ b/src/com/android/dialer/lookup/ReverseLookupThread.java
@@ -27,8 +27,8 @@ import android.os.Looper;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.util.Log;
-import android.util.Pair;
+import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
@@ -91,26 +91,23 @@ public class ReverseLookupThread extends Thread {
}
// Lookup contact if it's not cached
- Object data = null;
if (info == null) {
- Pair<ContactInfo, Object> results =
- ReverseLookup.getInstance(mContext).lookupNumber(
- mContext, mNormalizedNumber, mFormattedNumber);
+ try {
+ info = ReverseLookup.getInstance(mContext).lookupNumber(mContext,
+ mNormalizedNumber, mFormattedNumber);
+ } catch (IOException e) {
+ // ignored, we'll return below
+ }
- if (results == null) {
+ if (info == null) {
return;
}
- info = results.first;
- data = results.second;
-
// Put in cache only if the contact is valid
- if (info != null) {
- if (info.equals(ContactInfo.EMPTY)) {
- return;
- } else if (info.name != null) {
- LookupCache.cacheContact(mContext, info);
- }
+ if (info.equals(ContactInfo.EMPTY)) {
+ return;
+ } else if (info.name != null) {
+ LookupCache.cacheContact(mContext, info);
}
}
@@ -126,7 +123,7 @@ public class ReverseLookupThread extends Thread {
if (info.photoUri != null) {
if (!LookupCache.hasCachedImage(mContext, mNormalizedNumber)) {
Bitmap bmp = ReverseLookup.getInstance(mContext).lookupImage(
- mContext, info.photoUri, data);
+ mContext, info.photoUri);
if (bmp != null) {
LookupCache.cacheImage(mContext, mNormalizedNumber, bmp);
diff --git a/src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java b/src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java
index 4b4aa6d33..355208a18 100644
--- a/src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java
+++ b/src/com/android/dialer/lookup/cyngn/CyngnChineseReverseLookup.java
@@ -22,7 +22,6 @@ import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.util.Log;
-import android.util.Pair;
import com.android.dialer.calllog.ContactInfo;
import com.android.dialer.lookup.ContactBuilder;
import com.android.dialer.lookup.ReverseLookup;
@@ -36,6 +35,8 @@ public class CyngnChineseReverseLookup extends ReverseLookup {
private static final int COMMON_CHINESE_PHONE_NUMBER_AREANO_END = 5;
private static final boolean DEBUG = false;
+ private static final Uri PROVIDER_URI =
+ Uri.parse("content://com.cyngn.chineselocationlookup.provider");
public CyngnChineseReverseLookup(Context context) {
}
@@ -48,12 +49,9 @@ public class CyngnChineseReverseLookup extends ReverseLookup {
* @param formattedNumber The formatted phone number
* @return The phone number info object
*/
- public Pair<ContactInfo, Object> lookupNumber(Context context,
- String normalizedNumber, String formattedNumber) {
- String displayName;
-
- displayName = queryProvider(context, normalizedNumber);
-
+ public ContactInfo lookupNumber(Context context,
+ String normalizedNumber, String formattedNumber) {
+ String displayName = queryProvider(context, normalizedNumber);
if (displayName == null) {
return null;
}
@@ -66,19 +64,11 @@ public class CyngnChineseReverseLookup extends ReverseLookup {
ContactBuilder builder = new ContactBuilder(
ContactBuilder.REVERSE_LOOKUP,
normalizedNumber, formattedNumber);
-
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = displayName;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = number;
- pn.type = ContactsContract.CommonDataKinds.Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
-
+ builder.setName(ContactBuilder.Name.createDisplayName(displayName));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(number));
builder.setPhotoUri(ContactBuilder.PHOTO_URI_BUSINESS);
- return Pair.create(builder.build(), null);
+ return builder.build();
}
private String queryProvider(Context context, String normalizedNumber) {
@@ -91,20 +81,19 @@ public class CyngnChineseReverseLookup extends ReverseLookup {
COMMON_CHINESE_PHONE_NUMBER_AREANO_END);
ContentResolver resolver = context.getContentResolver();
- Cursor cursor = resolver.query(Uri.parse("content://com.cyngn.chineselocationlookup.provider"),
+ Cursor cursor = context.getContentResolver().query(PROVIDER_URI,
null, null, new String[] { areaPrefix }, null);
-
- String city = null;
+ if (cursor == null) {
+ return null;
+ }
try {
if (cursor.moveToFirst()) {
- city = cursor.getString(2);
+ return cursor.getString(2);
}
- } catch (NullPointerException e) {
- return null;
} finally {
cursor.close();
- return city;
}
+ return null;
}
}
diff --git a/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java b/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java
index 70c2962a7..2d9ed3e5f 100644
--- a/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java
+++ b/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchApi.java
@@ -18,21 +18,12 @@ package com.android.dialer.lookup.dastelefonbuch;
import android.content.Context;
import android.net.Uri;
-import android.text.Html;
-import com.android.dialer.lookup.LookupSettings;
+import com.android.dialer.lookup.LookupUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.util.EntityUtils;
import java.io.IOException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
public class TelefonbuchApi {
private static final String TAG = TelefonbuchApi.class.getSimpleName();
@@ -41,8 +32,9 @@ public class TelefonbuchApi {
"http://www.dastelefonbuch.de/?s=a20000" +
"&cmd=search&sort_ok=0&sp=55&vert_ok=0&aktion=23";
- private static final String USER_AGENT =
- "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0";
+ private static String NAME_REGEX ="<a id=\"name0.*?>\\s*\n?(.*?)\n?\\s*</a>";
+ private static String NUMBER_REGEX = "<span\\s+class=\"ico fon.*>.*<span>(.*?)</span><br/>";
+ private static String ADDRESS_REGEX = "<address.*?>\n?(.*?)</address>";
private TelefonbuchApi() {
}
@@ -53,28 +45,19 @@ public class TelefonbuchApi {
.buildUpon()
.appendQueryParameter("kw", number)
.build();
- String output = httpGet(uri.toString());
- if (output == null) {
- return null;
- }
-
// Cut out everything we're not interested in (scripts etc.) to
// speed up the subsequent matching.
- Pattern regex = Pattern.compile(": Treffer(.*)Ende Treffer", Pattern.DOTALL);
- Matcher matcher = regex.matcher(output);
- if (!matcher.find()) {
- return null;
- }
-
- output = matcher.group(1);
+ String output = LookupUtils.firstRegexResult(
+ LookupUtils.httpGet(new HttpGet(uri.toString())),
+ ": Treffer(.*)Ende Treffer", true);
- String name = parseName(output);
+ String name = parseValue(output, NAME_REGEX, true, false);
if (name == null) {
return null;
}
- String phoneNumber = parseNumber(output);
- String address = parseAddress(output);
+ String phoneNumber = parseValue(output, NUMBER_REGEX, false, true);
+ String address = parseValue(output, ADDRESS_REGEX, true, true);
ContactInfo info = new ContactInfo();
info.name = name;
@@ -85,72 +68,13 @@ public class TelefonbuchApi {
return info;
}
- private static String httpGet(String url) throws IOException {
- HttpClient client = new DefaultHttpClient();
- HttpGet get = new HttpGet(url);
-
- get.setHeader("User-Agent", USER_AGENT);
-
- HttpResponse response = client.execute(get);
- int status = response.getStatusLine().getStatusCode();
-
- // Android's org.apache.http doesn't have the RedirectStrategy class
- if (status == HttpStatus.SC_MOVED_PERMANENTLY
- || status == HttpStatus.SC_MOVED_TEMPORARILY) {
- Header[] headers = response.getHeaders("Location");
-
- if (headers != null && headers.length != 0) {
- String newUrl = headers[headers.length - 1].getValue();
- return httpGet(newUrl);
- } else {
- return null;
- }
- }
-
- if (status != HttpStatus.SC_OK) {
- return null;
- }
-
- return EntityUtils.toString(response.getEntity());
- }
-
- private static String parseName(String output) {
- Pattern regex = Pattern.compile("<a id=\"name0.*?>\\s*\n?(.*?)\n?\\s*</a>",
- Pattern.DOTALL);
- Matcher m = regex.matcher(output);
-
- if (m.find()) {
- return fromHtml(m.group(1));
- }
-
- return null;
- }
-
- private static String parseNumber(String output) {
- Pattern regex = Pattern.compile("<span\\s+class=\"ico fon.*>.*<span>(.*?)</span><br/>", 0);
- Matcher m = regex.matcher(output);
- if (m.find()) {
- return fromHtml(m.group(1).replaceAll("</?span.*?>", ""));
- }
-
- return null;
- }
-
- private static String parseAddress(String output) {
- Pattern regex = Pattern.compile("<address.*?>\n?(.*?)</address>", Pattern.DOTALL);
- Matcher m = regex.matcher(output);
- if (m.find()) {
- return fromHtml(m.group(1).replaceAll("</?span.*?>", ""));
- }
-
- return null;
- }
-
- private static String fromHtml(String input) {
- if (input == null) {
- return null;
+ private static String parseValue(String output, String regex,
+ boolean dotall, boolean removeSpans) {
+ String result = LookupUtils.firstRegexResult(output, regex, dotall);
+ if (result != null && removeSpans) {
+ result = result.replaceAll("</?span.*?>", "");
}
- return Html.fromHtml(input).toString().trim();
+ return LookupUtils.fromHtml(result);
}
public static class ContactInfo {
diff --git a/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java b/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java
index 18c24e163..a96a77260 100644
--- a/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java
+++ b/src/com/android/dialer/lookup/dastelefonbuch/TelefonbuchReverseLookup.java
@@ -21,7 +21,6 @@ import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.util.Pair;
import com.android.dialer.calllog.ContactInfo;
import com.android.dialer.lookup.ContactBuilder;
@@ -43,21 +42,14 @@ public class TelefonbuchReverseLookup extends ReverseLookup {
* @param formattedNumber The formatted phone number
* @return The phone number info object
*/
- public Pair<ContactInfo, Object> lookupNumber(Context context,
- String normalizedNumber, String formattedNumber) {
- TelefonbuchApi.ContactInfo info = null;
-
+ public ContactInfo lookupNumber(Context context,
+ String normalizedNumber, String formattedNumber) throws IOException {
if (normalizedNumber.startsWith("+") && !normalizedNumber.startsWith("+49")) {
// Das Telefonbuch only supports German numbers
return null;
}
- try {
- info = TelefonbuchApi.reverseLookup(context, normalizedNumber);
- } catch (IOException e) {
- return null;
- }
-
+ TelefonbuchApi.ContactInfo info = TelefonbuchApi.reverseLookup(context, normalizedNumber);
if (info == null) {
return null;
}
@@ -65,28 +57,13 @@ public class TelefonbuchReverseLookup extends ReverseLookup {
ContactBuilder builder = new ContactBuilder(
ContactBuilder.REVERSE_LOOKUP,
normalizedNumber, formattedNumber);
-
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = info.name;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = info.formattedNumber;
- pn.type = Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
-
+ builder.setName(ContactBuilder.Name.createDisplayName(info.name));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber));
+ builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website));
if (info.address != null) {
- ContactBuilder.Address a = new ContactBuilder.Address();
- a.formattedAddress = info.address;
- a.type = StructuredPostal.TYPE_HOME;
- builder.addAddress(a);
+ builder.addAddress(ContactBuilder.Address.createFormattedHome(info.address));
}
- ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl();
- w.url = info.website;
- w.type = Website.TYPE_PROFILE;
- builder.addWebsite(w);
-
- return Pair.create(builder.build(), null);
+ return builder.build();
}
}
diff --git a/src/com/android/dialer/lookup/google/GoogleForwardLookup.java b/src/com/android/dialer/lookup/google/GoogleForwardLookup.java
index 89214925a..215cbfd3b 100644
--- a/src/com/android/dialer/lookup/google/GoogleForwardLookup.java
+++ b/src/com/android/dialer/lookup/google/GoogleForwardLookup.java
@@ -179,15 +179,9 @@ public class GoogleForwardLookup extends ForwardLookup {
ContactBuilder builder = new ContactBuilder(
ContactBuilder.FORWARD_LOOKUP, null, phoneNumber);
-
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = displayName;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = phoneNumber;
- pn.type = Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
+ builder.setName(ContactBuilder.Name.createDisplayName(displayName));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(phoneNumber));
+ builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(profileUrl));
ContactBuilder.Address a = new ContactBuilder.Address();
a.formattedAddress = address;
@@ -195,11 +189,6 @@ public class GoogleForwardLookup extends ForwardLookup {
a.type = StructuredPostal.TYPE_WORK;
builder.addAddress(a);
- ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl();
- w.url = profileUrl;
- w.type = Website.TYPE_PROFILE;
- builder.addWebsite(w);
-
if (photoUri != null) {
builder.setPhotoUri(photoUri);
} else {
diff --git a/src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java b/src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java
index f7c907905..9dafab785 100644
--- a/src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java
+++ b/src/com/android/dialer/lookup/opencnam/OpenCnamReverseLookup.java
@@ -16,26 +16,19 @@
package com.android.dialer.lookup.opencnam;
-import com.android.dialer.calllog.ContactInfo;
-import com.android.dialer.lookup.ContactBuilder;
-import com.android.dialer.lookup.ReverseLookup;
-
import android.content.Context;
import android.net.Uri;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
-import android.util.Pair;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.lookup.ContactBuilder;
+import com.android.dialer.lookup.LookupUtils;
+import com.android.dialer.lookup.ReverseLookup;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.DefaultHttpClient;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class OpenCnamReverseLookup extends ReverseLookup {
@@ -62,20 +55,15 @@ public class OpenCnamReverseLookup extends ReverseLookup {
* @param formattedNumber The formatted phone number
* @return The phone number info object
*/
- public Pair<ContactInfo, Object> lookupNumber(Context context,
- String normalizedNumber, String formattedNumber) {
- String displayName;
-
+ public ContactInfo lookupNumber(Context context,
+ String normalizedNumber, String formattedNumber) throws IOException {
if (normalizedNumber.startsWith("+") &&!normalizedNumber.startsWith("+1")) {
// Any non-US number will return "We currently accept only US numbers"
return null;
}
- try {
- displayName = httpGetRequest(context, normalizedNumber);
- if (DEBUG) Log.d(TAG, "Reverse lookup returned name: " + displayName);
- } catch (IOException e) {
- return null;
- }
+
+ String displayName = httpGetRequest(context, normalizedNumber);
+ if (DEBUG) Log.d(TAG, "Reverse lookup returned name: " + displayName);
// Check displayName. The free tier of the service will return the
// following for some numbers:
@@ -91,19 +79,11 @@ public class OpenCnamReverseLookup extends ReverseLookup {
ContactBuilder builder = new ContactBuilder(
ContactBuilder.REVERSE_LOOKUP,
normalizedNumber, formattedNumber);
-
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = displayName;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = number;
- pn.type = Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
-
+ builder.setName(ContactBuilder.Name.createDisplayName(displayName));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(number));
builder.setPhotoUri(ContactBuilder.PHOTO_URI_BUSINESS);
- return Pair.create(builder.build(), null);
+ return builder.build();
}
private String httpGetRequest(Context context, String number) throws IOException {
@@ -124,20 +104,6 @@ public class OpenCnamReverseLookup extends ReverseLookup {
builder.appendQueryParameter(AUTH_TOKEN, authToken);
}
- String url = builder.build().toString();
-
- HttpClient client = new DefaultHttpClient();
- HttpGet request = new HttpGet(url);
-
- HttpResponse response = client.execute(request);
-
- if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
- throw new IOException();
- }
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- response.getEntity().writeTo(out);
-
- return new String(out.toByteArray());
+ return LookupUtils.httpGet(new HttpGet(builder.build().toString()));
}
}
diff --git a/src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java b/src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java
index 2f5cd8907..5bd5e723f 100644
--- a/src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java
+++ b/src/com/android/dialer/lookup/openstreetmap/OpenStreetMapForwardLookup.java
@@ -19,32 +19,31 @@
package com.android.dialer.lookup.openstreetmap;
-import com.android.dialer.calllog.ContactInfo;
-import com.android.dialer.lookup.ContactBuilder;
-import com.android.dialer.lookup.ForwardLookup;
-
import android.content.Context;
import android.location.Location;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
import android.util.Log;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Locale;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.lookup.ContactBuilder;
+import com.android.dialer.lookup.ForwardLookup;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Locale;
+
public class OpenStreetMapForwardLookup extends ForwardLookup {
private static final String TAG =
OpenStreetMapForwardLookup.class.getSimpleName();
@@ -88,8 +87,6 @@ public class OpenStreetMapForwardLookup extends ForwardLookup {
String request = String.format(Locale.ENGLISH, LOOKUP_QUERY, regex,
RADIUS, lastLocation.getLatitude(), lastLocation.getLongitude());
- Log.v(TAG, "POST'ing: " + request);
-
try {
String httpResponse = httpPostRequest(request);
@@ -151,14 +148,8 @@ public class OpenStreetMapForwardLookup extends ForwardLookup {
ContactBuilder builder = new ContactBuilder(
ContactBuilder.FORWARD_LOOKUP, null, phoneNumber);
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = displayName;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = phoneNumber;
- pn.type = Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
+ builder.setName(ContactBuilder.Name.createDisplayName(displayName));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(phoneNumber));
ContactBuilder.Address a = new ContactBuilder.Address();
a.formattedAddress = address;
@@ -194,11 +185,6 @@ public class OpenStreetMapForwardLookup extends ForwardLookup {
post.setEntity(new StringEntity(query));
- HttpResponse response = client.execute(post);
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- response.getEntity().writeTo(out);
-
- return new String(out.toByteArray());
+ return EntityUtils.toString(client.execute(post).getEntity());
}
}
diff --git a/src/com/android/dialer/lookup/paginebianche/PagineBiancheApi.java b/src/com/android/dialer/lookup/paginebianche/PagineBiancheApi.java
new file mode 100644
index 000000000..cace3b56c
--- /dev/null
+++ b/src/com/android/dialer/lookup/paginebianche/PagineBiancheApi.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2014 The CyanogenMod 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.
+ */
+
+package com.android.dialer.lookup.paginebianche;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.dialer.lookup.LookupUtils;
+
+import org.apache.http.client.methods.HttpGet;
+
+import java.io.IOException;
+
+public class PagineBiancheApi {
+ private static final String TAG = PagineBiancheApi.class.getSimpleName();
+
+ private static final String REVERSE_LOOKUP_URL =
+ "http://www.paginebianche.it/ricerca-da-numero?";
+
+ private static final String NAME_REGEX = "\\stitle=\"(.*?)\"";
+ private static final String NUMBER_REGEX = "class=\"tel\".*?class=\"value\">(.*?)<";
+ private static final String ADDRESS_REGEX = "class=\"street-address\">(.*?)</div>";
+
+ private PagineBiancheApi() {
+ }
+
+ public static ContactInfo reverseLookup(Context context, String number)
+ throws IOException {
+ Uri uri = Uri.parse(REVERSE_LOOKUP_URL)
+ .buildUpon()
+ .appendQueryParameter("qs", number)
+ .build();
+
+ // Cut out everything we're not interested in (scripts etc.) to
+ // speed up the subsequent matching.
+ String output = LookupUtils.firstRegexResult(
+ LookupUtils.httpGet(new HttpGet(uri.toString())),
+ "class=\"org fn\"(.*?)class=\"link_social", true);
+
+ String name = LookupUtils.firstRegexResult(output, NAME_REGEX, false);
+ if (name == null) {
+ return null;
+ }
+
+ String phoneNumber = LookupUtils.firstRegexResult(output, NUMBER_REGEX, false);
+ String address = parseAddress(output);
+
+ ContactInfo info = new ContactInfo();
+ info.name = name;
+ info.address = address;
+ info.formattedNumber = phoneNumber != null ? phoneNumber : number;
+ info.website = uri.toString();
+
+ return info;
+ }
+
+ private static String parseAddress(String output) {
+ String address = LookupUtils.firstRegexResult(output, ADDRESS_REGEX, false);
+ return address != null ? address.replaceAll("</?span.*?>", "") : null;
+ }
+
+ public static class ContactInfo {
+ String name;
+ String address;
+ String formattedNumber;
+ String website;
+ }
+}
diff --git a/src/com/android/dialer/lookup/paginebianche/PagineBiancheReverseLookup.java b/src/com/android/dialer/lookup/paginebianche/PagineBiancheReverseLookup.java
new file mode 100644
index 000000000..212663828
--- /dev/null
+++ b/src/com/android/dialer/lookup/paginebianche/PagineBiancheReverseLookup.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2014 The CyanogenMod 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.
+ */
+
+package com.android.dialer.lookup.paginebianche;
+
+import android.content.Context;
+import android.net.Uri;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.provider.ContactsContract.CommonDataKinds.Website;
+
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.lookup.ContactBuilder;
+import com.android.dialer.lookup.ReverseLookup;
+
+import java.io.IOException;
+
+public class PagineBiancheReverseLookup extends ReverseLookup {
+ private static final String TAG = PagineBiancheReverseLookup.class.getSimpleName();
+
+ public PagineBiancheReverseLookup(Context context) {
+ }
+
+ /**
+ * Perform phone number lookup.
+ *
+ * @param context The application context
+ * @param normalizedNumber The normalized phone number
+ * @param formattedNumber The formatted phone number
+ * @return The phone number info object
+ */
+ public ContactInfo lookupNumber(Context context,
+ String normalizedNumber, String formattedNumber) throws IOException {
+ if (normalizedNumber.startsWith("+") && !normalizedNumber.startsWith("+39")) {
+ // PagineBianche only supports Italian numbers
+ return null;
+ }
+
+ PagineBiancheApi.ContactInfo info =
+ PagineBiancheApi.reverseLookup(context, normalizedNumber.replace("+39",""));
+ if (info == null) {
+ return null;
+ }
+
+ ContactBuilder builder = new ContactBuilder(
+ ContactBuilder.REVERSE_LOOKUP,
+ normalizedNumber, formattedNumber);
+
+ builder.setName(ContactBuilder.Name.createDisplayName(info.name));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber));
+ if (info.address != null) {
+ builder.addAddress(ContactBuilder.Address.createFormattedHome(info.address));
+ }
+
+ return builder.build();
+ }
+}
diff --git a/src/com/android/dialer/lookup/whitepages/WhitePagesApi.java b/src/com/android/dialer/lookup/whitepages/WhitePagesApi.java
index 6497ac3be..5b266bf9c 100644
--- a/src/com/android/dialer/lookup/whitepages/WhitePagesApi.java
+++ b/src/com/android/dialer/lookup/whitepages/WhitePagesApi.java
@@ -16,26 +16,21 @@
package com.android.dialer.lookup.whitepages;
+import android.content.Context;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.util.Log;
+
import com.android.dialer.lookup.LookupSettings;
+import com.android.dialer.lookup.LookupUtils;
+
+import org.apache.http.client.methods.HttpGet;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.DefaultHttpClient;
-
-import android.content.Context;
-import android.net.Uri;
-import android.text.Html;
-import android.util.Log;
-
public class WhitePagesApi {
private static final String TAG = WhitePagesApi.class.getSimpleName();
@@ -97,7 +92,7 @@ public class WhitePagesApi {
continue;
}
- String name = unHtml(extractXmlRegex(section,
+ String name = LookupUtils.fromHtml(extractXmlRegex(section,
"<span[^>]+?itemprop=\"name\">", "span"));
if (name == null) {
@@ -105,11 +100,11 @@ public class WhitePagesApi {
}
// Address
- String addrCountry = unHtml(extractXmlRegex(section,
+ String addrCountry = LookupUtils.fromHtml(extractXmlRegex(section,
"<span[^>]+?itemprop=\"addressCountry\">", "span"));
- String addrState = unHtml(extractXmlRegex(section,
+ String addrState = LookupUtils.fromHtml(extractXmlRegex(section,
"<span[^>]+?itemprop=\"addressRegion\">", "span"));
- String addrCity = unHtml(extractXmlRegex(section,
+ String addrCity = LookupUtils.fromHtml(extractXmlRegex(section,
"<span[^>]+?itemprop=\"addressLocality\">", "span"));
StringBuilder sb = new StringBuilder();
@@ -145,13 +140,12 @@ public class WhitePagesApi {
}
String profile = httpGet(website);
- String phoneNumber = unHtml(extractXmlRegex(profile,
+ String phoneNumber = LookupUtils.fromHtml(extractXmlRegex(profile,
"<li[^>]+?class=\"no-overflow tel\">", "li"));
String address = parseAddressUnitedStates(profile);
if (phoneNumber == null) {
- Log.e(TAG,
- "Phone number is null. Either cookie is bad or regex is broken");
+ Log.e(TAG, "Phone number is null. Either cookie is bad or regex is broken");
continue;
}
@@ -209,14 +203,6 @@ public class WhitePagesApi {
return str.substring(realBegin, realEnd);
}
- private static String unHtml(String html) {
- if (html == null) {
- return null;
- }
-
- return Html.fromHtml(html).toString().trim();
- }
-
public static ContactInfo reverseLookup(Context context, String number)
throws IOException {
String provider = LookupSettings.getReverseLookupProvider(context);
@@ -257,36 +243,13 @@ public class WhitePagesApi {
}
private static String httpGet(String url) throws IOException {
- HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
- get.setHeader("User-Agent", USER_AGENT);
-
if (mCookie != null) {
get.setHeader("Cookie", COOKIE + "=" + mCookie);
}
- HttpResponse response = client.execute(get);
- int status = response.getStatusLine().getStatusCode();
-
- // Android's org.apache.http doesn't have the RedirectStrategy class
- if (status == HttpStatus.SC_MOVED_PERMANENTLY
- || status == HttpStatus.SC_MOVED_TEMPORARILY) {
- Header[] headers = response.getHeaders("Location");
-
- if (headers != null && headers.length != 0) {
- String newUrl = headers[headers.length - 1].getValue();
- return httpGet(newUrl);
- } else {
- return null;
- }
- }
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- response.getEntity().writeTo(out);
-
- String output = new String(out.toByteArray());
-
+ String output = LookupUtils.httpGet(get);
// If we can find a new cookie, use it
Pattern p = Pattern.compile(COOKIE_REGEX, Pattern.DOTALL);
Matcher m = p.matcher(output);
@@ -309,28 +272,13 @@ public class WhitePagesApi {
}
private static String parseNameUnitedStates(String output) {
- Matcher m;
-
- Pattern regexName = Pattern
- .compile("<h2.*?>Send (.*?)&#39;s details to phone</h2>",
- Pattern.DOTALL);
- String name = null;
-
- m = regexName.matcher(output);
- if (m.find()) {
- name = m.group(1).trim();
- }
+ String name = LookupUtils.firstRegexResult(output,
+ "<h2.*?>Send (.*?)&#39;s details to phone</h2>", true);
// Use summary if name doesn't exist
if (name == null) {
- Pattern regexSummary = Pattern.compile(
- "<span\\s*class=\"subtitle.*?>\\s*\n?(.*?)\n?\\s*</span>",
- Pattern.DOTALL);
-
- m = regexSummary.matcher(output);
- if (m.find()) {
- name = m.group(1).trim();
- }
+ name = LookupUtils.firstRegexResult(output,
+ "<span\\s*class=\"subtitle.*?>\\s*\n?(.*?)\n?\\s*</span>", true);
}
if (name != null) {
@@ -341,80 +289,36 @@ public class WhitePagesApi {
}
private static String parseNameCanada(String output) {
- Matcher m;
-
- Pattern regexName = Pattern.compile(
- "(<li\\s+class=\"listing_info\">.*?</li>)", Pattern.DOTALL);
- String name = null;
-
- m = regexName.matcher(output);
- if (m.find()) {
- name = m.group(1).trim();
- }
-
- if (name != null) {
- name = Html.fromHtml(name).toString().trim();
- }
-
- return name;
+ String name = LookupUtils.firstRegexResult(output,
+ "(<li\\s+class=\"listing_info\">.*?</li>)", true);
+ return LookupUtils.fromHtml(name);
}
private static String parseNumberUnitedStates(String output) {
- Matcher m;
-
- Pattern regexPhoneNumber = Pattern.compile(
- "Full Number:</span>([0-9\\-\\+\\(\\)]+)</li>", Pattern.DOTALL);
- String phoneNumber = null;
-
- m = regexPhoneNumber.matcher(output);
- if (m.find()) {
- phoneNumber = m.group(1).trim();
- }
-
- return phoneNumber;
+ return LookupUtils.firstRegexResult(output,
+ "Full Number:</span>([0-9\\-\\+\\(\\)]+)</li>", true);
}
private static String parseAddressUnitedStates(String output) {
- Matcher m;
-
String regexBase = "<span\\s+class=\"%s[^\"]+\"\\s*>([^<]*)</span>";
- Pattern regexAddressPrimary = Pattern.compile(
- String.format(regexBase, "address-primary"), Pattern.DOTALL);
- Pattern regexAddressSecondary = Pattern.compile(
- String.format(regexBase, "address-secondary"), Pattern.DOTALL);
- Pattern regexAddressLocation = Pattern.compile(
- String.format(regexBase, "address-location"), Pattern.DOTALL);
-
- String addressPrimary = null;
- String addressSecondary = null;
- String addressLocation = null;
-
- m = regexAddressPrimary.matcher(output);
- if (m.find()) {
- addressPrimary = m.group(1).trim();
- }
-
- m = regexAddressSecondary.matcher(output);
- if (m.find()) {
- addressSecondary = m.group(1).trim();
- }
-
- m = regexAddressLocation.matcher(output);
- if (m.find()) {
- addressLocation = m.group(1).trim();
- }
+ String addressPrimary = LookupUtils.firstRegexResult(output,
+ String.format(regexBase, "address-primary"), true);
+ String addressSecondary = LookupUtils.firstRegexResult(output,
+ String.format(regexBase, "address-secondary"), true);
+ String addressLocation = LookupUtils.firstRegexResult(output,
+ String.format(regexBase, "address-location"), true);
StringBuilder sb = new StringBuilder();
- if (addressPrimary != null && addressPrimary.length() != 0) {
+ if (!TextUtils.isEmpty(addressPrimary)) {
sb.append(addressPrimary);
}
- if (addressSecondary != null && addressSecondary.length() != 0) {
+ if (!TextUtils.isEmpty(addressSecondary)) {
sb.append(", ");
sb.append(addressSecondary);
}
- if (addressLocation != null && addressLocation.length() != 0) {
+ if (!TextUtils.isEmpty(addressLocation)) {
sb.append(", ");
sb.append(addressLocation);
}
@@ -428,22 +332,12 @@ public class WhitePagesApi {
}
private static String parseAddressCanada(String output) {
- Matcher m;
-
- Pattern regexAddress = Pattern
- .compile(
- "<ol class=\"result people_result\">.*?(<li\\s+class=\"col_location\">.*?</li>).*?</ol>",
- Pattern.DOTALL);
- String address = null;
-
- m = regexAddress.matcher(output);
- if (m.find()) {
- address = m.group(1).trim();
- }
+ String address = LookupUtils.firstRegexResult(output,
+ "<ol class=\"result people_result\">.*?(<li\\s+class=\"col_location\">.*?</li>)" +
+ ".*?</ol>", true);
if (address != null) {
- address = Html.fromHtml(address).toString().replace("\n", ", ")
- .trim();
+ address = LookupUtils.fromHtml(address).replace("\n", ", ");
}
return address;
diff --git a/src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java b/src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java
index 5de1bec82..b237327b4 100644
--- a/src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java
+++ b/src/com/android/dialer/lookup/whitepages/WhitePagesPeopleLookup.java
@@ -51,20 +51,16 @@ public class WhitePagesPeopleLookup extends PeopleLookup {
return null;
}
- ArrayList<ContactInfo> details = new ArrayList<ContactInfo>();
-
- for (WhitePagesApi.ContactInfo info : infos) {
+ ContactInfo[] details = new ContactInfo[infos.length];
+ for (int i = 0; i < infos.length; i++) {
+ WhitePagesApi.ContactInfo info = infos[i];
ContactBuilder builder = new ContactBuilder(
ContactBuilder.PEOPLE_LOOKUP, null, info.formattedNumber);
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = info.name;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = info.formattedNumber;
- pn.type = Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
+ builder.setName(ContactBuilder.Name.createDisplayName(info.name));
+ builder.addPhoneNumber(
+ ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber));
+ builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website));
if (info.address != null || info.city != null) {
ContactBuilder.Address a = new ContactBuilder.Address();
@@ -74,18 +70,9 @@ public class WhitePagesPeopleLookup extends PeopleLookup {
builder.addAddress(a);
}
- ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl();
- w.url = info.website;
- w.type = Website.TYPE_PROFILE;
- builder.addWebsite(w);
-
- details.add(builder.build());
+ details[i] = builder.build();
}
- if (details.size() > 0) {
- return details.toArray(new ContactInfo[details.size()]);
- } else {
- return null;
- }
+ return details;
}
}
diff --git a/src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java b/src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java
index 470758b9d..375c63f35 100644
--- a/src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java
+++ b/src/com/android/dialer/lookup/whitepages/WhitePagesReverseLookup.java
@@ -21,12 +21,6 @@ import com.android.dialer.lookup.ContactBuilder;
import com.android.dialer.lookup.ReverseLookup;
import android.content.Context;
-import android.net.Uri;
-import android.util.Pair;
-
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Website;
import java.io.IOException;
@@ -45,16 +39,9 @@ public class WhitePagesReverseLookup extends ReverseLookup {
* @param formattedNumber The formatted phone number
* @return The phone number info object
*/
- public Pair<ContactInfo, Object> lookupNumber(Context context,
- String normalizedNumber, String formattedNumber) {
- WhitePagesApi.ContactInfo info = null;
-
- try {
- info = WhitePagesApi.reverseLookup(context, normalizedNumber);
- } catch (IOException e) {
- return null;
- }
-
+ public ContactInfo lookupNumber(Context context,
+ String normalizedNumber, String formattedNumber) throws IOException {
+ WhitePagesApi.ContactInfo info = WhitePagesApi.reverseLookup(context, normalizedNumber);
if (info == null || info.name == null) {
return null;
}
@@ -63,27 +50,13 @@ public class WhitePagesReverseLookup extends ReverseLookup {
ContactBuilder.REVERSE_LOOKUP,
normalizedNumber, formattedNumber);
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = info.name;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = info.formattedNumber;
- pn.type = Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
-
+ builder.setName(ContactBuilder.Name.createDisplayName(info.name));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber));
+ builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website));
if (info.address != null) {
- ContactBuilder.Address a = new ContactBuilder.Address();
- a.formattedAddress = info.address;
- a.type = StructuredPostal.TYPE_HOME;
- builder.addAddress(a);
+ builder.addAddress(ContactBuilder.Address.createFormattedHome(info.address));
}
- ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl();
- w.url = info.website;
- w.type = Website.TYPE_PROFILE;
- builder.addWebsite(w);
-
- return Pair.create(builder.build(), null);
+ return builder.build();
}
}
diff --git a/src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java b/src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java
index 75078b92f..b52a67b1f 100644
--- a/src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java
+++ b/src/com/android/dialer/lookup/yellowpages/YellowPagesApi.java
@@ -16,25 +16,18 @@
package com.android.dialer.lookup.yellowpages;
+import android.content.Context;
+import android.text.TextUtils;
+
import com.android.dialer.lookup.LookupSettings;
+import com.android.dialer.lookup.LookupUtils;
-import android.content.Context;
-import android.text.Html;
+import org.apache.http.client.methods.HttpGet;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.DefaultHttpClient;
-
public class YellowPagesApi {
private static final String TAG = YellowPagesApi.class.getSimpleName();
@@ -61,81 +54,33 @@ public class YellowPagesApi {
}
private void fetchPage() throws IOException {
- mOutput = httpGet(mLookupUrl + mNumber);
- }
-
- private String httpGet(String url) throws IOException {
- HttpClient client = new DefaultHttpClient();
- HttpGet get = new HttpGet(url);
-
- HttpResponse response = client.execute(get);
- int status = response.getStatusLine().getStatusCode();
-
- // Android's org.apache.http doesn't have the RedirectStrategy class
- if (status == HttpStatus.SC_MOVED_PERMANENTLY
- || status == HttpStatus.SC_MOVED_TEMPORARILY) {
- Header[] headers = response.getHeaders("Location");
-
- if (headers != null && headers.length != 0) {
- String newUrl = headers[headers.length - 1].getValue();
- return httpGet(newUrl);
- } else {
- return null;
- }
- }
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- response.getEntity().writeTo(out);
-
- return new String(out.toByteArray());
+ mOutput = LookupUtils.httpGet(new HttpGet(mLookupUrl + mNumber));
}
private String getPhotoUrl(String website) throws IOException {
- String output = httpGet(website);
-
- Matcher m;
-
- Pattern regexGallery = Pattern.compile(
- "href=\"([^\"]+gallery\\?lid=[^\"]+)\"", Pattern.DOTALL);
-
- String galleryUrl = null;
-
- m = regexGallery.matcher(output);
- if (m.find()) {
- galleryUrl = "http://www.yellowpages.com" + m.group(1).trim();
- }
-
- if (galleryUrl == null) {
+ String output = LookupUtils.httpGet(new HttpGet(website));
+ String galleryRef = LookupUtils.firstRegexResult(output,
+ "href=\"([^\"]+gallery\\?lid=[^\"]+)\"", true);
+ if (galleryRef == null) {
return null;
}
// Get first image
+ HttpGet get = new HttpGet("http://www.yellowpages.com" + galleryRef);
+ output = LookupUtils.httpGet(get);
- output = httpGet(galleryUrl);
-
- Pattern regexPhoto = Pattern.compile(
- "\"type\":\"image\",\"src\":\"([^\"]+)\"", Pattern.DOTALL);
-
- String photoUrl = null;
-
- m = regexPhoto.matcher(output);
- if (m.find()) {
- photoUrl = m.group(1).trim();
- }
-
- return photoUrl;
+ return LookupUtils.firstRegexResult(output,
+ "\"type\":\"image\",\"src\":\"([^\"]+)\"", true);
}
private String[] parseNameWebsiteUnitedStates() {
- Matcher m;
-
Pattern regexNameAndWebsite = Pattern.compile(
"<a href=\"([^>]+?)\"[^>]+?class=\"url[^>]+?>([^<]+)</a>",
Pattern.DOTALL);
String name = null;
String website = null;
- m = regexNameAndWebsite.matcher(mOutput);
+ Matcher m = regexNameAndWebsite.matcher(mOutput);
if (m.find()) {
website = m.group(1).trim();
name = m.group(2).trim();
@@ -145,8 +90,6 @@ public class YellowPagesApi {
}
private String[] parseNameWebsiteCanada() {
- Matcher m;
-
Pattern regexNameAndWebsite = Pattern.compile(
"class=\"ypgListingTitleLink utagLink\".*?href=\"(.*?)\">"
+ "(<span\\s+class=\"listingTitle\">.*?</span>)",
@@ -154,14 +97,10 @@ public class YellowPagesApi {
String name = null;
String website = null;
- m = regexNameAndWebsite.matcher(mOutput);
+ Matcher m = regexNameAndWebsite.matcher(mOutput);
if (m.find()) {
website = m.group(1).trim();
- name = m.group(2).trim();
- }
-
- if (name != null) {
- name = Html.fromHtml(name).toString().trim();
+ name = LookupUtils.fromHtml(m.group(2).trim());
}
if (website != null) {
@@ -172,90 +111,43 @@ public class YellowPagesApi {
}
private String parseNumberUnitedStates() {
- Matcher m;
-
- Pattern regexPhoneNumber = Pattern.compile(
- "business-phone.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL);
- String phoneNumber = null;
-
- m = regexPhoneNumber.matcher(mOutput);
- if (m.find()) {
- phoneNumber = m.group(1).trim();
- }
-
- return phoneNumber;
+ return LookupUtils.firstRegexResult(mOutput,
+ "business-phone.*?>\n*([^\n<]+)\n*<", true);
}
private String parseNumberCanada() {
- Matcher m;
-
- Pattern regexPhoneNumber = Pattern.compile(
- "<div\\s+class=\"phoneNumber\">(.*?)</div>", Pattern.DOTALL);
- String phoneNumber = null;
-
- m = regexPhoneNumber.matcher(mOutput);
- if (m.find()) {
- phoneNumber = m.group(1).trim();
- }
-
- return phoneNumber;
+ return LookupUtils.firstRegexResult(mOutput,
+ "<div\\s+class=\"phoneNumber\">(.*?)</div>", true);
}
private String parseAddressUnitedStates() {
- Matcher m;
-
- Pattern regexAddressStreet = Pattern.compile(
- "street-address.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL);
- Pattern regexAddressCity = Pattern.compile(
- "locality.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL);
- Pattern regexAddressState = Pattern.compile(
- "region.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL);
- Pattern regexAddressZip = Pattern.compile(
- "postal-code.*?>\n*([^\n<]+)\n*<", Pattern.DOTALL);
-
- String addressStreet = null;
- String addressCity = null;
- String addressState = null;
- String addressZip = null;
-
- m = regexAddressStreet.matcher(mOutput);
- if (m.find()) {
- addressStreet = m.group(1).trim();
- if (addressStreet.endsWith(",")) {
- addressStreet = addressStreet.substring(0,
- addressStreet.length() - 1);
- }
+ String addressStreet = LookupUtils.firstRegexResult(mOutput,
+ "street-address.*?>\n*([^\n<]+)\n*<", true);
+ if (addressStreet != null && addressStreet.endsWith(",")) {
+ addressStreet = addressStreet.substring(0, addressStreet.length() - 1);
}
- m = regexAddressCity.matcher(mOutput);
- if (m.find()) {
- addressCity = m.group(1).trim();
- }
-
- m = regexAddressState.matcher(mOutput);
- if (m.find()) {
- addressState = m.group(1).trim();
- }
-
- m = regexAddressZip.matcher(mOutput);
- if (m.find()) {
- addressZip = m.group(1).trim();
- }
+ String addressCity = LookupUtils.firstRegexResult(mOutput,
+ "locality.*?>\n*([^\n<]+)\n*<", true);
+ String addressState = LookupUtils.firstRegexResult(mOutput,
+ "region.*?>\n*([^\n<]+)\n*<", true);
+ String addressZip = LookupUtils.firstRegexResult(mOutput,
+ "postal-code.*?>\n*([^\n<]+)\n*<", true);
StringBuilder sb = new StringBuilder();
- if (addressStreet != null && addressStreet.length() != 0) {
+ if (!TextUtils.isEmpty(addressStreet)) {
sb.append(addressStreet);
}
- if (addressCity != null && addressCity.length() != 0) {
+ if (!TextUtils.isEmpty(addressCity)) {
sb.append(", ");
sb.append(addressCity);
}
- if (addressState != null && addressState.length() != 0) {
+ if (!TextUtils.isEmpty(addressState)) {
sb.append(", ");
sb.append(addressState);
}
- if (addressZip != null && addressZip.length() != 0) {
+ if (!TextUtils.isEmpty(addressZip)) {
sb.append(", ");
sb.append(addressZip);
}
@@ -269,22 +161,9 @@ public class YellowPagesApi {
}
private String parseAddressCanada() {
- Matcher m;
-
- Pattern regexAddress = Pattern.compile(
- "<div\\s+class=\"address\">(.*?)</div>", Pattern.DOTALL);
- String address = null;
-
- m = regexAddress.matcher(mOutput);
- if (m.find()) {
- address = m.group(1).trim();
- }
-
- if (address != null) {
- address = Html.fromHtml(address).toString().trim();
- }
-
- return address;
+ String address = LookupUtils.firstRegexResult(mOutput,
+ "<div\\s+class=\"address\">(.*?)</div>", true);
+ return LookupUtils.fromHtml(address);
}
private void buildContactInfo() throws IOException {
diff --git a/src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java b/src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java
index 6e7b44df9..eaaee5779 100644
--- a/src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java
+++ b/src/com/android/dialer/lookup/yellowpages/YellowPagesReverseLookup.java
@@ -25,12 +25,8 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
-import android.util.Log;
-import android.util.Pair;
-
-import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.util.Log;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
@@ -54,9 +50,8 @@ public class YellowPagesReverseLookup extends ReverseLookup {
*
* @param context The application context
* @param uri The image URI
- * @param data Extra data (a authentication token, perhaps)
*/
- public Bitmap lookupImage(Context context, Uri uri, Object data) {
+ public Bitmap lookupImage(Context context, Uri uri) {
if (uri == null) {
throw new NullPointerException("URI is null");
}
@@ -107,16 +102,10 @@ public class YellowPagesReverseLookup extends ReverseLookup {
* @param formattedNumber The formatted phone number
* @return The phone number info object
*/
- public Pair<ContactInfo, Object> lookupNumber(Context context,
- String normalizedNumber, String formattedNumber) {
+ public ContactInfo lookupNumber(Context context,
+ String normalizedNumber, String formattedNumber) throws IOException {
YellowPagesApi ypa = new YellowPagesApi(context, normalizedNumber);
- YellowPagesApi.ContactInfo info = null;
-
- try {
- info = ypa.getContactInfo();
- } catch (IOException e) {
- return null;
- }
+ YellowPagesApi.ContactInfo info = ypa.getContactInfo();
if (info.name == null) {
return null;
@@ -126,14 +115,9 @@ public class YellowPagesReverseLookup extends ReverseLookup {
ContactBuilder.REVERSE_LOOKUP,
normalizedNumber, formattedNumber);
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = info.name;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = info.formattedNumber;
- pn.type = Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
+ builder.setName(ContactBuilder.Name.createDisplayName(info.name));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber));
+ builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website));
if (info.address != null) {
ContactBuilder.Address a = new ContactBuilder.Address();
@@ -142,17 +126,12 @@ public class YellowPagesReverseLookup extends ReverseLookup {
builder.addAddress(a);
}
- ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl();
- w.url = info.website;
- w.type = Website.TYPE_PROFILE;
- builder.addWebsite(w);
-
if (info.photoUrl != null) {
builder.setPhotoUri(info.photoUrl);
} else {
builder.setPhotoUri(ContactBuilder.PHOTO_URI_BUSINESS);
}
- return Pair.create(builder.build(), null);
+ return builder.build();
}
}
diff --git a/src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java b/src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java
index 76fc414f5..2e8b65abd 100644
--- a/src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java
+++ b/src/com/android/dialer/lookup/zabasearch/ZabaSearchApi.java
@@ -16,15 +16,13 @@
package com.android.dialer.lookup.zabasearch;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import android.text.TextUtils;
+
+import com.android.dialer.lookup.LookupUtils;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.DefaultHttpClient;
+
+import java.io.IOException;
public class ZabaSearchApi {
private static final String TAG = ZabaSearchApi.class.getSimpleName();
@@ -40,93 +38,40 @@ public class ZabaSearchApi {
}
private void fetchPage() throws IOException {
- mOutput = httpGet(LOOKUP_URL + mNumber);
- }
-
- private String httpGet(String url) throws IOException {
- HttpClient client = new DefaultHttpClient();
- HttpGet get = new HttpGet(url);
-
- HttpResponse response = client.execute(get);
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- response.getEntity().writeTo(out);
-
- return new String(out.toByteArray());
+ mOutput = LookupUtils.httpGet(new HttpGet(LOOKUP_URL + mNumber));
}
private void buildContactInfo() {
- Matcher m;
-
// Name
- Pattern regexName = Pattern.compile(
- "itemprop=\"?name\"?>([^<]+)<", Pattern.DOTALL);
- String name = null;
-
- m = regexName.matcher(mOutput);
- if (m.find()) {
- name = m.group(1).trim();
- }
-
+ String name = LookupUtils.firstRegexResult(mOutput,
+ "itemprop=\"?name\"?>([^<]+)<", true);
// Formatted phone number
- Pattern regexPhoneNumber = Pattern.compile(
- "itemprop=\"?telephone\"?>([^<]+)<", Pattern.DOTALL);
- String phoneNumber = null;
-
- m = regexPhoneNumber.matcher(mOutput);
- if (m.find()) {
- phoneNumber = m.group(1).trim();
- }
-
+ String phoneNumber = LookupUtils.firstRegexResult(mOutput,
+ "itemprop=\"?telephone\"?>([^<]+)<", true);
// Address
- Pattern regexStreet = Pattern.compile(
- "itemprop=\"?streetAddress\"?>([^<]+?)(&nbsp;)*<", Pattern.DOTALL);
- Pattern regexCity = Pattern.compile(
- "itemprop=\"?addressLocality\"?>([^<]+)<", Pattern.DOTALL);
- Pattern regexState = Pattern.compile(
- "itemprop=\"?addressRegion\"?>([^<]+)<", Pattern.DOTALL);
- Pattern regexZip = Pattern.compile(
- "itemprop=\"?postalCode\"?>([^<]+)<", Pattern.DOTALL);
-
- String addressStreet = null;
- String addressCity = null;
- String addressState = null;
- String addressZip = null;
-
- m = regexStreet.matcher(mOutput);
- if (m.find()) {
- addressStreet = m.group(1).trim();
- }
-
- m = regexCity.matcher(mOutput);
- if (m.find()) {
- addressCity = m.group(1).trim();
- }
-
- m = regexState.matcher(mOutput);
- if (m.find()) {
- addressState = m.group(1).trim();
- }
-
- m = regexZip.matcher(mOutput);
- if (m.find()) {
- addressZip = m.group(1).trim();
- }
+ String addressStreet = LookupUtils.firstRegexResult(mOutput,
+ "itemprop=\"?streetAddress\"?>([^<]+?)(&nbsp;)*<", true);
+ String addressCity = LookupUtils.firstRegexResult(mOutput,
+ "itemprop=\"?addressLocality\"?>([^<]+)<", true);
+ String addressState = LookupUtils.firstRegexResult(mOutput,
+ "itemprop=\"?addressRegion\"?>([^<]+)<", true);
+ String addressZip = LookupUtils.firstRegexResult(mOutput,
+ "itemprop=\"?postalCode\"?>([^<]+)<", true);
StringBuilder sb = new StringBuilder();
- if (addressStreet != null && addressStreet.length() != 0) {
+ if (!TextUtils.isEmpty(addressStreet)) {
sb.append(addressStreet);
}
- if (addressCity != null && addressCity.length() != 0) {
+ if (!TextUtils.isEmpty(addressCity)) {
sb.append(", ");
sb.append(addressCity);
}
- if (addressState != null && addressState.length() != 0) {
+ if (!TextUtils.isEmpty(addressState)) {
sb.append(", ");
sb.append(addressState);
}
- if (addressZip != null && addressZip.length() != 0) {
+ if (!TextUtils.isEmpty(addressZip)) {
sb.append(", ");
sb.append(addressZip);
}
diff --git a/src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java b/src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java
index e0395214a..afe9961ac 100644
--- a/src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java
+++ b/src/com/android/dialer/lookup/zabasearch/ZabaSearchReverseLookup.java
@@ -21,11 +21,6 @@ import com.android.dialer.lookup.ContactBuilder;
import com.android.dialer.lookup.ReverseLookup;
import android.content.Context;
-import android.util.Pair;
-
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Website;
import java.io.IOException;
@@ -44,17 +39,10 @@ public class ZabaSearchReverseLookup extends ReverseLookup {
* @param formattedNumber The formatted phone number
* @return The phone number info object
*/
- public Pair<ContactInfo, Object> lookupNumber(Context context,
- String normalizedNumber, String formattedNumber) {
+ public ContactInfo lookupNumber(Context context,
+ String normalizedNumber, String formattedNumber) throws IOException {
ZabaSearchApi zsa = new ZabaSearchApi(normalizedNumber);
- ZabaSearchApi.ContactInfo info = null;
-
- try {
- info = zsa.getContactInfo();
- } catch (IOException e) {
- return null;
- }
-
+ ZabaSearchApi.ContactInfo info = zsa.getContactInfo();
if (info.name == null) {
return null;
}
@@ -63,27 +51,13 @@ public class ZabaSearchReverseLookup extends ReverseLookup {
ContactBuilder.REVERSE_LOOKUP,
normalizedNumber, formattedNumber);
- ContactBuilder.Name n = new ContactBuilder.Name();
- n.displayName = info.name;
- builder.setName(n);
-
- ContactBuilder.PhoneNumber pn = new ContactBuilder.PhoneNumber();
- pn.number = info.formattedNumber;
- pn.type = Phone.TYPE_MAIN;
- builder.addPhoneNumber(pn);
-
+ builder.setName(ContactBuilder.Name.createDisplayName(info.name));
+ builder.addPhoneNumber(ContactBuilder.PhoneNumber.createMainNumber(info.formattedNumber));
+ builder.addWebsite(ContactBuilder.WebsiteUrl.createProfile(info.website));
if (info.address != null) {
- ContactBuilder.Address a = new ContactBuilder.Address();
- a.formattedAddress = info.address;
- a.type = StructuredPostal.TYPE_HOME;
- builder.addAddress(a);
+ builder.addAddress(ContactBuilder.Address.createFormattedHome(info.address));
}
- ContactBuilder.WebsiteUrl w = new ContactBuilder.WebsiteUrl();
- w.url = info.website;
- w.type = Website.TYPE_PROFILE;
- builder.addWebsite(w);
-
- return Pair.create(builder.build(), null);
+ return builder.build();
}
}