Merge "Implement RemoteVvmTaskService"
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
index 3a350da..7e2e3c7 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu-rIN/strings.xml
@@ -428,7 +428,7 @@
     <string name="card_title_dialing" msgid="5769417478498348054">"ડાયલ કરી રહ્યાં છે"</string>
     <string name="card_title_redialing" msgid="8253487008234167266">"ફરી ડાયલ કરી રહ્યાં છે"</string>
     <string name="card_title_conf_call" msgid="1162980346189744501">"કોન્ફરન્સ કૉલ"</string>
-    <string name="card_title_incoming_call" msgid="7364539451234646909">"આવનાર કૉલ"</string>
+    <string name="card_title_incoming_call" msgid="7364539451234646909">"ઇનકમિંગ કૉલ"</string>
     <string name="card_title_call_ended" msgid="5544730338889702298">"કૉલ સમાપ્ત થયો"</string>
     <string name="card_title_on_hold" msgid="821463117892339942">"હોલ્ડ પર"</string>
     <string name="card_title_hanging_up" msgid="3999101620995182450">"સમાપ્ત કરી રહ્યાં છે"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 9ba3f75..cc35e3e 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -52,7 +52,7 @@
     <string name="requesting_unlock" msgid="6412629401033249351">"Հայցվում է ցանցի ապակողպում..."</string>
     <string name="unlock_failed" msgid="6490531697031504225">"Ցանցի ապակողպման հարցումը խափանվեց:"</string>
     <string name="unlock_success" msgid="6770085622238180152">"Ցանցի ապակողպումը խափանվեց"</string>
-    <string name="mobile_network_settings_not_available" msgid="3831911315358856062">"Բջջային ցանցի կարգավորումներն անհասանելի են այս օգտվողի համար"</string>
+    <string name="mobile_network_settings_not_available" msgid="3831911315358856062">"Բջջային ցանցի կարգավորումներն անհասանելի են այս օգտատիրոջ"</string>
     <string name="labelGSMMore" msgid="5930842194056092106">"GSM զանգերի կարգավորումներ"</string>
     <string name="labelGsmMore_with_label" msgid="2674012918829238901">"GSM զանգի կարգավորումներ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="labelCDMAMore" msgid="1630676740428229339">"CDMA զանգերի կարգավորումներ"</string>
@@ -118,7 +118,7 @@
     <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Անջատված է"</string>
     <string name="disable_cfnrc_forbidden" msgid="5646361343094064333">"Ձեր սպասարկողը չի աջակցում զանգի վերահասցեավորման կասեցում, երբ ձեր հեռախոսն անհասանելի է:"</string>
     <string name="updating_title" msgid="6146755386174019046">"Զանգի կարգավորումներ"</string>
-    <string name="call_settings_admin_user_only" msgid="4526094783818216374">"Զանգի կարգավորումները կարող է փոխել միայն ադմինիստրատոր հանդիսացող օգտվողը:"</string>
+    <string name="call_settings_admin_user_only" msgid="4526094783818216374">"Զանգի կարգավորումները կարող է փոխել միայն ադմինիստրատոր հանդիսացող օգտատերը:"</string>
     <string name="call_settings_with_label" msgid="3401177261468593519">"Կարգավորումներ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="7970259216988931777">"Զանգի կարգավորումների սխալ"</string>
     <string name="reading_settings" msgid="1920291699287055284">"Ընթերցման կարգավորումներ..."</string>
@@ -557,8 +557,8 @@
     <string name="selectContact" msgid="781975788478987237">"ընտրել կոնտակտ"</string>
     <string name="not_voice_capable" msgid="2739898841461577811">"Ձայնային զանգերը չեն սպասարկվում"</string>
     <string name="description_dial_button" msgid="7459705245418435351">"համարհավաքել"</string>
-    <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Թրթռալ"</string>
-    <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Թրթռալ"</string>
+    <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Թրթռոց"</string>
+    <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Թրթռոց"</string>
     <string name="voicemail_visual_voicemail_switch_title" msgid="5012622186976275457">"Տեսանելի ձայնային փոստ"</string>
     <string name="voicemail_set_pin_dialog_title" msgid="2797924461029093837">"Ընտրեք PIN"</string>
     <string name="voicemail_change_pin_dialog_title" msgid="6035421908626121564">"Փոխել PIN-ը"</string>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index f044a4e..c8a2d26 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -456,7 +456,7 @@
     <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"हस्तांतर करू शकत नाही."</string>
     <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"परिषद कॉल करण्‍यात अक्षम."</string>
     <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"कॉल नाकारू शकत नाही."</string>
-    <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"कॉल रिलीझ करू शकत नाही."</string>
+    <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"कॉल रिलीज करू शकत नाही."</string>
     <string name="incall_error_supp_service_hold" msgid="7967020511232222078">"कॉल सुरु ठेवू शकत नाही."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="1782466780452640089">"कॉल करण्‍यासाठी वायरलेस नेटवर्कशी कनेक्‍ट करा."</string>
     <string name="incall_error_promote_wfc" msgid="106510757624022064">"कॉल करण्यासाठी वाय-फाय कॉलिंग सक्षम करा."</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 1496902..e7e1a57 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -86,7 +86,7 @@
     <string name="sum_cdma_call_settings" msgid="284753265979035549">"Dodatkowe ustawienia tylko połączenia CDMA"</string>
     <string name="labelNwService" msgid="4699970172021870983">"Ustawienia usługi sieciowej"</string>
     <string name="labelCallerId" msgid="3888899447379069198">"Nazwa rozmówcy"</string>
-    <string name="sum_loading_settings" msgid="1826692909391168620">"Wczytywanie ustawień…"</string>
+    <string name="sum_loading_settings" msgid="1826692909391168620">"Wczytuję ustawienia…"</string>
     <string name="sum_hide_caller_id" msgid="1071407020290873782">"Ukrycie numeru podczas rozmów wychodzących"</string>
     <string name="sum_show_caller_id" msgid="6768534125447290401">"Numer wyświetlany w połączeniach wychodzących"</string>
     <string name="sum_default_caller_id" msgid="1954518825510901365">"Do wyświetlania mojego numeru w połączeniach wychodzących używaj domyślnych ustawień operatora"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index fa4179e..5b46456 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -145,7 +145,7 @@
     <string name="fw_change_failed" msgid="5298103228470214665">"無法更改轉接號碼。\n如果問題持續發生,請與流動網絡供應商聯絡。"</string>
     <string name="fw_get_in_vm_failed" msgid="8862896836093833973">"無法擷取和儲存目前的轉接號碼設定。\n您仍要轉到新的供應商嗎?"</string>
     <string name="no_change" msgid="3186040086622435212">"沒有更改。"</string>
-    <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"選擇語音信箱服務"</string>
+    <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"選擇留言信箱服務"</string>
     <string name="voicemail_default" msgid="2001233554889016880">"您的流動網絡供應商"</string>
     <string name="vm_change_pin_old_pin" msgid="7295220109886682573">"舊的 PIN"</string>
     <string name="vm_change_pin_new_pin" msgid="5412922262839438097">"新的 PIN"</string>
@@ -579,16 +579,16 @@
     <string name="message_decode_error" msgid="3456481534066924855">"為訊息解碼時發生錯誤。"</string>
     <string name="callFailed_cdma_activation" msgid="2307989779233262164">"SIM 卡已啟動您的服務,並更新了您的手機漫遊功能。"</string>
     <string name="callFailed_cdma_call_limit" msgid="1556916577171457086">"進行中的通話過多。請先結束或合併現有通話,再重新撥打。"</string>
-    <string name="change_pin_title" msgid="7790232089699034029">"變更語音信箱 PIN 碼"</string>
+    <string name="change_pin_title" msgid="7790232089699034029">"變更留言信箱 PIN"</string>
     <string name="change_pin_continue_label" msgid="2135088662420163447">"繼續"</string>
     <string name="change_pin_cancel_label" msgid="353535488390948596">"取消"</string>
     <string name="change_pin_ok_label" msgid="6204308560844889926">"確認"</string>
     <string name="change_pin_enter_old_pin_header" msgid="419179847657548887">"確認舊 PIN 碼"</string>
-    <string name="change_pin_enter_old_pin_hint" msgid="8579171678763615453">"請輸入您的語音信箱 PIN 碼,然後繼續操作。"</string>
+    <string name="change_pin_enter_old_pin_hint" msgid="8579171678763615453">"請輸入留言信箱 PIN 以繼續操作。"</string>
     <string name="change_pin_enter_new_pin_header" msgid="2611191814590251532">"設定新 PIN 碼"</string>
     <string name="change_pin_enter_new_pin_hint" msgid="2322940054329689309">"PIN 碼長度必須介乎 <xliff:g id="MIN">%1$d</xliff:g>-<xliff:g id="MAX">%2$d</xliff:g> 個數字。"</string>
     <string name="change_pin_confirm_pin_header" msgid="8113764019347322170">"確認 PIN 碼"</string>
     <string name="change_pin_confirm_pins_dont_match" msgid="4795052654904027909">"PIN 碼不符"</string>
-    <string name="change_pin_succeeded" msgid="2022852286442211151">"已更新語音信箱 PIN 碼"</string>
+    <string name="change_pin_succeeded" msgid="2022852286442211151">"已更新留言信箱 PIN"</string>
     <string name="change_pin_system_error" msgid="8308462387154257840">"無法設定 PIN 碼"</string>
 </resources>
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index 05e5afa..92f202a 100644
--- a/src/com/android/services/telephony/DisconnectCauseUtil.java
+++ b/src/com/android/services/telephony/DisconnectCauseUtil.java
@@ -127,6 +127,7 @@
             case android.telephony.DisconnectCause.DATA_DISABLED:
             case android.telephony.DisconnectCause.DATA_LIMIT_REACHED:
             case android.telephony.DisconnectCause.DIALED_ON_WRONG_SLOT:
+            case android.telephony.DisconnectCause.DIALED_CALL_FORWARDING_WHILE_ROAMING:
                 return DisconnectCause.ERROR;
 
             case android.telephony.DisconnectCause.DIALED_MMI:
@@ -378,6 +379,9 @@
             case android.telephony.DisconnectCause.DATA_LIMIT_REACHED:
                 resourceId = R.string.callFailed_data_limit_reached_description;
                 break;
+            case android.telephony.DisconnectCause.DIALED_CALL_FORWARDING_WHILE_ROAMING:
+                resourceId = com.android.internal.R.string.mmiErrorWhileRoaming;
+                break;
 
             default:
                 break;
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index b5f195f..6d52387 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -547,6 +547,15 @@
             return failedConnection;
         }
 
+        // Check roaming status to see if we should block custom call forwarding codes
+        if (blockCallForwardingNumberWhileRoaming(phone, number)) {
+            return Connection.createFailedConnection(
+                    DisconnectCauseUtil.toTelecomDisconnectCause(
+                            android.telephony.DisconnectCause.DIALED_CALL_FORWARDING_WHILE_ROAMING,
+                            "Call forwarding while roaming"));
+        }
+
+
         final TelephonyConnection connection =
                 createConnectionFor(phone, null, true /* isOutgoing */, request.getAccountHandle(),
                         request.getTelecomCallId(), request.getAddress(), request.getVideoState());
@@ -758,6 +767,28 @@
         }
     }
 
+    private boolean blockCallForwardingNumberWhileRoaming(Phone phone, String number) {
+        if (phone == null || TextUtils.isEmpty(number) || !phone.getServiceState().getRoaming()) {
+            return false;
+        }
+        String[] blockPrefixes = null;
+        CarrierConfigManager cfgManager = (CarrierConfigManager)
+                phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+        if (cfgManager != null) {
+            blockPrefixes = cfgManager.getConfigForSubId(phone.getSubId()).getStringArray(
+                    CarrierConfigManager.KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY);
+        }
+
+        if (blockPrefixes != null) {
+            for (String prefix : blockPrefixes) {
+                if (number.startsWith(prefix)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     private boolean isRadioOn() {
         boolean result = false;
         for (Phone phone : mPhoneFactoryProxy.getPhones()) {