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