1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.telephony; 18 19 import android.os.Bundle; 20 import android.os.Handler; 21 import android.os.Looper; 22 import android.os.Message; 23 import android.telephony.SubscriptionManager; 24 import android.telephony.CellLocation; 25 import android.telephony.CellInfo; 26 import android.telephony.VoLteServiceState; 27 import android.telephony.Rlog; 28 import android.telephony.ServiceState; 29 import android.telephony.SignalStrength; 30 import android.telephony.PreciseCallState; 31 import android.telephony.PreciseDataConnectionState; 32 33 import com.android.internal.telephony.IPhoneStateListener; 34 import java.util.List; 35 import java.lang.ref.WeakReference; 36 37 /** 38 * A listener class for monitoring changes in specific telephony states 39 * on the device, including service state, signal strength, message 40 * waiting indicator (voicemail), and others. 41 * <p> 42 * Override the methods for the state that you wish to receive updates for, and 43 * pass your PhoneStateListener object, along with bitwise-or of the LISTEN_ 44 * flags to {@link TelephonyManager#listen TelephonyManager.listen()}. 45 * <p> 46 * Note that access to some telephony information is 47 * permission-protected. Your application won't receive updates for protected 48 * information unless it has the appropriate permissions declared in 49 * its manifest file. Where permissions apply, they are noted in the 50 * appropriate LISTEN_ flags. 51 */ 52 public class PhoneStateListener { 53 private static final String LOG_TAG = "PhoneStateListener"; 54 private static final boolean DBG = false; // STOPSHIP if true 55 56 /** 57 * Stop listening for updates. 58 */ 59 public static final int LISTEN_NONE = 0; 60 61 /** 62 * Listen for changes to the network service state (cellular). 63 * 64 * @see #onServiceStateChanged 65 * @see ServiceState 66 */ 67 public static final int LISTEN_SERVICE_STATE = 0x00000001; 68 69 /** 70 * Listen for changes to the network signal strength (cellular). 71 * {@more} 72 * Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE 73 * READ_PHONE_STATE} 74 * <p> 75 * 76 * @see #onSignalStrengthChanged 77 * 78 * @deprecated by {@link #LISTEN_SIGNAL_STRENGTHS} 79 */ 80 @Deprecated 81 public static final int LISTEN_SIGNAL_STRENGTH = 0x00000002; 82 83 /** 84 * Listen for changes to the message-waiting indicator. 85 * {@more} 86 * Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE 87 * READ_PHONE_STATE} 88 * <p> 89 * Example: The status bar uses this to determine when to display the 90 * voicemail icon. 91 * 92 * @see #onMessageWaitingIndicatorChanged 93 */ 94 public static final int LISTEN_MESSAGE_WAITING_INDICATOR = 0x00000004; 95 96 /** 97 * Listen for changes to the call-forwarding indicator. 98 * {@more} 99 * Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE 100 * READ_PHONE_STATE} 101 * @see #onCallForwardingIndicatorChanged 102 */ 103 public static final int LISTEN_CALL_FORWARDING_INDICATOR = 0x00000008; 104 105 /** 106 * Listen for changes to the device's cell location. Note that 107 * this will result in frequent callbacks to the listener. 108 * {@more} 109 * Requires Permission: {@link android.Manifest.permission#ACCESS_COARSE_LOCATION 110 * ACCESS_COARSE_LOCATION} 111 * <p> 112 * If you need regular location updates but want more control over 113 * the update interval or location precision, you can set up a listener 114 * through the {@link android.location.LocationManager location manager} 115 * instead. 116 * 117 * @see #onCellLocationChanged 118 */ 119 public static final int LISTEN_CELL_LOCATION = 0x00000010; 120 121 /** 122 * Listen for changes to the device call state. 123 * {@more} 124 * 125 * @see #onCallStateChanged 126 */ 127 public static final int LISTEN_CALL_STATE = 0x00000020; 128 129 /** 130 * Listen for changes to the data connection state (cellular). 131 * 132 * @see #onDataConnectionStateChanged 133 */ 134 public static final int LISTEN_DATA_CONNECTION_STATE = 0x00000040; 135 136 /** 137 * Listen for changes to the direction of data traffic on the data 138 * connection (cellular). 139 * {@more} 140 * Example: The status bar uses this to display the appropriate 141 * data-traffic icon. 142 * 143 * @see #onDataActivity 144 */ 145 public static final int LISTEN_DATA_ACTIVITY = 0x00000080; 146 147 /** 148 * Listen for changes to the network signal strengths (cellular). 149 * <p> 150 * Example: The status bar uses this to control the signal-strength 151 * icon. 152 * 153 * @see #onSignalStrengthsChanged 154 */ 155 public static final int LISTEN_SIGNAL_STRENGTHS = 0x00000100; 156 157 /** 158 * Listen for changes to OTASP mode. 159 * 160 * @see #onOtaspChanged 161 * @hide 162 */ 163 public static final int LISTEN_OTASP_CHANGED = 0x00000200; 164 165 /** 166 * Listen for changes to observed cell info. 167 * 168 * @see #onCellInfoChanged 169 */ 170 public static final int LISTEN_CELL_INFO = 0x00000400; 171 172 /** 173 * Listen for precise changes and fails to the device calls (cellular). 174 * {@more} 175 * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE 176 * READ_PRECISE_PHONE_STATE} 177 * 178 * @hide 179 */ 180 public static final int LISTEN_PRECISE_CALL_STATE = 0x00000800; 181 182 /** 183 * Listen for precise changes and fails on the data connection (cellular). 184 * {@more} 185 * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE 186 * READ_PRECISE_PHONE_STATE} 187 * 188 * @see #onPreciseDataConnectionStateChanged 189 * @hide 190 */ 191 public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 0x00001000; 192 193 /** 194 * Listen for real time info for all data connections (cellular)). 195 * {@more} 196 * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE 197 * READ_PRECISE_PHONE_STATE} 198 * @see #onDataConnectionRealTimeInfoChanged(DataConnectionRealTimeInfo) 199 * 200 * @deprecated Use {@link TelephonyManager#getModemActivityInfo()} 201 * @hide 202 */ 203 @Deprecated 204 public static final int LISTEN_DATA_CONNECTION_REAL_TIME_INFO = 0x00002000; 205 206 /** 207 * Listen for changes to LTE network state 208 * 209 * @see #onLteNetworkStateChanged 210 * @hide 211 */ 212 public static final int LISTEN_VOLTE_STATE = 0x00004000; 213 214 /** 215 * Listen for OEM hook raw event 216 * 217 * @see #onOemHookRawEvent 218 * @hide 219 */ 220 public static final int LISTEN_OEM_HOOK_RAW_EVENT = 0x00008000; 221 222 /** 223 * Listen for carrier network changes indicated by a carrier app. 224 * 225 * @see #onCarrierNetworkRequest 226 * @see TelephonyManager#notifyCarrierNetworkChange(boolean) 227 * @hide 228 */ 229 public static final int LISTEN_CARRIER_NETWORK_CHANGE = 0x00010000; 230 231 /* 232 * Subscription used to listen to the phone state changes 233 * @hide 234 */ 235 /** @hide */ 236 protected int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 237 238 private final Handler mHandler; 239 240 /** 241 * Create a PhoneStateListener for the Phone with the default subscription. 242 * This class requires Looper.myLooper() not return null. 243 */ PhoneStateListener()244 public PhoneStateListener() { 245 this(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, Looper.myLooper()); 246 } 247 248 /** 249 * Create a PhoneStateListener for the Phone with the default subscription 250 * using a particular non-null Looper. 251 * @hide 252 */ PhoneStateListener(Looper looper)253 public PhoneStateListener(Looper looper) { 254 this(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, looper); 255 } 256 257 /** 258 * Create a PhoneStateListener for the Phone using the specified subscription. 259 * This class requires Looper.myLooper() not return null. To supply your 260 * own non-null Looper use PhoneStateListener(int subId, Looper looper) below. 261 * @hide 262 */ PhoneStateListener(int subId)263 public PhoneStateListener(int subId) { 264 this(subId, Looper.myLooper()); 265 } 266 267 /** 268 * Create a PhoneStateListener for the Phone using the specified subscription 269 * and non-null Looper. 270 * @hide 271 */ PhoneStateListener(int subId, Looper looper)272 public PhoneStateListener(int subId, Looper looper) { 273 if (DBG) log("ctor: subId=" + subId + " looper=" + looper); 274 mSubId = subId; 275 mHandler = new Handler(looper) { 276 public void handleMessage(Message msg) { 277 if (DBG) { 278 log("mSubId=" + mSubId + " what=0x" + Integer.toHexString(msg.what) 279 + " msg=" + msg); 280 } 281 switch (msg.what) { 282 case LISTEN_SERVICE_STATE: 283 PhoneStateListener.this.onServiceStateChanged((ServiceState)msg.obj); 284 break; 285 case LISTEN_SIGNAL_STRENGTH: 286 PhoneStateListener.this.onSignalStrengthChanged(msg.arg1); 287 break; 288 case LISTEN_MESSAGE_WAITING_INDICATOR: 289 PhoneStateListener.this.onMessageWaitingIndicatorChanged(msg.arg1 != 0); 290 break; 291 case LISTEN_CALL_FORWARDING_INDICATOR: 292 PhoneStateListener.this.onCallForwardingIndicatorChanged(msg.arg1 != 0); 293 break; 294 case LISTEN_CELL_LOCATION: 295 PhoneStateListener.this.onCellLocationChanged((CellLocation)msg.obj); 296 break; 297 case LISTEN_CALL_STATE: 298 PhoneStateListener.this.onCallStateChanged(msg.arg1, (String)msg.obj); 299 break; 300 case LISTEN_DATA_CONNECTION_STATE: 301 PhoneStateListener.this.onDataConnectionStateChanged(msg.arg1, msg.arg2); 302 PhoneStateListener.this.onDataConnectionStateChanged(msg.arg1); 303 break; 304 case LISTEN_DATA_ACTIVITY: 305 PhoneStateListener.this.onDataActivity(msg.arg1); 306 break; 307 case LISTEN_SIGNAL_STRENGTHS: 308 PhoneStateListener.this.onSignalStrengthsChanged((SignalStrength)msg.obj); 309 break; 310 case LISTEN_OTASP_CHANGED: 311 PhoneStateListener.this.onOtaspChanged(msg.arg1); 312 break; 313 case LISTEN_CELL_INFO: 314 PhoneStateListener.this.onCellInfoChanged((List<CellInfo>)msg.obj); 315 break; 316 case LISTEN_PRECISE_CALL_STATE: 317 PhoneStateListener.this.onPreciseCallStateChanged((PreciseCallState)msg.obj); 318 break; 319 case LISTEN_PRECISE_DATA_CONNECTION_STATE: 320 PhoneStateListener.this.onPreciseDataConnectionStateChanged( 321 (PreciseDataConnectionState)msg.obj); 322 break; 323 case LISTEN_DATA_CONNECTION_REAL_TIME_INFO: 324 PhoneStateListener.this.onDataConnectionRealTimeInfoChanged( 325 (DataConnectionRealTimeInfo)msg.obj); 326 break; 327 case LISTEN_VOLTE_STATE: 328 PhoneStateListener.this.onVoLteServiceStateChanged((VoLteServiceState)msg.obj); 329 break; 330 case LISTEN_OEM_HOOK_RAW_EVENT: 331 PhoneStateListener.this.onOemHookRawEvent((byte[])msg.obj); 332 break; 333 case LISTEN_CARRIER_NETWORK_CHANGE: 334 PhoneStateListener.this.onCarrierNetworkChange((boolean)msg.obj); 335 break; 336 337 } 338 } 339 }; 340 } 341 342 /** 343 * Callback invoked when device service state changes. 344 * 345 * @see ServiceState#STATE_EMERGENCY_ONLY 346 * @see ServiceState#STATE_IN_SERVICE 347 * @see ServiceState#STATE_OUT_OF_SERVICE 348 * @see ServiceState#STATE_POWER_OFF 349 */ onServiceStateChanged(ServiceState serviceState)350 public void onServiceStateChanged(ServiceState serviceState) { 351 // default implementation empty 352 } 353 354 /** 355 * Callback invoked when network signal strength changes. 356 * 357 * @see ServiceState#STATE_EMERGENCY_ONLY 358 * @see ServiceState#STATE_IN_SERVICE 359 * @see ServiceState#STATE_OUT_OF_SERVICE 360 * @see ServiceState#STATE_POWER_OFF 361 * @deprecated Use {@link #onSignalStrengthsChanged(SignalStrength)} 362 */ 363 @Deprecated onSignalStrengthChanged(int asu)364 public void onSignalStrengthChanged(int asu) { 365 // default implementation empty 366 } 367 368 /** 369 * Callback invoked when the message-waiting indicator changes. 370 */ onMessageWaitingIndicatorChanged(boolean mwi)371 public void onMessageWaitingIndicatorChanged(boolean mwi) { 372 // default implementation empty 373 } 374 375 /** 376 * Callback invoked when the call-forwarding indicator changes. 377 */ onCallForwardingIndicatorChanged(boolean cfi)378 public void onCallForwardingIndicatorChanged(boolean cfi) { 379 // default implementation empty 380 } 381 382 /** 383 * Callback invoked when device cell location changes. 384 */ onCellLocationChanged(CellLocation location)385 public void onCellLocationChanged(CellLocation location) { 386 // default implementation empty 387 } 388 389 /** 390 * Callback invoked when device call state changes. 391 * @param state call state 392 * @param incomingNumber incoming call phone number. If application does not have 393 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} permission, an empty 394 * string will be passed as an argument. 395 * 396 * @see TelephonyManager#CALL_STATE_IDLE 397 * @see TelephonyManager#CALL_STATE_RINGING 398 * @see TelephonyManager#CALL_STATE_OFFHOOK 399 */ onCallStateChanged(int state, String incomingNumber)400 public void onCallStateChanged(int state, String incomingNumber) { 401 // default implementation empty 402 } 403 404 /** 405 * Callback invoked when connection state changes. 406 * 407 * @see TelephonyManager#DATA_DISCONNECTED 408 * @see TelephonyManager#DATA_CONNECTING 409 * @see TelephonyManager#DATA_CONNECTED 410 * @see TelephonyManager#DATA_SUSPENDED 411 */ onDataConnectionStateChanged(int state)412 public void onDataConnectionStateChanged(int state) { 413 // default implementation empty 414 } 415 416 /** 417 * same as above, but with the network type. Both called. 418 */ onDataConnectionStateChanged(int state, int networkType)419 public void onDataConnectionStateChanged(int state, int networkType) { 420 } 421 422 /** 423 * Callback invoked when data activity state changes. 424 * 425 * @see TelephonyManager#DATA_ACTIVITY_NONE 426 * @see TelephonyManager#DATA_ACTIVITY_IN 427 * @see TelephonyManager#DATA_ACTIVITY_OUT 428 * @see TelephonyManager#DATA_ACTIVITY_INOUT 429 * @see TelephonyManager#DATA_ACTIVITY_DORMANT 430 */ onDataActivity(int direction)431 public void onDataActivity(int direction) { 432 // default implementation empty 433 } 434 435 /** 436 * Callback invoked when network signal strengths changes. 437 * 438 * @see ServiceState#STATE_EMERGENCY_ONLY 439 * @see ServiceState#STATE_IN_SERVICE 440 * @see ServiceState#STATE_OUT_OF_SERVICE 441 * @see ServiceState#STATE_POWER_OFF 442 */ onSignalStrengthsChanged(SignalStrength signalStrength)443 public void onSignalStrengthsChanged(SignalStrength signalStrength) { 444 // default implementation empty 445 } 446 447 448 /** 449 * The Over The Air Service Provisioning (OTASP) has changed. Requires 450 * the READ_PHONE_STATE permission. 451 * @param otaspMode is integer <code>OTASP_UNKNOWN=1<code> 452 * means the value is currently unknown and the system should wait until 453 * <code>OTASP_NEEDED=2<code> or <code>OTASP_NOT_NEEDED=3<code> is received before 454 * making the decision to perform OTASP or not. 455 * 456 * @hide 457 */ onOtaspChanged(int otaspMode)458 public void onOtaspChanged(int otaspMode) { 459 // default implementation empty 460 } 461 462 /** 463 * Callback invoked when a observed cell info has changed, 464 * or new cells have been added or removed. 465 * @param cellInfo is the list of currently visible cells. 466 */ onCellInfoChanged(List<CellInfo> cellInfo)467 public void onCellInfoChanged(List<CellInfo> cellInfo) { 468 } 469 470 /** 471 * Callback invoked when precise device call state changes. 472 * 473 * @hide 474 */ onPreciseCallStateChanged(PreciseCallState callState)475 public void onPreciseCallStateChanged(PreciseCallState callState) { 476 // default implementation empty 477 } 478 479 /** 480 * Callback invoked when data connection state changes with precise information. 481 * 482 * @hide 483 */ onPreciseDataConnectionStateChanged( PreciseDataConnectionState dataConnectionState)484 public void onPreciseDataConnectionStateChanged( 485 PreciseDataConnectionState dataConnectionState) { 486 // default implementation empty 487 } 488 489 /** 490 * Callback invoked when data connection state changes with precise information. 491 * 492 * @hide 493 */ onDataConnectionRealTimeInfoChanged( DataConnectionRealTimeInfo dcRtInfo)494 public void onDataConnectionRealTimeInfoChanged( 495 DataConnectionRealTimeInfo dcRtInfo) { 496 // default implementation empty 497 } 498 499 /** 500 * Callback invoked when the service state of LTE network 501 * related to the VoLTE service has changed. 502 * @param stateInfo is the current LTE network information 503 * @hide 504 */ onVoLteServiceStateChanged(VoLteServiceState stateInfo)505 public void onVoLteServiceStateChanged(VoLteServiceState stateInfo) { 506 } 507 508 /** 509 * Callback invoked when OEM hook raw event is received. Requires 510 * the READ_PRIVILEGED_PHONE_STATE permission. 511 * @param rawData is the byte array of the OEM hook raw data. 512 * @hide 513 */ onOemHookRawEvent(byte[] rawData)514 public void onOemHookRawEvent(byte[] rawData) { 515 // default implementation empty 516 } 517 518 /** 519 * Callback invoked when telephony has received notice from a carrier 520 * app that a network action that could result in connectivity loss 521 * has been requested by an app using 522 * {@link android.telephony.TelephonyManager#notifyCarrierNetworkChange(boolean)} 523 * 524 * @param active Whether the carrier network change is or shortly 525 * will be active. This value is true to indicate 526 * showing alternative UI and false to stop. 527 * 528 * @hide 529 */ onCarrierNetworkChange(boolean active)530 public void onCarrierNetworkChange(boolean active) { 531 // default implementation empty 532 } 533 534 /** 535 * The callback methods need to be called on the handler thread where 536 * this object was created. If the binder did that for us it'd be nice. 537 * 538 * Using a static class and weak reference here to avoid memory leak caused by the 539 * IPhoneStateListener.Stub callback retaining references to the outside PhoneStateListeners: 540 * even caller has been destroyed and "un-registered" the PhoneStateListener, it is still not 541 * eligible for GC given the references coming from: 542 * Native Stack --> PhoneStateListener --> Context (Activity). 543 * memory of caller's context will be collected after GC from service side get triggered 544 */ 545 private static class IPhoneStateListenerStub extends IPhoneStateListener.Stub { 546 private WeakReference<PhoneStateListener> mPhoneStateListenerWeakRef; 547 IPhoneStateListenerStub(PhoneStateListener phoneStateListener)548 public IPhoneStateListenerStub(PhoneStateListener phoneStateListener) { 549 mPhoneStateListenerWeakRef = new WeakReference<PhoneStateListener>(phoneStateListener); 550 } 551 send(int what, int arg1, int arg2, Object obj)552 private void send(int what, int arg1, int arg2, Object obj) { 553 PhoneStateListener listener = mPhoneStateListenerWeakRef.get(); 554 if (listener != null) { 555 Message.obtain(listener.mHandler, what, arg1, arg2, obj).sendToTarget(); 556 } 557 } 558 onServiceStateChanged(ServiceState serviceState)559 public void onServiceStateChanged(ServiceState serviceState) { 560 send(LISTEN_SERVICE_STATE, 0, 0, serviceState); 561 } 562 onSignalStrengthChanged(int asu)563 public void onSignalStrengthChanged(int asu) { 564 send(LISTEN_SIGNAL_STRENGTH, asu, 0, null); 565 } 566 onMessageWaitingIndicatorChanged(boolean mwi)567 public void onMessageWaitingIndicatorChanged(boolean mwi) { 568 send(LISTEN_MESSAGE_WAITING_INDICATOR, mwi ? 1 : 0, 0, null); 569 } 570 onCallForwardingIndicatorChanged(boolean cfi)571 public void onCallForwardingIndicatorChanged(boolean cfi) { 572 send(LISTEN_CALL_FORWARDING_INDICATOR, cfi ? 1 : 0, 0, null); 573 } 574 onCellLocationChanged(Bundle bundle)575 public void onCellLocationChanged(Bundle bundle) { 576 CellLocation location = CellLocation.newFromBundle(bundle); 577 send(LISTEN_CELL_LOCATION, 0, 0, location); 578 } 579 onCallStateChanged(int state, String incomingNumber)580 public void onCallStateChanged(int state, String incomingNumber) { 581 send(LISTEN_CALL_STATE, state, 0, incomingNumber); 582 } 583 onDataConnectionStateChanged(int state, int networkType)584 public void onDataConnectionStateChanged(int state, int networkType) { 585 send(LISTEN_DATA_CONNECTION_STATE, state, networkType, null); 586 } 587 onDataActivity(int direction)588 public void onDataActivity(int direction) { 589 send(LISTEN_DATA_ACTIVITY, direction, 0, null); 590 } 591 onSignalStrengthsChanged(SignalStrength signalStrength)592 public void onSignalStrengthsChanged(SignalStrength signalStrength) { 593 send(LISTEN_SIGNAL_STRENGTHS, 0, 0, signalStrength); 594 } 595 onOtaspChanged(int otaspMode)596 public void onOtaspChanged(int otaspMode) { 597 send(LISTEN_OTASP_CHANGED, otaspMode, 0, null); 598 } 599 onCellInfoChanged(List<CellInfo> cellInfo)600 public void onCellInfoChanged(List<CellInfo> cellInfo) { 601 send(LISTEN_CELL_INFO, 0, 0, cellInfo); 602 } 603 onPreciseCallStateChanged(PreciseCallState callState)604 public void onPreciseCallStateChanged(PreciseCallState callState) { 605 send(LISTEN_PRECISE_CALL_STATE, 0, 0, callState); 606 } 607 onPreciseDataConnectionStateChanged( PreciseDataConnectionState dataConnectionState)608 public void onPreciseDataConnectionStateChanged( 609 PreciseDataConnectionState dataConnectionState) { 610 send(LISTEN_PRECISE_DATA_CONNECTION_STATE, 0, 0, dataConnectionState); 611 } 612 onDataConnectionRealTimeInfoChanged( DataConnectionRealTimeInfo dcRtInfo)613 public void onDataConnectionRealTimeInfoChanged( 614 DataConnectionRealTimeInfo dcRtInfo) { 615 send(LISTEN_DATA_CONNECTION_REAL_TIME_INFO, 0, 0, dcRtInfo); 616 } 617 onVoLteServiceStateChanged(VoLteServiceState lteState)618 public void onVoLteServiceStateChanged(VoLteServiceState lteState) { 619 send(LISTEN_VOLTE_STATE, 0, 0, lteState); 620 } 621 onOemHookRawEvent(byte[] rawData)622 public void onOemHookRawEvent(byte[] rawData) { 623 send(LISTEN_OEM_HOOK_RAW_EVENT, 0, 0, rawData); 624 } 625 onCarrierNetworkChange(boolean active)626 public void onCarrierNetworkChange(boolean active) { 627 send(LISTEN_CARRIER_NETWORK_CHANGE, 0, 0, active); 628 } 629 } 630 631 IPhoneStateListener callback = new IPhoneStateListenerStub(this); 632 log(String s)633 private void log(String s) { 634 Rlog.d(LOG_TAG, s); 635 } 636 } 637