17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2006 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1987c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenimport static com.android.internal.telephony.PhoneConstants.SUBSCRIPTION_KEY; 2087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 2130a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yenimport android.Manifest.permission; 22602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganovimport android.app.ActivityManager; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AppOpsManager; 2430a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yenimport android.app.PendingIntent; 25bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepalimport android.content.ComponentName; 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 2897ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tanimport android.content.SharedPreferences; 296e11887b99940b986591eb40228faf53bb57a162Amith Yamasaniimport android.content.pm.PackageInfo; 3060f9c952a11be2a34460b4cc8e0f9b31e38f5f30Shishir Agrawalimport android.content.pm.PackageManager; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.Uri; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Binder; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle; 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Looper; 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Message; 38602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganovimport android.os.Process; 3965d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunnimport android.os.PersistableBundle; 40903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinskiimport android.os.ResultReceiver; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.ServiceManager; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.UserHandle; 43981d85874294656a51683ae6ecc6ba312d3635ceStuart Scottimport android.os.UserManager; 449a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindranimport android.os.WorkSource; 4597ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tanimport android.preference.PreferenceManager; 46f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awadimport android.provider.Settings; 471a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wangimport android.service.carrier.CarrierIdentifier; 487a1885ba88b4ca833d6dae8b352097636f242917Santos Cordonimport android.telecom.PhoneAccount; 4931f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chenimport android.telecom.PhoneAccountHandle; 509431b838f89399db2278c0436bd2817322a45f74Andrew Leeimport android.telecom.TelecomManager; 5112f7d80f47bdad9ed1c02b8b916f75e4f11fe873Junda Liuimport android.telephony.CarrierConfigManager; 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.telephony.CellInfo; 539a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindranimport android.telephony.ClientRequestStats; 54da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawalimport android.telephony.IccOpenLogicalChannelResponse; 5587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenimport android.telephony.ModemActivityInfo; 56e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hambyimport android.telephony.NeighboringCellInfo; 575d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Savilleimport android.telephony.RadioAccessFamily; 5865d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunnimport android.telephony.Rlog; 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.telephony.ServiceState; 6030a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yenimport android.telephony.SmsManager; 610f3b5fcda1b76fbd6042f9a6f81f69d0b44bc3eeWink Savilleimport android.telephony.SubscriptionInfo; 6285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkeyimport android.telephony.SubscriptionManager; 6399ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padaweimport android.telephony.TelephonyHistogram; 64b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yenimport android.telephony.TelephonyManager; 6565d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunnimport android.telephony.UssdResponse; 66b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yenimport android.telephony.VisualVoicemailSmsFilterSettings; 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils; 6885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkeyimport android.util.ArraySet; 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 70e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hambyimport android.util.Pair; 7185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkeyimport android.util.Slog; 7230a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen 73312e8177b25ab359627685d449e0a5fdb539809fAndrew Leeimport com.android.ims.ImsManager; 7451f743acf922009c45c60362fd71431a9891c051Brad Ebingerimport com.android.ims.internal.IImsServiceController; 7551f743acf922009c45c60362fd71431a9891c051Brad Ebingerimport com.android.ims.internal.IImsServiceFeatureListener; 76566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawalimport com.android.internal.telephony.CallManager; 7710d19bf452996ecb85cfcb1fccc2131c3c4717aeTyler Gunnimport com.android.internal.telephony.CallStateException; 78302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawalimport com.android.internal.telephony.CellNetworkScanResult; 79566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawalimport com.android.internal.telephony.CommandException; 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.DefaultPhoneNotifier; 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.ITelephony; 82e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hambyimport com.android.internal.telephony.IccCard; 831c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamathimport com.android.internal.telephony.MccTable; 84302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawalimport com.android.internal.telephony.OperatorInfo; 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone; 86a667c150aedea6ca49b805da19a2fbb3b1e75999Nathan Haroldimport com.android.internal.telephony.PhoneConstantConversions; 8787c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenimport com.android.internal.telephony.PhoneConstants; 8836469e74b7c79ed84148754190c38196eb9a2c49Wink Savilleimport com.android.internal.telephony.PhoneFactory; 895d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Savilleimport com.android.internal.telephony.ProxyController; 9099ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padaweimport com.android.internal.telephony.RIL; 91b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganovimport com.android.internal.telephony.RILConstants; 92ac1bdfd36366426513d51bd2c4b107b00533889eWink Savilleimport com.android.internal.telephony.SubscriptionController; 93566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawalimport com.android.internal.telephony.uicc.IccIoResult; 94566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawalimport com.android.internal.telephony.uicc.IccUtils; 95b30140510ae7209034135809738a20f9e6f26c5fNathan Haroldimport com.android.internal.telephony.uicc.SIMRecords; 96eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawalimport com.android.internal.telephony.uicc.UiccCard; 97b30140510ae7209034135809738a20f9e6f26c5fNathan Haroldimport com.android.internal.telephony.uicc.UiccCardApplication; 98566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawalimport com.android.internal.telephony.uicc.UiccController; 997ed723db509e6fa86b96fa3d7fd6291ab142cb52fionaxuimport com.android.internal.telephony.util.VoicemailNotificationSettingsUtil; 100e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hambyimport com.android.internal.util.HexDump; 101c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yenimport com.android.phone.vvm.PhoneAccountHandleConverter; 102527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yenimport com.android.phone.vvm.RemoteVvmTaskManager; 103c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yenimport com.android.phone.vvm.VisualVoicemailSettingsUtil; 104c890531fe977852dd19fc920b7719a03f3a31b3eTa-wei Yenimport com.android.phone.vvm.VisualVoicemailSmsFilterConfig; 10530a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen 106c236d6b7ad95481ec831905c15e563498d65dc3eTa-wei Yenimport java.io.FileDescriptor; 107c236d6b7ad95481ec831905c15e563498d65dc3eTa-wei Yenimport java.io.PrintWriter; 10830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yenimport java.nio.charset.StandardCharsets; 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.ArrayList; 11085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkeyimport java.util.Arrays; 111e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hambyimport java.util.List; 1121c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamathimport java.util.Locale; 11385190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkeyimport java.util.Map; 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Implementation of the ITelephony interface. 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 118117fee7467c140dccdc66972f60031dae2d55b35Santos Cordonpublic class PhoneInterfaceManager extends ITelephony.Stub { 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "PhoneInterfaceManager"; 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2); 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final boolean DBG_LOC = false; 12285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey private static final boolean DBG_MERGE = false; 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Message codes used with mMainThreadHandler 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int CMD_HANDLE_PIN_MMI = 1; 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int CMD_HANDLE_NEIGHBORING_CELL = 2; 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_NEIGHBORING_CELL_DONE = 3; 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int CMD_ANSWER_RINGING_CALL = 4; 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int CMD_END_CALL = 5; // not used yet 130da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal private static final int CMD_TRANSMIT_APDU_LOGICAL_CHANNEL = 7; 131da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal private static final int EVENT_TRANSMIT_APDU_LOGICAL_CHANNEL_DONE = 8; 132566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal private static final int CMD_OPEN_CHANNEL = 9; 133566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal private static final int EVENT_OPEN_CHANNEL_DONE = 10; 134566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal private static final int CMD_CLOSE_CHANNEL = 11; 135566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal private static final int EVENT_CLOSE_CHANNEL_DONE = 12; 136e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private static final int CMD_NV_READ_ITEM = 13; 137e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private static final int EVENT_NV_READ_ITEM_DONE = 14; 138e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private static final int CMD_NV_WRITE_ITEM = 15; 139e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private static final int EVENT_NV_WRITE_ITEM_DONE = 16; 140e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private static final int CMD_NV_WRITE_CDMA_PRL = 17; 141e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private static final int EVENT_NV_WRITE_CDMA_PRL_DONE = 18; 142e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private static final int CMD_NV_RESET_CONFIG = 19; 143e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private static final int EVENT_NV_RESET_CONFIG_DONE = 20; 1447c27be317e8757948178815426d3a329c852b9eeJake Hamby private static final int CMD_GET_PREFERRED_NETWORK_TYPE = 21; 1457c27be317e8757948178815426d3a329c852b9eeJake Hamby private static final int EVENT_GET_PREFERRED_NETWORK_TYPE_DONE = 22; 1467c27be317e8757948178815426d3a329c852b9eeJake Hamby private static final int CMD_SET_PREFERRED_NETWORK_TYPE = 23; 1477c27be317e8757948178815426d3a329c852b9eeJake Hamby private static final int EVENT_SET_PREFERRED_NETWORK_TYPE_DONE = 24; 14835b5945231af96ad0d7ebf4cfcaafeb677d8c75cSailesh Nepal private static final int CMD_SEND_ENVELOPE = 25; 14935b5945231af96ad0d7ebf4cfcaafeb677d8c75cSailesh Nepal private static final int EVENT_SEND_ENVELOPE_DONE = 26; 1506b088eef6c47d96b9b2a0097e3b8ee8b4332f068Derek Tan private static final int CMD_INVOKE_OEM_RIL_REQUEST_RAW = 27; 1516b088eef6c47d96b9b2a0097e3b8ee8b4332f068Derek Tan private static final int EVENT_INVOKE_OEM_RIL_REQUEST_RAW_DONE = 28; 1526b088eef6c47d96b9b2a0097e3b8ee8b4332f068Derek Tan private static final int CMD_TRANSMIT_APDU_BASIC_CHANNEL = 29; 1536b088eef6c47d96b9b2a0097e3b8ee8b4332f068Derek Tan private static final int EVENT_TRANSMIT_APDU_BASIC_CHANNEL_DONE = 30; 1546b088eef6c47d96b9b2a0097e3b8ee8b4332f068Derek Tan private static final int CMD_EXCHANGE_SIM_IO = 31; 1556b088eef6c47d96b9b2a0097e3b8ee8b4332f068Derek Tan private static final int EVENT_EXCHANGE_SIM_IO_DONE = 32; 15676d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal private static final int CMD_SET_VOICEMAIL_NUMBER = 33; 15776d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal private static final int EVENT_SET_VOICEMAIL_NUMBER_DONE = 34; 15854788801de04c603a856596f4ae4377ab77a9821Stuart Scott private static final int CMD_SET_NETWORK_SELECTION_MODE_AUTOMATIC = 35; 15954788801de04c603a856596f4ae4377ab77a9821Stuart Scott private static final int EVENT_SET_NETWORK_SELECTION_MODE_AUTOMATIC_DONE = 36; 1607fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham private static final int CMD_GET_MODEM_ACTIVITY_INFO = 37; 1617fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham private static final int EVENT_GET_MODEM_ACTIVITY_INFO_DONE = 38; 162302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal private static final int CMD_PERFORM_NETWORK_SCAN = 39; 163302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal private static final int EVENT_PERFORM_NETWORK_SCAN_DONE = 40; 164302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal private static final int CMD_SET_NETWORK_SELECTION_MODE_MANUAL = 41; 165302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal private static final int EVENT_SET_NETWORK_SELECTION_MODE_MANUAL_DONE = 42; 1661a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang private static final int CMD_SET_ALLOWED_CARRIERS = 43; 1671a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang private static final int EVENT_SET_ALLOWED_CARRIERS_DONE = 44; 1681a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang private static final int CMD_GET_ALLOWED_CARRIERS = 45; 1691a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang private static final int EVENT_GET_ALLOWED_CARRIERS_DONE = 46; 17032d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar private static final int CMD_HANDLE_USSD_REQUEST = 47; 171b30140510ae7209034135809738a20f9e6f26c5fNathan Harold private static final int CMD_GET_FORBIDDEN_PLMNS = 48; 172b30140510ae7209034135809738a20f9e6f26c5fNathan Harold private static final int EVENT_GET_FORBIDDEN_PLMNS_DONE = 49; 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** The singleton instance. */ 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static PhoneInterfaceManager sInstance; 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1773ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville private PhoneGlobals mApp; 1783ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville private Phone mPhone; 1793ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville private CallManager mCM; 180981d85874294656a51683ae6ecc6ba312d3635ceStuart Scott private UserManager mUserManager; 1813ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville private AppOpsManager mAppOps; 1823ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville private MainThreadHandler mMainThreadHandler; 183ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville private SubscriptionController mSubscriptionController; 1843ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville private SharedPreferences mTelephonySharedPreferences; 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 18697ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan private static final String PREF_CARRIERS_ALPHATAG_PREFIX = "carrier_alphtag_"; 18797ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan private static final String PREF_CARRIERS_NUMBER_PREFIX = "carrier_number_"; 18885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey private static final String PREF_CARRIERS_SUBSCRIBER_PREFIX = "carrier_subscriber_"; 18989e89d47f249a1e910d6d726dbfcbedfc193cb83Derek Tan 19089e89d47f249a1e910d6d726dbfcbedfc193cb83Derek Tan /** 191566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal * A request object to use for transmitting data to an ICC. 192566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal */ 193566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal private static final class IccAPDUArgument { 194566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal public int channel, cla, command, p1, p2, p3; 195566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal public String data; 196566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 197566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal public IccAPDUArgument(int channel, int cla, int command, 198566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal int p1, int p2, int p3, String data) { 199566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal this.channel = channel; 200566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal this.cla = cla; 201566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal this.command = command; 202566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal this.p1 = p1; 203566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal this.p2 = p2; 204566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal this.p3 = p3; 205566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal this.data = data; 206566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 207566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 208566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 209566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal /** 21077ba317277863812508869705308373b42364e0aShishir Agrawal * A request object to use for transmitting data to an ICC. 21177ba317277863812508869705308373b42364e0aShishir Agrawal */ 21277ba317277863812508869705308373b42364e0aShishir Agrawal private static final class ManualNetworkSelectionArgument { 21377ba317277863812508869705308373b42364e0aShishir Agrawal public OperatorInfo operatorInfo; 21477ba317277863812508869705308373b42364e0aShishir Agrawal public boolean persistSelection; 21577ba317277863812508869705308373b42364e0aShishir Agrawal 21677ba317277863812508869705308373b42364e0aShishir Agrawal public ManualNetworkSelectionArgument(OperatorInfo operatorInfo, boolean persistSelection) { 21777ba317277863812508869705308373b42364e0aShishir Agrawal this.operatorInfo = operatorInfo; 21877ba317277863812508869705308373b42364e0aShishir Agrawal this.persistSelection = persistSelection; 21977ba317277863812508869705308373b42364e0aShishir Agrawal } 22077ba317277863812508869705308373b42364e0aShishir Agrawal } 22177ba317277863812508869705308373b42364e0aShishir Agrawal 22277ba317277863812508869705308373b42364e0aShishir Agrawal /** 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * A request object for use with {@link MainThreadHandler}. Requesters should wait() on the 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * request after sending. The main thread will notify the request when it is complete. 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final class MainThreadRequest { 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** The argument to use for the request */ 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public Object argument; 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** The result of the request that is run on the main thread */ 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public Object result; 23156e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe // The subscriber id that this request applies to. Defaults to 23256e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe // SubscriptionManager.INVALID_SUBSCRIPTION_ID 23356e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe public Integer subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public MainThreadRequest(Object argument) { 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon this.argument = argument; 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 23876d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal 23976d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal public MainThreadRequest(Object argument, Integer subId) { 24076d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal this.argument = argument; 24156e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe if (subId != null) { 24256e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe this.subId = subId; 24356e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe } 24476d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal } 2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 247cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal private static final class IncomingThirdPartyCallArgs { 248cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal public final ComponentName component; 249cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal public final String callId; 250cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal public final String callerDisplayName; 251cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal 252cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal public IncomingThirdPartyCallArgs(ComponentName component, String callId, 253cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal String callerDisplayName) { 254cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal this.component = component; 255cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal this.callId = callId; 256cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal this.callerDisplayName = callerDisplayName; 257cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal } 258cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal } 259cc0375f8f26f868a55c36616921f4c572347062bSailesh Nepal 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * A handler that processes messages on the main thread in the phone process. Since many 2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * of the Phone calls are not thread safe this is needed to shuttle the requests from the 2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * inbound binder threads to the main thread in the phone process. The Binder thread 2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * may provide a {@link MainThreadRequest} object in the msg.obj field that they are waiting 2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * on, which will be notified when the operation completes and will contain the result of the 2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * request. 2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * <p>If a MainThreadRequest object is provided in the msg.obj field, 2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * note that request.result must be set to something non-null for the calling thread to 2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * unblock. 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final class MainThreadHandler extends Handler { 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void handleMessage(Message msg) { 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon MainThreadRequest request; 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message onCompleted; 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar; 278c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal UiccCard uiccCard; 279da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal IccAPDUArgument iccArgument; 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (msg.what) { 28232d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar case CMD_HANDLE_USSD_REQUEST: { 28332d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar request = (MainThreadRequest) msg.obj; 28432d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar final Phone phone = getPhoneFromRequest(request); 28532d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar Pair<String, ResultReceiver> ussdObject = (Pair) request.argument; 28632d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar String ussdRequest = ussdObject.first; 28732d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar ResultReceiver wrappedCallback = ussdObject.second; 28865d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn 28965d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn if (!isUssdApiAllowed(request.subId)) { 29065d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn // Carrier does not support use of this API, return failure. 29165d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn Rlog.w(LOG_TAG, "handleUssdRequest: carrier does not support USSD apis."); 29265d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn UssdResponse response = new UssdResponse(ussdRequest, null); 29365d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn Bundle returnData = new Bundle(); 29465d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn returnData.putParcelable(TelephonyManager.USSD_RESPONSE, response); 29565d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn wrappedCallback.send(TelephonyManager.USSD_RETURN_FAILURE, returnData); 29665d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn 29765d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn request.result = true; 29865d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn synchronized (request) { 29965d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn request.notifyAll(); 30065d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn } 30165d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn return; 30265d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn } 30365d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn 30410d19bf452996ecb85cfcb1fccc2131c3c4717aeTyler Gunn try { 30510d19bf452996ecb85cfcb1fccc2131c3c4717aeTyler Gunn request.result = phone != null ? 30610d19bf452996ecb85cfcb1fccc2131c3c4717aeTyler Gunn phone.handleUssdRequest(ussdRequest, wrappedCallback) 30710d19bf452996ecb85cfcb1fccc2131c3c4717aeTyler Gunn : false; 30810d19bf452996ecb85cfcb1fccc2131c3c4717aeTyler Gunn } catch (CallStateException cse) { 30910d19bf452996ecb85cfcb1fccc2131c3c4717aeTyler Gunn request.result = false; 31010d19bf452996ecb85cfcb1fccc2131c3c4717aeTyler Gunn } 31132d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar // Wake up the requesting thread 31232d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar synchronized (request) { 31332d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar request.notifyAll(); 31432d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar } 31532d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar break; 31632d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar } 31732d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar 318716f67e149e8defd72262b7e7f875ea2aef57652Yorke Lee case CMD_HANDLE_PIN_MMI: { 3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request = (MainThreadRequest) msg.obj; 320716f67e149e8defd72262b7e7f875ea2aef57652Yorke Lee final Phone phone = getPhoneFromRequest(request); 321716f67e149e8defd72262b7e7f875ea2aef57652Yorke Lee request.result = phone != null ? 322716f67e149e8defd72262b7e7f875ea2aef57652Yorke Lee getPhoneFromRequest(request).handlePinMmi((String) request.argument) 323716f67e149e8defd72262b7e7f875ea2aef57652Yorke Lee : false; 3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Wake up the requesting thread 3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (request) { 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request.notifyAll(); 3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 329716f67e149e8defd72262b7e7f875ea2aef57652Yorke Lee } 3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case CMD_HANDLE_NEIGHBORING_CELL: 3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request = (MainThreadRequest) msg.obj; 3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon onCompleted = obtainMessage(EVENT_NEIGHBORING_CELL_DONE, 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request); 3359a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran mPhone.getNeighboringCids(onCompleted, (WorkSource)request.argument); 3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_NEIGHBORING_CELL_DONE: 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ar = (AsyncResult) msg.obj; 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request = (MainThreadRequest) ar.userObj; 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ar.exception == null && ar.result != null) { 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request.result = ar.result; 3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // create an empty list to notify the waiting thread 345e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request.result = new ArrayList<NeighboringCellInfo>(0); 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Wake up the requesting thread 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (request) { 3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request.notifyAll(); 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case CMD_ANSWER_RINGING_CALL: 3540887461919173015886ea69ef6c6afbe20ebf1dcWink Saville request = (MainThreadRequest) msg.obj; 355584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott int answer_subId = request.subId; 3560887461919173015886ea69ef6c6afbe20ebf1dcWink Saville answerRingingCallInternal(answer_subId); 3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case CMD_END_CALL: 3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request = (MainThreadRequest) msg.obj; 361584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott int end_subId = request.subId; 3620887461919173015886ea69ef6c6afbe20ebf1dcWink Saville final boolean hungUp; 363ae4e36d0e6edc3a912e822e844ab362dd7469491Anthony Lee Phone phone = getPhone(end_subId); 364ae4e36d0e6edc3a912e822e844ab362dd7469491Anthony Lee if (phone == null) { 365ae4e36d0e6edc3a912e822e844ab362dd7469491Anthony Lee if (DBG) log("CMD_END_CALL: no phone for id: " + end_subId); 366ae4e36d0e6edc3a912e822e844ab362dd7469491Anthony Lee break; 367ae4e36d0e6edc3a912e822e844ab362dd7469491Anthony Lee } 368ae4e36d0e6edc3a912e822e844ab362dd7469491Anthony Lee int phoneType = phone.getPhoneType(); 3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { 3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // CDMA: If the user presses the Power button we treat it as 3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // ending the complete call session 3720887461919173015886ea69ef6c6afbe20ebf1dcWink Saville hungUp = PhoneUtils.hangupRingingAndActive(getPhone(end_subId)); 3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { 3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // GSM: End the call as per the Phone state 3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon hungUp = PhoneUtils.hangup(mCM); 3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon throw new IllegalStateException("Unexpected phone type: " + phoneType); 3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("CMD_END_CALL: " + (hungUp ? "hung up!" : "no call to hang up")); 3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request.result = hungUp; 3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Wake up the requesting thread 3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (request) { 3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request.notifyAll(); 3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 387da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal case CMD_TRANSMIT_APDU_LOGICAL_CHANNEL: 388566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request = (MainThreadRequest) msg.obj; 389da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument = (IccAPDUArgument) request.argument; 390c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal uiccCard = getUiccCardFromRequest(request); 391eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal if (uiccCard == null) { 392eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal loge("iccTransmitApduLogicalChannel: No UICC"); 393eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal request.result = new IccIoResult(0x6F, 0, (byte[])null); 394eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal synchronized (request) { 395eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal request.notifyAll(); 396eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 397eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } else { 398da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal onCompleted = obtainMessage(EVENT_TRANSMIT_APDU_LOGICAL_CHANNEL_DONE, 399da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request); 400eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal uiccCard.iccTransmitApduLogicalChannel( 401da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument.channel, iccArgument.cla, iccArgument.command, 402da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument.p1, iccArgument.p2, iccArgument.p3, iccArgument.data, 403566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal onCompleted); 404eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 405566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal break; 406566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 407da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal case EVENT_TRANSMIT_APDU_LOGICAL_CHANNEL_DONE: 408566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal ar = (AsyncResult) msg.obj; 409566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request = (MainThreadRequest) ar.userObj; 410566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (ar.exception == null && ar.result != null) { 411566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request.result = ar.result; 412566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } else { 413566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request.result = new IccIoResult(0x6F, 0, (byte[])null); 414566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (ar.result == null) { 415566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal loge("iccTransmitApduLogicalChannel: Empty response"); 416e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } else if (ar.exception instanceof CommandException) { 417566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal loge("iccTransmitApduLogicalChannel: CommandException: " + 418e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby ar.exception); 419566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } else { 420566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal loge("iccTransmitApduLogicalChannel: Unknown exception"); 421566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 422566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 423566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal synchronized (request) { 424566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request.notifyAll(); 425566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 426566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal break; 427566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 428da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal case CMD_TRANSMIT_APDU_BASIC_CHANNEL: 429da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request = (MainThreadRequest) msg.obj; 430da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument = (IccAPDUArgument) request.argument; 431c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal uiccCard = getUiccCardFromRequest(request); 432da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (uiccCard == null) { 433da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal loge("iccTransmitApduBasicChannel: No UICC"); 434da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.result = new IccIoResult(0x6F, 0, (byte[])null); 435da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal synchronized (request) { 436da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.notifyAll(); 437da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 438da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } else { 439da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal onCompleted = obtainMessage(EVENT_TRANSMIT_APDU_BASIC_CHANNEL_DONE, 440da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request); 441da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal uiccCard.iccTransmitApduBasicChannel( 442da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument.cla, iccArgument.command, iccArgument.p1, iccArgument.p2, 443da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument.p3, iccArgument.data, onCompleted); 444da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 445da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal break; 446da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 447da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal case EVENT_TRANSMIT_APDU_BASIC_CHANNEL_DONE: 448da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal ar = (AsyncResult) msg.obj; 449da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request = (MainThreadRequest) ar.userObj; 450da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (ar.exception == null && ar.result != null) { 451da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.result = ar.result; 452da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } else { 453da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.result = new IccIoResult(0x6F, 0, (byte[])null); 454da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (ar.result == null) { 455da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal loge("iccTransmitApduBasicChannel: Empty response"); 456da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } else if (ar.exception instanceof CommandException) { 457da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal loge("iccTransmitApduBasicChannel: CommandException: " + 458da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal ar.exception); 459da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } else { 460da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal loge("iccTransmitApduBasicChannel: Unknown exception"); 461da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 462da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 463da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal synchronized (request) { 464da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.notifyAll(); 465da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 466da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal break; 467da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 468da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal case CMD_EXCHANGE_SIM_IO: 469da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request = (MainThreadRequest) msg.obj; 470da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument = (IccAPDUArgument) request.argument; 471c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal uiccCard = getUiccCardFromRequest(request); 472da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (uiccCard == null) { 473da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal loge("iccExchangeSimIO: No UICC"); 474da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.result = new IccIoResult(0x6F, 0, (byte[])null); 475da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal synchronized (request) { 476da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.notifyAll(); 477da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 478da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } else { 479da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal onCompleted = obtainMessage(EVENT_EXCHANGE_SIM_IO_DONE, 480da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request); 481da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal uiccCard.iccExchangeSimIO(iccArgument.cla, /* fileID */ 482da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument.command, iccArgument.p1, iccArgument.p2, iccArgument.p3, 483da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal iccArgument.data, onCompleted); 484da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 485da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal break; 486da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 487da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal case EVENT_EXCHANGE_SIM_IO_DONE: 488da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal ar = (AsyncResult) msg.obj; 489da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request = (MainThreadRequest) ar.userObj; 490da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (ar.exception == null && ar.result != null) { 491da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.result = ar.result; 492da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } else { 493da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.result = new IccIoResult(0x6f, 0, (byte[])null); 494da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 495da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal synchronized (request) { 496da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal request.notifyAll(); 497da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 498da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal break; 499da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 5004d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan case CMD_SEND_ENVELOPE: 5014d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan request = (MainThreadRequest) msg.obj; 502c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal uiccCard = getUiccCardFromRequest(request); 503eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal if (uiccCard == null) { 504eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal loge("sendEnvelopeWithStatus: No UICC"); 505eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal request.result = new IccIoResult(0x6F, 0, (byte[])null); 506eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal synchronized (request) { 507eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal request.notifyAll(); 508eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 509eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } else { 510eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal onCompleted = obtainMessage(EVENT_SEND_ENVELOPE_DONE, request); 511eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal uiccCard.sendEnvelopeWithStatus((String)request.argument, onCompleted); 512eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 5134d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan break; 5144d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan 5154d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan case EVENT_SEND_ENVELOPE_DONE: 5164d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan ar = (AsyncResult) msg.obj; 5174d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan request = (MainThreadRequest) ar.userObj; 5189f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal if (ar.exception == null && ar.result != null) { 5199f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal request.result = ar.result; 5204d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan } else { 5219f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal request.result = new IccIoResult(0x6F, 0, (byte[])null); 5229f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal if (ar.result == null) { 5239f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal loge("sendEnvelopeWithStatus: Empty response"); 5249f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal } else if (ar.exception instanceof CommandException) { 5259f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal loge("sendEnvelopeWithStatus: CommandException: " + 5269f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal ar.exception); 5279f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal } else { 5289f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal loge("sendEnvelopeWithStatus: exception:" + ar.exception); 5299f9877db9261aac66cfabf85b745440cfd970b9cShishir Agrawal } 5304d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan } 5314d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan synchronized (request) { 5324d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan request.notifyAll(); 5334d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan } 5344d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan break; 5354d5e5c1b4742ed532fd2963e3d08b913ac565d16Derek Tan 536566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal case CMD_OPEN_CHANNEL: 537566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request = (MainThreadRequest) msg.obj; 538c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal uiccCard = getUiccCardFromRequest(request); 539d7454d3c7e1662e4aefebadf78b780ac5fe8127bAjay Nambi Pair<String, Integer> openChannelArgs = (Pair<String, Integer>) request.argument; 540eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal if (uiccCard == null) { 541eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal loge("iccOpenLogicalChannel: No UICC"); 542fc0492a59242a0d8f159d9d475aa0569f8de7c39Shishir Agrawal request.result = new IccOpenLogicalChannelResponse(-1, 543fc0492a59242a0d8f159d9d475aa0569f8de7c39Shishir Agrawal IccOpenLogicalChannelResponse.STATUS_MISSING_RESOURCE, null); 544eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal synchronized (request) { 545eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal request.notifyAll(); 546eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 547eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } else { 548eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal onCompleted = obtainMessage(EVENT_OPEN_CHANNEL_DONE, request); 549d7454d3c7e1662e4aefebadf78b780ac5fe8127bAjay Nambi uiccCard.iccOpenLogicalChannel(openChannelArgs.first, 550d7454d3c7e1662e4aefebadf78b780ac5fe8127bAjay Nambi openChannelArgs.second, onCompleted); 551eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 552566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal break; 553566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 554566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal case EVENT_OPEN_CHANNEL_DONE: 555566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal ar = (AsyncResult) msg.obj; 556566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request = (MainThreadRequest) ar.userObj; 557da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal IccOpenLogicalChannelResponse openChannelResp; 558566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (ar.exception == null && ar.result != null) { 559da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal int[] result = (int[]) ar.result; 560da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal int channelId = result[0]; 561da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal byte[] selectResponse = null; 562da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (result.length > 1) { 563da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal selectResponse = new byte[result.length - 1]; 564da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal for (int i = 1; i < result.length; ++i) { 565da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal selectResponse[i - 1] = (byte) result[i]; 566da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 567da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 568da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal openChannelResp = new IccOpenLogicalChannelResponse(channelId, 569527e8bf2bd43c5bfdb2ac7ea8cf05413c1faaeb5Shishir Agrawal IccOpenLogicalChannelResponse.STATUS_NO_ERROR, selectResponse); 570566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } else { 571566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (ar.result == null) { 572566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal loge("iccOpenLogicalChannel: Empty response"); 573566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 574da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (ar.exception != null) { 575da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal loge("iccOpenLogicalChannel: Exception: " + ar.exception); 576da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 577da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 578527e8bf2bd43c5bfdb2ac7ea8cf05413c1faaeb5Shishir Agrawal int errorCode = IccOpenLogicalChannelResponse.STATUS_UNKNOWN_ERROR; 579a754ba14f729744f3261113d5e355b86d5c846d3Junda Liu if (ar.exception instanceof CommandException) { 580a754ba14f729744f3261113d5e355b86d5c846d3Junda Liu CommandException.Error error = 581a754ba14f729744f3261113d5e355b86d5c846d3Junda Liu ((CommandException) (ar.exception)).getCommandError(); 582a754ba14f729744f3261113d5e355b86d5c846d3Junda Liu if (error == CommandException.Error.MISSING_RESOURCE) { 583527e8bf2bd43c5bfdb2ac7ea8cf05413c1faaeb5Shishir Agrawal errorCode = IccOpenLogicalChannelResponse.STATUS_MISSING_RESOURCE; 584a754ba14f729744f3261113d5e355b86d5c846d3Junda Liu } else if (error == CommandException.Error.NO_SUCH_ELEMENT) { 585527e8bf2bd43c5bfdb2ac7ea8cf05413c1faaeb5Shishir Agrawal errorCode = IccOpenLogicalChannelResponse.STATUS_NO_SUCH_ELEMENT; 586da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 587da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 588da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal openChannelResp = new IccOpenLogicalChannelResponse( 589da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal IccOpenLogicalChannelResponse.INVALID_CHANNEL, errorCode, null); 590566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 59182c8a46052629d1450320c116d14c7353bfe4ea1Shishir Agrawal request.result = openChannelResp; 592566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal synchronized (request) { 593566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request.notifyAll(); 594566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 595566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal break; 596566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 597566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal case CMD_CLOSE_CHANNEL: 598566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request = (MainThreadRequest) msg.obj; 599c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal uiccCard = getUiccCardFromRequest(request); 600eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal if (uiccCard == null) { 601eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal loge("iccCloseLogicalChannel: No UICC"); 602eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal request.result = new IccIoResult(0x6F, 0, (byte[])null); 603eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal synchronized (request) { 604eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal request.notifyAll(); 605eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 606eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } else { 607eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal onCompleted = obtainMessage(EVENT_CLOSE_CHANNEL_DONE, request); 608eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal uiccCard.iccCloseLogicalChannel((Integer) request.argument, onCompleted); 609eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 610566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal break; 611566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 612566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal case EVENT_CLOSE_CHANNEL_DONE: 613e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby handleNullReturnEvent(msg, "iccCloseLogicalChannel"); 614e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby break; 615e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 616e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby case CMD_NV_READ_ITEM: 617e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request = (MainThreadRequest) msg.obj; 618e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby onCompleted = obtainMessage(EVENT_NV_READ_ITEM_DONE, request); 619e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby mPhone.nvReadItem((Integer) request.argument, onCompleted); 620e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby break; 621e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 622e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby case EVENT_NV_READ_ITEM_DONE: 623566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal ar = (AsyncResult) msg.obj; 624566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request = (MainThreadRequest) ar.userObj; 625e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (ar.exception == null && ar.result != null) { 626e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request.result = ar.result; // String 627566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } else { 628e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request.result = ""; 629e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (ar.result == null) { 630e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby loge("nvReadItem: Empty response"); 631e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } else if (ar.exception instanceof CommandException) { 632e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby loge("nvReadItem: CommandException: " + 633e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby ar.exception); 634566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } else { 635e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby loge("nvReadItem: Unknown exception"); 636566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 637566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 638566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal synchronized (request) { 639566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal request.notifyAll(); 640566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 641566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal break; 642566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 643e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby case CMD_NV_WRITE_ITEM: 644e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request = (MainThreadRequest) msg.obj; 645e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby onCompleted = obtainMessage(EVENT_NV_WRITE_ITEM_DONE, request); 646e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby Pair<Integer, String> idValue = (Pair<Integer, String>) request.argument; 647e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby mPhone.nvWriteItem(idValue.first, idValue.second, onCompleted); 648e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby break; 649e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 650e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby case EVENT_NV_WRITE_ITEM_DONE: 651e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby handleNullReturnEvent(msg, "nvWriteItem"); 652e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby break; 653e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 654e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby case CMD_NV_WRITE_CDMA_PRL: 655e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request = (MainThreadRequest) msg.obj; 656e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby onCompleted = obtainMessage(EVENT_NV_WRITE_CDMA_PRL_DONE, request); 657e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby mPhone.nvWriteCdmaPrl((byte[]) request.argument, onCompleted); 658e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby break; 659e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 660e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby case EVENT_NV_WRITE_CDMA_PRL_DONE: 661e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby handleNullReturnEvent(msg, "nvWriteCdmaPrl"); 662e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby break; 663e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 664e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby case CMD_NV_RESET_CONFIG: 665e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request = (MainThreadRequest) msg.obj; 666e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby onCompleted = obtainMessage(EVENT_NV_RESET_CONFIG_DONE, request); 667e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby mPhone.nvResetConfig((Integer) request.argument, onCompleted); 668e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby break; 669e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 670e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby case EVENT_NV_RESET_CONFIG_DONE: 671e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby handleNullReturnEvent(msg, "nvResetConfig"); 672e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby break; 673e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 6747c27be317e8757948178815426d3a329c852b9eeJake Hamby case CMD_GET_PREFERRED_NETWORK_TYPE: 6757c27be317e8757948178815426d3a329c852b9eeJake Hamby request = (MainThreadRequest) msg.obj; 6767c27be317e8757948178815426d3a329c852b9eeJake Hamby onCompleted = obtainMessage(EVENT_GET_PREFERRED_NETWORK_TYPE_DONE, request); 67754788801de04c603a856596f4ae4377ab77a9821Stuart Scott getPhoneFromRequest(request).getPreferredNetworkType(onCompleted); 6787c27be317e8757948178815426d3a329c852b9eeJake Hamby break; 6797c27be317e8757948178815426d3a329c852b9eeJake Hamby 6807c27be317e8757948178815426d3a329c852b9eeJake Hamby case EVENT_GET_PREFERRED_NETWORK_TYPE_DONE: 6817c27be317e8757948178815426d3a329c852b9eeJake Hamby ar = (AsyncResult) msg.obj; 6827c27be317e8757948178815426d3a329c852b9eeJake Hamby request = (MainThreadRequest) ar.userObj; 6837c27be317e8757948178815426d3a329c852b9eeJake Hamby if (ar.exception == null && ar.result != null) { 6847c27be317e8757948178815426d3a329c852b9eeJake Hamby request.result = ar.result; // Integer 6857c27be317e8757948178815426d3a329c852b9eeJake Hamby } else { 686cfc2d354cfd2d421b2f3d6cb105ca2e0f763b802Sanket Padawe request.result = null; 6877c27be317e8757948178815426d3a329c852b9eeJake Hamby if (ar.result == null) { 6887c27be317e8757948178815426d3a329c852b9eeJake Hamby loge("getPreferredNetworkType: Empty response"); 6897c27be317e8757948178815426d3a329c852b9eeJake Hamby } else if (ar.exception instanceof CommandException) { 6907c27be317e8757948178815426d3a329c852b9eeJake Hamby loge("getPreferredNetworkType: CommandException: " + 6917c27be317e8757948178815426d3a329c852b9eeJake Hamby ar.exception); 6927c27be317e8757948178815426d3a329c852b9eeJake Hamby } else { 6937c27be317e8757948178815426d3a329c852b9eeJake Hamby loge("getPreferredNetworkType: Unknown exception"); 6947c27be317e8757948178815426d3a329c852b9eeJake Hamby } 6957c27be317e8757948178815426d3a329c852b9eeJake Hamby } 6967c27be317e8757948178815426d3a329c852b9eeJake Hamby synchronized (request) { 6977c27be317e8757948178815426d3a329c852b9eeJake Hamby request.notifyAll(); 6987c27be317e8757948178815426d3a329c852b9eeJake Hamby } 6997c27be317e8757948178815426d3a329c852b9eeJake Hamby break; 7007c27be317e8757948178815426d3a329c852b9eeJake Hamby 7017c27be317e8757948178815426d3a329c852b9eeJake Hamby case CMD_SET_PREFERRED_NETWORK_TYPE: 7027c27be317e8757948178815426d3a329c852b9eeJake Hamby request = (MainThreadRequest) msg.obj; 7037c27be317e8757948178815426d3a329c852b9eeJake Hamby onCompleted = obtainMessage(EVENT_SET_PREFERRED_NETWORK_TYPE_DONE, request); 7047c27be317e8757948178815426d3a329c852b9eeJake Hamby int networkType = (Integer) request.argument; 70554788801de04c603a856596f4ae4377ab77a9821Stuart Scott getPhoneFromRequest(request).setPreferredNetworkType(networkType, onCompleted); 7067c27be317e8757948178815426d3a329c852b9eeJake Hamby break; 7077c27be317e8757948178815426d3a329c852b9eeJake Hamby 7087c27be317e8757948178815426d3a329c852b9eeJake Hamby case EVENT_SET_PREFERRED_NETWORK_TYPE_DONE: 7097c27be317e8757948178815426d3a329c852b9eeJake Hamby handleNullReturnEvent(msg, "setPreferredNetworkType"); 7107c27be317e8757948178815426d3a329c852b9eeJake Hamby break; 7117c27be317e8757948178815426d3a329c852b9eeJake Hamby 7124bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu case CMD_INVOKE_OEM_RIL_REQUEST_RAW: 7134bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu request = (MainThreadRequest)msg.obj; 7144bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu onCompleted = obtainMessage(EVENT_INVOKE_OEM_RIL_REQUEST_RAW_DONE, request); 7154bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu mPhone.invokeOemRilRequestRaw((byte[])request.argument, onCompleted); 7164bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu break; 7174bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu 7184bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu case EVENT_INVOKE_OEM_RIL_REQUEST_RAW_DONE: 7194bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu ar = (AsyncResult)msg.obj; 7204bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu request = (MainThreadRequest)ar.userObj; 7214bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu request.result = ar; 7224bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu synchronized (request) { 7234bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu request.notifyAll(); 7244bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu } 7254bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu break; 7264bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu 72776d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal case CMD_SET_VOICEMAIL_NUMBER: 72876d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal request = (MainThreadRequest) msg.obj; 72976d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal onCompleted = obtainMessage(EVENT_SET_VOICEMAIL_NUMBER_DONE, request); 73076d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal Pair<String, String> tagNum = (Pair<String, String>) request.argument; 731584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott getPhoneFromRequest(request).setVoiceMailNumber(tagNum.first, tagNum.second, 732584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott onCompleted); 73376d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal break; 73476d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal 73576d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal case EVENT_SET_VOICEMAIL_NUMBER_DONE: 73676d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal handleNullReturnEvent(msg, "setVoicemailNumber"); 73776d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal break; 73876d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal 73954788801de04c603a856596f4ae4377ab77a9821Stuart Scott case CMD_SET_NETWORK_SELECTION_MODE_AUTOMATIC: 74054788801de04c603a856596f4ae4377ab77a9821Stuart Scott request = (MainThreadRequest) msg.obj; 74154788801de04c603a856596f4ae4377ab77a9821Stuart Scott onCompleted = obtainMessage(EVENT_SET_NETWORK_SELECTION_MODE_AUTOMATIC_DONE, 74254788801de04c603a856596f4ae4377ab77a9821Stuart Scott request); 74354788801de04c603a856596f4ae4377ab77a9821Stuart Scott getPhoneFromRequest(request).setNetworkSelectionModeAutomatic(onCompleted); 74454788801de04c603a856596f4ae4377ab77a9821Stuart Scott break; 74554788801de04c603a856596f4ae4377ab77a9821Stuart Scott 74654788801de04c603a856596f4ae4377ab77a9821Stuart Scott case EVENT_SET_NETWORK_SELECTION_MODE_AUTOMATIC_DONE: 74754788801de04c603a856596f4ae4377ab77a9821Stuart Scott handleNullReturnEvent(msg, "setNetworkSelectionModeAutomatic"); 74854788801de04c603a856596f4ae4377ab77a9821Stuart Scott break; 74954788801de04c603a856596f4ae4377ab77a9821Stuart Scott 750302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal case CMD_PERFORM_NETWORK_SCAN: 751302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal request = (MainThreadRequest) msg.obj; 752302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal onCompleted = obtainMessage(EVENT_PERFORM_NETWORK_SCAN_DONE, request); 753302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal getPhoneFromRequest(request).getAvailableNetworks(onCompleted); 754302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal break; 755302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal 756302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal case EVENT_PERFORM_NETWORK_SCAN_DONE: 757302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal ar = (AsyncResult) msg.obj; 758302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal request = (MainThreadRequest) ar.userObj; 759302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal CellNetworkScanResult cellScanResult; 760302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal if (ar.exception == null && ar.result != null) { 761302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal cellScanResult = new CellNetworkScanResult( 762302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal CellNetworkScanResult.STATUS_SUCCESS, 763302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal (List<OperatorInfo>) ar.result); 764302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } else { 765302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal if (ar.result == null) { 766302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal loge("getCellNetworkScanResults: Empty response"); 767302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } 768302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal if (ar.exception != null) { 769302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal loge("getCellNetworkScanResults: Exception: " + ar.exception); 770302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } 771302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal int errorCode = CellNetworkScanResult.STATUS_UNKNOWN_ERROR; 772302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal if (ar.exception instanceof CommandException) { 773302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal CommandException.Error error = 774302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal ((CommandException) (ar.exception)).getCommandError(); 775302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal if (error == CommandException.Error.RADIO_NOT_AVAILABLE) { 776302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal errorCode = CellNetworkScanResult.STATUS_RADIO_NOT_AVAILABLE; 777302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } else if (error == CommandException.Error.GENERIC_FAILURE) { 778302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal errorCode = CellNetworkScanResult.STATUS_RADIO_GENERIC_FAILURE; 779302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } 780302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } 781302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal cellScanResult = new CellNetworkScanResult(errorCode, null); 782302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } 783302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal request.result = cellScanResult; 784302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal synchronized (request) { 785302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal request.notifyAll(); 786302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } 787302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal break; 788302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal 789302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal case CMD_SET_NETWORK_SELECTION_MODE_MANUAL: 790302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal request = (MainThreadRequest) msg.obj; 79177ba317277863812508869705308373b42364e0aShishir Agrawal ManualNetworkSelectionArgument selArg = 79277ba317277863812508869705308373b42364e0aShishir Agrawal (ManualNetworkSelectionArgument) request.argument; 793302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal onCompleted = obtainMessage(EVENT_SET_NETWORK_SELECTION_MODE_MANUAL_DONE, 794302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal request); 79577ba317277863812508869705308373b42364e0aShishir Agrawal getPhoneFromRequest(request).selectNetworkManually(selArg.operatorInfo, 79677ba317277863812508869705308373b42364e0aShishir Agrawal selArg.persistSelection, onCompleted); 797302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal break; 798302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal 799302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal case EVENT_SET_NETWORK_SELECTION_MODE_MANUAL_DONE: 800302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal handleNullReturnEvent(msg, "setNetworkSelectionModeManual"); 801302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal break; 802302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal 8037fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham case CMD_GET_MODEM_ACTIVITY_INFO: 8047fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham request = (MainThreadRequest) msg.obj; 8057fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham onCompleted = obtainMessage(EVENT_GET_MODEM_ACTIVITY_INFO_DONE, request); 80661a60ad2e6944a80944898e636c2e9d9fd7b0e70Prerepa Viswanadham mPhone.getModemActivityInfo(onCompleted); 8077fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham break; 8087fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham 8097fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham case EVENT_GET_MODEM_ACTIVITY_INFO_DONE: 8107fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham ar = (AsyncResult) msg.obj; 8117fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham request = (MainThreadRequest) ar.userObj; 8127fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham if (ar.exception == null && ar.result != null) { 8137fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham request.result = ar.result; 8147fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham } else { 8157fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham if (ar.result == null) { 8167fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham loge("queryModemActivityInfo: Empty response"); 8177fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham } else if (ar.exception instanceof CommandException) { 8187fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham loge("queryModemActivityInfo: CommandException: " + 8197fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham ar.exception); 8207fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham } else { 8217fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham loge("queryModemActivityInfo: Unknown exception"); 8227fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham } 8237fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham } 824d476622ffe8a5371f7ae19a6eb3c0a0a665c3e7dAmit Mahajan // Result cannot be null. Return ModemActivityInfo with all fields set to 0. 825d476622ffe8a5371f7ae19a6eb3c0a0a665c3e7dAmit Mahajan if (request.result == null) { 826d476622ffe8a5371f7ae19a6eb3c0a0a665c3e7dAmit Mahajan request.result = new ModemActivityInfo(0, 0, 0, null, 0, 0); 827d476622ffe8a5371f7ae19a6eb3c0a0a665c3e7dAmit Mahajan } 8287fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham synchronized (request) { 8297fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham request.notifyAll(); 8307fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham } 8317fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham break; 8327fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham 8331a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang case CMD_SET_ALLOWED_CARRIERS: 8341a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request = (MainThreadRequest) msg.obj; 8351a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang onCompleted = obtainMessage(EVENT_SET_ALLOWED_CARRIERS_DONE, request); 8361a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang mPhone.setAllowedCarriers( 8371a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang (List<CarrierIdentifier>) request.argument, 8381a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang onCompleted); 8391a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang break; 8401a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang 8411a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang case EVENT_SET_ALLOWED_CARRIERS_DONE: 8421a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang ar = (AsyncResult) msg.obj; 8431a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request = (MainThreadRequest) ar.userObj; 8441a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang if (ar.exception == null && ar.result != null) { 8451a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request.result = ar.result; 8461a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } else { 8471a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang if (ar.result == null) { 8481a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang loge("setAllowedCarriers: Empty response"); 8491a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } else if (ar.exception instanceof CommandException) { 8501a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang loge("setAllowedCarriers: CommandException: " + 8511a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang ar.exception); 8521a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } else { 8531a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang loge("setAllowedCarriers: Unknown exception"); 8541a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 8551a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 8561a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang // Result cannot be null. Return -1 on error. 8571a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang if (request.result == null) { 8581a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request.result = new int[]{-1}; 8591a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 8601a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang synchronized (request) { 8611a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request.notifyAll(); 8621a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 8631a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang break; 8641a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang 8651a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang case CMD_GET_ALLOWED_CARRIERS: 8661a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request = (MainThreadRequest) msg.obj; 8671a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang onCompleted = obtainMessage(EVENT_GET_ALLOWED_CARRIERS_DONE, request); 8681a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang mPhone.getAllowedCarriers(onCompleted); 8691a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang break; 8701a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang 8711a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang case EVENT_GET_ALLOWED_CARRIERS_DONE: 8721a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang ar = (AsyncResult) msg.obj; 8731a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request = (MainThreadRequest) ar.userObj; 8741a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang if (ar.exception == null && ar.result != null) { 8751a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request.result = ar.result; 8761a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } else { 8771a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang if (ar.result == null) { 8781a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang loge("getAllowedCarriers: Empty response"); 8791a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } else if (ar.exception instanceof CommandException) { 8801a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang loge("getAllowedCarriers: CommandException: " + 8811a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang ar.exception); 8821a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } else { 8831a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang loge("getAllowedCarriers: Unknown exception"); 8841a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 8851a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 8861a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang // Result cannot be null. Return empty list of CarrierIdentifier. 8871a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang if (request.result == null) { 8881a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request.result = new ArrayList<CarrierIdentifier>(0); 8891a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 8901a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang synchronized (request) { 8911a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang request.notifyAll(); 8921a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 8931a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang break; 8941a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang 895b30140510ae7209034135809738a20f9e6f26c5fNathan Harold case EVENT_GET_FORBIDDEN_PLMNS_DONE: 896b30140510ae7209034135809738a20f9e6f26c5fNathan Harold ar = (AsyncResult) msg.obj; 897b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request = (MainThreadRequest) ar.userObj; 898b30140510ae7209034135809738a20f9e6f26c5fNathan Harold if (ar.exception == null && ar.result != null) { 899b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request.result = ar.result; 900b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } else { 901b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request.result = new IllegalArgumentException( 902b30140510ae7209034135809738a20f9e6f26c5fNathan Harold "Failed to retrieve Forbidden Plmns"); 903b30140510ae7209034135809738a20f9e6f26c5fNathan Harold if (ar.result == null) { 904b30140510ae7209034135809738a20f9e6f26c5fNathan Harold loge("getForbiddenPlmns: Empty response"); 905b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } else { 906b30140510ae7209034135809738a20f9e6f26c5fNathan Harold loge("getForbiddenPlmns: Unknown exception"); 907b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 908b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 909b30140510ae7209034135809738a20f9e6f26c5fNathan Harold synchronized (request) { 910b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request.notifyAll(); 911b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 912b30140510ae7209034135809738a20f9e6f26c5fNathan Harold break; 913b30140510ae7209034135809738a20f9e6f26c5fNathan Harold 914b30140510ae7209034135809738a20f9e6f26c5fNathan Harold case CMD_GET_FORBIDDEN_PLMNS: 915b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request = (MainThreadRequest) msg.obj; 916b30140510ae7209034135809738a20f9e6f26c5fNathan Harold uiccCard = getUiccCardFromRequest(request); 917b30140510ae7209034135809738a20f9e6f26c5fNathan Harold if (uiccCard == null) { 918b30140510ae7209034135809738a20f9e6f26c5fNathan Harold loge("getForbiddenPlmns() UiccCard is null"); 919b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request.result = new IllegalArgumentException( 920b30140510ae7209034135809738a20f9e6f26c5fNathan Harold "getForbiddenPlmns() UiccCard is null"); 921b30140510ae7209034135809738a20f9e6f26c5fNathan Harold synchronized (request) { 922b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request.notifyAll(); 923b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 924b30140510ae7209034135809738a20f9e6f26c5fNathan Harold break; 925b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 926b30140510ae7209034135809738a20f9e6f26c5fNathan Harold Integer appType = (Integer) request.argument; 927b30140510ae7209034135809738a20f9e6f26c5fNathan Harold UiccCardApplication uiccApp = uiccCard.getApplicationByType(appType); 928b30140510ae7209034135809738a20f9e6f26c5fNathan Harold if (uiccApp == null) { 929b30140510ae7209034135809738a20f9e6f26c5fNathan Harold loge("getForbiddenPlmns() no app with specified type -- " 930b30140510ae7209034135809738a20f9e6f26c5fNathan Harold + appType); 931b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request.result = new IllegalArgumentException("Failed to get UICC App"); 932b30140510ae7209034135809738a20f9e6f26c5fNathan Harold synchronized (request) { 933b30140510ae7209034135809738a20f9e6f26c5fNathan Harold request.notifyAll(); 934b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 935b30140510ae7209034135809738a20f9e6f26c5fNathan Harold break; 936b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } else { 937b30140510ae7209034135809738a20f9e6f26c5fNathan Harold if (DBG) logv("getForbiddenPlmns() found app " + uiccApp.getAid() 938b30140510ae7209034135809738a20f9e6f26c5fNathan Harold + " specified type -- " + appType); 939b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 940b30140510ae7209034135809738a20f9e6f26c5fNathan Harold onCompleted = obtainMessage(EVENT_GET_FORBIDDEN_PLMNS_DONE, request); 941b30140510ae7209034135809738a20f9e6f26c5fNathan Harold ((SIMRecords) uiccApp.getIccRecords()).getForbiddenPlmns( 942b30140510ae7209034135809738a20f9e6f26c5fNathan Harold onCompleted); 943b30140510ae7209034135809738a20f9e6f26c5fNathan Harold break; 944b30140510ae7209034135809738a20f9e6f26c5fNathan Harold 9457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 9467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what); 9477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 9487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 950e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 951e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby private void handleNullReturnEvent(Message msg, String command) { 952e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby AsyncResult ar = (AsyncResult) msg.obj; 953e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby MainThreadRequest request = (MainThreadRequest) ar.userObj; 954e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (ar.exception == null) { 955e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request.result = true; 956e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } else { 957e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request.result = false; 958e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (ar.exception instanceof CommandException) { 959e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby loge(command + ": CommandException: " + ar.exception); 960e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } else { 961e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby loge(command + ": Unknown exception"); 962e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } 963e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } 964e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby synchronized (request) { 965e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby request.notifyAll(); 966e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } 967e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } 9687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 9707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 9717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Posts the specified command to be executed on the main thread, 9727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * waits for the request to complete, and returns the result. 9737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @see #sendRequestAsync 9747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 9757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Object sendRequest(int command, Object argument) { 97656e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe return sendRequest(command, argument, SubscriptionManager.INVALID_SUBSCRIPTION_ID); 97736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 97836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 97936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville /** 98036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * Posts the specified command to be executed on the main thread, 98136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * waits for the request to complete, and returns the result. 98236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * @see #sendRequestAsync 98336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 98476d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal private Object sendRequest(int command, Object argument, Integer subId) { 9857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (Looper.myLooper() == mMainThreadHandler.getLooper()) { 9867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon throw new RuntimeException("This method will deadlock if called from the main thread."); 9877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 98976d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal MainThreadRequest request = new MainThreadRequest(argument, subId); 9907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message msg = mMainThreadHandler.obtainMessage(command, request); 9917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon msg.sendToTarget(); 9927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 9937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Wait for the request to complete 9947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (request) { 9957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon while (request.result == null) { 9967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 9977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon request.wait(); 9987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (InterruptedException e) { 9997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Do nothing, go back and wait until the request is complete 10007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return request.result; 10047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 10077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Asynchronous ("fire and forget") version of sendRequest(): 10087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Posts the specified command to be executed on the main thread, and 10097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * returns immediately. 10107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @see #sendRequest 10117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 10127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void sendRequestAsync(int command) { 10137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mMainThreadHandler.sendEmptyMessage(command); 10147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1017bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal * Same as {@link #sendRequestAsync(int)} except it takes an argument. 1018bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal * @see {@link #sendRequest(int,Object)} 1019bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal */ 1020bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal private void sendRequestAsync(int command, Object argument) { 1021bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal MainThreadRequest request = new MainThreadRequest(argument); 1022bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal Message msg = mMainThreadHandler.obtainMessage(command, request); 1023bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal msg.sendToTarget(); 1024bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal } 1025bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal 1026bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal /** 10277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Initialize the singleton PhoneInterfaceManager instance. 10287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This is only done once, at startup, from PhoneApp.onCreate(). 10297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1030194161ed3aef6bdeeecd6153403269bbd01314a5Sailesh Nepal /* package */ static PhoneInterfaceManager init(PhoneGlobals app, Phone phone) { 10317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (PhoneInterfaceManager.class) { 10327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (sInstance == null) { 1033194161ed3aef6bdeeecd6153403269bbd01314a5Sailesh Nepal sInstance = new PhoneInterfaceManager(app, phone); 10347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 10357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.wtf(LOG_TAG, "init() called multiple times! sInstance = " + sInstance); 10367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return sInstance; 10387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** Private constructor; @see init() */ 1042194161ed3aef6bdeeecd6153403269bbd01314a5Sailesh Nepal private PhoneInterfaceManager(PhoneGlobals app, Phone phone) { 10437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApp = app; 10447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPhone = phone; 10457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCM = PhoneGlobals.getInstance().mCM; 1046981d85874294656a51683ae6ecc6ba312d3635ceStuart Scott mUserManager = (UserManager) app.getSystemService(Context.USER_SERVICE); 10477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mAppOps = (AppOpsManager)app.getSystemService(Context.APP_OPS_SERVICE); 10487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mMainThreadHandler = new MainThreadHandler(); 1049df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee mTelephonySharedPreferences = 105097ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan PreferenceManager.getDefaultSharedPreferences(mPhone.getContext()); 1051ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville mSubscriptionController = SubscriptionController.getInstance(); 10523ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville 10537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon publish(); 10547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void publish() { 10577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("publish: " + this); 10587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ServiceManager.addService("phone", this); 10607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1062584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott private Phone getPhoneFromRequest(MainThreadRequest request) { 106356e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe return (request.subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) 106456e75a3b2e7b49e1cc2c4f8670405fd9b896471dSanket Padawe ? mPhone : getPhone(request.subId); 1065584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott } 1066584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott 1067c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal private UiccCard getUiccCardFromRequest(MainThreadRequest request) { 1068c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal Phone phone = getPhoneFromRequest(request); 1069c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal return phone == null ? null : 1070c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal UiccController.getInstance().getUiccCard(phone.getPhoneId()); 1071c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal } 1072c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal 107336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville // returns phone associated with the subId. 1074b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville private Phone getPhone(int subId) { 1075ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville return PhoneFactory.getPhone(mSubscriptionController.getPhoneId(subId)); 107636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 10777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 10787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Implementation of the ITelephony interface. 10797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 10807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void dial(String number) { 1082add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville dialForSubscriber(getPreferredVoiceSubscription(), number); 108336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 108436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1085b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public void dialForSubscriber(int subId, String number) { 10867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("dial: " + number); 10877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // No permission check needed here: This is just a wrapper around the 10887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // ACTION_DIAL intent, which is available to any app since it puts up 10897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the UI before it does anything. 10907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String url = createTelUrl(number); 10927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (url == null) { 10937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 10947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // PENDING: should we just silently fail if phone is offhook or ringing? 109736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville PhoneConstants.State state = mCM.getState(subId); 10987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (state != PhoneConstants.State.OFFHOOK && state != PhoneConstants.State.RINGING) { 10997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 11007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 11017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApp.startActivity(intent); 11027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void call(String callingPackage, String number) { 1106add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville callForSubscriber(getPreferredVoiceSubscription(), callingPackage, number); 110736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 110836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1109b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public void callForSubscriber(int subId, String callingPackage, String number) { 11107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("call: " + number); 11117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // This is just a wrapper around the ACTION_CALL intent, but we still 11137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // need to do a permission check since we're calling startActivity() 11147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // from the context of the phone app. 11157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceCallPermission(); 11167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mAppOps.noteOp(AppOpsManager.OP_CALL_PHONE, Binder.getCallingUid(), callingPackage) 11187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon != AppOpsManager.MODE_ALLOWED) { 11197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 11207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String url = createTelUrl(number); 11237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (url == null) { 11247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 11257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11270887461919173015886ea69ef6c6afbe20ebf1dcWink Saville boolean isValid = false; 11281c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath final List<SubscriptionInfo> slist = getActiveSubscriptionInfoList(); 11293ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville if (slist != null) { 11303ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville for (SubscriptionInfo subInfoRecord : slist) { 11313ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville if (subInfoRecord.getSubscriptionId() == subId) { 11323ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville isValid = true; 11333ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville break; 11343ab207e3711ebd717f9cfe7412018c51ae1c8131Wink Saville } 11350887461919173015886ea69ef6c6afbe20ebf1dcWink Saville } 11360887461919173015886ea69ef6c6afbe20ebf1dcWink Saville } 11370887461919173015886ea69ef6c6afbe20ebf1dcWink Saville if (isValid == false) { 11380887461919173015886ea69ef6c6afbe20ebf1dcWink Saville return; 11390887461919173015886ea69ef6c6afbe20ebf1dcWink Saville } 11400887461919173015886ea69ef6c6afbe20ebf1dcWink Saville 11417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url)); 114236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville intent.putExtra(SUBSCRIPTION_KEY, subId); 11437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 11447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApp.startActivity(intent); 11457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 11487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * End a call based on call state 11497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @return true is a call was ended 11507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 11517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean endCall() { 1152add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville return endCallForSubscriber(getDefaultSubscription()); 115336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 115436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 115536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville /** 115636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * End a call based on the call state of the subId 115736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * @return true is a call was ended 115836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 1159b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public boolean endCallForSubscriber(int subId) { 11607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceCallPermission(); 1161584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott return (Boolean) sendRequest(CMD_END_CALL, null, new Integer(subId)); 11627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void answerRingingCall() { 1165add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville answerRingingCallForSubscriber(getDefaultSubscription()); 116636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 116736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1168b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public void answerRingingCallForSubscriber(int subId) { 11697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("answerRingingCall..."); 11707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: there should eventually be a separate "ANSWER_PHONE" permission, 11717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // but that can probably wait till the big TelephonyManager API overhaul. 11727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // For now, protect this call with the MODIFY_PHONE_STATE permission. 11737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 1174584921cffac3dc8e7fa3bdeb5a87d764cc0cd77dStuart Scott sendRequest(CMD_ANSWER_RINGING_CALL, null, new Integer(subId)); 11757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 11787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Make the actual telephony calls to implement answerRingingCall(). 11797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This should only be called from the main thread of the Phone app. 11807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @see #answerRingingCall 11817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 11827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * TODO: it would be nice to return true if we answered the call, or 11837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * false if there wasn't actually a ringing incoming call, or some 11847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * other error occurred. (In other words, pass back the return value 11857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * from PhoneUtils.answerCall() or PhoneUtils.answerAndEndActive().) 11867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * But that would require calling this method via sendRequest() rather 11877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * than sendRequestAsync(), and right now we don't actually *need* that 11887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * return value, so let's just return void for now. 11897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1190b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville private void answerRingingCallInternal(int subId) { 11910887461919173015886ea69ef6c6afbe20ebf1dcWink Saville final boolean hasRingingCall = !getPhone(subId).getRingingCall().isIdle(); 11927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (hasRingingCall) { 11930887461919173015886ea69ef6c6afbe20ebf1dcWink Saville final boolean hasActiveCall = !getPhone(subId).getForegroundCall().isIdle(); 11940887461919173015886ea69ef6c6afbe20ebf1dcWink Saville final boolean hasHoldingCall = !getPhone(subId).getBackgroundCall().isIdle(); 11957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (hasActiveCall && hasHoldingCall) { 11967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Both lines are in use! 11977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: provide a flag to let the caller specify what 11987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // policy to use if both lines are in use. (The current 11997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // behavior is hardwired to "answer incoming, end ongoing", 12007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // which is how the CALL button is specced to behave.) 12017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneUtils.answerAndEndActive(mCM, mCM.getFirstActiveRingingCall()); 12027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 12037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 12047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // answerCall() will automatically hold the current active 12057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // call, if there is one. 12067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneUtils.answerCall(mCM.getFirstActiveRingingCall()); 12077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 12087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 12107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // No call was ringing. 12117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 12127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 12165422a8deb513e4466ec6cc1e640895a6b536fee0Santos Cordon * This method is no longer used and can be removed once TelephonyManager stops referring to it. 12177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 12185422a8deb513e4466ec6cc1e640895a6b536fee0Santos Cordon public void silenceRinger() { 12195422a8deb513e4466ec6cc1e640895a6b536fee0Santos Cordon Log.e(LOG_TAG, "silenseRinger not supported"); 12207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 122236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 122336b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public boolean isOffhook(String callingPackage) { 122436b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return isOffhookForSubscriber(getDefaultSubscription(), callingPackage); 122536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 122636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 122736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 122836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public boolean isOffhookForSubscriber(int subId, String callingPackage) { 122936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "isOffhookForSubscriber")) { 123036b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return false; 123136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 123236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt 1233356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1234356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1235356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return (phone.getState() == PhoneConstants.State.OFFHOOK); 1236356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1237356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1238356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 12397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 124136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 124236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public boolean isRinging(String callingPackage) { 124336b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return (isRingingForSubscriber(getDefaultSubscription(), callingPackage)); 124436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 124536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 124636b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 124736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public boolean isRingingForSubscriber(int subId, String callingPackage) { 124836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "isRingingForSubscriber")) { 124936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return false; 125036b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 125136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt 1252356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1253356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1254356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return (phone.getState() == PhoneConstants.State.RINGING); 1255356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1256356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1257356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 12587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 126036b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 126136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public boolean isIdle(String callingPackage) { 126236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return isIdleForSubscriber(getDefaultSubscription(), callingPackage); 126336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 126436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 126536b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 126636b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public boolean isIdleForSubscriber(int subId, String callingPackage) { 126736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "isIdleForSubscriber")) { 126836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return false; 126936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 127036b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt 1271356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1272356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1273356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return (phone.getState() == PhoneConstants.State.IDLE); 1274356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1275356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1276356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 12777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean supplyPin(String pin) { 1280add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville return supplyPinForSubscriber(getDefaultSubscription(), pin); 128136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 128236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1283b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public boolean supplyPinForSubscriber(int subId, String pin) { 1284add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville int [] resultArray = supplyPinReportResultForSubscriber(subId, pin); 12859de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville return (resultArray[0] == PhoneConstants.PIN_RESULT_SUCCESS) ? true : false; 12869de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } 12879de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville 12889de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville public boolean supplyPuk(String puk, String pin) { 1289add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville return supplyPukForSubscriber(getDefaultSubscription(), puk, pin); 129036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 129136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1292b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public boolean supplyPukForSubscriber(int subId, String puk, String pin) { 1293add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville int [] resultArray = supplyPukReportResultForSubscriber(subId, puk, pin); 12949de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville return (resultArray[0] == PhoneConstants.PIN_RESULT_SUCCESS) ? true : false; 12959de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } 12969de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville 12979de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville /** {@hide} */ 12989de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville public int[] supplyPinReportResult(String pin) { 1299add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville return supplyPinReportResultForSubscriber(getDefaultSubscription(), pin); 130036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 130136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1302b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public int[] supplyPinReportResultForSubscriber(int subId, String pin) { 13037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 130436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville final UnlockSim checkSimPin = new UnlockSim(getPhone(subId).getIccCard()); 13057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon checkSimPin.start(); 13067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return checkSimPin.unlockSim(null, pin); 13077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13099de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville /** {@hide} */ 13109de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville public int[] supplyPukReportResult(String puk, String pin) { 1311add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville return supplyPukReportResultForSubscriber(getDefaultSubscription(), puk, pin); 131236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 131336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1314b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public int[] supplyPukReportResultForSubscriber(int subId, String puk, String pin) { 13157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 131636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville final UnlockSim checkSimPuk = new UnlockSim(getPhone(subId).getIccCard()); 13177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon checkSimPuk.start(); 13187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return checkSimPuk.unlockSim(puk, pin); 13197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 13229de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville * Helper thread to turn async call to SimCard#supplyPin into 13237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * a synchronous one. 13247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 13257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static class UnlockSim extends Thread { 13267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final IccCard mSimCard; 13287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private boolean mDone = false; 13309de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville private int mResult = PhoneConstants.PIN_GENERAL_FAILURE; 13319de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville private int mRetryCount = -1; 13327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // For replies from SimCard interface 13347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Handler mHandler; 13357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // For async handler to identify request type 13377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int SUPPLY_PIN_COMPLETE = 100; 13387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public UnlockSim(IccCard simCard) { 13407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSimCard = simCard; 13417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 13447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 13457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Looper.prepare(); 13467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (UnlockSim.this) { 13477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mHandler = new Handler() { 13487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 13497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void handleMessage(Message msg) { 13507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar = (AsyncResult) msg.obj; 13517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (msg.what) { 13527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SUPPLY_PIN_COMPLETE: 13537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "SUPPLY_PIN_COMPLETE"); 13547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (UnlockSim.this) { 13559de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville mRetryCount = msg.arg1; 13569de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville if (ar.exception != null) { 13579de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville if (ar.exception instanceof CommandException && 13589de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville ((CommandException)(ar.exception)).getCommandError() 13599de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville == CommandException.Error.PASSWORD_INCORRECT) { 13609de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville mResult = PhoneConstants.PIN_PASSWORD_INCORRECT; 13619de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } else { 13629de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville mResult = PhoneConstants.PIN_GENERAL_FAILURE; 13639de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } 13649de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } else { 13659de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville mResult = PhoneConstants.PIN_RESULT_SUCCESS; 13669de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } 13677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mDone = true; 13687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon UnlockSim.this.notifyAll(); 13697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 13717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 13747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon UnlockSim.this.notifyAll(); 13757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Looper.loop(); 13777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* 13807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Use PIN or PUK to unlock SIM card 13817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 13827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * If PUK is null, unlock SIM card with PIN 13837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 13847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * If PUK is not null, unlock SIM card with PUK and set PIN code 13857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 13869de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville synchronized int[] unlockSim(String puk, String pin) { 13877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon while (mHandler == null) { 13897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 13907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon wait(); 13917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (InterruptedException e) { 13927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Thread.currentThread().interrupt(); 13937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message callback = Message.obtain(mHandler, SUPPLY_PIN_COMPLETE); 13967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (puk == null) { 13987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSimCard.supplyPin(pin, callback); 13997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 14007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSimCard.supplyPuk(puk, pin, callback); 14017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon while (!mDone) { 14047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 14057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "wait for done"); 14067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon wait(); 14077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (InterruptedException e) { 14087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Restore the interrupted status 14097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Thread.currentThread().interrupt(); 14107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "done"); 14139de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville int[] resultArray = new int[2]; 14149de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville resultArray[0] = mResult; 14159de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville resultArray[1] = mRetryCount; 14169de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville return resultArray; 14177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void updateServiceLocation() { 1421add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville updateServiceLocationForSubscriber(getDefaultSubscription()); 142236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 142336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 142436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1425b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public void updateServiceLocationForSubscriber(int subId) { 14267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // No permission check needed here: this call is harmless, and it's 14277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // needed for the ServiceState.requestStateUpdate() call (which is 14287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // already intentionally exposed to 3rd parties.) 1429356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1430356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1431356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe phone.updateServiceLocation(); 1432356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 14337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 143536b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 143636b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public boolean isRadioOn(String callingPackage) { 143736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return isRadioOnForSubscriber(getDefaultSubscription(), callingPackage); 143836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 143936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 144036b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 144136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public boolean isRadioOnForSubscriber(int subId, String callingPackage) { 144236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "isRadioOnForSubscriber")) { 144336b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return false; 144436b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 144536b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return isRadioOnForSubscriber(subId); 144636b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 144736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt 144836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt private boolean isRadioOnForSubscriber(int subId) { 1449356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1450356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1451356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF; 1452356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1453356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1454356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 14557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void toggleRadioOnOff() { 1458add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville toggleRadioOnOffForSubscriber(getDefaultSubscription()); 145936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 146036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 146136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1462b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public void toggleRadioOnOffForSubscriber(int subId) { 14637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 1464356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1465356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1466356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe phone.setRadioPower(!isRadioOnForSubscriber(subId)); 1467356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 14687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 146936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 14707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean setRadio(boolean turnOn) { 1471add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville return setRadioForSubscriber(getDefaultSubscription(), turnOn); 147236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 147336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1474b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public boolean setRadioForSubscriber(int subId, boolean turnOn) { 14757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 1476356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1477356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone == null) { 1478356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1479356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 1480356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if ((phone.getServiceState().getState() != 148136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville ServiceState.STATE_POWER_OFF) != turnOn) { 1482add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville toggleRadioOnOffForSubscriber(subId); 14837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 14857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 148636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 14871fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla public boolean needMobileRadioShutdown() { 14881fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla /* 14891fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla * If any of the Radios are available, it will need to be 14901fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla * shutdown. So return true if any Radio is available. 14911fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla */ 14921fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla for (int i = 0; i < TelephonyManager.getDefault().getPhoneCount(); i++) { 14931fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla Phone phone = PhoneFactory.getPhone(i); 14941fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla if (phone != null && phone.isRadioAvailable()) return true; 14951fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla } 14961fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla logv(TelephonyManager.getDefault().getPhoneCount() + " Phones are shutdown."); 14971fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla return false; 14981fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla } 14991fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla 15001fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla public void shutdownMobileRadios() { 15011fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla for (int i = 0; i < TelephonyManager.getDefault().getPhoneCount(); i++) { 15021fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla logv("Shutting down Phone " + i); 15031fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla shutdownRadioUsingPhoneId(i); 15041fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla } 15051fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla } 15061fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla 15071fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla private void shutdownRadioUsingPhoneId(int phoneId) { 15081fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla enforceModifyPermission(); 15091fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla Phone phone = PhoneFactory.getPhone(phoneId); 15101fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla if (phone != null && phone.isRadioAvailable()) { 15111fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla phone.shutdownRadio(); 15121fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla } 15131fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla } 15141fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla 15157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean setRadioPower(boolean turnOn) { 1516b4e161682ad9267e7a7be89b895f723529973f66Jack Yu enforceModifyPermission(); 15179ae2a0674f3215c36d6d5570755679f4f33cf0b6Wei Liu final Phone defaultPhone = PhoneFactory.getDefaultPhone(); 15189ae2a0674f3215c36d6d5570755679f4f33cf0b6Wei Liu if (defaultPhone != null) { 15199ae2a0674f3215c36d6d5570755679f4f33cf0b6Wei Liu defaultPhone.setRadioPower(turnOn); 15209ae2a0674f3215c36d6d5570755679f4f33cf0b6Wei Liu return true; 15219ae2a0674f3215c36d6d5570755679f4f33cf0b6Wei Liu } else { 15229ae2a0674f3215c36d6d5570755679f4f33cf0b6Wei Liu loge("There's no default phone."); 15239ae2a0674f3215c36d6d5570755679f4f33cf0b6Wei Liu return false; 15249ae2a0674f3215c36d6d5570755679f4f33cf0b6Wei Liu } 152536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 152636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1527b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public boolean setRadioPowerForSubscriber(int subId, boolean turnOn) { 15287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 1529356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1530356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1531356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe phone.setRadioPower(turnOn); 1532356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return true; 1533356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1534356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1535356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 15367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 153836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville // FIXME: subId version needed 1539356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 15407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean enableDataConnectivity() { 15417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 1542ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville int subId = mSubscriptionController.getDefaultDataSubId(); 1543356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1544356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1545356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe phone.setDataEnabled(true); 1546356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return true; 1547356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1548356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1549356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 15507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 155236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville // FIXME: subId version needed 1553356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 15547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean disableDataConnectivity() { 15557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 1556ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville int subId = mSubscriptionController.getDefaultDataSubId(); 1557356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1558356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1559356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe phone.setDataEnabled(false); 1560356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return true; 1561356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1562356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1563356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 15647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 156636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville // FIXME: subId version needed 1567356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 15687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean isDataConnectivityPossible() { 1569ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville int subId = mSubscriptionController.getDefaultDataSubId(); 1570356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1571356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1572356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.isDataConnectivityPossible(); 1573356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1574356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1575356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 15767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 15787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean handlePinMmi(String dialString) { 1579add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville return handlePinMmiForSubscriber(getDefaultSubscription(), dialString); 158036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 158136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1582ae03a6b732b0fc020ae4732fe6fa9f58548aa109pkanwar public void handleUssdRequest(int subId, String ussdRequest, ResultReceiver wrappedCallback) { 158332d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar enforceCallPermission(); 158432d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar if (!SubscriptionManager.isValidSubscriptionId(subId)) { 158532d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar return; 158632d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar } 158732d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar Pair<String, ResultReceiver> ussdObject = new Pair(ussdRequest, wrappedCallback); 158832d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar sendRequest(CMD_HANDLE_USSD_REQUEST, ussdObject, subId); 158932d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar }; 159032d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar 159132d516d1996012a11298e6f96b2edbf88c7a38a3pkanwar 1592b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public boolean handlePinMmiForSubscriber(int subId, String dialString) { 15937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon enforceModifyPermission(); 1594356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (!SubscriptionManager.isValidSubscriptionId(subId)) { 1595356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 1596356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 159736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville return (Boolean) sendRequest(CMD_HANDLE_PIN_MMI, dialString, subId); 15987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 16007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int getCallState() { 1601a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return getCallStateForSlot(getSlotForDefaultSubscription()); 160236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 160336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 160413bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public int getCallStateForSlot(int slotIndex) { 160513bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe Phone phone = PhoneFactory.getPhone(slotIndex); 1606a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return phone == null ? TelephonyManager.CALL_STATE_IDLE : 1607a667c150aedea6ca49b805da19a2fbb3b1e75999Nathan Harold PhoneConstantConversions.convertCallState(phone.getState()); 16087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 16097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1610356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 16117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int getDataState() { 1612ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville Phone phone = getPhone(mSubscriptionController.getDefaultDataSubId()); 1613356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1614a667c150aedea6ca49b805da19a2fbb3b1e75999Nathan Harold return PhoneConstantConversions.convertDataState(phone.getDataConnectionState()); 1615356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1616a667c150aedea6ca49b805da19a2fbb3b1e75999Nathan Harold return PhoneConstantConversions.convertDataState(PhoneConstants.DataState.DISCONNECTED); 1617356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 16187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 16197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1620356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 16217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int getDataActivity() { 1622ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville Phone phone = getPhone(mSubscriptionController.getDefaultDataSubId()); 1623356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1624356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return DefaultPhoneNotifier.convertDataActivityState(phone.getDataActivityState()); 1625356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1626356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return TelephonyManager.DATA_ACTIVITY_NONE; 1627356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 16287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 16297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 16307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 163164fad26f22ed5d382533b3c07271cd1c7b81dd0bSvetoslav public Bundle getCellLocation(String callingPackage) { 1632602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov enforceFineOrCoarseLocationPermission("getCellLocation"); 1633602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 1634602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // OP_COARSE_LOCATION controls both fine and coarse location. 1635602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (mAppOps.noteOp(AppOpsManager.OP_COARSE_LOCATION, Binder.getCallingUid(), 1636602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov callingPackage) != AppOpsManager.MODE_ALLOWED) { 1637602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov log("getCellLocation: returning null; mode != allowed"); 163864fad26f22ed5d382533b3c07271cd1c7b81dd0bSvetoslav return null; 16397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 16407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1641602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (checkIfCallerIsSelfOrForegroundUser() || 1642602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov checkCallerInteractAcrossUsersFull()) { 1643602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) log("getCellLocation: is active user"); 1644602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov Bundle data = new Bundle(); 1645602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov Phone phone = getPhone(mSubscriptionController.getDefaultDataSubId()); 1646602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (phone == null) { 1647602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov return null; 1648602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 1649602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 1650602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov WorkSource workSource = getWorkSource(null, Binder.getCallingUid()); 1651602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov phone.getCellLocation(workSource).fillInNotifierBundle(data); 1652602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov return data; 1653602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } else { 1654602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov log("getCellLocation: suppress non-active user"); 16557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return null; 16567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1657602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 16587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1659602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov private void enforceFineOrCoarseLocationPermission(String message) { 1660602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov try { 1661602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov mApp.enforceCallingOrSelfPermission( 1662602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov android.Manifest.permission.ACCESS_FINE_LOCATION, null); 1663602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } catch (SecurityException e) { 1664602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // If we have ACCESS_FINE_LOCATION permission, skip the check for ACCESS_COARSE_LOCATION 1665602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // A failure should throw the SecurityException from ACCESS_COARSE_LOCATION since this 1666602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // is the weaker precondition 1667602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov mApp.enforceCallingOrSelfPermission( 1668602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov android.Manifest.permission.ACCESS_COARSE_LOCATION, message); 1669602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 167064fad26f22ed5d382533b3c07271cd1c7b81dd0bSvetoslav } 167164fad26f22ed5d382533b3c07271cd1c7b81dd0bSvetoslav 1672602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 16737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 16747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void enableLocationUpdates() { 1675add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville enableLocationUpdatesForSubscriber(getDefaultSubscription()); 167636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 167736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1678356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 1679b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public void enableLocationUpdatesForSubscriber(int subId) { 16807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApp.enforceCallingOrSelfPermission( 16817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon android.Manifest.permission.CONTROL_LOCATION_UPDATES, null); 1682356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1683356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1684356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe phone.enableLocationUpdates(); 1685356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 16867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 16877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 16887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 16897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void disableLocationUpdates() { 1690add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville disableLocationUpdatesForSubscriber(getDefaultSubscription()); 169136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 169236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1693356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 1694b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public void disableLocationUpdatesForSubscriber(int subId) { 16957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApp.enforceCallingOrSelfPermission( 16967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon android.Manifest.permission.CONTROL_LOCATION_UPDATES, null); 1697356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1698356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1699356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe phone.disableLocationUpdates(); 1700356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 17017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 17027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 17037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 17047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @SuppressWarnings("unchecked") 17057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public List<NeighboringCellInfo> getNeighboringCellInfo(String callingPackage) { 1706602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov enforceFineOrCoarseLocationPermission("getNeighboringCellInfo"); 1707602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 1708602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // OP_COARSE_LOCATION controls both fine and coarse location. 1709602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (mAppOps.noteOp(AppOpsManager.OP_COARSE_LOCATION, Binder.getCallingUid(), 1710602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov callingPackage) != AppOpsManager.MODE_ALLOWED) { 171164fad26f22ed5d382533b3c07271cd1c7b81dd0bSvetoslav return null; 17127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 17137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 17147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mAppOps.noteOp(AppOpsManager.OP_NEIGHBORING_CELLS, Binder.getCallingUid(), 17157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon callingPackage) != AppOpsManager.MODE_ALLOWED) { 17167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return null; 17177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 171864fad26f22ed5d382533b3c07271cd1c7b81dd0bSvetoslav 1719602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (checkIfCallerIsSelfOrForegroundUser() || 1720602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov checkCallerInteractAcrossUsersFull()) { 1721602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) log("getNeighboringCellInfo: is active user"); 17227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1723602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov ArrayList<NeighboringCellInfo> cells = null; 17247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1725602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov WorkSource workSource = getWorkSource(null, Binder.getCallingUid()); 1726602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov try { 1727602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov cells = (ArrayList<NeighboringCellInfo>) sendRequest( 1728602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov CMD_HANDLE_NEIGHBORING_CELL, workSource, 1729602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov SubscriptionManager.INVALID_SUBSCRIPTION_ID); 1730602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } catch (RuntimeException e) { 1731602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov Log.e(LOG_TAG, "getNeighboringCellInfo " + e); 1732602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 1733602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov return cells; 1734602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } else { 1735602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) log("getNeighboringCellInfo: suppress non-active user"); 1736602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov return null; 17377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 17387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 17397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 17407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 17417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 174264fad26f22ed5d382533b3c07271cd1c7b81dd0bSvetoslav public List<CellInfo> getAllCellInfo(String callingPackage) { 1743602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov enforceFineOrCoarseLocationPermission("getAllCellInfo"); 1744602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 1745602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // OP_COARSE_LOCATION controls both fine and coarse location. 1746602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (mAppOps.noteOp(AppOpsManager.OP_COARSE_LOCATION, Binder.getCallingUid(), 1747602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov callingPackage) != AppOpsManager.MODE_ALLOWED) { 174864fad26f22ed5d382533b3c07271cd1c7b81dd0bSvetoslav return null; 17497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 17507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1751602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (checkIfCallerIsSelfOrForegroundUser() || 1752602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov checkCallerInteractAcrossUsersFull()) { 1753602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) log("getAllCellInfo: is active user"); 1754602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov WorkSource workSource = getWorkSource(null, Binder.getCallingUid()); 1755602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov List<CellInfo> cellInfos = new ArrayList<CellInfo>(); 1756602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov for (Phone phone : PhoneFactory.getPhones()) { 1757602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov final List<CellInfo> info = phone.getAllCellInfo(workSource); 1758602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (info != null) cellInfos.addAll(info); 1759602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 1760602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov return cellInfos; 1761602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } else { 1762602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) log("getAllCellInfo: suppress non-active user"); 1763602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov return null; 17647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 17657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 17667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1767bd76e4e0407f75c4e6a6961cf943d36fc75a0e1aSailesh Nepal @Override 17687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void setCellInfoListRate(int rateInMillis) { 1769a8d8cb8e810c410cce9329c226badac294422678Jack Yu enforceModifyPermission(); 17709a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran WorkSource workSource = getWorkSource(null, Binder.getCallingUid()); 17719a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran mPhone.setCellInfoListRate(rateInMillis, workSource); 17727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 17737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1774a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal @Override 177513bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public String getImeiForSlot(int slotIndex, String callingPackage) { 1776a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal if (!canReadPhoneState(callingPackage, "getImeiForSlot")) { 1777a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return null; 1778a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal } 177913bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe Phone phone = PhoneFactory.getPhone(slotIndex); 1780a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return phone == null ? null : phone.getImei(); 1781a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal } 1782a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal 1783a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal @Override 17842af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu public String getMeidForSlot(int slotIndex, String callingPackage) { 17852af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu if (!canReadPhoneState(callingPackage, "getMeidForSlot")) { 17862af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu return null; 17872af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu } 17882af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu Phone phone = PhoneFactory.getPhone(slotIndex); 17892af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu return phone == null ? null : phone.getMeid(); 17902af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu } 17912af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu 17922af8d71cbed6e57fe94fddc0db9e1c98cd230a2dJack Yu @Override 179313bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public String getDeviceSoftwareVersionForSlot(int slotIndex, String callingPackage) { 1794a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal if (!canReadPhoneState(callingPackage, "getDeviceSoftwareVersionForSlot")) { 1795a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return null; 1796a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal } 179713bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe Phone phone = PhoneFactory.getPhone(slotIndex); 1798a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return phone == null ? null : phone.getDeviceSvn(); 1799a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal } 1800a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal 18017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 18027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Internal helper methods. 18037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 18047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1805ee13a9b14976efd7404816891aecab50a0451966Sanket Padawe /** 1806602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov * Returns true if the caller holds INTERACT_ACROSS_USERS_FULL. 1807602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov */ 1808602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov private boolean checkCallerInteractAcrossUsersFull() { 1809602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov return mPhone.getContext().checkCallingOrSelfPermission( 1810602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) 1811602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov == PackageManager.PERMISSION_GRANTED; 1812602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 1813602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 1814602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov private static boolean checkIfCallerIsSelfOrForegroundUser() { 1815602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov boolean ok; 1816602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 1817602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov boolean self = Binder.getCallingUid() == Process.myUid(); 1818602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (!self) { 1819602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // Get the caller's user id then clear the calling identity 1820602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // which will be restored in the finally clause. 1821602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov int callingUser = UserHandle.getCallingUserId(); 1822602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov long ident = Binder.clearCallingIdentity(); 1823602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 1824602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov try { 1825602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov // With calling identity cleared the current user is the foreground user. 1826602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov int foregroundUser = ActivityManager.getCurrentUser(); 1827602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov ok = (foregroundUser == callingUser); 1828602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) { 1829602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov log("checkIfCallerIsSelfOrForegoundUser: foregroundUser=" + foregroundUser 1830602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov + " callingUser=" + callingUser + " ok=" + ok); 1831602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 1832602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } catch (Exception ex) { 1833602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) loge("checkIfCallerIsSelfOrForegoundUser: Exception ex=" + ex); 1834602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov ok = false; 1835602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } finally { 1836602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov Binder.restoreCallingIdentity(ident); 1837602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 1838602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } else { 1839602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) log("checkIfCallerIsSelfOrForegoundUser: is self"); 1840602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov ok = true; 1841602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 1842602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov if (DBG_LOC) log("checkIfCallerIsSelfOrForegoundUser: ret=" + ok); 1843602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov return ok; 1844602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov } 1845602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov 1846602b29662cd9c4ab1d5483217055885e8d9b8b7cSvetoslav Ganov /** 18477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Make sure the caller has the MODIFY_PHONE_STATE permission. 18487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 18497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @throws SecurityException if the caller does not have the required permission 18507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 18517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void enforceModifyPermission() { 18527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null); 18537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 18547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 18557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1856a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu * Make sure either system app or the caller has carrier privilege. 1857a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu * 1858a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu * @throws SecurityException if the caller does not have the required permission/privilege 1859a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu */ 1860c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal private void enforceModifyPermissionOrCarrierPrivilege(int subId) { 1861f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal int permission = mApp.checkCallingOrSelfPermission( 1862f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal android.Manifest.permission.MODIFY_PHONE_STATE); 1863f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal if (permission == PackageManager.PERMISSION_GRANTED) { 1864f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal return; 1865f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal } 1866f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal 1867f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal log("No modify permission, check carrier privilege next."); 1868c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceCarrierPrivilege(subId); 1869a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu } 1870a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu 1871a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu /** 1872a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu * Make sure the caller has carrier privilege. 1873a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu * 1874a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu * @throws SecurityException if the caller does not have the required permission 1875a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu */ 1876c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal private void enforceCarrierPrivilege(int subId) { 1877c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal if (getCarrierPrivilegeStatus(subId) != 1878c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { 1879f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal loge("No Carrier Privilege."); 1880f1ac4c93f1b87b7db0836882ed72935a86ed3898Shishir Agrawal throw new SecurityException("No Carrier Privilege."); 1881a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu } 1882a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu } 1883a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu 1884a2e3601f8c198e7880ff407e1cea9ef2b8ce8505Junda Liu /** 18857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Make sure the caller has the CALL_PHONE permission. 18867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 18877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @throws SecurityException if the caller does not have the required permission 18887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 18897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void enforceCallPermission() { 18907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApp.enforceCallingOrSelfPermission(android.Manifest.permission.CALL_PHONE, null); 18917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 18927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 18938eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott private void enforceConnectivityInternalPermission() { 18948eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott mApp.enforceCallingOrSelfPermission( 18958eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott android.Manifest.permission.CONNECTIVITY_INTERNAL, 18968eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott "ConnectivityService"); 18978eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott } 18988eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott 18997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String createTelUrl(String number) { 19007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (TextUtils.isEmpty(number)) { 19017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return null; 19027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 19037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1904e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby return "tel:" + number; 19057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 19067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1907f9e92733e130dc37ce2c592b36deab86008f5706Ihab Awad private static void log(String msg) { 19087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "[PhoneIntfMgr] " + msg); 19097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 19107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 19111fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla private static void logv(String msg) { 19121fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla Log.v(LOG_TAG, "[PhoneIntfMgr] " + msg); 19131fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla } 19141fd79bd442bda04a7e5e467c9ae6ab22e2a83f05Naveen Kalla 1915f9e92733e130dc37ce2c592b36deab86008f5706Ihab Awad private static void loge(String msg) { 19167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "[PhoneIntfMgr] " + msg); 19177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 19187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 191936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 19207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int getActivePhoneType() { 1921a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return getActivePhoneTypeForSlot(getSlotForDefaultSubscription()); 192236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 192336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1924356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 192513bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public int getActivePhoneTypeForSlot(int slotIndex) { 192613bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe final Phone phone = PhoneFactory.getPhone(slotIndex); 1927356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone == null) { 1928356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return PhoneConstants.PHONE_TYPE_NONE; 1929356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1930a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return phone.getPhoneType(); 1931356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 19327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 19337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 19347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 19357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns the CDMA ERI icon index to display 19367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 193736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 193836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getCdmaEriIconIndex(String callingPackage) { 193936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return getCdmaEriIconIndexForSubscriber(getDefaultSubscription(), callingPackage); 194036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 194136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1942356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 194336b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getCdmaEriIconIndexForSubscriber(int subId, String callingPackage) { 194436b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "getCdmaEriIconIndexForSubscriber")) { 194536b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return -1; 194636b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 1947356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1948356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1949356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getCdmaEriIconIndex(); 1950356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1951356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return -1; 1952356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 19537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 19547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 19557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 19567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns the CDMA ERI icon mode, 19577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 0 - ON 19587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 1 - FLASHING 19597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 196036b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 196136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getCdmaEriIconMode(String callingPackage) { 196236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return getCdmaEriIconModeForSubscriber(getDefaultSubscription(), callingPackage); 196336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 196436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1965356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 196636b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getCdmaEriIconModeForSubscriber(int subId, String callingPackage) { 196736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "getCdmaEriIconModeForSubscriber")) { 196836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return -1; 196936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 1970356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1971356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1972356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getCdmaEriIconMode(); 1973356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1974356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return -1; 1975356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 19767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 19777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 19787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 19797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns the CDMA ERI text, 19807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 198136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 198236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public String getCdmaEriText(String callingPackage) { 198336b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return getCdmaEriTextForSubscriber(getDefaultSubscription(), callingPackage); 198436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 198536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 1986356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 198736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public String getCdmaEriTextForSubscriber(int subId, String callingPackage) { 198836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "getCdmaEriIconTextForSubscriber")) { 198936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return null; 199036b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 1991356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 1992356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 1993356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getCdmaEriText(); 1994356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 1995356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return null; 1996356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 19977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 19987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 19997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 2000ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu * Returns the CDMA MDN. 2001ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu */ 2002356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 2003b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public String getCdmaMdn(int subId) { 2004c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2005356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 2006356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA && phone != null) { 2007356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getLine1Number(); 2008ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu } else { 2009ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu return null; 2010ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu } 2011ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu } 2012ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu 2013ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu /** 2014ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu * Returns the CDMA MIN. 2015ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu */ 2016356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 2017b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public String getCdmaMin(int subId) { 2018c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2019356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 2020356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null && phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { 2021356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getCdmaMin(); 2022ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu } else { 2023ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu return null; 2024ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu } 2025ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu } 2026ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu 2027ca05d5dad142516de2cc78dead550472a9cc5ee0Junda Liu /** 20287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns true if CDMA provisioning needs to run. 20297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 20307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean needsOtaServiceProvisioning() { 20317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return mPhone.needsOtaServiceProvisioning(); 20327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 20337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 20347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 203576d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal * Sets the voice mail number of a given subId. 203676d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal */ 203776d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal @Override 203876d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal public boolean setVoiceMailNumber(int subId, String alphaTag, String number) { 2039c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceCarrierPrivilege(subId); 204076d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal Boolean success = (Boolean) sendRequest(CMD_SET_VOICEMAIL_NUMBER, 204176d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal new Pair<String, String>(alphaTag, number), new Integer(subId)); 204276d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal return success; 204376d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal } 204476d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal 204587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen @Override 2046c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen public Bundle getVisualVoicemailSettings(String callingPackage, int subId) { 2047c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 2048c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen String systemDialer = TelecomManager.from(mPhone.getContext()).getSystemDialerPackage(); 2049c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen if (!TextUtils.equals(callingPackage, systemDialer)) { 2050c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen throw new SecurityException("caller must be system dialer"); 2051c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen } 2052c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen PhoneAccountHandle phoneAccountHandle = PhoneAccountHandleConverter.fromSubId(subId); 2053c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen if (phoneAccountHandle == null){ 2054c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen return null; 2055c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen } 2056c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen return VisualVoicemailSettingsUtil.dump(mPhone.getContext(), phoneAccountHandle); 2057c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen } 2058c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen 2059c9df04303b7c1289054f63646dffc45235fbe69bTa-wei Yen @Override 2060409ac56bd3289a169e0b2adc05b11786b4059555Ta-wei Yen public String getVisualVoicemailPackageName(String callingPackage, int subId) { 2061dca928f50b6717fde22e3d5c07eb6ca309930183Ta-wei Yen mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 2062dca928f50b6717fde22e3d5c07eb6ca309930183Ta-wei Yen if (!canReadPhoneState(callingPackage, "getVisualVoicemailPackageName")) { 2063dca928f50b6717fde22e3d5c07eb6ca309930183Ta-wei Yen return null; 2064dca928f50b6717fde22e3d5c07eb6ca309930183Ta-wei Yen } 2065dca928f50b6717fde22e3d5c07eb6ca309930183Ta-wei Yen return RemoteVvmTaskManager.getRemotePackage(mPhone.getContext(), subId).getPackageName(); 2066dca928f50b6717fde22e3d5c07eb6ca309930183Ta-wei Yen } 2067dca928f50b6717fde22e3d5c07eb6ca309930183Ta-wei Yen 2068dca928f50b6717fde22e3d5c07eb6ca309930183Ta-wei Yen @Override 2069b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public void enableVisualVoicemailSmsFilter(String callingPackage, int subId, 2070b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen VisualVoicemailSmsFilterSettings settings) { 2071b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 207287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen VisualVoicemailSmsFilterConfig 2073b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .enableVisualVoicemailSmsFilter(mPhone.getContext(), callingPackage, subId, 2074b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen settings); 207587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 207687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 207787c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen @Override 2078b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public void disableVisualVoicemailSmsFilter(String callingPackage, int subId) { 2079b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 208087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen VisualVoicemailSmsFilterConfig 2081b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .disableVisualVoicemailSmsFilter(mPhone.getContext(), callingPackage, subId); 208287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 208387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 208487c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen @Override 2085b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public VisualVoicemailSmsFilterSettings getVisualVoicemailSmsFilterSettings( 2086b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen String callingPackage, int subId) { 2087b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 208887c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen return VisualVoicemailSmsFilterConfig 2089b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .getVisualVoicemailSmsFilterSettings(mPhone.getContext(), callingPackage, subId); 209087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 209187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 209287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen @Override 209330a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen public VisualVoicemailSmsFilterSettings getActiveVisualVoicemailSmsFilterSettings(int subId) { 2094b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen enforceReadPrivilegedPermission(); 209587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen return VisualVoicemailSmsFilterConfig 209630a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen .getActiveVisualVoicemailSmsFilterSettings(mPhone.getContext(), subId); 209730a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } 209830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen 209930a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen @Override 210030a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen public void sendVisualVoicemailSmsForSubscriber(String callingPackage, int subId, 210130a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen String number, int port, String text, PendingIntent sentIntent) { 210230a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 2103527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen enforceVisualVoicemailPackage(callingPackage, subId); 210430a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen enforceSendSmsPermission(); 210530a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen // Make the calls as the phone process. 210630a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen final long identity = Binder.clearCallingIdentity(); 210730a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen try { 210830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen SmsManager smsManager = SmsManager.getSmsManagerForSubscriptionId(subId); 210930a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen if (port == 0) { 211030a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen smsManager.sendTextMessageWithSelfPermissions(number, null, text, 211130a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen sentIntent, null, false); 211230a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } else { 211330a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen byte[] data = text.getBytes(StandardCharsets.UTF_8); 211430a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen smsManager.sendDataMessageWithSelfPermissions(number, null, 211530a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen (short) port, data, sentIntent, null); 211630a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } 211730a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } finally { 211830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen Binder.restoreCallingIdentity(identity); 211930a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } 212087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 212176d5da9d705eba24aea9e5ef8d9ff2071b7819e2Shishir Agrawal /** 21220152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu * Sets the voice activation state of a given subId. 21230152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu */ 21240152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu @Override 21250152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu public void setVoiceActivationState(int subId, int activationState) { 21260152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu enforceModifyPermissionOrCarrierPrivilege(subId); 21270152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu final Phone phone = getPhone(subId); 21280152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu if (phone != null) { 21290152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu phone.setVoiceActivationState(activationState); 21300152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } else { 21310152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu loge("setVoiceActivationState fails with invalid subId: " + subId); 21320152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21330152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21340152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu 21350152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu /** 21360152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu * Sets the data activation state of a given subId. 21370152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu */ 21380152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu @Override 21390152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu public void setDataActivationState(int subId, int activationState) { 21400152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu enforceModifyPermissionOrCarrierPrivilege(subId); 21410152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu final Phone phone = getPhone(subId); 21420152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu if (phone != null) { 21430152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu phone.setDataActivationState(activationState); 21440152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } else { 21450152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu loge("setVoiceActivationState fails with invalid subId: " + subId); 21460152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21470152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21480152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu 21490152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu /** 21500152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu * Returns the voice activation state of a given subId. 21510152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu */ 21520152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu @Override 21530152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu public int getVoiceActivationState(int subId, String callingPackage) { 21540152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu if (!canReadPhoneState(callingPackage, "getVoiceActivationStateForSubscriber")) { 21550152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu return TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN; 21560152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21570152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu final Phone phone = getPhone(subId); 21580152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu if (phone != null) { 21590152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu return phone.getVoiceActivationState(); 21600152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } else { 21610152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu return TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN; 21620152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21630152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21640152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu 21650152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu /** 21660152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu * Returns the data activation state of a given subId. 21670152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu */ 21680152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu @Override 21690152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu public int getDataActivationState(int subId, String callingPackage) { 21700152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu if (!canReadPhoneState(callingPackage, "getDataActivationStateForSubscriber")) { 21710152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu return TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN; 21720152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21730152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu final Phone phone = getPhone(subId); 21740152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu if (phone != null) { 21750152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu return phone.getDataActivationState(); 21760152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } else { 21770152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu return TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN; 21780152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21790152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu } 21800152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu 21810152e5188e6d23069d7d7ff7809c7d19e3004eb4fionaxu /** 21827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns the unread count of voicemails 21837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 21847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int getVoiceMessageCount() { 2185add7cc5326c1daf6b51a608e143eccef893bbedbWink Saville return getVoiceMessageCountForSubscriber(getDefaultSubscription()); 218636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 218736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 218836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville /** 218936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * Returns the unread count of voicemails for a subId 219036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 2191356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 2192b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville public int getVoiceMessageCountForSubscriber( int subId) { 2193356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 2194356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 2195356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getVoiceMessageCount(); 2196356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 2197356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return 0; 2198356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 21997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 22007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 22017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 22028a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar * returns true, if the device is in a state where both voice and data 22038a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar * are supported simultaneously. This can change based on location or network condition. 22048a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar */ 22058a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar @Override 22068a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar public boolean isConcurrentVoiceAndDataAllowed(int subId) { 22078a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar final Phone phone = getPhone(subId); 22088a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar return (phone == null ? false : phone.isConcurrentVoiceAndDataAllowed()); 22098a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar } 22108a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar 22118a4dcfb76dc8f60d08071dd7b0b747c0b96dab56pkanwar /** 2212235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu * Send the dialer code if called from the current default dialer or the caller has 2213235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu * carrier privilege. 2214235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu * @param inputCode The dialer code to send 2215235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu */ 2216235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu @Override 2217235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu public void sendDialerSpecialCode(String callingPackage, String inputCode) { 2218235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 2219235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu String defaultDialer = TelecomManager.from(mPhone.getContext()).getDefaultDialerPackage(); 2220235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu if (!TextUtils.equals(callingPackage, defaultDialer)) { 2221235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu enforceCarrierPrivilege(getDefaultSubscription()); 2222235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu } 2223235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu mPhone.sendDialerSpecialCode(inputCode); 2224235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu } 2225235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu 2226235cc5e8bccb90e10c7a38354e3c2d4c88d8600ffionaxu /** 2227a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt * Returns the data network type. 2228a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt * Legacy call, permission-free. 22297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 22307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @Deprecated to be removed Q3 2013 use {@link #getDataNetworkType}. 22317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 22327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2233a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt public int getNetworkType() { 2234a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt final Phone phone = getPhone(getDefaultSubscription()); 2235a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt if (phone != null) { 2236a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt return phone.getServiceState().getDataNetworkType(); 2237a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt } else { 2238a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt return TelephonyManager.NETWORK_TYPE_UNKNOWN; 2239a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt } 224036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 224136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 224236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville /** 224336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * Returns the network type for a subId 224436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 224536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville @Override 224636b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getNetworkTypeForSubscriber(int subId, String callingPackage) { 224736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "getNetworkTypeForSubscriber")) { 224836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return TelephonyManager.NETWORK_TYPE_UNKNOWN; 224936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 2250a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt 2251356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 225236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (phone != null) { 2253356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getServiceState().getDataNetworkType(); 2254356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 2255356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return TelephonyManager.NETWORK_TYPE_UNKNOWN; 2256356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 22577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 22587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 22597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 22607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns the data network type 22617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 22627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 226336b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getDataNetworkType(String callingPackage) { 226436b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return getDataNetworkTypeForSubscriber(getDefaultSubscription(), callingPackage); 226536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 226636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 226736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville /** 226836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * Returns the data network type for a subId 226936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 227036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville @Override 227136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getDataNetworkTypeForSubscriber(int subId, String callingPackage) { 227236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "getDataNetworkTypeForSubscriber")) { 227336b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return TelephonyManager.NETWORK_TYPE_UNKNOWN; 227436b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 227536b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt 2276356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 2277356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 2278356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getServiceState().getDataNetworkType(); 2279356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 2280356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return TelephonyManager.NETWORK_TYPE_UNKNOWN; 2281356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 22827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 22837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 22847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 228536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * Returns the Voice network type for a subId 228636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 228736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville @Override 2288a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt public int getVoiceNetworkTypeForSubscriber(int subId, String callingPackage) { 2289a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt if (!canReadPhoneState(callingPackage, "getDataNetworkTypeForSubscriber")) { 2290a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt return TelephonyManager.NETWORK_TYPE_UNKNOWN; 2291a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt } 2292a5dcfcb1c18056def5df69b0ac963fee0a5be98cRobert Greenwalt 2293356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 2294356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone != null) { 2295356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getServiceState().getVoiceNetworkType(); 2296356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 2297356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return TelephonyManager.NETWORK_TYPE_UNKNOWN; 2298356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 22997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 23007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 23017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 23027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @return true if a ICC card is present 23037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 23047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean hasIccCard() { 230536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville // FIXME Make changes to pass defaultSimId of type int 230613bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe return hasIccCardUsingSlotIndex(mSubscriptionController.getSlotIndex( 230713bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe getDefaultSubscription())); 230836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 230936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 231036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville /** 231113bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe * @return true if a ICC card is present for a slotIndex 231236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 2313356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 231413bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public boolean hasIccCardUsingSlotIndex(int slotIndex) { 231513bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe final Phone phone = PhoneFactory.getPhone(slotIndex); 23166e6c68b387bf10a8bbf906a2e5245a5d3326332cfionaxu if (phone != null) { 2317356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getIccCard().hasIccCard(); 2318a6fc2a8518c71b7a720f849bbfd4c51fe35a461dAmit Mahajan } else { 2319a6fc2a8518c71b7a720f849bbfd4c51fe35a461dAmit Mahajan return false; 2320a6fc2a8518c71b7a720f849bbfd4c51fe35a461dAmit Mahajan } 23217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 23227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 23237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 23247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Return if the current radio is LTE on CDMA. This 23257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * is a tri-state return value as for a period of time 23267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * the mode may be unknown. 23277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 232836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt * @param callingPackage the name of the package making the call. 23297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @return {@link Phone#LTE_ON_CDMA_UNKNOWN}, {@link Phone#LTE_ON_CDMA_FALSE} 2330e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * or {@link Phone#LTE_ON_CDMA_TRUE} 23317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 233236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt @Override 233336b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getLteOnCdmaMode(String callingPackage) { 233436b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return getLteOnCdmaModeForSubscriber(getDefaultSubscription(), callingPackage); 233536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 233636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 2337356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe @Override 233836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getLteOnCdmaModeForSubscriber(int subId, String callingPackage) { 233936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "getLteOnCdmaModeForSubscriber")) { 234036b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 234136b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 234236b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt 2343356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 2344356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone == null) { 2345356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return PhoneConstants.LTE_ON_CDMA_UNKNOWN; 2346356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } else { 2347356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return phone.getLteOnCdmaMode(); 2348356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 234936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 235036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 235136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville public void setPhone(Phone phone) { 235236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville mPhone = phone; 235336469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 235436469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 235536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville /** 235636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * {@hide} 235736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * Returns Default subId, 0 in the case of single standby. 235836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 2359b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville private int getDefaultSubscription() { 2360ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville return mSubscriptionController.getDefaultSubId(); 236136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 236236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 2363a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal private int getSlotForDefaultSubscription() { 2364a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal return mSubscriptionController.getPhoneId(getDefaultSubscription()); 2365a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal } 2366a9f32182731999b81bf7d65702cc26485721cdceShishir Agrawal 2367b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville private int getPreferredVoiceSubscription() { 2368ac1bdfd36366426513d51bd2c4b107b00533889eWink Saville return mSubscriptionController.getDefaultVoiceSubId(); 23697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2370f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad 2371f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad /** 2372f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad * @see android.telephony.TelephonyManager.WifiCallingChoices 2373f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad */ 2374f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad public int getWhenToMakeWifiCalls() { 2375d1e681513fb108d5902a1c76eedca7b83034c056Sailesh Nepal return Settings.System.getInt(mPhone.getContext().getContentResolver(), 2376d1e681513fb108d5902a1c76eedca7b83034c056Sailesh Nepal Settings.System.WHEN_TO_MAKE_WIFI_CALLS, getWhenToMakeWifiCallsDefaultPreference()); 2377f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad } 2378f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad 2379f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad /** 2380f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad * @see android.telephony.TelephonyManager.WifiCallingChoices 2381f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad */ 2382f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad public void setWhenToMakeWifiCalls(int preference) { 2383d1e681513fb108d5902a1c76eedca7b83034c056Sailesh Nepal if (DBG) log("setWhenToMakeWifiCallsStr, storing setting = " + preference); 2384d1e681513fb108d5902a1c76eedca7b83034c056Sailesh Nepal Settings.System.putInt(mPhone.getContext().getContentResolver(), 2385d1e681513fb108d5902a1c76eedca7b83034c056Sailesh Nepal Settings.System.WHEN_TO_MAKE_WIFI_CALLS, preference); 2386f9e92733e130dc37ce2c592b36deab86008f5706Ihab Awad } 2387f9e92733e130dc37ce2c592b36deab86008f5706Ihab Awad 2388d1e681513fb108d5902a1c76eedca7b83034c056Sailesh Nepal private static int getWhenToMakeWifiCallsDefaultPreference() { 2389da120f4e3d32ca97c5b4c21d6c505d834a29ab8dSantos Cordon // TODO: Use a build property to choose this value. 23909829e880f73f76119ba76ba032db42aad042858fEvan Charlton return TelephonyManager.WifiCallingChoices.ALWAYS_USE; 2391f2177b7ec0fd9efcb8299e8272a494e869dcf16fIhab Awad } 239269f68120b94cecb2d87fe856bc115714b4e77bcdShishir Agrawal 2393566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal @Override 2394d7454d3c7e1662e4aefebadf78b780ac5fe8127bAjay Nambi public IccOpenLogicalChannelResponse iccOpenLogicalChannel(int subId, String AID, int p2) { 2395c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2396566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 2397d7454d3c7e1662e4aefebadf78b780ac5fe8127bAjay Nambi if (DBG) log("iccOpenLogicalChannel: subId=" + subId + " aid=" + AID + " p2=" + p2); 2398da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal IccOpenLogicalChannelResponse response = (IccOpenLogicalChannelResponse)sendRequest( 2399d7454d3c7e1662e4aefebadf78b780ac5fe8127bAjay Nambi CMD_OPEN_CHANNEL, new Pair<String, Integer>(AID, p2), subId); 2400da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (DBG) log("iccOpenLogicalChannel: " + response); 2401da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal return response; 2402566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 2403566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 2404566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal @Override 2405c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal public boolean iccCloseLogicalChannel(int subId, int channel) { 2406c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2407566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 2408c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal if (DBG) log("iccCloseLogicalChannel: subId=" + subId + " chnl=" + channel); 2409566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (channel < 0) { 2410566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal return false; 2411566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 2412c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal Boolean success = (Boolean)sendRequest(CMD_CLOSE_CHANNEL, channel, subId); 2413566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (DBG) log("iccCloseLogicalChannel: " + success); 2414566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal return success; 2415566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 2416566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 2417566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal @Override 2418c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal public String iccTransmitApduLogicalChannel(int subId, int channel, int cla, 2419566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal int command, int p1, int p2, int p3, String data) { 2420c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2421566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 2422566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (DBG) { 2423c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal log("iccTransmitApduLogicalChannel: subId=" + subId + " chnl=" + channel + 2424c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal " cla=" + cla + " cmd=" + command + " p1=" + p1 + " p2=" + p2 + " p3=" + p3 + 2425566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal " data=" + data); 2426566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 2427566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 2428566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (channel < 0) { 2429566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal return ""; 2430566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 2431566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 2432da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal IccIoResult response = (IccIoResult)sendRequest(CMD_TRANSMIT_APDU_LOGICAL_CHANNEL, 2433c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal new IccAPDUArgument(channel, cla, command, p1, p2, p3, data), subId); 2434566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal if (DBG) log("iccTransmitApduLogicalChannel: " + response); 2435566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal 2436566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal // Append the returned status code to the end of the response payload. 2437566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal String s = Integer.toHexString( 2438566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal (response.sw1 << 8) + response.sw2 + 0x10000).substring(1); 24395ec14172e42d180d7dd6110ef8eb1dedb0a0a7fbShishir Agrawal if (response.payload != null) { 24405ec14172e42d180d7dd6110ef8eb1dedb0a0a7fbShishir Agrawal s = IccUtils.bytesToHexString(response.payload) + s; 24415ec14172e42d180d7dd6110ef8eb1dedb0a0a7fbShishir Agrawal } 2442566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal return s; 2443566b761b610e7e5e1ade9ab0906a2a7e816dad63Shishir Agrawal } 2444e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 2445c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton @Override 2446c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal public String iccTransmitApduBasicChannel(int subId, int cla, int command, int p1, int p2, 2447da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal int p3, String data) { 2448c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2449da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2450da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (DBG) { 2451c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal log("iccTransmitApduBasicChannel: subId=" + subId + " cla=" + cla + " cmd=" + command 2452c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal + " p1=" + p1 + " p2=" + p2 + " p3=" + p3 + " data=" + data); 2453da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 2454da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2455da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal IccIoResult response = (IccIoResult)sendRequest(CMD_TRANSMIT_APDU_BASIC_CHANNEL, 2456c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal new IccAPDUArgument(0, cla, command, p1, p2, p3, data), subId); 2457da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (DBG) log("iccTransmitApduBasicChannel: " + response); 2458da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2459da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal // Append the returned status code to the end of the response payload. 2460da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal String s = Integer.toHexString( 2461da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal (response.sw1 << 8) + response.sw2 + 0x10000).substring(1); 24625ec14172e42d180d7dd6110ef8eb1dedb0a0a7fbShishir Agrawal if (response.payload != null) { 24635ec14172e42d180d7dd6110ef8eb1dedb0a0a7fbShishir Agrawal s = IccUtils.bytesToHexString(response.payload) + s; 24645ec14172e42d180d7dd6110ef8eb1dedb0a0a7fbShishir Agrawal } 2465da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal return s; 2466da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 2467da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2468da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal @Override 2469c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal public byte[] iccExchangeSimIO(int subId, int fileID, int command, int p1, int p2, int p3, 2470da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal String filePath) { 2471c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2472da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2473da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (DBG) { 2474c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal log("Exchange SIM_IO " + subId + ":" + fileID + ":" + command + " " + 2475da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal p1 + " " + p2 + " " + p3 + ":" + filePath); 2476da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 2477da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2478da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal IccIoResult response = 2479da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal (IccIoResult)sendRequest(CMD_EXCHANGE_SIM_IO, 2480c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal new IccAPDUArgument(-1, fileID, command, p1, p2, p3, filePath), 2481c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal subId); 2482da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2483da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (DBG) { 2484da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal log("Exchange SIM_IO [R]" + response); 2485da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 2486da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2487da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal byte[] result = null; 2488da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal int length = 2; 2489da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal if (response.payload != null) { 2490da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal length = 2 + response.payload.length; 2491da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal result = new byte[length]; 2492da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal System.arraycopy(response.payload, 0, result, 0, response.payload.length); 2493da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } else { 2494da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal result = new byte[length]; 2495da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 2496da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2497da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal result[length - 1] = (byte) response.sw2; 2498da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal result[length - 2] = (byte) response.sw1; 2499da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal return result; 2500da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal } 2501da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal 2502b30140510ae7209034135809738a20f9e6f26c5fNathan Harold /** 2503b30140510ae7209034135809738a20f9e6f26c5fNathan Harold * Get the forbidden PLMN List from the given app type (ex APPTYPE_USIM) 2504b30140510ae7209034135809738a20f9e6f26c5fNathan Harold * on a particular subscription 2505b30140510ae7209034135809738a20f9e6f26c5fNathan Harold */ 2506b30140510ae7209034135809738a20f9e6f26c5fNathan Harold public String[] getForbiddenPlmns(int subId, int appType) { 25078c92f3842a2a8045ecff6e8a75b0652a4ee875aeNathan Harold mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE, 25088c92f3842a2a8045ecff6e8a75b0652a4ee875aeNathan Harold "Requires READ_PHONE_STATE"); 2509b30140510ae7209034135809738a20f9e6f26c5fNathan Harold if (appType != TelephonyManager.APPTYPE_USIM && appType != TelephonyManager.APPTYPE_SIM) { 2510b30140510ae7209034135809738a20f9e6f26c5fNathan Harold loge("getForbiddenPlmnList(): App Type must be USIM or SIM"); 2511b30140510ae7209034135809738a20f9e6f26c5fNathan Harold return null; 2512b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 2513b30140510ae7209034135809738a20f9e6f26c5fNathan Harold Object response = sendRequest( 2514b30140510ae7209034135809738a20f9e6f26c5fNathan Harold CMD_GET_FORBIDDEN_PLMNS, new Integer(appType), subId); 2515b30140510ae7209034135809738a20f9e6f26c5fNathan Harold if (response instanceof String[]) { 2516b30140510ae7209034135809738a20f9e6f26c5fNathan Harold return (String[]) response; 2517b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 2518b30140510ae7209034135809738a20f9e6f26c5fNathan Harold // Response is an Exception of some kind, which is signalled to the user as a NULL retval 2519b30140510ae7209034135809738a20f9e6f26c5fNathan Harold return null; 2520b30140510ae7209034135809738a20f9e6f26c5fNathan Harold } 2521b30140510ae7209034135809738a20f9e6f26c5fNathan Harold 2522da0bb0d7aff7b4a445370dc0709e94b874031178Shishir Agrawal @Override 2523c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal public String sendEnvelopeWithStatus(int subId, String content) { 2524c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2525c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton 2526c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal IccIoResult response = (IccIoResult)sendRequest(CMD_SEND_ENVELOPE, content, subId); 2527c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton if (response.payload == null) { 2528c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton return ""; 2529c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton } 2530c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton 2531c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton // Append the returned status code to the end of the response payload. 2532c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton String s = Integer.toHexString( 2533c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton (response.sw1 << 8) + response.sw2 + 0x10000).substring(1); 2534c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton s = IccUtils.bytesToHexString(response.payload) + s; 2535c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton return s; 2536c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton } 2537c66da36833b835a9a122f6b0a3e4ecef27be266bEvan Charlton 2538e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby /** 2539e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * Read one of the NV items defined in {@link com.android.internal.telephony.RadioNVItems} 2540e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * and {@code ril_nv_items.h}. Used for device configuration by some CDMA operators. 2541e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * 2542e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @param itemID the ID of the item to read 2543e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @return the NV item as a String, or null on error. 2544e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby */ 2545e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby @Override 2546e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby public String nvReadItem(int itemID) { 2547c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription()); 2548e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (DBG) log("nvReadItem: item " + itemID); 2549e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby String value = (String) sendRequest(CMD_NV_READ_ITEM, itemID); 2550e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (DBG) log("nvReadItem: item " + itemID + " is \"" + value + '"'); 2551e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby return value; 2552e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } 2553e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 2554e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby /** 2555e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * Write one of the NV items defined in {@link com.android.internal.telephony.RadioNVItems} 2556e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * and {@code ril_nv_items.h}. Used for device configuration by some CDMA operators. 2557e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * 2558e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @param itemID the ID of the item to read 2559e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @param itemValue the value to write, as a String 2560e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @return true on success; false on any failure 2561e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby */ 2562e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby @Override 2563e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby public boolean nvWriteItem(int itemID, String itemValue) { 2564c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription()); 2565e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (DBG) log("nvWriteItem: item " + itemID + " value \"" + itemValue + '"'); 2566e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby Boolean success = (Boolean) sendRequest(CMD_NV_WRITE_ITEM, 2567e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby new Pair<Integer, String>(itemID, itemValue)); 2568e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (DBG) log("nvWriteItem: item " + itemID + ' ' + (success ? "ok" : "fail")); 2569e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby return success; 2570e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } 2571e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 2572e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby /** 2573e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * Update the CDMA Preferred Roaming List (PRL) in the radio NV storage. 2574e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * Used for device configuration by some CDMA operators. 2575e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * 2576e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @param preferredRoamingList byte array containing the new PRL 2577e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @return true on success; false on any failure 2578e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby */ 2579e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby @Override 2580e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby public boolean nvWriteCdmaPrl(byte[] preferredRoamingList) { 2581c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription()); 2582e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (DBG) log("nvWriteCdmaPrl: value: " + HexDump.toHexString(preferredRoamingList)); 2583e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby Boolean success = (Boolean) sendRequest(CMD_NV_WRITE_CDMA_PRL, preferredRoamingList); 2584e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (DBG) log("nvWriteCdmaPrl: " + (success ? "ok" : "fail")); 2585e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby return success; 2586e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } 2587e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby 2588e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby /** 2589e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * Perform the specified type of NV config reset. 2590e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * Used for device configuration by some CDMA operators. 2591e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * 2592e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @param resetType the type of reset to perform (1 == factory reset; 2 == NV-only reset) 2593e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby * @return true on success; false on any failure 2594e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby */ 2595e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby @Override 2596e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby public boolean nvResetConfig(int resetType) { 2597c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription()); 2598e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (DBG) log("nvResetConfig: type " + resetType); 2599e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby Boolean success = (Boolean) sendRequest(CMD_NV_RESET_CONFIG, resetType); 2600e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby if (DBG) log("nvResetConfig: type " + resetType + ' ' + (success ? "ok" : "fail")); 2601e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby return success; 2602e994d46a1f951b496441a42d1eabd2a0e026ceaeJake Hamby } 26037c27be317e8757948178815426d3a329c852b9eeJake Hamby 26047c27be317e8757948178815426d3a329c852b9eeJake Hamby /** 260536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * {@hide} 260636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville * Returns Default sim, 0 in the case of single standby. 260736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville */ 260836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville public int getDefaultSim() { 260936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville //TODO Need to get it from Telephony Devcontroller 261036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville return 0; 261136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 261236469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 2613b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov public String[] getPcscfAddress(String apnType, String callingPackage) { 2614b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov if (!canReadPhoneState(callingPackage, "getPcscfAddress")) { 2615b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov return new String[0]; 2616b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov } 2617b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov 2618b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov 261987fca6f34c10e43e4dcfdd3f4e35bd4050e19582ram return mPhone.getPcscfAddress(apnType); 262036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 262136469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 262251f743acf922009c45c60362fd71431a9891c051Brad Ebinger /** 262351f743acf922009c45c60362fd71431a9891c051Brad Ebinger * Returns the {@link IImsServiceController} that corresponds to the given slot Id and IMS 262451f743acf922009c45c60362fd71431a9891c051Brad Ebinger * feature or {@link null} if the service is not available. If an ImsServiceController is 262551f743acf922009c45c60362fd71431a9891c051Brad Ebinger * available, the {@link IImsServiceFeatureListener} callback is registered as a listener for 262651f743acf922009c45c60362fd71431a9891c051Brad Ebinger * feature updates. 262751f743acf922009c45c60362fd71431a9891c051Brad Ebinger */ 262813bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public IImsServiceController getImsServiceControllerAndListen(int slotIndex, int feature, 262951f743acf922009c45c60362fd71431a9891c051Brad Ebinger IImsServiceFeatureListener callback) { 263051f743acf922009c45c60362fd71431a9891c051Brad Ebinger enforceModifyPermission(); 263113bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe return PhoneFactory.getImsResolver().getImsServiceControllerAndListen(slotIndex, feature, 263251f743acf922009c45c60362fd71431a9891c051Brad Ebinger callback); 263351f743acf922009c45c60362fd71431a9891c051Brad Ebinger } 263451f743acf922009c45c60362fd71431a9891c051Brad Ebinger 263536469e74b7c79ed84148754190c38196eb9a2c49Wink Saville public void setImsRegistrationState(boolean registered) { 263636469e74b7c79ed84148754190c38196eb9a2c49Wink Saville enforceModifyPermission(); 263736469e74b7c79ed84148754190c38196eb9a2c49Wink Saville mPhone.setImsRegistrationState(registered); 263836469e74b7c79ed84148754190c38196eb9a2c49Wink Saville } 263936469e74b7c79ed84148754190c38196eb9a2c49Wink Saville 264036469e74b7c79ed84148754190c38196eb9a2c49Wink Saville /** 264154788801de04c603a856596f4ae4377ab77a9821Stuart Scott * Set the network selection mode to automatic. 264254788801de04c603a856596f4ae4377ab77a9821Stuart Scott * 264354788801de04c603a856596f4ae4377ab77a9821Stuart Scott */ 264454788801de04c603a856596f4ae4377ab77a9821Stuart Scott @Override 264554788801de04c603a856596f4ae4377ab77a9821Stuart Scott public void setNetworkSelectionModeAutomatic(int subId) { 2646c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 264754788801de04c603a856596f4ae4377ab77a9821Stuart Scott if (DBG) log("setNetworkSelectionModeAutomatic: subId " + subId); 264854788801de04c603a856596f4ae4377ab77a9821Stuart Scott sendRequest(CMD_SET_NETWORK_SELECTION_MODE_AUTOMATIC, null, subId); 264954788801de04c603a856596f4ae4377ab77a9821Stuart Scott } 265054788801de04c603a856596f4ae4377ab77a9821Stuart Scott 265154788801de04c603a856596f4ae4377ab77a9821Stuart Scott /** 2652302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal * Set the network selection mode to manual with the selected carrier. 2653302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal */ 2654302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal @Override 265577ba317277863812508869705308373b42364e0aShishir Agrawal public boolean setNetworkSelectionModeManual(int subId, OperatorInfo operator, 265677ba317277863812508869705308373b42364e0aShishir Agrawal boolean persistSelection) { 2657c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2658302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal if (DBG) log("setNetworkSelectionModeManual: subId:" + subId + " operator:" + operator); 265977ba317277863812508869705308373b42364e0aShishir Agrawal ManualNetworkSelectionArgument arg = new ManualNetworkSelectionArgument(operator, 266077ba317277863812508869705308373b42364e0aShishir Agrawal persistSelection); 266177ba317277863812508869705308373b42364e0aShishir Agrawal return (Boolean) sendRequest(CMD_SET_NETWORK_SELECTION_MODE_MANUAL, arg, subId); 2662302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } 2663302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal 2664302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal /** 2665302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal * Scans for available networks. 2666302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal */ 2667302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal @Override 2668302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal public CellNetworkScanResult getCellNetworkScanResults(int subId) { 2669c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 2670302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal if (DBG) log("getCellNetworkScanResults: subId " + subId); 2671302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal CellNetworkScanResult result = (CellNetworkScanResult) sendRequest( 2672302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal CMD_PERFORM_NETWORK_SCAN, null, subId); 2673302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal return result; 2674302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal } 2675302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal 2676302c8699cd4389dbb3ec9b2d23748f3f0d51a8daShishir Agrawal /** 267784d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu * Get the calculated preferred network type. 267884d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu * Used for debugging incorrect network type. 267984d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu * 268084d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu * @return the preferred network type, defined in RILConstants.java. 268184d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu */ 268284d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu @Override 2683b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov public int getCalculatedPreferredNetworkType(String callingPackage) { 2684b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov if (!canReadPhoneState(callingPackage, "getCalculatedPreferredNetworkType")) { 2685b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov return RILConstants.PREFERRED_NETWORK_MODE; 2686b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov } 2687b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov 268843330e02af9431ac18a9b9d6c09610f910b8c0f2Amit Mahajan return PhoneFactory.calculatePreferredNetworkType(mPhone.getContext(), 0); // wink FIXME: need to get SubId from somewhere. 268984d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu } 269084d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu 269184d15a2e84fa528f111abf05d17fc2280b182b7cJunda Liu /** 26927c27be317e8757948178815426d3a329c852b9eeJake Hamby * Get the preferred network type. 26937c27be317e8757948178815426d3a329c852b9eeJake Hamby * Used for device configuration by some CDMA operators. 26947c27be317e8757948178815426d3a329c852b9eeJake Hamby * 26957c27be317e8757948178815426d3a329c852b9eeJake Hamby * @return the preferred network type, defined in RILConstants.java. 26967c27be317e8757948178815426d3a329c852b9eeJake Hamby */ 26977c27be317e8757948178815426d3a329c852b9eeJake Hamby @Override 269854788801de04c603a856596f4ae4377ab77a9821Stuart Scott public int getPreferredNetworkType(int subId) { 2699c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 27007c27be317e8757948178815426d3a329c852b9eeJake Hamby if (DBG) log("getPreferredNetworkType"); 270154788801de04c603a856596f4ae4377ab77a9821Stuart Scott int[] result = (int[]) sendRequest(CMD_GET_PREFERRED_NETWORK_TYPE, null, subId); 27027c27be317e8757948178815426d3a329c852b9eeJake Hamby int networkType = (result != null ? result[0] : -1); 27037c27be317e8757948178815426d3a329c852b9eeJake Hamby if (DBG) log("getPreferredNetworkType: " + networkType); 27047c27be317e8757948178815426d3a329c852b9eeJake Hamby return networkType; 27057c27be317e8757948178815426d3a329c852b9eeJake Hamby } 27067c27be317e8757948178815426d3a329c852b9eeJake Hamby 27077c27be317e8757948178815426d3a329c852b9eeJake Hamby /** 27087c27be317e8757948178815426d3a329c852b9eeJake Hamby * Set the preferred network type. 27097c27be317e8757948178815426d3a329c852b9eeJake Hamby * Used for device configuration by some CDMA operators. 27107c27be317e8757948178815426d3a329c852b9eeJake Hamby * 27117c27be317e8757948178815426d3a329c852b9eeJake Hamby * @param networkType the preferred network type, defined in RILConstants.java. 27127c27be317e8757948178815426d3a329c852b9eeJake Hamby * @return true on success; false on any failure. 27137c27be317e8757948178815426d3a329c852b9eeJake Hamby */ 27147c27be317e8757948178815426d3a329c852b9eeJake Hamby @Override 271554788801de04c603a856596f4ae4377ab77a9821Stuart Scott public boolean setPreferredNetworkType(int subId, int networkType) { 2716c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermissionOrCarrierPrivilege(subId); 271754788801de04c603a856596f4ae4377ab77a9821Stuart Scott if (DBG) log("setPreferredNetworkType: subId " + subId + " type " + networkType); 271854788801de04c603a856596f4ae4377ab77a9821Stuart Scott Boolean success = (Boolean) sendRequest(CMD_SET_PREFERRED_NETWORK_TYPE, networkType, subId); 27197c27be317e8757948178815426d3a329c852b9eeJake Hamby if (DBG) log("setPreferredNetworkType: " + (success ? "ok" : "fail")); 272080bc0d1614b46c89fa7a2c1d68fdb3ccb018625dJunda Liu if (success) { 272180bc0d1614b46c89fa7a2c1d68fdb3ccb018625dJunda Liu Settings.Global.putInt(mPhone.getContext().getContentResolver(), 272254788801de04c603a856596f4ae4377ab77a9821Stuart Scott Settings.Global.PREFERRED_NETWORK_MODE + subId, networkType); 272380bc0d1614b46c89fa7a2c1d68fdb3ccb018625dJunda Liu } 27247c27be317e8757948178815426d3a329c852b9eeJake Hamby return success; 27257c27be317e8757948178815426d3a329c852b9eeJake Hamby } 2726ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt 2727ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt /** 2728475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu * Check TETHER_DUN_REQUIRED and TETHER_DUN_APN settings, net.tethering.noprovisioning 2729475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu * SystemProperty, and config_tether_apndata to decide whether DUN APN is required for 2730475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu * tethering. 2731475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu * 2732475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu * @return 0: Not required. 1: required. 2: Not set. 2733475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu * @hide 2734475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu */ 2735475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu @Override 2736475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu public int getTetherApnRequired() { 2737c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceModifyPermission(); 2738475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu int dunRequired = Settings.Global.getInt(mPhone.getContext().getContentResolver(), 2739475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu Settings.Global.TETHER_DUN_REQUIRED, 2); 2740475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu // If not set, check net.tethering.noprovisioning, TETHER_DUN_APN setting and 2741475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu // config_tether_apndata. 2742475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu if (dunRequired == 2 && mPhone.hasMatchedTetherApnSetting()) { 2743475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu dunRequired = 1; 2744475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu } 2745475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu return dunRequired; 2746475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu } 2747475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu 2748475951f7b5c5831cbe015869c69b6916d4ab7053Junda Liu /** 2749ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt * Set mobile data enabled 2750ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt * Used by the user through settings etc to turn on/off mobile data 2751ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt * 2752ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt * @param enable {@code true} turn turn data on, else {@code false} 2753ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt */ 2754ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt @Override 2755e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville public void setDataEnabled(int subId, boolean enable) { 2756a192071524ffd206a0db6b1bbe4cb97075c905cdJeff Davidson enforceModifyPermissionOrCarrierPrivilege(subId); 2757e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville int phoneId = mSubscriptionController.getPhoneId(subId); 2758a601dd2275b7afdf5fa31f90c0c4ae0745554b40Joe Onorato if (DBG) log("getDataEnabled: subId=" + subId + " phoneId=" + phoneId); 2759e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville Phone phone = PhoneFactory.getPhone(phoneId); 2760e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville if (phone != null) { 2761a601dd2275b7afdf5fa31f90c0c4ae0745554b40Joe Onorato if (DBG) log("setDataEnabled: subId=" + subId + " enable=" + enable); 2762e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville phone.setDataEnabled(enable); 2763e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville } else { 2764e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville loge("setDataEnabled: no phone for subId=" + subId); 2765e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville } 2766ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt } 2767ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt 2768ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt /** 2769646120a5b2c016a4528dab5372db94e027233fb3Robert Greenwalt * Get whether mobile data is enabled. 2770646120a5b2c016a4528dab5372db94e027233fb3Robert Greenwalt * 2771a192071524ffd206a0db6b1bbe4cb97075c905cdJeff Davidson * Accepts either ACCESS_NETWORK_STATE, MODIFY_PHONE_STATE or carrier privileges. 2772ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt * 2773ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt * @return {@code true} if data is enabled else {@code false} 2774ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt */ 2775ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt @Override 2776e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville public boolean getDataEnabled(int subId) { 2777646120a5b2c016a4528dab5372db94e027233fb3Robert Greenwalt try { 2778646120a5b2c016a4528dab5372db94e027233fb3Robert Greenwalt mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE, 2779646120a5b2c016a4528dab5372db94e027233fb3Robert Greenwalt null); 2780646120a5b2c016a4528dab5372db94e027233fb3Robert Greenwalt } catch (Exception e) { 2781a192071524ffd206a0db6b1bbe4cb97075c905cdJeff Davidson enforceModifyPermissionOrCarrierPrivilege(subId); 2782646120a5b2c016a4528dab5372db94e027233fb3Robert Greenwalt } 2783e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville int phoneId = mSubscriptionController.getPhoneId(subId); 2784a601dd2275b7afdf5fa31f90c0c4ae0745554b40Joe Onorato if (DBG) log("getDataEnabled: subId=" + subId + " phoneId=" + phoneId); 2785e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville Phone phone = PhoneFactory.getPhone(phoneId); 2786e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville if (phone != null) { 2787e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville boolean retVal = phone.getDataEnabled(); 2788a601dd2275b7afdf5fa31f90c0c4ae0745554b40Joe Onorato if (DBG) log("getDataEnabled: subId=" + subId + " retVal=" + retVal); 2789e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville return retVal; 2790e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville } else { 2791a601dd2275b7afdf5fa31f90c0c4ae0745554b40Joe Onorato if (DBG) loge("getDataEnabled: no phone subId=" + subId + " retVal=false"); 2792e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville return false; 2793e7353bb9c6321b0858f9d981835b1bbc52b3e517Wink Saville } 2794ed86e5837b426bcba625b57e466b8d04ddbd8008Robert Greenwalt } 279560f9c952a11be2a34460b4cc8e0f9b31e38f5f30Shishir Agrawal 279660f9c952a11be2a34460b4cc8e0f9b31e38f5f30Shishir Agrawal @Override 2797c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal public int getCarrierPrivilegeStatus(int subId) { 2798c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal final Phone phone = getPhone(subId); 2799c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal if (phone == null) { 2800c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal loge("getCarrierPrivilegeStatus: Invalid subId"); 2801c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS; 2802c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal } 2803c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal UiccCard card = UiccController.getInstance().getUiccCard(phone.getPhoneId()); 2804eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal if (card == null) { 28055e5becdfa352e3ad1699cce13386b20761e2fde1Shishir Agrawal loge("getCarrierPrivilegeStatus: No UICC"); 2806eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED; 2807eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 2808eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal return card.getCarrierPrivilegeStatusForCurrentTransaction( 2809c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal phone.getContext().getPackageManager()); 281060f9c952a11be2a34460b4cc8e0f9b31e38f5f30Shishir Agrawal } 28112934034e04c5ca7839de41d0cc8f8bab89b1e336Junda Liu 28122934034e04c5ca7839de41d0cc8f8bab89b1e336Junda Liu @Override 281350ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson public int checkCarrierPrivilegesForPackage(String pkgName) { 2814317d70be627c1816af361376943a6a258b4e13d5Junda Liu if (TextUtils.isEmpty(pkgName)) 2815317d70be627c1816af361376943a6a258b4e13d5Junda Liu return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS; 281621409250c4001605606a37c3903dc22805410900Shishir Agrawal UiccCard card = UiccController.getInstance().getUiccCard(mPhone.getPhoneId()); 2817eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal if (card == null) { 2818eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal loge("checkCarrierPrivilegesForPackage: No UICC"); 2819eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED; 2820eb8771e9b44fcc885c17d3ff4a3358fcd0b21c6eShishir Agrawal } 282150ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson return card.getCarrierPrivilegeStatus(mPhone.getContext().getPackageManager(), pkgName); 282250ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson } 282350ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson 282450ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson @Override 282550ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) { 2826317d70be627c1816af361376943a6a258b4e13d5Junda Liu if (TextUtils.isEmpty(pkgName)) 2827317d70be627c1816af361376943a6a258b4e13d5Junda Liu return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS; 282850ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson int result = TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED; 282950ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson for (int i = 0; i < TelephonyManager.getDefault().getPhoneCount(); i++) { 283050ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson UiccCard card = UiccController.getInstance().getUiccCard(i); 283150ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson if (card == null) { 28327d320dff9d5b30b7b8a2dc9ef7574dc9bb8571b8Jonathan Basseri // No UICC in that slot. 283350ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson continue; 283450ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson } 283550ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson 283650ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson result = card.getCarrierPrivilegeStatus( 283750ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson mPhone.getContext().getPackageManager(), pkgName); 283850ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson if (result == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { 283950ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson break; 284050ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson } 284150ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson } 284250ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson 284350ecba360335a12252c30c95c309ef3ff5560fbfZach Johnson return result; 28442934034e04c5ca7839de41d0cc8f8bab89b1e336Junda Liu } 284589e89d47f249a1e910d6d726dbfcbedfc193cb83Derek Tan 284689e89d47f249a1e910d6d726dbfcbedfc193cb83Derek Tan @Override 2847e64de7820475d67ef0882a1b37f3bd188ca68e25Junda Liu public List<String> getCarrierPackageNamesForIntentAndPhone(Intent intent, int phoneId) { 2848e64de7820475d67ef0882a1b37f3bd188ca68e25Junda Liu if (!SubscriptionManager.isValidPhoneId(phoneId)) { 2849e64de7820475d67ef0882a1b37f3bd188ca68e25Junda Liu loge("phoneId " + phoneId + " is not valid."); 2850e64de7820475d67ef0882a1b37f3bd188ca68e25Junda Liu return null; 2851e64de7820475d67ef0882a1b37f3bd188ca68e25Junda Liu } 2852e64de7820475d67ef0882a1b37f3bd188ca68e25Junda Liu UiccCard card = UiccController.getInstance().getUiccCard(phoneId); 2853eb6439a7bd453313f7ed7972d30e2478243801ffShishir Agrawal if (card == null) { 2854af74c86463b193100a48a0a2b83d0096863bf110Diego Pontoriero loge("getCarrierPackageNamesForIntent: No UICC"); 2855eb6439a7bd453313f7ed7972d30e2478243801ffShishir Agrawal return null ; 2856eb6439a7bd453313f7ed7972d30e2478243801ffShishir Agrawal } 2857af74c86463b193100a48a0a2b83d0096863bf110Diego Pontoriero return card.getCarrierPackageNamesForIntent( 2858483aff78d6bada4c2f4d28f804935d24c8173fceSvetoslav mPhone.getContext().getPackageManager(), intent); 2859eb6439a7bd453313f7ed7972d30e2478243801ffShishir Agrawal } 2860eb6439a7bd453313f7ed7972d30e2478243801ffShishir Agrawal 28616e11887b99940b986591eb40228faf53bb57a162Amith Yamasani @Override 28626e11887b99940b986591eb40228faf53bb57a162Amith Yamasani public List<String> getPackagesWithCarrierPrivileges() { 28636e11887b99940b986591eb40228faf53bb57a162Amith Yamasani PackageManager pm = mPhone.getContext().getPackageManager(); 28646e11887b99940b986591eb40228faf53bb57a162Amith Yamasani List<String> privilegedPackages = new ArrayList<>(); 28656e11887b99940b986591eb40228faf53bb57a162Amith Yamasani List<PackageInfo> packages = null; 28666e11887b99940b986591eb40228faf53bb57a162Amith Yamasani for (int i = 0; i < TelephonyManager.getDefault().getPhoneCount(); i++) { 28676e11887b99940b986591eb40228faf53bb57a162Amith Yamasani UiccCard card = UiccController.getInstance().getUiccCard(i); 28686e11887b99940b986591eb40228faf53bb57a162Amith Yamasani if (card == null) { 28696e11887b99940b986591eb40228faf53bb57a162Amith Yamasani // No UICC in that slot. 28706e11887b99940b986591eb40228faf53bb57a162Amith Yamasani continue; 28716e11887b99940b986591eb40228faf53bb57a162Amith Yamasani } 28726e11887b99940b986591eb40228faf53bb57a162Amith Yamasani if (card.hasCarrierPrivilegeRules()) { 28736e11887b99940b986591eb40228faf53bb57a162Amith Yamasani if (packages == null) { 28746e11887b99940b986591eb40228faf53bb57a162Amith Yamasani // Only check packages in user 0 for now 28756e11887b99940b986591eb40228faf53bb57a162Amith Yamasani packages = pm.getInstalledPackagesAsUser( 28766e11887b99940b986591eb40228faf53bb57a162Amith Yamasani PackageManager.MATCH_DISABLED_COMPONENTS 28776e11887b99940b986591eb40228faf53bb57a162Amith Yamasani | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS 28786e11887b99940b986591eb40228faf53bb57a162Amith Yamasani | PackageManager.GET_SIGNATURES, UserHandle.USER_SYSTEM); 28796e11887b99940b986591eb40228faf53bb57a162Amith Yamasani } 28806e11887b99940b986591eb40228faf53bb57a162Amith Yamasani for (int p = packages.size() - 1; p >= 0; p--) { 28816e11887b99940b986591eb40228faf53bb57a162Amith Yamasani PackageInfo pkgInfo = packages.get(p); 28826e11887b99940b986591eb40228faf53bb57a162Amith Yamasani if (pkgInfo != null && pkgInfo.packageName != null 28836e11887b99940b986591eb40228faf53bb57a162Amith Yamasani && card.getCarrierPrivilegeStatus(pkgInfo) 28846e11887b99940b986591eb40228faf53bb57a162Amith Yamasani == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { 28856e11887b99940b986591eb40228faf53bb57a162Amith Yamasani privilegedPackages.add(pkgInfo.packageName); 28866e11887b99940b986591eb40228faf53bb57a162Amith Yamasani } 28876e11887b99940b986591eb40228faf53bb57a162Amith Yamasani } 28886e11887b99940b986591eb40228faf53bb57a162Amith Yamasani } 28896e11887b99940b986591eb40228faf53bb57a162Amith Yamasani } 28906e11887b99940b986591eb40228faf53bb57a162Amith Yamasani return privilegedPackages; 28916e11887b99940b986591eb40228faf53bb57a162Amith Yamasani } 28926e11887b99940b986591eb40228faf53bb57a162Amith Yamasani 2893b564aaeff3b6c4b20c899b8c254e4622b691d0cfWink Saville private String getIccId(int subId) { 2894356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 2895356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe UiccCard card = phone == null ? null : phone.getUiccCard(); 289697ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan if (card == null) { 289797ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan loge("getIccId: No UICC"); 289897ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan return null; 289997ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan } 290097ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan String iccId = card.getIccId(); 290197ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan if (TextUtils.isEmpty(iccId)) { 290297ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan loge("getIccId: ICC ID is null or empty."); 290397ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan return null; 290497ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan } 290597ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan return iccId; 290697ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan } 290797ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan 2908eb6439a7bd453313f7ed7972d30e2478243801ffShishir Agrawal @Override 290985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey public boolean setLine1NumberForDisplayForSubscriber(int subId, String alphaTag, 291085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey String number) { 2911c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceCarrierPrivilege(subId); 291297ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan 291385190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String iccId = getIccId(subId); 2914356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final Phone phone = getPhone(subId); 2915356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe if (phone == null) { 2916356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe return false; 2917356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe } 2918356d76380ebed2bdb3b2abac40e55c073ceefb83Sanket Padawe final String subscriberId = phone.getSubscriberId(); 291985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 292085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (DBG_MERGE) { 292185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey Slog.d(LOG_TAG, "Setting line number for ICC=" + iccId + ", subscriberId=" 292285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey + subscriberId + " to " + number); 292385190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 292485190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 2925495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal if (TextUtils.isEmpty(iccId)) { 2926495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal return false; 2927495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal } 292897ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan 292985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final SharedPreferences.Editor editor = mTelephonySharedPreferences.edit(); 293085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 293185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String alphaTagPrefKey = PREF_CARRIERS_ALPHATAG_PREFIX + iccId; 2932495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal if (alphaTag == null) { 2933495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal editor.remove(alphaTagPrefKey); 2934495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal } else { 2935495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal editor.putString(alphaTagPrefKey, alphaTag); 293697ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan } 2937495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal 293885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey // Record both the line number and IMSI for this ICCID, since we need to 293985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey // track all merged IMSIs based on line number 294085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String numberPrefKey = PREF_CARRIERS_NUMBER_PREFIX + iccId; 294185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String subscriberPrefKey = PREF_CARRIERS_SUBSCRIBER_PREFIX + iccId; 2942495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal if (number == null) { 2943495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal editor.remove(numberPrefKey); 294485190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey editor.remove(subscriberPrefKey); 2945495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal } else { 2946495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal editor.putString(numberPrefKey, number); 294785190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey editor.putString(subscriberPrefKey, subscriberId); 2948495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal } 294985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 2950495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal editor.commit(); 2951495d7e1f6af536095cf90d7299b64e47c8323dfcShishir Agrawal return true; 29527226c84acb402f96e527650347391fa025294350Derek Tan } 29537226c84acb402f96e527650347391fa025294350Derek Tan 29547226c84acb402f96e527650347391fa025294350Derek Tan @Override 2955b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov public String getLine1NumberForDisplay(int subId, String callingPackage) { 2956fee69345c86d13b46e9e1d1e36178ebef17538eeMakoto Onuki // This is open to apps with WRITE_SMS. 2957fee69345c86d13b46e9e1d1e36178ebef17538eeMakoto Onuki if (!canReadPhoneNumber(callingPackage, "getLine1NumberForDisplay")) { 29589cf11515781910c7fda66a8a27a0fa14ab1ed2afAmit Mahajan if (DBG_MERGE) log("getLine1NumberForDisplay returning null due to permission"); 2959b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov return null; 2960b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov } 296197ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan 296297ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan String iccId = getIccId(subId); 296397ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan if (iccId != null) { 296497ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan String numberPrefKey = PREF_CARRIERS_NUMBER_PREFIX + iccId; 29659cf11515781910c7fda66a8a27a0fa14ab1ed2afAmit Mahajan if (DBG_MERGE) { 29669cf11515781910c7fda66a8a27a0fa14ab1ed2afAmit Mahajan log("getLine1NumberForDisplay returning " + 29679cf11515781910c7fda66a8a27a0fa14ab1ed2afAmit Mahajan mTelephonySharedPreferences.getString(numberPrefKey, null)); 29689cf11515781910c7fda66a8a27a0fa14ab1ed2afAmit Mahajan } 2969df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee return mTelephonySharedPreferences.getString(numberPrefKey, null); 29707226c84acb402f96e527650347391fa025294350Derek Tan } 29719cf11515781910c7fda66a8a27a0fa14ab1ed2afAmit Mahajan if (DBG_MERGE) log("getLine1NumberForDisplay returning null as iccId is null"); 297297ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan return null; 29737226c84acb402f96e527650347391fa025294350Derek Tan } 29747226c84acb402f96e527650347391fa025294350Derek Tan 29757226c84acb402f96e527650347391fa025294350Derek Tan @Override 2976b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov public String getLine1AlphaTagForDisplay(int subId, String callingPackage) { 2977b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov if (!canReadPhoneState(callingPackage, "getLine1AlphaTagForDisplay")) { 2978b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov return null; 2979b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov } 298097ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan 298197ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan String iccId = getIccId(subId); 298297ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan if (iccId != null) { 298397ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan String alphaTagPrefKey = PREF_CARRIERS_ALPHATAG_PREFIX + iccId; 2984df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee return mTelephonySharedPreferences.getString(alphaTagPrefKey, null); 29857226c84acb402f96e527650347391fa025294350Derek Tan } 298697ebb427fc22f1f14eab7c79745dfcbf2eb2ff7aDerek Tan return null; 29877226c84acb402f96e527650347391fa025294350Derek Tan } 2988b1ebf8c3755b7e1cb207cbd49f6c8bdfa3566668Shishir Agrawal 2989b1ebf8c3755b7e1cb207cbd49f6c8bdfa3566668Shishir Agrawal @Override 29908e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov public String[] getMergedSubscriberIds(String callingPackage) { 29918e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov if (!canReadPhoneState(callingPackage, "getMergedSubscriberIds")) { 29928e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov return null; 29938e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov } 299485190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final Context context = mPhone.getContext(); 299585190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final TelephonyManager tele = TelephonyManager.from(context); 299685190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final SubscriptionManager sub = SubscriptionManager.from(context); 299785190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 299885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey // Figure out what subscribers are currently active 299985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final ArraySet<String> activeSubscriberIds = new ArraySet<>(); 30008e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov // Clear calling identity, when calling TelephonyManager, because callerUid must be 30018e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov // the process, where TelephonyManager was instantiated. Otherwise AppOps check will fail. 30028e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov final long identity = Binder.clearCallingIdentity(); 30038e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov try { 30048e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov final int[] subIds = sub.getActiveSubscriptionIdList(); 30058e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov for (int subId : subIds) { 30068e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov activeSubscriberIds.add(tele.getSubscriberId(subId)); 30078e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov } 30088e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov } finally { 30098e53b0bd5f402210bd0187da70a6b2ecc14a296bFyodor Kupolov Binder.restoreCallingIdentity(identity); 301085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 301185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 301285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey // First pass, find a number override for an active subscriber 301385190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey String mergeNumber = null; 301485190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final Map<String, ?> prefs = mTelephonySharedPreferences.getAll(); 301585190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey for (String key : prefs.keySet()) { 301685190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (key.startsWith(PREF_CARRIERS_SUBSCRIBER_PREFIX)) { 301785190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String subscriberId = (String) prefs.get(key); 301885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (activeSubscriberIds.contains(subscriberId)) { 301985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String iccId = key.substring(PREF_CARRIERS_SUBSCRIBER_PREFIX.length()); 302085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String numberKey = PREF_CARRIERS_NUMBER_PREFIX + iccId; 302185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey mergeNumber = (String) prefs.get(numberKey); 302285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (DBG_MERGE) { 302385190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey Slog.d(LOG_TAG, "Found line number " + mergeNumber 302485190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey + " for active subscriber " + subscriberId); 302585190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 302685190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (!TextUtils.isEmpty(mergeNumber)) { 302785190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey break; 302885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 302985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 303085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 303185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 303285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 303385190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey // Shortcut when no active merged subscribers 303485190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (TextUtils.isEmpty(mergeNumber)) { 303585190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey return null; 303685190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 303785190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 303885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey // Second pass, find all subscribers under that line override 303985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final ArraySet<String> result = new ArraySet<>(); 304085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey for (String key : prefs.keySet()) { 304185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (key.startsWith(PREF_CARRIERS_NUMBER_PREFIX)) { 304285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String number = (String) prefs.get(key); 304385190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (mergeNumber.equals(number)) { 304485190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String iccId = key.substring(PREF_CARRIERS_NUMBER_PREFIX.length()); 304585190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String subscriberKey = PREF_CARRIERS_SUBSCRIBER_PREFIX + iccId; 304685190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String subscriberId = (String) prefs.get(subscriberKey); 304785190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (!TextUtils.isEmpty(subscriberId)) { 304885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey result.add(subscriberId); 304985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 305085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 305185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 305285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 305385190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 305485190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey final String[] resultArray = result.toArray(new String[result.size()]); 305585190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey Arrays.sort(resultArray); 305685190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey if (DBG_MERGE) { 305785190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey Slog.d(LOG_TAG, "Found subscribers " + Arrays.toString(resultArray) + " after merge"); 305885190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 305985190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey return resultArray; 306085190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey } 306185190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey 306285190e62b6d44db4454891cd98c7e5ead04e8e1bJeff Sharkey @Override 3063c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal public boolean setOperatorBrandOverride(int subId, String brand) { 3064c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceCarrierPrivilege(subId); 3065c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal final Phone phone = getPhone(subId); 3066c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal return phone == null ? false : phone.setOperatorBrandOverride(brand); 3067b1ebf8c3755b7e1cb207cbd49f6c8bdfa3566668Shishir Agrawal } 30684bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu 30694bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu @Override 3070c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal public boolean setRoamingOverride(int subId, List<String> gsmRoamingList, 3071621a47c9ff058ac6a735ee5347c45ec30b0236baShishir Agrawal List<String> gsmNonRoamingList, List<String> cdmaRoamingList, 3072621a47c9ff058ac6a735ee5347c45ec30b0236baShishir Agrawal List<String> cdmaNonRoamingList) { 3073c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal enforceCarrierPrivilege(subId); 3074c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal final Phone phone = getPhone(subId); 3075c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal if (phone == null) { 3076c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal return false; 3077c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal } 3078c04d97533f4d8e9b5d344a2128062f05f4bdecd1Shishir Agrawal return phone.setRoamingOverride(gsmRoamingList, gsmNonRoamingList, cdmaRoamingList, 3079621a47c9ff058ac6a735ee5347c45ec30b0236baShishir Agrawal cdmaNonRoamingList); 3080621a47c9ff058ac6a735ee5347c45ec30b0236baShishir Agrawal } 3081621a47c9ff058ac6a735ee5347c45ec30b0236baShishir Agrawal 3082621a47c9ff058ac6a735ee5347c45ec30b0236baShishir Agrawal @Override 3083f43fe46d8393c39dccad2dc912ec95e8c1ca013aAmit Mahajan @Deprecated 30844bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu public int invokeOemRilRequestRaw(byte[] oemReq, byte[] oemResp) { 30854bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu enforceModifyPermission(); 30864bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu 30874bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu int returnValue = 0; 30884bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu try { 30894bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu AsyncResult result = (AsyncResult)sendRequest(CMD_INVOKE_OEM_RIL_REQUEST_RAW, oemReq); 30904bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu if(result.exception == null) { 30914bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu if (result.result != null) { 30924bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu byte[] responseData = (byte[])(result.result); 30934bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu if(responseData.length > oemResp.length) { 30944bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu Log.w(LOG_TAG, "Buffer to copy response too small: Response length is " + 30954bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu responseData.length + "bytes. Buffer Size is " + 30964bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu oemResp.length + "bytes."); 30974bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu } 30984bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu System.arraycopy(responseData, 0, oemResp, 0, responseData.length); 30994bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu returnValue = responseData.length; 31004bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu } 31014bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu } else { 31024bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu CommandException ex = (CommandException) result.exception; 31034bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu returnValue = ex.getCommandError().ordinal(); 31044bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu if(returnValue > 0) returnValue *= -1; 31054bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu } 31064bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu } catch (RuntimeException e) { 31074bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu Log.w(LOG_TAG, "sendOemRilRequestRaw: Runtime Exception"); 31084bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu returnValue = (CommandException.Error.GENERIC_FAILURE.ordinal()); 31094bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu if(returnValue > 0) returnValue *= -1; 31104bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu } 31114bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu 31124bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu return returnValue; 31134bf01bc69fe97b9675463978cf5a2afff26fcccbSteven Liu } 31145d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville 31155d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville @Override 31165d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville public void setRadioCapability(RadioAccessFamily[] rafs) { 31175d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville try { 31185d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville ProxyController.getInstance().setRadioCapability(rafs); 31195d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville } catch (RuntimeException e) { 31205d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville Log.w(LOG_TAG, "setRadioCapability: Runtime Exception"); 31215d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville } 31225d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville } 31235d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville 31245d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville @Override 312536b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt public int getRadioAccessFamily(int phoneId, String callingPackage) { 312636b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt if (!canReadPhoneState(callingPackage, "getRadioAccessFamily")) { 312736b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt return RadioAccessFamily.RAF_UNKNOWN; 312836b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt } 312936b23afecddd082056dc1ce65e38c38f2805ca84Robert Greenwalt 31305d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville return ProxyController.getInstance().getRadioAccessFamily(phoneId); 31315d475dda0d2c2a220b8e33e77f9a40f5983c75b9Wink Saville } 3132df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee 3133df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee @Override 3134df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee public void enableVideoCalling(boolean enable) { 3135df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee enforceModifyPermission(); 3136fdd69de7a5d886baa4310a6792858722a8f18f16Tyler Gunn ImsManager.setVtSetting(mPhone.getContext(), enable); 3137df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee } 3138df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee 3139df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee @Override 3140b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov public boolean isVideoCallingEnabled(String callingPackage) { 3141b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov if (!canReadPhoneState(callingPackage, "isVideoCallingEnabled")) { 3142b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov return false; 3143b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov } 3144b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov 314577527ac0cdad089f51530066f5248cb7925dd365Andrew Lee // Check the user preference and the system-level IMS setting. Even if the user has 314677527ac0cdad089f51530066f5248cb7925dd365Andrew Lee // enabled video calling, if IMS is disabled we aren't able to support video calling. 314777527ac0cdad089f51530066f5248cb7925dd365Andrew Lee // In the long run, we may instead need to check if there exists a connection service 314877527ac0cdad089f51530066f5248cb7925dd365Andrew Lee // which can support video calling. 3149312e8177b25ab359627685d449e0a5fdb539809fAndrew Lee return ImsManager.isVtEnabledByPlatform(mPhone.getContext()) 3150312e8177b25ab359627685d449e0a5fdb539809fAndrew Lee && ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext()) 3151fdd69de7a5d886baa4310a6792858722a8f18f16Tyler Gunn && ImsManager.isVtEnabledByUser(mPhone.getContext()); 3152df14ead5c9ddb3120a6841552db54d4713058d3bAndrew Lee } 3153afe8264bd1241982c39c86f40d0fd08f0888c824Libin.Tang@motorola.com 3154a1239f2604b7fed20970aadf7496d6e12ba7ceaeAndrew Lee @Override 3155a1239f2604b7fed20970aadf7496d6e12ba7ceaeAndrew Lee public boolean canChangeDtmfToneLength() { 31569504c6b5c5c7072f72d8a9e6df59dbda8a6ccbe4Jonathan Basseri return mApp.getCarrierConfig().getBoolean(CarrierConfigManager.KEY_DTMF_TYPE_ENABLED_BOOL); 3157a1239f2604b7fed20970aadf7496d6e12ba7ceaeAndrew Lee } 3158a1239f2604b7fed20970aadf7496d6e12ba7ceaeAndrew Lee 3159a1239f2604b7fed20970aadf7496d6e12ba7ceaeAndrew Lee @Override 3160a1239f2604b7fed20970aadf7496d6e12ba7ceaeAndrew Lee public boolean isWorldPhone() { 31619504c6b5c5c7072f72d8a9e6df59dbda8a6ccbe4Jonathan Basseri return mApp.getCarrierConfig().getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL); 3162a1239f2604b7fed20970aadf7496d6e12ba7ceaeAndrew Lee } 3163a1239f2604b7fed20970aadf7496d6e12ba7ceaeAndrew Lee 31649431b838f89399db2278c0436bd2817322a45f74Andrew Lee @Override 31659431b838f89399db2278c0436bd2817322a45f74Andrew Lee public boolean isTtyModeSupported() { 31669431b838f89399db2278c0436bd2817322a45f74Andrew Lee TelecomManager telecomManager = TelecomManager.from(mPhone.getContext()); 31679431b838f89399db2278c0436bd2817322a45f74Andrew Lee TelephonyManager telephonyManager = 31689431b838f89399db2278c0436bd2817322a45f74Andrew Lee (TelephonyManager) mPhone.getContext().getSystemService(Context.TELEPHONY_SERVICE); 31691f82f7a0d499ff76677d4479487c689beeb81691Wooki Wu return telecomManager.isTtySupported(); 31709431b838f89399db2278c0436bd2817322a45f74Andrew Lee } 31719431b838f89399db2278c0436bd2817322a45f74Andrew Lee 31729431b838f89399db2278c0436bd2817322a45f74Andrew Lee @Override 31739431b838f89399db2278c0436bd2817322a45f74Andrew Lee public boolean isHearingAidCompatibilitySupported() { 31749431b838f89399db2278c0436bd2817322a45f74Andrew Lee return mPhone.getContext().getResources().getBoolean(R.bool.hac_enabled); 31759431b838f89399db2278c0436bd2817322a45f74Andrew Lee } 31769431b838f89399db2278c0436bd2817322a45f74Andrew Lee 31777310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe /** 31787310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe * Returns the unique device ID of phone, for example, the IMEI for 31797310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe * GSM and the MEID for CDMA phones. Return null if device ID is not available. 31807310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe * 31817310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe * <p>Requires Permission: 31827310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 31837310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe */ 31847310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe @Override 3185b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov public String getDeviceId(String callingPackage) { 3186b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov if (!canReadPhoneState(callingPackage, "getDeviceId")) { 3187b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov return null; 3188b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov } 3189b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov 31907310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe final Phone phone = PhoneFactory.getPhone(0); 31917310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe if (phone != null) { 31927310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe return phone.getDeviceId(); 31937310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe } else { 31947310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe return null; 31957310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe } 31967310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe } 31977310cc789b2efe4674e75bb8255373ab0c5a6881Sanket Padawe 3198afe8264bd1241982c39c86f40d0fd08f0888c824Libin.Tang@motorola.com /* 3199afe8264bd1241982c39c86f40d0fd08f0888c824Libin.Tang@motorola.com * {@hide} 3200afe8264bd1241982c39c86f40d0fd08f0888c824Libin.Tang@motorola.com * Returns the IMS Registration Status 3201afe8264bd1241982c39c86f40d0fd08f0888c824Libin.Tang@motorola.com */ 32027a1885ba88b4ca833d6dae8b352097636f242917Santos Cordon @Override 3203afe8264bd1241982c39c86f40d0fd08f0888c824Libin.Tang@motorola.com public boolean isImsRegistered() { 3204afe8264bd1241982c39c86f40d0fd08f0888c824Libin.Tang@motorola.com return mPhone.isImsRegistered(); 3205afe8264bd1241982c39c86f40d0fd08f0888c824Libin.Tang@motorola.com } 32067a1885ba88b4ca833d6dae8b352097636f242917Santos Cordon 32077a1885ba88b4ca833d6dae8b352097636f242917Santos Cordon @Override 32087a1885ba88b4ca833d6dae8b352097636f242917Santos Cordon public int getSubIdForPhoneAccount(PhoneAccount phoneAccount) { 32097a1885ba88b4ca833d6dae8b352097636f242917Santos Cordon return PhoneUtils.getSubIdForPhoneAccount(phoneAccount); 32107a1885ba88b4ca833d6dae8b352097636f242917Santos Cordon } 3211dcfc793ddff32e3fd5ab49db2647d7b08fc4d29cNathan Harold 3212c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold /* 3213c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold * {@hide} 3214c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold * Returns the IMS Registration Status 3215c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold */ 32163b7a1bce40307becff28763f505faeffa927d577Etan Cohen public boolean isWifiCallingAvailable() { 3217c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold return mPhone.isWifiCallingEnabled(); 3218c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold } 3219c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold 3220c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold /* 3221c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold * {@hide} 3222c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold * Returns the IMS Registration Status 3223c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold */ 32243b7a1bce40307becff28763f505faeffa927d577Etan Cohen public boolean isVolteAvailable() { 3225c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold return mPhone.isVolteEnabled(); 3226c55097a922f316dd97084bce196335b64c6a55b0Nathan Harold } 3227b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov 32283b7a1bce40307becff28763f505faeffa927d577Etan Cohen /* 32293b7a1bce40307becff28763f505faeffa927d577Etan Cohen * {@hide} Returns the IMS Registration Status 32303b7a1bce40307becff28763f505faeffa927d577Etan Cohen */ 32313b7a1bce40307becff28763f505faeffa927d577Etan Cohen public boolean isVideoTelephonyAvailable() { 32323b7a1bce40307becff28763f505faeffa927d577Etan Cohen return mPhone.isVideoEnabled(); 32333b7a1bce40307becff28763f505faeffa927d577Etan Cohen } 32343b7a1bce40307becff28763f505faeffa927d577Etan Cohen 3235b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov private boolean canReadPhoneState(String callingPackage, String message) { 3236921655c60d4b464b8f4add98e0e5fb3ca48cccd4Etan Cohen try { 323783ea23b90597f39f5f8f899023ae099eab0e98e2Amit Mahajan mApp.enforceCallingOrSelfPermission( 3238921655c60d4b464b8f4add98e0e5fb3ca48cccd4Etan Cohen android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, message); 3239921655c60d4b464b8f4add98e0e5fb3ca48cccd4Etan Cohen 324083ea23b90597f39f5f8f899023ae099eab0e98e2Amit Mahajan // SKIP checking for run-time permission since caller or self has PRIVILEDGED permission 3241921655c60d4b464b8f4add98e0e5fb3ca48cccd4Etan Cohen return true; 3242785783f758260e5d23633317f1a286a89d66090dAmit Mahajan } catch (SecurityException e) { 3243785783f758260e5d23633317f1a286a89d66090dAmit Mahajan mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE, 3244785783f758260e5d23633317f1a286a89d66090dAmit Mahajan message); 3245921655c60d4b464b8f4add98e0e5fb3ca48cccd4Etan Cohen } 3246b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov 3247b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), 3248b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov callingPackage) != AppOpsManager.MODE_ALLOWED) { 3249b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov return false; 3250b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov } 3251b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov 3252b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov return true; 3253b320e187c6eddc4a9d5f31d397f52500d38b4c05Svet Ganov } 32548eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott 3255fee69345c86d13b46e9e1d1e36178ebef17538eeMakoto Onuki /** 3256b9b49787246b0b82e9fb5c6638be524438716accAmit Mahajan * Besides READ_PHONE_STATE, WRITE_SMS and READ_SMS also allow apps to get phone numbers. 3257fee69345c86d13b46e9e1d1e36178ebef17538eeMakoto Onuki */ 3258fee69345c86d13b46e9e1d1e36178ebef17538eeMakoto Onuki private boolean canReadPhoneNumber(String callingPackage, String message) { 3259e4072d10b761c7e167c4f9b5d7570c6417c1d054Makoto Onuki // Default SMS app can always read it. 3260e4072d10b761c7e167c4f9b5d7570c6417c1d054Makoto Onuki if (mAppOps.noteOp(AppOpsManager.OP_WRITE_SMS, 3261e4072d10b761c7e167c4f9b5d7570c6417c1d054Makoto Onuki Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED) { 3262e4072d10b761c7e167c4f9b5d7570c6417c1d054Makoto Onuki return true; 3263e4072d10b761c7e167c4f9b5d7570c6417c1d054Makoto Onuki } 32647a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker 3265e4072d10b761c7e167c4f9b5d7570c6417c1d054Makoto Onuki try { 3266e4072d10b761c7e167c4f9b5d7570c6417c1d054Makoto Onuki return canReadPhoneState(callingPackage, message); 3267b9b49787246b0b82e9fb5c6638be524438716accAmit Mahajan } catch (SecurityException readPhoneStateSecurityException) { 32687a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker } 32697a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker // Can be read with READ_SMS too. 32707a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker try { 32717a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_SMS, message); 32727a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker int opCode = mAppOps.permissionToOpCode(android.Manifest.permission.READ_SMS); 32737a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker if (opCode != AppOpsManager.OP_NONE) { 32747a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker return mAppOps.noteOp(opCode, Binder.getCallingUid(), callingPackage) 32757a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker == AppOpsManager.MODE_ALLOWED; 32767a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker } else { 32777a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker return true; 3278b9b49787246b0b82e9fb5c6638be524438716accAmit Mahajan } 32797a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker } catch (SecurityException readSmsSecurityException) { 3280e4072d10b761c7e167c4f9b5d7570c6417c1d054Makoto Onuki } 3281f342a983401126326e6c10001303cb940b12a696Chad Brubaker // Can be read with READ_PHONE_NUMBERS too. 32827a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker try { 3283f342a983401126326e6c10001303cb940b12a696Chad Brubaker mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_NUMBERS, 32847a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker message); 3285f342a983401126326e6c10001303cb940b12a696Chad Brubaker int opCode = mAppOps.permissionToOpCode(android.Manifest.permission.READ_PHONE_NUMBERS); 32867a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker if (opCode != AppOpsManager.OP_NONE) { 32877a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker return mAppOps.noteOp(opCode, Binder.getCallingUid(), callingPackage) 32887a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker == AppOpsManager.MODE_ALLOWED; 32897a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker } else { 32907a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker return true; 32917a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker } 32927a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker } catch (SecurityException readPhoneNumberSecurityException) { 32937a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker } 32947a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker 32957a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker throw new SecurityException(message + ": Neither user " + Binder.getCallingUid() + 32967a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker " nor current process has" + android.Manifest.permission.READ_PHONE_STATE + 32977a8fba2e22f3a3ab23eeb839bfaa792f1d5ac5b0Chad Brubaker ", " + android.Manifest.permission.READ_SMS + ", or " + 3298f342a983401126326e6c10001303cb940b12a696Chad Brubaker android.Manifest.permission.READ_PHONE_NUMBERS); 3299fee69345c86d13b46e9e1d1e36178ebef17538eeMakoto Onuki } 3300fee69345c86d13b46e9e1d1e36178ebef17538eeMakoto Onuki 33018eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott @Override 33028eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott public void factoryReset(int subId) { 33038eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott enforceConnectivityInternalPermission(); 3304981d85874294656a51683ae6ecc6ba312d3635ceStuart Scott if (mUserManager.hasUserRestriction(UserManager.DISALLOW_NETWORK_RESET)) { 3305981d85874294656a51683ae6ecc6ba312d3635ceStuart Scott return; 3306981d85874294656a51683ae6ecc6ba312d3635ceStuart Scott } 3307981d85874294656a51683ae6ecc6ba312d3635ceStuart Scott 3308cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov final long identity = Binder.clearCallingIdentity(); 3309cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov try { 3310981d85874294656a51683ae6ecc6ba312d3635ceStuart Scott if (SubscriptionManager.isUsableSubIdValue(subId) && !mUserManager.hasUserRestriction( 3311981d85874294656a51683ae6ecc6ba312d3635ceStuart Scott UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) { 3312cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov // Enable data 3313cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov setDataEnabled(subId, true); 3314cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov // Set network selection mode to automatic 3315cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov setNetworkSelectionModeAutomatic(subId); 3316cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov // Set preferred mobile network type to the best available 3317cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov setPreferredNetworkType(subId, Phone.PREFERRED_NT_MODE); 3318cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov // Turn off roaming 3319cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov SubscriptionManager.from(mApp).setDataRoaming(0, subId); 3320cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov } 3321cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov } finally { 3322cc087f8219bf8dd606a46a18a2b0f57079c7ff8aSvet Ganov Binder.restoreCallingIdentity(identity); 33238eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott } 33248eef64f25181774c3112892ca222af3c1cf259c7Stuart Scott } 33251c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath 33261c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath @Override 33271c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath public String getLocaleFromDefaultSim() { 33281c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath // We query all subscriptions instead of just the active ones, because 33291c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath // this might be called early on in the provisioning flow when the 33301c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath // subscriptions potentially aren't active yet. 33311c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath final List<SubscriptionInfo> slist = getAllSubscriptionInfoList(); 33321c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath if (slist == null || slist.isEmpty()) { 33331c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath return null; 33341c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33351c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath 33361c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath // This function may be called very early, say, from the setup wizard, at 33371c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath // which point we won't have a default subscription set. If that's the case 33381c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath // we just choose the first, which will be valid in "most cases". 33391c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath final int defaultSubId = getDefaultSubscription(); 33401c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath SubscriptionInfo info = null; 33411c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { 33421c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath info = slist.get(0); 33431c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } else { 33441c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath for (SubscriptionInfo item : slist) { 33451c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath if (item.getSubscriptionId() == defaultSubId) { 33461c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath info = item; 33471c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath break; 33481c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33491c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33501c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath 33511c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath if (info == null) { 33521c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath return null; 33531c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33541c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33551c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath 33561c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath // Try and fetch the locale from the carrier properties or from the SIM language 33571c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath // preferences (EF-PL and EF-LI)... 3358183b2de07cb23d8bdf68d14e25cdae96c905b37bTony Hill final int mcc = info.getMcc(); 33591c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath final Phone defaultPhone = getPhone(info.getSubscriptionId()); 3360011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath String simLanguage = null; 33611c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath if (defaultPhone != null) { 33621c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath final Locale localeFromDefaultSim = defaultPhone.getLocaleFromSimAndCarrierPrefs(); 33631c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath if (localeFromDefaultSim != null) { 3364011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath if (!localeFromDefaultSim.getCountry().isEmpty()) { 3365183b2de07cb23d8bdf68d14e25cdae96c905b37bTony Hill if (DBG) log("Using locale from default SIM:" + localeFromDefaultSim); 3366183b2de07cb23d8bdf68d14e25cdae96c905b37bTony Hill return localeFromDefaultSim.toLanguageTag(); 3367011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath } else { 3368011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath simLanguage = localeFromDefaultSim.getLanguage(); 3369183b2de07cb23d8bdf68d14e25cdae96c905b37bTony Hill } 33701c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33711c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33721c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath 3373011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath // The SIM language preferences only store a language (e.g. fr = French), not an 3374011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath // exact locale (e.g. fr_FR = French/France). So, if the locale returned from 3375011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath // the SIM and carrier preferences does not include a country we add the country 3376011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath // determined from the SIM MCC to provide an exact locale. 3377011676f979e1f0c8fd2d042a38e21cde5852789eNarayan Kamath final Locale mccLocale = MccTable.getLocaleFromMcc(mPhone.getContext(), mcc, simLanguage); 3378183b2de07cb23d8bdf68d14e25cdae96c905b37bTony Hill if (mccLocale != null) { 3379183b2de07cb23d8bdf68d14e25cdae96c905b37bTony Hill if (DBG) log("No locale from default SIM, using mcc locale:" + mccLocale); 3380183b2de07cb23d8bdf68d14e25cdae96c905b37bTony Hill return mccLocale.toLanguageTag(); 33811c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33821c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath 3383183b2de07cb23d8bdf68d14e25cdae96c905b37bTony Hill if (DBG) log("No locale found - returning null"); 33841c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath return null; 33851c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33861c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath 33871c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath private List<SubscriptionInfo> getAllSubscriptionInfoList() { 33881c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath final long identity = Binder.clearCallingIdentity(); 33891c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath try { 33901c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath return mSubscriptionController.getAllSubInfoList( 33911c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath mPhone.getContext().getOpPackageName()); 33921c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } finally { 33931c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath Binder.restoreCallingIdentity(identity); 33941c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33951c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 33961c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath 33971c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath private List<SubscriptionInfo> getActiveSubscriptionInfoList() { 33981c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath final long identity = Binder.clearCallingIdentity(); 33991c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath try { 34001c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath return mSubscriptionController.getActiveSubscriptionInfoList( 34011c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath mPhone.getContext().getOpPackageName()); 34021c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } finally { 34031c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath Binder.restoreCallingIdentity(identity); 34041c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 34051c496c28c4122c00f3c54ce8717fb767d1421bf6Narayan Kamath } 34067fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham 34077fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham /** 3408903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski * Responds to the ResultReceiver with the {@link android.telephony.ModemActivityInfo} object 3409903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski * representing the state of the modem. 3410903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski * 3411903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski * NOTE: This clears the modem state, so there should only every be one caller. 3412903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski * @hide 34137fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham */ 34147fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham @Override 3415903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski public void requestModemActivityInfo(ResultReceiver result) { 3416903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski enforceModifyPermission(); 3417903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski 3418903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski ModemActivityInfo info = (ModemActivityInfo) sendRequest(CMD_GET_MODEM_ACTIVITY_INFO, null); 3419903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski Bundle bundle = new Bundle(); 3420903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski bundle.putParcelable(TelephonyManager.MODEM_ACTIVITY_RESULT_KEY, info); 3421903a54c1c2e9eaab5f44323f0c1d5537c0ab7ff4Adam Lesinski result.send(0, bundle); 34227fcff6902e3a8b5f54c5020edbbb8818dfcdcbffPrerepa Viswanadham } 342385bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu 342485bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu /** 342585bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu * {@hide} 342685bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu * Returns the service state information on specified subscription. 342785bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu */ 342885bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu @Override 342985bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu public ServiceState getServiceStateForSubscriber(int subId, String callingPackage) { 343085bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu 343185bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu if (!canReadPhoneState(callingPackage, "getServiceStateForSubscriber")) { 343285bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu return null; 343385bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu } 343485bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu 343585bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu final Phone phone = getPhone(subId); 343685bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu if (phone == null) { 343785bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu return null; 343885bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu } 343985bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu 344085bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu return phone.getServiceState(); 344185bd38aeae4a6c8ab2b780be7212ec5d005dd384Jack Yu } 344231f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen 344331f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen /** 344431f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * Returns the URI for the per-account voicemail ringtone set in Phone settings. 344531f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * 344631f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * @param accountHandle The handle for the {@link PhoneAccount} for which to retrieve the 344731f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * voicemail ringtone. 344831f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * @return The URI for the ringtone to play when receiving a voicemail from a specific 344931f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * PhoneAccount. 345031f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen */ 345131f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen @Override 345231f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen public Uri getVoicemailRingtoneUri(PhoneAccountHandle accountHandle) { 345300b4ab5b42f687bad66026805e1c0b18a0c14b6eTa-wei Yen Phone phone = PhoneUtils.getPhoneForPhoneAccountHandle(accountHandle); 345431f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen if (phone == null) { 345500b4ab5b42f687bad66026805e1c0b18a0c14b6eTa-wei Yen phone = mPhone; 345631f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen } 345731f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen 34587ed723db509e6fa86b96fa3d7fd6291ab142cb52fionaxu return VoicemailNotificationSettingsUtil.getRingtoneUri(phone.getContext()); 345931f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen } 346031f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen 346131f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen /** 3462c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * Sets the per-account voicemail ringtone. 3463c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * 3464c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * <p>Requires that the calling app is the default dialer, or has carrier privileges, or 3465c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * has permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. 3466c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * 3467c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the 3468c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * voicemail ringtone. 3469c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * @param uri The URI for the ringtone to play when receiving a voicemail from a specific 3470c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * PhoneAccount. 3471c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen */ 3472c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen @Override 3473c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen public void setVoicemailRingtoneUri(String callingPackage, 3474c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen PhoneAccountHandle phoneAccountHandle, Uri uri) { 3475c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 3476c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen if (!TextUtils.equals(callingPackage, 3477c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen TelecomManager.from(mPhone.getContext()).getDefaultDialerPackage())) { 3478c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen enforceModifyPermissionOrCarrierPrivilege( 3479c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle)); 3480c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen } 3481c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen Phone phone = PhoneUtils.getPhoneForPhoneAccountHandle(phoneAccountHandle); 3482c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen if (phone == null){ 348300b4ab5b42f687bad66026805e1c0b18a0c14b6eTa-wei Yen phone = mPhone; 3484c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen } 34857ed723db509e6fa86b96fa3d7fd6291ab142cb52fionaxu VoicemailNotificationSettingsUtil.setRingtoneUri(phone.getContext(), uri); 3486c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen } 3487c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen 3488c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen /** 348931f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * Returns whether vibration is set for voicemail notification in Phone settings. 349031f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * 349131f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * @param accountHandle The handle for the {@link PhoneAccount} for which to retrieve the 349231f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * voicemail vibration setting. 349331f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen * @return {@code true} if the vibration is set for this PhoneAccount, {@code false} otherwise. 349431f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen */ 349531f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen @Override 349631f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen public boolean isVoicemailVibrationEnabled(PhoneAccountHandle accountHandle) { 349700b4ab5b42f687bad66026805e1c0b18a0c14b6eTa-wei Yen Phone phone = PhoneUtils.getPhoneForPhoneAccountHandle(accountHandle); 349831f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen if (phone == null) { 349900b4ab5b42f687bad66026805e1c0b18a0c14b6eTa-wei Yen phone = mPhone; 350031f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen } 350131f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen 35027ed723db509e6fa86b96fa3d7fd6291ab142cb52fionaxu return VoicemailNotificationSettingsUtil.isVibrationEnabled(phone.getContext()); 350331f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen } 350431f9ba14fc404ce4baa7e5cba6bad84ebe4bf124Nancy Chen 3505e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang /** 3506c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * Sets the per-account voicemail vibration. 3507c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * 3508c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * <p>Requires that the calling app is the default dialer, or has carrier privileges, or 3509c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * has permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. 3510c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * 3511c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the 3512c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * voicemail vibration setting. 3513c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * @param enabled Whether to enable or disable vibration for voicemail notifications from a 3514c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen * specific PhoneAccount. 3515c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen */ 3516c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen @Override 3517c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen public void setVoicemailVibrationEnabled(String callingPackage, 3518c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen PhoneAccountHandle phoneAccountHandle, boolean enabled) { 3519c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); 3520c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen if (!TextUtils.equals(callingPackage, 3521c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen TelecomManager.from(mPhone.getContext()).getDefaultDialerPackage())) { 3522c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen enforceModifyPermissionOrCarrierPrivilege( 3523c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle)); 3524c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen } 3525c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen 3526c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen Phone phone = PhoneUtils.getPhoneForPhoneAccountHandle(phoneAccountHandle); 3527c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen if (phone == null){ 352800b4ab5b42f687bad66026805e1c0b18a0c14b6eTa-wei Yen phone = mPhone; 3529c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen } 35307ed723db509e6fa86b96fa3d7fd6291ab142cb52fionaxu VoicemailNotificationSettingsUtil.setVibrationEnabled(phone.getContext(), enabled); 3531c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen } 3532c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen 3533c33877d4d466de546051274dcc5afde1017d18a8Ta-wei Yen /** 3534e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang * Make sure either called from same process as self (phone) or IPC caller has read privilege. 3535e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang * 3536e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang * @throws SecurityException if the caller does not have the required permission 3537e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang */ 3538e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang private void enforceReadPrivilegedPermission() { 3539e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 3540e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang null); 3541e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang } 3542e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang 3543e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang /** 354430a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen * Make sure either called from same process as self (phone) or IPC caller has send SMS 354530a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen * permission. 354630a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen * 354730a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen * @throws SecurityException if the caller does not have the required permission 354830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen */ 354930a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen private void enforceSendSmsPermission() { 355030a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen mApp.enforceCallingOrSelfPermission(permission.SEND_SMS, null); 355130a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } 355230a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen 355330a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen /** 3554527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen * Make sure called from the package in charge of visual voicemail. 355530a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen * 3556527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen * @throws SecurityException if the caller is not the visual voicemail package. 3557527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen */ 3558527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen private void enforceVisualVoicemailPackage(String callingPackage, int subId) { 35595d81b0c432b266a075cfe2ccca4c831cc7076dfdTa-wei Yen ComponentName componentName = 35605d81b0c432b266a075cfe2ccca4c831cc7076dfdTa-wei Yen RemoteVvmTaskManager.getRemotePackage(mPhone.getContext(), subId); 35615d81b0c432b266a075cfe2ccca4c831cc7076dfdTa-wei Yen if(componentName == null) { 35625d81b0c432b266a075cfe2ccca4c831cc7076dfdTa-wei Yen throw new SecurityException("Caller not current active visual voicemail package[null]"); 35635d81b0c432b266a075cfe2ccca4c831cc7076dfdTa-wei Yen } 35645d81b0c432b266a075cfe2ccca4c831cc7076dfdTa-wei Yen String vvmPackage = componentName.getPackageName(); 3565527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen if (!callingPackage.equals(vvmPackage)) { 3566527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen throw new SecurityException("Caller not current active visual voicemail package[" + 3567527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen vvmPackage + "]"); 356830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } 356930a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } 357030a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen 357130a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen /** 3572e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang * Return the application ID for the app type. 3573e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang * 3574e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang * @param subId the subscription ID that this request applies to. 3575e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang * @param appType the uicc app type. 3576e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang * @return Application ID for specificied app type, or null if no uicc. 3577e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang */ 3578e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang @Override 3579e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang public String getAidForAppType(int subId, int appType) { 3580e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang enforceReadPrivilegedPermission(); 3581e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang Phone phone = getPhone(subId); 3582e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang if (phone == null) { 3583e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang return null; 3584e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang } 3585e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang String aid = null; 3586e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang try { 3587e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang aid = UiccController.getInstance().getUiccCard(phone.getPhoneId()) 3588e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang .getApplicationByType(appType).getAid(); 3589e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang } catch (Exception e) { 3590e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang Log.e(LOG_TAG, "Not getting aid. Exception ex=" + e); 3591e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang } 3592e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang return aid; 3593e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang } 3594e64578ad5d155e6d63b1d0e0b8d6677c94594036Youhan Wang 35954001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang /** 35964001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang * Return the Electronic Serial Number. 35974001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang * 35984001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang * @param subId the subscription ID that this request applies to. 35994001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang * @return ESN or null if error. 36004001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang */ 36014001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang @Override 36024001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang public String getEsn(int subId) { 36034001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang enforceReadPrivilegedPermission(); 36044001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang Phone phone = getPhone(subId); 36054001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang if (phone == null) { 36064001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang return null; 36074001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang } 36084001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang String esn = null; 36094001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang try { 36104001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang esn = phone.getEsn(); 36114001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang } catch (Exception e) { 36124001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang Log.e(LOG_TAG, "Not getting ESN. Exception ex=" + e); 36134001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang } 36144001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang return esn; 36154001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang } 36164001d255c5f6f78ab22b9bb01bcb30bb86b5be6eYouhan Wang 361799ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe /** 361866ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang * Return the Preferred Roaming List Version. 361966ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang * 362066ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang * @param subId the subscription ID that this request applies to. 362166ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang * @return PRLVersion or null if error. 362266ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang */ 362366ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang @Override 362466ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang public String getCdmaPrlVersion(int subId) { 362566ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang enforceReadPrivilegedPermission(); 362666ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang Phone phone = getPhone(subId); 362766ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang if (phone == null) { 362866ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang return null; 362966ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang } 363066ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang String cdmaPrlVersion = null; 363166ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang try { 363266ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang cdmaPrlVersion = phone.getCdmaPrlVersion(); 363366ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang } catch (Exception e) { 363466ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang Log.e(LOG_TAG, "Not getting PRLVersion", e); 363566ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang } 363666ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang return cdmaPrlVersion; 363766ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang } 363866ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang 363966ad5d7d8ef18687300d652ac9b52fcb0896c463Youhan Wang /** 364099ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe * Get snapshot of Telephony histograms 364199ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe * @return List of Telephony histograms 364299ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe * @hide 364399ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe */ 364499ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe @Override 364599ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe public List<TelephonyHistogram> getTelephonyHistograms() { 364699ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription()); 364799ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe return RIL.getTelephonyRILTimingHistograms(); 364899ef1e3f6183db6d87e366e410e987ff5e2d1a95Sanket Padawe } 36491a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang 36501a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang /** 36511a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * {@hide} 365213bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe * Set the allowed carrier list for slotIndex 36531a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * Require system privileges. In the future we may add this to carrier APIs. 36541a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * 36551a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * @return The number of carriers set successfully, should match length of carriers 36561a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang */ 36571a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang @Override 365813bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public int setAllowedCarriers(int slotIndex, List<CarrierIdentifier> carriers) { 36591a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang enforceModifyPermission(); 366013bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe 36619b7c4e93d3a22956adb12ec77caecbfaf21a2a8bMeng Wang if (carriers == null) { 36629b7c4e93d3a22956adb12ec77caecbfaf21a2a8bMeng Wang throw new NullPointerException("carriers cannot be null"); 36639b7c4e93d3a22956adb12ec77caecbfaf21a2a8bMeng Wang } 366413bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe 366513bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe int subId = SubscriptionManager.getSubId(slotIndex)[0]; 36661a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang int[] retVal = (int[]) sendRequest(CMD_SET_ALLOWED_CARRIERS, carriers, subId); 36671a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang return retVal[0]; 36681a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 36691a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang 36701a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang /** 36711a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * {@hide} 367213bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe * Get the allowed carrier list for slotIndex. 36731a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * Require system privileges. In the future we may add this to carrier APIs. 36741a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * 36751a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * @return List of {@link android.service.telephony.CarrierIdentifier}; empty list 36761a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang * means all carriers are allowed. 36771a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang */ 36781a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang @Override 367913bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public List<CarrierIdentifier> getAllowedCarriers(int slotIndex) { 36801a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang enforceReadPrivilegedPermission(); 368113bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe int subId = SubscriptionManager.getSubId(slotIndex)[0]; 36821a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang return (List<CarrierIdentifier>) sendRequest(CMD_GET_ALLOWED_CARRIERS, null, subId); 36831a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang } 36841a7c35a7846792c02a57b45957c413fe4a6b07f6Meng Wang 368559545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu /** 368659545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu * Action set from carrier signalling broadcast receivers to enable/disable metered apns 368759545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu * @param subId the subscription ID that this action applies to. 368859545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu * @param enabled control enable or disable metered apns. 368959545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu * {@hide} 369059545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu */ 369159545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu @Override 369259545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu public void carrierActionSetMeteredApnsEnabled(int subId, boolean enabled) { 369359545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu enforceModifyPermission(); 369459545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu final Phone phone = getPhone(subId); 369559545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu if (phone == null) { 369659545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu loge("carrierAction: SetMeteredApnsEnabled fails with invalid subId: " + subId); 369759545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu return; 369859545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu } 369959545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu try { 370059545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu phone.carrierActionSetMeteredApnsEnabled(enabled); 370159545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu } catch (Exception e) { 370259545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu Log.e(LOG_TAG, "carrierAction: SetMeteredApnsEnabled fails. Exception ex=" + e); 370359545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu } 370459545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu } 370559545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu 370659545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu /** 370759545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu * Action set from carrier signalling broadcast receivers to enable/disable radio 370859545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu * @param subId the subscription ID that this action applies to. 370959545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu * @param enabled control enable or disable radio. 371059545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu * {@hide} 371159545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu */ 371259545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu @Override 371359545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu public void carrierActionSetRadioEnabled(int subId, boolean enabled) { 371459545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu enforceModifyPermission(); 371559545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu final Phone phone = getPhone(subId); 371659545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu if (phone == null) { 371759545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu loge("carrierAction: SetRadioEnabled fails with invalid sibId: " + subId); 371859545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu return; 371959545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu } 372059545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu try { 372159545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu phone.carrierActionSetRadioEnabled(enabled); 372259545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu } catch (Exception e) { 372359545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu Log.e(LOG_TAG, "carrierAction: SetRadioEnabled fails. Exception ex=" + e); 372459545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu } 372559545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu } 372659545b46512cf658a509e4bc0ba886cb3c3aa972fionaxu 3727c236d6b7ad95481ec831905c15e563498d65dc3eTa-wei Yen /** 3728c236d6b7ad95481ec831905c15e563498d65dc3eTa-wei Yen * Called when "adb shell dumpsys phone" is invoked. Dump is also automatically invoked when a 3729c236d6b7ad95481ec831905c15e563498d65dc3eTa-wei Yen * bug report is being generated. 3730c236d6b7ad95481ec831905c15e563498d65dc3eTa-wei Yen */ 3731c236d6b7ad95481ec831905c15e563498d65dc3eTa-wei Yen @Override 373299282e0eb8f04d03c9464bea94fa2d8959edbd13Ta-wei Yen protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { 373322b950d862c87ebced143045bdefbbc626787b88dcashman if (mPhone.getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 373422b950d862c87ebced143045bdefbbc626787b88dcashman != PackageManager.PERMISSION_GRANTED) { 373522b950d862c87ebced143045bdefbbc626787b88dcashman writer.println("Permission Denial: can't dump Phone from pid=" 373622b950d862c87ebced143045bdefbbc626787b88dcashman + Binder.getCallingPid() 373722b950d862c87ebced143045bdefbbc626787b88dcashman + ", uid=" + Binder.getCallingUid() 373822b950d862c87ebced143045bdefbbc626787b88dcashman + "without permission " 373922b950d862c87ebced143045bdefbbc626787b88dcashman + android.Manifest.permission.DUMP); 374022b950d862c87ebced143045bdefbbc626787b88dcashman return; 374122b950d862c87ebced143045bdefbbc626787b88dcashman } 374299282e0eb8f04d03c9464bea94fa2d8959edbd13Ta-wei Yen DumpsysHandler.dump(mPhone.getContext(), fd, writer, args); 3743c236d6b7ad95481ec831905c15e563498d65dc3eTa-wei Yen } 3744eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu 3745eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu /** 3746eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu * Get aggregated video call data usage from all subscriptions since boot. 3747eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu * @return total data usage in bytes 3748eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu * {@hide} 3749eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu */ 3750eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu @Override 3751eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu public long getVtDataUsage() { 3752eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_NETWORK_USAGE_HISTORY, 3753eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu null); 3754eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu 3755eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu // NetworkStatsService keeps tracking the active network interface and identity. It will 3756eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu // record the delta with the corresponding network identity. What we need to do here is 3757eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu // returning total video call data usage from all subscriptions since boot. 3758eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu 3759eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu // TODO: Add sub id support in the future. We'll need it when we support DSDA and 3760eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu // simultaneous VT calls. 3761eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu final Phone[] phones = PhoneFactory.getPhones(); 3762eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu long total = 0; 3763eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu for (Phone phone : phones) { 3764eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu total += phone.getVtDataUsage(); 3765eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu } 3766eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu return total; 3767eb89b247cea9561534f2fcc0a1d17c96fc04e45fJack Yu } 376875ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu 376975ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu /** 377075ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu * Policy control of data connection. Usually used when data limit is passed. 377175ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu * @param enabled True if enabling the data, otherwise disabling. 377275ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu * @param subId Subscription index 377375ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu * {@hide} 377475ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu */ 377575ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu @Override 377675ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu public void setPolicyDataEnabled(boolean enabled, int subId) { 377775ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu enforceModifyPermission(); 377875ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu Phone phone = getPhone(subId); 377975ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu if (phone != null) { 378075ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu phone.setPolicyDataEnabled(enabled); 378175ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu } 378275ab2950e0a037018c88c4f42cf0ee58b393cbe7Jack Yu } 37839a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran 37849a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran /** 37859a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran * Get Client request stats 37869a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran * @return List of Client Request Stats 37879a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran * @hide 37889a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran */ 37899a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran @Override 37909a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran public List<ClientRequestStats> getClientRequestStats(String callingPackage, int subId) { 37919a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran if (!canReadPhoneState(callingPackage, "getClientRequestStats")) { 37929a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran return null; 37939a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran } 37949a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran 37959a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran Phone phone = getPhone(subId); 37969a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran if (phone != null) { 37979a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran return phone.getClientRequestStats(); 37989a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran } 37999a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran 38009a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran return null; 38019a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran } 38029a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran 38039a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran private WorkSource getWorkSource(WorkSource workSource, int uid) { 38049a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran if (workSource != null) { 38059a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran return workSource; 38069a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran } 38079a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran 38089a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran String packageName = mPhone.getContext().getPackageManager().getNameForUid(uid); 38099a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran workSource = new WorkSource(uid, packageName); 38109a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran return workSource; 38119a90931553275145ffe9b14c1a91ee4e7896f0d4Sooraj Sasindran } 3812eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu 3813eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu /** 3814eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu * Set SIM card power state. Request is equivalent to inserting or removing the card. 3815eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu * 381613bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe * @param slotIndex SIM slot id. 3817eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu * @param powerUp True if powering up the SIM, otherwise powering down 3818eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu * 3819eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu **/ 3820eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu @Override 382113bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe public void setSimPowerStateForSlot(int slotIndex, boolean powerUp) { 3822eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu enforceModifyPermission(); 382313bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe Phone phone = PhoneFactory.getPhone(slotIndex); 382413bac7bc86cbfca9d9508ae3e4c3facfd514bbe3Sanket Padawe 3825eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu if (phone != null) { 3826eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu phone.setSimPowerState(powerUp); 3827eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu } 3828eb4124c8ea93e8d7db155216835bb4b7495d9841Jack Yu } 3829dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian 383065d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn private boolean isUssdApiAllowed(int subId) { 383165d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn CarrierConfigManager configManager = 383265d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn (CarrierConfigManager) mPhone.getContext().getSystemService( 383365d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn Context.CARRIER_CONFIG_SERVICE); 383465d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn if (configManager == null) { 383565d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn return false; 383665d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn } 383765d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn PersistableBundle pb = configManager.getConfigForSubId(subId); 383865d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn if (pb == null) { 383965d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn return false; 384065d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn } 384165d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn return pb.getBoolean( 384265d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn CarrierConfigManager.KEY_ALLOW_USSD_REQUESTS_VIA_TELEPHONY_MANAGER_BOOL); 384365d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn } 384465d45c272358e1230c176d891cd76ad65c3b63a7Tyler Gunn 3845dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian /** 3846dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian * Check if phone is in emergency callback mode 3847dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian * @return true if phone is in emergency callback mode 3848dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian * @param subId sub id 3849dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian */ 3850dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian public boolean getEmergencyCallbackMode(int subId) { 3851dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian final Phone phone = getPhone(subId); 3852dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian if (phone != null) { 3853dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian return phone.isInEcm(); 3854dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian } else { 3855dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian return false; 3856dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian } 3857dd21031e41b68706b01efc79fefcf8e6a1bf944aShuo Qian } 38587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 3859