Clay Murphy | 9bb082a | 2016-07-08 13:33:37 -0700 | [diff] [blame] | 1 | page.title=Implementing Block Phone Numbers |
| 2 | @jd:body |
| 3 | |
| 4 | <!-- |
| 5 | Copyright 2016 The Android Open Source Project |
| 6 | |
| 7 | Licensed under the Apache License, Version 2.0 (the "License"); |
| 8 | you may not use this file except in compliance with the License. |
| 9 | You may obtain a copy of the License at |
| 10 | |
| 11 | http://www.apache.org/licenses/LICENSE-2.0 |
| 12 | |
| 13 | Unless required by applicable law or agreed to in writing, software |
| 14 | distributed under the License is distributed on an "AS IS" BASIS, |
| 15 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 16 | See the License for the specific language governing permissions and |
| 17 | limitations under the License. |
| 18 | --> |
| 19 | |
| 20 | <div id="qv-wrapper"> |
| 21 | <div id="qv"> |
| 22 | <h2>In this document</h2> |
| 23 | <ol id="auto-toc"> |
| 24 | </ol> |
| 25 | </div> |
| 26 | </div> |
| 27 | |
| 28 | <p> |
| 29 | Because telephony is such an open communications channel - anyone may call or |
| 30 | text any number at any time - Android users need the ability to easily block |
| 31 | unwanted calls and texts. |
| 32 | </p> |
| 33 | |
| 34 | <p> |
| 35 | Before N, Android users had to rely on downloaded apps to restrict calls and |
| 36 | texts from bothersome phone numbers. Many of those apps either do not work as |
| 37 | desired or provide a less-than ideal experience because there are no proper APIs |
| 38 | for blocking calls and messages. |
| 39 | </p> |
| 40 | |
| 41 | <p> |
| 42 | Some manufacturers might ship their own blocking solutions out-of-the-box, but |
| 43 | if users switch devices, they may lose the blocked list completely due to lack |
| 44 | of interoperability. Finally, even if users are employing dialing apps and |
| 45 | messaging clients that provide such functionality, they likely still have to |
| 46 | perform the block action in each app for the block to take effect for both |
| 47 | calling and texting. |
| 48 | </p> |
| 49 | |
| 50 | <h2 id="features">Features</h2> |
| 51 | |
| 52 | <p> |
| 53 | The Android N release introduces a <code>BlockedNumberProvider</code> content |
| 54 | provider that stores a list of phone numbers the user has specified should not |
| 55 | be able to contact them via telephony communications (calls, SMS, MMS). The |
| 56 | system will respect the numbers in the blocked list by restricting calls and |
| 57 | texts from those numbers. Android N displays the list of blocked numbers and |
| 58 | allows the user to add and remove numbers. |
| 59 | </p> |
| 60 | |
| 61 | <p> |
| 62 | Further, the number-blocking feature enables the system and the relevant apps on |
| 63 | the platform to work together to help protect the user and to simplify the |
| 64 | experience. The default dialer, default messaging client, UICC-privileged app, |
| 65 | and apps with the same signature as the system can all directly read from and |
| 66 | write to the blocked list. Because the blocked numbers are stored on the system, |
| 67 | no matter what dialing or messaging apps the user employs, the numbers stay |
| 68 | blocked. Finally, the blocked numbers list may be restored on any new device, |
| 69 | regardless of the manufacturer. |
| 70 | </p> |
| 71 | |
| 72 | <ul> |
| 73 | <li>User will be guaranteed to have a blocking feature that works out-of-the-box |
| 74 | and will not lose their block list when they switch apps or get a new phone. All |
| 75 | relevant apps on the system can share the same list to provide the user with the |
| 76 | most streamlined experience. |
| 77 | <li>App developers do not need to develop their own way to manage a block list |
| 78 | and the calls and messages that come in. They can simply use the |
| 79 | platform-provided feature. |
| 80 | <li>Dialer / messenger apps that are selected as the default by the user can |
| 81 | read and write to the provider. Other apps can launch the block list management |
| 82 | user interface by using <code>createManageBlockedNumbersIntent()</code> |
| 83 | <li>OEMs can use platform provided feature to ship a blocking feature |
| 84 | out-of-the-box. OEMs can rest assured that when users switch from another OEM’s |
| 85 | device that they have a better onboarding experience because the block list will |
| 86 | be transferred as well. |
| 87 | <li>If carrier has their own dialer or messenger app, they can reuse platform |
| 88 | feature for allowing the user to maintain a block list. They can rest assured |
| 89 | that the user’s block list can stay with the users, even when they get a new |
| 90 | device. Finally, all carrier-privileged apps can read the block list, so if the |
| 91 | carrier wants to provide some additional more powerful blocking for the user |
| 92 | based on the block list, that is now possible with this feature.</li></ul> |
| 93 | |
| 94 | <h2 id="data-flow">Data flow</h2> |
| 95 | |
| 96 | <img src="images/block-numbers-flow.png" alt="block numbers data flow" width="642" id="block-numbers-flow" /> |
| 97 | <p class="img-caption"> |
| 98 | <strong>Figure 1.</strong> Block phone numbers data flow |
| 99 | </p> |
| 100 | |
| 101 | <h2 id="examples-and-source">Examples and source</h2> |
| 102 | |
| 103 | <p> |
| 104 | Here are example calls using the number-blocking new feature: |
| 105 | </p> |
| 106 | |
| 107 | <h3 id="launch-from-app">Launch blocked number manager from app</h3> |
| 108 | |
| 109 | <pre> |
| 110 | Context.startActivity(telecomManager.createManageBlockedNumbersIntent(), null); |
| 111 | </pre> |
| 112 | |
| 113 | <h3 id="query-blocked-numbers">Query blocked numbers</h3> |
| 114 | |
| 115 | <pre> |
| 116 | Cursor c = getContentResolver().query(BlockedNumbers.CONTENT_URI, |
| 117 | new String[]{BlockedNumbers.COLUMN_ID, |
| 118 | BlockedNumbers.COLUMN_ORIGINAL_NUMBER, |
| 119 | BlockedNumbers.COLUMN_E164_NUMBER}, null, null, null); |
| 120 | </pre> |
| 121 | |
| 122 | <h3 id="put-blocked-number">Put blocked number</h3> |
| 123 | |
| 124 | <pre> |
| 125 | ContentValues values = new ContentValues(); |
| 126 | values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890"); |
| 127 | Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values); |
| 128 | </pre> |
| 129 | |
| 130 | <h3 id="delete-blocked-number">Delete blocked number</h3> |
| 131 | |
| 132 | <pre> |
| 133 | ContentValues values = new ContentValues(); |
| 134 | values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890"); |
| 135 | Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values); |
| 136 | getContentResolver().delete(uri, null, null); |
| 137 | </pre> |
| 138 | |
| 139 | <h2 id="implementation">Implementation</h2> |
| 140 | |
| 141 | <p> |
| 142 | These are the high-level tasks that must be completed to put the number-blocking |
| 143 | feature to use: |
| 144 | </p> |
| 145 | |
| 146 | <ul> |
| 147 | <li>OEMs implement call/message-restriction features on their devices by using |
| 148 | <code>BlockedNumberProvider</code> |
| 149 | <li>If carrier has dialer or messenger application, implement call/message |
| 150 | restriction features by using <code>BlockedNumberProvider</code> |
| 151 | <li>Third-party dialer and messenger app vendors use |
| 152 | <code>BlockedNumberProvider</code> for their blocking features</li> |
| 153 | </ul> |
| 154 | |
| 155 | <h3 id="recommendations-for-oems">Recommendations for OEMs</h3> |
| 156 | |
| 157 | <p> |
| 158 | If the device had previously never shipped with any additional call/message |
| 159 | restriction features, use the number-blocking feature in the Android Open Source |
| 160 | Project (AOSP) on all such devices. It is recommended that reasonable entry |
| 161 | points for blocking are supported, such as blocking a number right from the call |
| 162 | log or within a message thread. |
| 163 | </p> |
| 164 | |
| 165 | <p> |
| 166 | If the device had previously shipped with call/message restriction features, |
| 167 | adapt the features so all <em>strict-match phone numbers</em> that are blocked |
| 168 | are stored in the <code>BlockedNumberProvider,</code> and that the behavior |
| 169 | around the provider satisfy the requirements for this feature outlined in the |
| 170 | Android Compatibility Definition Document (CDD). |
| 171 | </p> |
| 172 | |
| 173 | <p> |
| 174 | Any other advanced feature can be implemented via custom providers and custom UI |
| 175 | / controls, as long as the CDD requirements are satisfied with regards to |
| 176 | blocking strict-match phone numbers. It is recommended that those other features |
| 177 | be labeled as “advanced” features to avoid confusion with the basic |
| 178 | number-blocking feature. |
| 179 | </p> |
| 180 | |
| 181 | <h3 id="apis">APIs</h3> |
| 182 | |
| 183 | <p> |
| 184 | Here are the APIs in use: |
| 185 | </p> |
| 186 | <ul> |
| 187 | <li><code><a |
| 188 | href="http://developer.android.com/reference/android/telecom/TelecomManager.html">TelecomManager</a> |
| 189 | API</code> |
| 190 | <ul> |
| 191 | <li><code>Intent createManageBlockedNumbersIntent()</code> |
| 192 | </ul> |
| 193 | </li> |
| 194 | <li><code><a |
| 195 | href="http://developer.android.com/reference/android/telephony/CarrierConfigManager.html">Carrier |
| 196 | Config</a></code> |
| 197 | <ul> |
| 198 | <li><code>KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT</code> |
| 199 | </ul> |
| 200 | </li> |
| 201 | <li>Please refer to <code>BlockedNumberContract</code> |
| 202 | <ul> |
| 203 | <li>APIs provided by <code><a |
| 204 | href="https://developer.android.com/reference/android/provider/BlockedNumberContract.html">BlockedNumberContract</a></code></li> |
| 205 | <li><code>boolean isBlocked(Context context, String phoneNumber)</code></li> |
| 206 | <li><code>int unblock(Context context, String phoneNumber)</code></li> |
| 207 | <li><code>boolean canCurrentUserBlockNumbers(Context context)</code></li> |
| 208 | </ul> |
| 209 | </li> |
| 210 | </ul> |
| 211 | |
| 212 | <h3 id="user-interface">User interface</h3> |
| 213 | <p> |
| 214 | The BlockedNumbersActivity.java user interface provided in AOSP can be used as |
| 215 | is. Partners may also implement their own version of the UI, as long as it |
| 216 | satisfies related CDD requirements. |
| 217 | </p> |
| 218 | |
| 219 | <p> |
| 220 | Please note, the partner’s PC application for backup and restore may be needed |
| 221 | to implement restoration of the block list by using |
| 222 | <code>BlockedNumberProvider</code>. See the images below for the blocked |
| 223 | numbers interface supplied in AOSP. |
| 224 | </p> |
| 225 | |
| 226 | <img src="images/block-numbers-ui.png" alt="block numbers user interface" width="665" id="block-numbers-ui" /> |
| 227 | <p class="img-caption"> |
| 228 | <strong>Figure 2.</strong> Block phone numbers user interface |
| 229 | </p> |
| 230 | |
| 231 | <h2 id="validation">Validation</h2> |
| 232 | |
| 233 | <p> |
| 234 | Implementers can ensure their version of the feature works as intended by |
| 235 | running the following CTS tests: |
| 236 | </p> |
| 237 | |
| 238 | <pre> |
| 239 | android.provider.cts.BlockedNumberContractTest |
| 240 | com.android.cts.numberblocking.hostside.NumberBlockingTest |
| 241 | android.telecom.cts.ExtendedInCallServiceTest#testIncomingCallFromBlockedNumber_IsRejected |
| 242 | android.telephony.cts.SmsManagerTest#testSmsBlocking |
| 243 | </pre> |
| 244 | |
| 245 | <p> |
| 246 | The <code>BlockedNumberProvider</code> can be manipulated using <code>adb</code> commands |
| 247 | after running <code>$ adb root</code>. For example: |
| 248 | </p> |
| 249 | <pre> |
| 250 | $ adb root |
| 251 | $ adb shell content query --uri content://com.android.blockednumber/blocked |
| 252 | $ adb shell content insert --uri / content://com.android.blockednumber/blocked --bind / original_number:s:'6501002000' |
| 253 | $ adb shell content delete --uri / content://com.android.blockednumber/blocked/1 |
| 254 | </pre> |