ImsUt.java revision ef36ef67e009449300b0150c60c9f637e205d79e
1ef36ef67e009449300b0150c60c9f637e205d79eWink Saville/*
2ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * Copyright (c) 2013 The Android Open Source Project
3ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *
4ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * you may not use this file except in compliance with the License.
6ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * You may obtain a copy of the License at
7ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *
8ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *
10ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * Unless required by applicable law or agreed to in writing, software
11ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * See the License for the specific language governing permissions and
14ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * limitations under the License.
15ef36ef67e009449300b0150c60c9f637e205d79eWink Saville */
16ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
17ef36ef67e009449300b0150c60c9f637e205d79eWink Savillepackage com.android.ims;
18ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
19ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport java.util.HashMap;
20ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport java.util.Map;
21ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
22ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport android.os.AsyncResult;
23ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport android.os.Bundle;
24ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport android.os.Message;
25ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport android.os.RemoteException;
26ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport android.telephony.Rlog;
27ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
28ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport com.android.ims.internal.IImsUt;
29ef36ef67e009449300b0150c60c9f637e205d79eWink Savilleimport com.android.ims.internal.IImsUtListener;
30ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
31ef36ef67e009449300b0150c60c9f637e205d79eWink Saville/**
32ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * Provides APIs for the supplementary service settings using IMS (Ut interface).
33ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * It is created from 3GPP TS 24.623 (XCAP(XML Configuration Access Protocol)
34ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * over the Ut interface for manipulating supplementary services).
35ef36ef67e009449300b0150c60c9f637e205d79eWink Saville *
36ef36ef67e009449300b0150c60c9f637e205d79eWink Saville * @hide
37ef36ef67e009449300b0150c60c9f637e205d79eWink Saville */
38ef36ef67e009449300b0150c60c9f637e205d79eWink Savillepublic class ImsUt implements ImsUtInterface {
39ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
40ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Key string for an additional supplementary service configurations.
41ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
42ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
43ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Actions : string format of ImsUtInterface#ACTION_xxx
44ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      "0" (deactivation), "1" (activation), "2" (not_used),
45ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      "3" (registration), "4" (erasure), "5" (Interrogation)
46ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
47ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String KEY_ACTION = "action";
48ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
49ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Categories :
50ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      "OIP", "OIR", "TIP", "TIR", "CDIV", "CB", "CW", "CONF",
51ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      "ACR", "MCID", "ECT", "CCBS", "AOC", "MWI", "FA", "CAT"
52ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
53ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Detailed parameter name will be determined according to the properties
54ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * of the supplementary service configuration.
55ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
56ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String KEY_CATEGORY = "category";
57ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String CATEGORY_OIP = "OIP";
58ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String CATEGORY_OIR = "OIR";
59ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String CATEGORY_TIP = "TIP";
60ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String CATEGORY_TIR = "TIR";
61ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String CATEGORY_CDIV = "CDIV";
62ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String CATEGORY_CB = "CB";
63ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String CATEGORY_CW = "CW";
64ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public static final String CATEGORY_CONF = "CONF";
65ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
66ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private static final String TAG = "ImsUt";
67ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private static final boolean DBG = true;
68ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
69ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    // For synchronization of private variables
70ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private Object mLockObj = new Object();
71ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private final IImsUt miUt;
72ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private HashMap<Integer, Message> mPendingCmds =
73ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            new HashMap<Integer, Message>();
74ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
75ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public ImsUt(IImsUt iUt) {
76ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        miUt = iUt;
77ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
78ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (miUt != null) {
79ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
80ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                miUt.setListener(new IImsUtListenerProxy());
81ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
82ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
83ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
84ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
85ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
86ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void close() {
87ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
88ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (miUt != null) {
89ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                try {
90ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    miUt.close();
91ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                } catch (RemoteException e) {
92ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
93ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
94ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
95ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            if (!mPendingCmds.isEmpty()) {
96ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                Map.Entry<Integer, Message>[] entries =
97ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    mPendingCmds.entrySet().toArray(new Map.Entry[mPendingCmds.size()]);
98ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
99ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                for (Map.Entry<Integer, Message> entry : entries) {
100ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    sendFailureReport(entry.getValue(),
101ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                            ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE);
102ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
103ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
104ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.clear();
105ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
106ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
107ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
108ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
109ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
110ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Operations for the supplementary service configuration
111ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
112ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
113ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
114ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Retrieves the configuration of the call barring.
115ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *
116ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param cbType type of call barring to be queried; ImsUtInterface#CB_XXX
117ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * @param result message to pass the result of this operation
118ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     *      The return value of ((AsyncResult)result.obj) is an array of {@link ImsSsInfo}.
119ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
120ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
121ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void queryCallBarring(int cbType, Message result) {
122ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
123ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("queryCallBarring :: Ut=" + miUt + ", cbType=" + cbType);
124ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
125ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
126ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
127ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
128ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.queryCallBarring(cbType);
129ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
130ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
131ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    id *= (-1);
132ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    sendFailureReport(result, id);
133ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
134ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
135ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
136ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
137ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
138ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(result, ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE);
139ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
140ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
141ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
142ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
143ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
144ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Retrieves the configuration of the call forward.
145ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The return value of ((AsyncResult)result.obj) is an array of {@link ImsCallForwardInfo}.
146ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
147ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
148ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void queryCallForward(int condition, String number, Message result) {
149ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
150ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("queryCallForward :: Ut=" + miUt + ", condition=" + condition
151ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    + ", number=" + number);
152ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
153ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
154ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
155ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
156ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.queryCallForward(condition, number);
157ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
158ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
159ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    id *= (-1);
160ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    sendFailureReport(result, id);
161ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
162ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
163ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
164ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
165ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
166ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(result, ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE);
167ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
168ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
169ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
170ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
171ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
172ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Retrieves the configuration of the call waiting.
173ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The return value of ((AsyncResult)result.obj) is an array of {@link ImsSsInfo}.
174ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
175ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
176ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void queryCallWaiting(Message result) {
177ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
178ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("queryCallWaiting :: Ut=" + miUt);
179ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
180ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
181ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
182ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
183ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.queryCallWaiting();
184ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
185ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
186ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    id *= (-1);
187ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    sendFailureReport(result, id);
188ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
189ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
190ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
191ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
192ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
193ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(result, ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE);
194ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
195ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
196ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
197ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
198ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
199ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Modifies the configuration of the call barring.
200ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
201ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
202ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void updateCallBarring(int cbType, boolean enable, Message result) {
203ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
204ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("updateCallBarring :: Ut=" + miUt + ", cbType=" + cbType
205ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    + ", enable=" + enable);
206ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
207ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
208ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
209ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
210ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.updateCallBarring(cbType, enable);
211ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
212ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
213ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    id *= (-1);
214ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    sendFailureReport(result, id);
215ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
216ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
217ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
218ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
219ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
220ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(result, ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE);
221ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
222ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
223ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
224ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
225ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
226ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Modifies the configuration of the call forward.
227ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
228ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
229ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void updateCallForward(int action, int condition, String number,
230ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            int timeSeconds, Message result) {
231ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
232ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("updateCallForward :: Ut=" + miUt + ", action=" + action
233ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    + ", condition=" + condition + ", number=" + number
234ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    + ", timeSeconds=" + timeSeconds);
235ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
236ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
237ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
238ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
239ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.updateCallForward(action, condition, number, timeSeconds);
240ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
241ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
242ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    id *= (-1);
243ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    sendFailureReport(result, id);
244ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
245ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
246ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
247ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
248ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
249ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(result, ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE);
250ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
251ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
252ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
253ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
254ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
255ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Modifies the configuration of the call waiting.
256ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
257ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
258ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void updateCallWaiting(boolean enable, Message result) {
259ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
260ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("updateCallWaiting :: Ut=" + miUt + ", enable=" + enable);
261ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
262ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
263ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
264ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
265ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.updateCallWaiting(enable);
266ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
267ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
268ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    id *= (-1);
269ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    sendFailureReport(result, id);
270ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
271ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
272ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
273ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
274ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
275ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(result, ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE);
276ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
277ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
278ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
279ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
280ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void transact(Bundle ssInfo, Message result) {
281ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
282ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("transact :: Ut=" + miUt + ", ssInfo=" + ssInfo);
283ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
284ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
285ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
286ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
287ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.transact(ssInfo);
288ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
289ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
290ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    id *= (-1);
291ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    sendFailureReport(result, id);
292ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
293ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
294ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
295ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
296ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
297ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(result, ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE);
298ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
299ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
300ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
301ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
302ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void sendFailureReport(Message result, int errorCode) {
303ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (result == null) {
304ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
305ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
306ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
307ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        AsyncResult.forMessage(result, null, new ImsException("Ut Exception", errorCode));
308ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        result.sendToTarget();
309ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
310ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
311ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void sendSuccessReport(Message result) {
312ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (result == null) {
313ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
314ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
315ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
316ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        AsyncResult.forMessage(result, null, null);
317ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        result.sendToTarget();
318ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
319ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
320ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void sendSuccessReport(Message result, Object ssInfo) {
321ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (result == null) {
322ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
323ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
324ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
325ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        AsyncResult.forMessage(result, ssInfo, null);
326ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        result.sendToTarget();
327ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
328ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
329ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void log(String s) {
330ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        Rlog.d(TAG, s);
331ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
332ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
333ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void loge(String s) {
334ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        Rlog.e(TAG, s);
335ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
336ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
337ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void loge(String s, Throwable t) {
338ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        Rlog.e(TAG, s, t);
339ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
340ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
341ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
342ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * A listener type for the result of the supplementary service configuration.
343ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
344ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private class IImsUtListenerProxy extends IImsUtListener.Stub {
345ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
346ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of the supplementary service configuration udpate.
347ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
348ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
349ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationUpdated(IImsUt ut, int id) {
350ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
351ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
352ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
353ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key));
354ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
355ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
356ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
357ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
358ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
359ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationUpdateFailed(IImsUt ut, int id, int errorCode) {
360ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
361ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
362ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
363ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(mPendingCmds.get(key), errorCode);
364ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
365ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
366ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
367ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
368ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
369ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of the supplementary service configuration query.
370ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
371ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
372ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationQueried(IImsUt ut, int id, Bundle ssInfo) {
373ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
374ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
375ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
376ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key), ssInfo);
377ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
378ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
379ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
380ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
381ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
382ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationQueryFailed(IImsUt ut, int id, int errorCode) {
383ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
384ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
385ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
386ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendFailureReport(mPendingCmds.get(key), errorCode);
387ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
388ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
389ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
390ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
391ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
392ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the status of the call barring supplementary service.
393ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
394ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
395ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationCallBarringQueried(IImsUt ut,
396ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id, ImsSsInfo[] cbInfo) {
397ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
398ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
399ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
400ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key), cbInfo);
401ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
402ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
403ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
404ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
405ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
406ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the status of the call forwarding supplementary service.
407ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
408ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
409ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationCallForwardQueried(IImsUt ut,
410ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id, ImsCallForwardInfo[] cfInfo) {
411ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
412ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
413ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
414ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key), cfInfo);
415ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
416ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
417ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
418ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
419ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
420ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the status of the call waiting supplementary service.
421ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
422ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
423ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationCallWaitingQueried(IImsUt ut,
424ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id, ImsSsInfo[] cwInfo) {
425ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
426ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
427ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
428ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key), cwInfo);
429ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
430ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
431ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
432ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
433ef36ef67e009449300b0150c60c9f637e205d79eWink Saville}
434