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