19c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan/* 29c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * Copyright (C) 2010 The Android Open Source Project 39c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * 49c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License"); 59c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * you may not use this file except in compliance with the License. 69c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * You may obtain a copy of the License at 79c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * 89c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * http://www.apache.org/licenses/LICENSE-2.0 99c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * 109c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * Unless required by applicable law or agreed to in writing, software 119c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS, 129c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * See the License for the specific language governing permissions and 149c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan * limitations under the License. 159c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan */ 169c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 179c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyanpackage com.android.server.sip; 189c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 199c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyanimport android.net.sip.ISipSession; 209c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyanimport android.net.sip.ISipSessionListener; 219c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyanimport android.net.sip.SipProfile; 229c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyanimport android.os.DeadObjectException; 239329db04f13480ccdff013dcc00cdb96f12a921cWink Savilleimport android.telephony.Rlog; 249c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 259c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan/** Class to help safely run a callback in a different thread. */ 269c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyanclass SipSessionListenerProxy extends ISipSessionListener.Stub { 279329db04f13480ccdff013dcc00cdb96f12a921cWink Saville private static final String TAG = "SipSessionListnerProxy"; 289c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 299c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan private ISipSessionListener mListener; 309c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 319c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void setListener(ISipSessionListener listener) { 329c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener = listener; 339c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 349c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 359c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public ISipSessionListener getListener() { 369c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan return mListener; 379c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 389c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 399c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan private void proxy(Runnable runnable) { 409c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan // One thread for each calling back. 419c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan // Note: Guarantee ordering if the issue becomes important. Currently, 429c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan // the chance of handling two callback events at a time is none. 439c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan new Thread(runnable, "SipSessionCallbackThread").start(); 449c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 459c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 469329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 479c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onCalling(final ISipSession session) { 489c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 499c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 509329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 519c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 529c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 539c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onCalling(session); 549c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 559c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onCalling()"); 569c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 579c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 589c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 599c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 609c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 619329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 629c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onRinging(final ISipSession session, final SipProfile caller, 639c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan final String sessionDescription) { 649c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 659c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 669329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 679c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 689c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 699c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onRinging(session, caller, sessionDescription); 709c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 719c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onRinging()"); 729c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 739c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 749c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 759c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 769c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 779329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 789c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onRingingBack(final ISipSession session) { 799c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 809c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 819329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 829c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 839c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 849c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onRingingBack(session); 859c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 869c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onRingingBack()"); 879c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 889c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 899c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 909c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 919c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 929329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 939c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onCallEstablished(final ISipSession session, 949c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan final String sessionDescription) { 959c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 969c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 979329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 989c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 999c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 1009c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onCallEstablished(session, sessionDescription); 1019c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 1029c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onCallEstablished()"); 1039c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1049c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1059c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 1069c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1079c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 1089329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1099c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onCallEnded(final ISipSession session) { 1109c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 1119c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 1129329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1139c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 1149c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 1159c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onCallEnded(session); 1169c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 1179c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onCallEnded()"); 1189c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1199c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1209c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 1219c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1229c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 1239329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 12422ecc3df834674605daf86f7edf20169b6ca800brepo sync public void onCallTransferring(final ISipSession newSession, 12522ecc3df834674605daf86f7edf20169b6ca800brepo sync final String sessionDescription) { 12622ecc3df834674605daf86f7edf20169b6ca800brepo sync if (mListener == null) return; 12722ecc3df834674605daf86f7edf20169b6ca800brepo sync proxy(new Runnable() { 1289329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 12922ecc3df834674605daf86f7edf20169b6ca800brepo sync public void run() { 13022ecc3df834674605daf86f7edf20169b6ca800brepo sync try { 13122ecc3df834674605daf86f7edf20169b6ca800brepo sync mListener.onCallTransferring(newSession, sessionDescription); 13222ecc3df834674605daf86f7edf20169b6ca800brepo sync } catch (Throwable t) { 13322ecc3df834674605daf86f7edf20169b6ca800brepo sync handle(t, "onCallTransferring()"); 13422ecc3df834674605daf86f7edf20169b6ca800brepo sync } 13522ecc3df834674605daf86f7edf20169b6ca800brepo sync } 13622ecc3df834674605daf86f7edf20169b6ca800brepo sync }); 13722ecc3df834674605daf86f7edf20169b6ca800brepo sync } 13822ecc3df834674605daf86f7edf20169b6ca800brepo sync 1399329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1409c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onCallBusy(final ISipSession session) { 1419c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 1429c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 1439329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1449c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 1459c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 1469c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onCallBusy(session); 1479c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 1489c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onCallBusy()"); 1499c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1509c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1519c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 1529c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1539c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 1549329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1559c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onCallChangeFailed(final ISipSession session, 1569c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan final int errorCode, final String message) { 1579c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 1589c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 1599329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1609c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 1619c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 1629c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onCallChangeFailed(session, errorCode, message); 1639c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 1649c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onCallChangeFailed()"); 1659c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1669c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1679c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 1689c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1699c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 1709329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1719c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onError(final ISipSession session, final int errorCode, 1729c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan final String message) { 1739c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 1749c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 1759329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1769c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 1779c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 1789c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onError(session, errorCode, message); 1799c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 1809c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onError()"); 1819c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1829c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1839c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 1849c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1859c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 1869329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1879c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onRegistering(final ISipSession session) { 1889c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 1899c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 1909329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 1919c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 1929c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 1939c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onRegistering(session); 1949c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 1959c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onRegistering()"); 1969c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1979c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 1989c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 1999c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2009c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 2019329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 2029c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onRegistrationDone(final ISipSession session, 2039c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan final int duration) { 2049c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 2059c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 2069329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 2079c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 2089c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 2099c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onRegistrationDone(session, duration); 2109c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 2119c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onRegistrationDone()"); 2129c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2139c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2149c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 2159c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2169c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 2179329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 2189c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onRegistrationFailed(final ISipSession session, 2199c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan final int errorCode, final String message) { 2209c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 2219c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 2229329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 2239c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 2249c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 2259c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onRegistrationFailed(session, errorCode, message); 2269c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 2279c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onRegistrationFailed()"); 2289c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2299c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2309c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 2319c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2329c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 2339329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 2349c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void onRegistrationTimeout(final ISipSession session) { 2359c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (mListener == null) return; 2369c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan proxy(new Runnable() { 2379329db04f13480ccdff013dcc00cdb96f12a921cWink Saville @Override 2389c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan public void run() { 2399c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan try { 2409c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener.onRegistrationTimeout(session); 2419c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } catch (Throwable t) { 2429c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan handle(t, "onRegistrationTimeout()"); 2439c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2449c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2459c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan }); 2469c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2479c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan 2489c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan private void handle(Throwable t, String message) { 2499c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan if (t instanceof DeadObjectException) { 2509c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan mListener = null; 2519c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan // This creates race but it's harmless. Just don't log the error 2529c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan // when it happens. 2539c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } else if (mListener != null) { 2549329db04f13480ccdff013dcc00cdb96f12a921cWink Saville loge(message, t); 2559c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2569c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan } 2579329db04f13480ccdff013dcc00cdb96f12a921cWink Saville 2589329db04f13480ccdff013dcc00cdb96f12a921cWink Saville private void log(String s) { 2599329db04f13480ccdff013dcc00cdb96f12a921cWink Saville Rlog.d(TAG, s); 2609329db04f13480ccdff013dcc00cdb96f12a921cWink Saville } 2619329db04f13480ccdff013dcc00cdb96f12a921cWink Saville 2629329db04f13480ccdff013dcc00cdb96f12a921cWink Saville private void loge(String s, Throwable t) { 2639329db04f13480ccdff013dcc00cdb96f12a921cWink Saville Rlog.e(TAG, s, t); 2649329db04f13480ccdff013dcc00cdb96f12a921cWink Saville } 2659c1fbe7bca34ac7463079926a401a3ce42717460Hung-ying Tyan} 266