diff options
author | Brint E. Kriebel <bekit@cyngn.com> | 2014-11-03 19:11:11 -0800 |
---|---|---|
committer | Brint E. Kriebel <bekit@cyngn.com> | 2014-11-03 19:11:11 -0800 |
commit | f9db81424082ebe5fd4f47754fc58697379054ca (patch) | |
tree | 6b0629099bccbd862f88ab0ae04037fb88703166 | |
parent | 637e2f0cb94337d77c3fd054fd184446d56d8988 (diff) | |
parent | b6783c46c27a987f5b50b6f77b95af16ed0c6030 (diff) | |
download | android_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
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ü > 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 (.*?)'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 (.*?)'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\"?>([^<]+?)( )*<", 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\"?>([^<]+?)( )*<", 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(); } } |