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(),
101f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
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) {
131f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
132f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
133ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
134ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
135ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
136ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
137ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
138f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
139f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
140ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
141ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
142ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
143ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
144ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
145ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Retrieves the configuration of the call forward.
146ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The return value of ((AsyncResult)result.obj) is an array of {@link ImsCallForwardInfo}.
147ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
148ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
149ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void queryCallForward(int condition, String number, Message result) {
150ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
151ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("queryCallForward :: Ut=" + miUt + ", condition=" + condition
152ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    + ", number=" + number);
153ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
154ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
155ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
156ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
157ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.queryCallForward(condition, number);
158ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
159ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
160f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
161f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
162ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
163ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
164ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
165ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
166ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
167f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
168f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
169ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
170ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
171ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
172ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
173ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
174ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Retrieves the configuration of the call waiting.
175ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * The return value of ((AsyncResult)result.obj) is an array of {@link ImsSsInfo}.
176ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
177ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
178ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void queryCallWaiting(Message result) {
179ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
180ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("queryCallWaiting :: Ut=" + miUt);
181ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
182ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
183ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
184ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
185ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.queryCallWaiting();
186ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
187ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
188f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
189f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
190ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
191ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
192ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
193ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
194ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
195f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
196f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
197ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
198ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
199ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
200ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
201ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
2029b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     * Retrieves the default CLIR setting.
2039b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     */
2049b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    @Override
2059b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    public void queryCLIR(Message result) {
2069b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        if (DBG) {
2079b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            log("queryCLIR :: Ut=" + miUt);
2089b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
2099b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2109b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        synchronized(mLockObj) {
2119b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            try {
2129b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                int id = miUt.queryCLIR();
2139b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2149b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                if (id < 0) {
215f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
216f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
2179b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                    return;
2189b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                }
2199b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2209b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                mPendingCmds.put(Integer.valueOf(id), result);
2219b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            } catch (RemoteException e) {
222f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
223f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
2249b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            }
2259b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
2269b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    }
2279b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2289b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    /**
2299b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     * Retrieves the CLIP call setting.
2309b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     */
2319b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    public void queryCLIP(Message result) {
2329b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        if (DBG) {
2339b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            log("queryCLIP :: Ut=" + miUt);
2349b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
2359b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2369b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        synchronized(mLockObj) {
2379b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            try {
2389b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                int id = miUt.queryCLIP();
2399b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2409b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                if (id < 0) {
241f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
242f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
2439b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                    return;
2449b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                }
2459b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2469b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                mPendingCmds.put(Integer.valueOf(id), result);
2479b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            } catch (RemoteException e) {
248f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
249f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
2509b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            }
2519b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
2529b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    }
2539b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2549b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    /**
2559b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     * Retrieves the COLR call setting.
2569b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     */
2579b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    public void queryCOLR(Message result) {
2589b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        if (DBG) {
2599b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            log("queryCOLR :: Ut=" + miUt);
2609b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
2619b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2629b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        synchronized(mLockObj) {
2639b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            try {
2649b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                int id = miUt.queryCOLR();
2659b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2669b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                if (id < 0) {
267f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
268f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
2699b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                    return;
2709b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                }
2719b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2729b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                mPendingCmds.put(Integer.valueOf(id), result);
2739b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            } catch (RemoteException e) {
274f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
275f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
2769b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            }
2779b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
2789b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    }
2799b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2809b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    /**
2819b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     * Retrieves the COLP call setting.
2829b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     */
2839b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    public void queryCOLP(Message result) {
2849b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        if (DBG) {
2859b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            log("queryCOLP :: Ut=" + miUt);
2869b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
2879b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2889b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        synchronized(mLockObj) {
2899b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            try {
2909b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                int id = miUt.queryCOLP();
2919b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2929b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                if (id < 0) {
293f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
294f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
2959b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                    return;
2969b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                }
2979b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
2989b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                mPendingCmds.put(Integer.valueOf(id), result);
2999b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            } catch (RemoteException e) {
300f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
301f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
3029b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            }
3039b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
3049b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    }
3059b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
3069b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    /**
307ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Modifies the configuration of the call barring.
308ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
309ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
310f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh    public void updateCallBarring(int cbType, boolean enable, Message result, String[] barrList) {
311ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
312f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh            if (barrList != null) {
313f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                String bList = new String();
314f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                for (int i = 0; i < barrList.length; i++) {
315f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    bList.concat(barrList[i] + " ");
316f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                }
317f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                log("updateCallBarring :: Ut=" + miUt + ", cbType=" + cbType
318f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        + ", enable=" + enable + ", barrList=" + bList);
319f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh            }
320f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh            else {
321f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                log("updateCallBarring :: Ut=" + miUt + ", cbType=" + cbType
322f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        + ", enable=" + enable);
323f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh            }
324ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
325ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
326ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
327ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
328f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                int id = miUt.updateCallBarring(cbType, enable, barrList);
329ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
330ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
331f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
332f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
333ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
334ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
335ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
336ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
337ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
338f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
339f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
340ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
341ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
342ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
343ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
344ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
345ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Modifies the configuration of the call forward.
346ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
347ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
348ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void updateCallForward(int action, int condition, String number,
349ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            int timeSeconds, Message result) {
350ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
351ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("updateCallForward :: Ut=" + miUt + ", action=" + action
352ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    + ", condition=" + condition + ", number=" + number
353ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    + ", timeSeconds=" + timeSeconds);
354ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
355ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
356ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
357ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
358ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.updateCallForward(action, condition, number, timeSeconds);
359ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
360ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
361f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
362f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
363ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
364ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
365ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
366ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
367ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
368f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
369f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
370ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
371ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
372ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
373ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
374ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
375ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * Modifies the configuration of the call waiting.
376ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
377ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    @Override
378ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void updateCallWaiting(boolean enable, Message result) {
379ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
380ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("updateCallWaiting :: Ut=" + miUt + ", enable=" + enable);
381ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
382ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
383ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
384ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
385ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.updateCallWaiting(enable);
386ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
387ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
388f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
389f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
390ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
391ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
392ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
393ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
394ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
395f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
396f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
397ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
398ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
399ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
400ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
4019b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    /**
4029b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     * Updates the configuration of the CLIR supplementary service.
4039b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     */
4049b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    @Override
4059b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    public void updateCLIR(int clirMode, Message result) {
4069b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        if (DBG) {
4079b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            log("updateCLIR :: Ut=" + miUt + ", clirMode=" + clirMode);
4089b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
4099b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4109b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        synchronized(mLockObj) {
4119b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            try {
4129b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                int id = miUt.updateCLIR(clirMode);
4139b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4149b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                if (id < 0) {
415f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
416f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
4179b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                    return;
4189b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                }
4199b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4209b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                mPendingCmds.put(Integer.valueOf(id), result);
4219b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            } catch (RemoteException e) {
422f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
423f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
4249b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            }
4259b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
4269b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    }
4279b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4289b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    /**
4299b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     * Updates the configuration of the CLIP supplementary service.
4309b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     */
4319b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    @Override
4329b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    public void updateCLIP(boolean enable, Message result) {
4339b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        if (DBG) {
4349b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            log("updateCLIP :: Ut=" + miUt + ", enable=" + enable);
4359b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
4369b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4379b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        synchronized(mLockObj) {
4389b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            try {
4399b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                int id = miUt.updateCLIP(enable);
4409b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4419b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                if (id < 0) {
442f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
443f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
4449b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                    return;
4459b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                }
4469b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4479b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                mPendingCmds.put(Integer.valueOf(id), result);
4489b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            } catch (RemoteException e) {
449f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
450f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
4519b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            }
4529b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
4539b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    }
4549b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4559b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    /**
4569b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     * Updates the configuration of the COLR supplementary service.
4579b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     */
4589b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    @Override
4599b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    public void updateCOLR(int presentation, Message result) {
4609b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        if (DBG) {
4619b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            log("updateCOLR :: Ut=" + miUt + ", presentation=" + presentation);
4629b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
4639b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4649b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        synchronized(mLockObj) {
4659b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            try {
4669b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                int id = miUt.updateCOLR(presentation);
4679b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4689b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                if (id < 0) {
469f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
470f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
4719b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                    return;
4729b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                }
4739b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4749b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                mPendingCmds.put(Integer.valueOf(id), result);
4759b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            } catch (RemoteException e) {
476f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
477f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
4789b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            }
4799b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
4809b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    }
4819b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4829b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    /**
4839b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     * Updates the configuration of the COLP supplementary service.
4849b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen     */
4859b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    @Override
4869b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    public void updateCOLP(boolean enable, Message result) {
4879b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        if (DBG) {
4889b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            log("updateCallWaiting :: Ut=" + miUt + ", enable=" + enable);
4899b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
4909b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4919b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        synchronized(mLockObj) {
4929b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            try {
4939b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                int id = miUt.updateCOLP(enable);
4949b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
4959b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                if (id < 0) {
496f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
497f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
4989b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                    return;
4999b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                }
5009b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
5019b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen                mPendingCmds.put(Integer.valueOf(id), result);
5029b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            } catch (RemoteException e) {
503f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
504f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
5059b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen            }
5069b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen        }
5079b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen    }
5089b4ca89882b8b403b36462972b826ac9199a34a4Etan Cohen
509ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    public void transact(Bundle ssInfo, Message result) {
510ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (DBG) {
511ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            log("transact :: Ut=" + miUt + ", ssInfo=" + ssInfo);
512ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
513ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
514ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        synchronized(mLockObj) {
515ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            try {
516ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id = miUt.transact(ssInfo);
517ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
518ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                if (id < 0) {
519f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                    sendFailureReport(result,
520f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                            new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
521ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                    return;
522ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                }
523ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
524ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.put(Integer.valueOf(id), result);
525ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            } catch (RemoteException e) {
526f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(result,
527f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                        new ImsReasonInfo(ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, 0));
528ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
529ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
530ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
531ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
532f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh    private void sendFailureReport(Message result, ImsReasonInfo error) {
533f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        if (result == null || error == null) {
534ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
535ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
536ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
537f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        String errorString;
538f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        // If ImsReasonInfo object does not have a String error code, use a
539f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        // default error string.
540f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        if (error.mExtraMessage == null) {
541f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh            errorString = new String("IMS UT exception");
542f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        }
543f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        else {
544f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh            errorString = new String(error.mExtraMessage);
545f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        }
546f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        AsyncResult.forMessage(result, null, new ImsException(errorString, error.mCode));
547ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        result.sendToTarget();
548ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
549ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
550ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void sendSuccessReport(Message result) {
551ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (result == null) {
552ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
553ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
554ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
555ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        AsyncResult.forMessage(result, null, null);
556ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        result.sendToTarget();
557ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
558ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
559ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void sendSuccessReport(Message result, Object ssInfo) {
560ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        if (result == null) {
561ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            return;
562ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
563ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
564ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        AsyncResult.forMessage(result, ssInfo, null);
565ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        result.sendToTarget();
566ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
567ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
568ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void log(String s) {
569ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        Rlog.d(TAG, s);
570ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
571ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
572ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void loge(String s) {
573ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        Rlog.e(TAG, s);
574ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
575ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
576ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private void loge(String s, Throwable t) {
577ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        Rlog.e(TAG, s, t);
578ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
579ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
580ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    /**
581ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     * A listener type for the result of the supplementary service configuration.
582ef36ef67e009449300b0150c60c9f637e205d79eWink Saville     */
583ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    private class IImsUtListenerProxy extends IImsUtListener.Stub {
584ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
585ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of the supplementary service configuration udpate.
586ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
587ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
588ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationUpdated(IImsUt ut, int id) {
589ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
590ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
591ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
592ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key));
593ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
594ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
595ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
596ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
597ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
598f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        public void utConfigurationUpdateFailed(IImsUt ut, int id, ImsReasonInfo error) {
599ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
600ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
601ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
602f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(mPendingCmds.get(key), error);
603ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
604ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
605ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
606ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
607ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
608ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the result of the supplementary service configuration query.
609ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
610ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
611ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationQueried(IImsUt ut, int id, Bundle ssInfo) {
612ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
613ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
614ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
615ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key), ssInfo);
616ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
617ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
618ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
619ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
620ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
621f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh        public void utConfigurationQueryFailed(IImsUt ut, int id, ImsReasonInfo error) {
622ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
623ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
624ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
625f54a9cc3d97915245086cdbf32cc2fbe8bfaea8cShriram Ganesh                sendFailureReport(mPendingCmds.get(key), error);
626ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
627ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
628ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
629ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
630ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
631ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the status of the call barring supplementary service.
632ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
633ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
634ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationCallBarringQueried(IImsUt ut,
635ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id, ImsSsInfo[] cbInfo) {
636ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
637ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
638ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
639ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key), cbInfo);
640ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
641ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
642ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
643ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
644ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
645ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the status of the call forwarding supplementary service.
646ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
647ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
648ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationCallForwardQueried(IImsUt ut,
649ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id, ImsCallForwardInfo[] cfInfo) {
650ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
651ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
652ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
653ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key), cfInfo);
654ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
655ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
656ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
657ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
658ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        /**
659ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         * Notifies the status of the call waiting supplementary service.
660ef36ef67e009449300b0150c60c9f637e205d79eWink Saville         */
661ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        @Override
662ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        public void utConfigurationCallWaitingQueried(IImsUt ut,
663ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                int id, ImsSsInfo[] cwInfo) {
664ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            Integer key = Integer.valueOf(id);
665ef36ef67e009449300b0150c60c9f637e205d79eWink Saville
666ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            synchronized(mLockObj) {
667ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                sendSuccessReport(mPendingCmds.get(key), cwInfo);
668ef36ef67e009449300b0150c60c9f637e205d79eWink Saville                mPendingCmds.remove(key);
669ef36ef67e009449300b0150c60c9f637e205d79eWink Saville            }
670ef36ef67e009449300b0150c60c9f637e205d79eWink Saville        }
671ef36ef67e009449300b0150c60c9f637e205d79eWink Saville    }
672ef36ef67e009449300b0150c60c9f637e205d79eWink Saville}
673