1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.phone; 18 19 import static com.android.internal.util.Preconditions.checkNotNull; 20 21 import android.os.Bundle; 22 import android.os.Handler; 23 import android.os.RemoteException; 24 import android.os.ResultReceiver; 25 import android.telephony.TelephonyManager; 26 import android.telephony.UssdResponse; 27 import android.text.TextUtils; 28 import android.util.Log; 29 30 import com.android.internal.telephony.IIntegerConsumer; 31 32 import java.util.HashMap; 33 34 /** 35 * Handling the call waiting USSD result. 36 */ 37 public class CallWaitingUssdResultReceiver extends ResultReceiver { 38 private static final String LOG_TAG = "CwUssdResultReceiver"; 39 40 private IIntegerConsumer mCallback; 41 private CarrierXmlParser mCarrierXmlParser; 42 private CarrierXmlParser.SsEntry.SSAction mSsAction; 43 CallWaitingUssdResultReceiver(Handler handler, IIntegerConsumer callback, CarrierXmlParser carrierXmlParser, CarrierXmlParser.SsEntry.SSAction action)44 CallWaitingUssdResultReceiver(Handler handler, IIntegerConsumer callback, 45 CarrierXmlParser carrierXmlParser, CarrierXmlParser.SsEntry.SSAction action) { 46 super(handler); 47 mCallback = callback; 48 mCarrierXmlParser = carrierXmlParser; 49 mSsAction = action; 50 } 51 52 @Override onReceiveResult(int resultCode, Bundle ussdResponse)53 protected void onReceiveResult(int resultCode, Bundle ussdResponse) { 54 log("USSD:" + resultCode); 55 checkNotNull(ussdResponse, "ussdResponse cannot be null."); 56 UssdResponse response = ussdResponse.getParcelable( 57 TelephonyManager.USSD_RESPONSE); 58 59 if (resultCode == TelephonyManager.USSD_RETURN_SUCCESS) { 60 int callWaitingStatus = getStatusFromResponse(response); 61 try { 62 mCallback.accept(callWaitingStatus); 63 } catch (RemoteException e) { 64 log("Fail to notify getCallWaitingStatus due to " + e); 65 } 66 } else { 67 try { 68 mCallback.accept(TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR); 69 } catch (RemoteException e) { 70 log("Fail to notify getCallWaitingStatus due to " + e); 71 } 72 } 73 } 74 getStatusFromResponse(UssdResponse response)75 private int getStatusFromResponse(UssdResponse response) { 76 int callWaitingStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR; 77 78 CarrierXmlParser.SsFeature callWaitingFeature = mCarrierXmlParser.getFeature( 79 CarrierXmlParser.FEATURE_CALL_WAITING); 80 if (callWaitingFeature == null) { 81 return callWaitingStatus; 82 } 83 84 HashMap<String, String> analysisResult = callWaitingFeature 85 .getResponseSet(mSsAction, response.getReturnMessage().toString()); 86 if (analysisResult.get(CarrierXmlParser.TAG_RESPONSE_STATUS_ERROR) != null) { 87 return callWaitingStatus; 88 } 89 90 if (analysisResult != null && analysisResult.size() != 0) { 91 String tmpStatusStr = analysisResult.get( 92 CarrierXmlParser.TAG_RESPONSE_STATUS); 93 94 if (!TextUtils.isEmpty(tmpStatusStr)) { 95 if (tmpStatusStr.equals( 96 CarrierXmlParser.TAG_COMMAND_RESULT_DEFINITION_ACTIVATE)) { 97 callWaitingStatus = 98 TelephonyManager.CALL_WAITING_STATUS_ENABLED; 99 } else if (tmpStatusStr.equals( 100 CarrierXmlParser.TAG_COMMAND_RESULT_DEFINITION_DEACTIVATE)) { 101 callWaitingStatus = 102 TelephonyManager.CALL_WAITING_STATUS_DISABLED; 103 } 104 } 105 } 106 return callWaitingStatus; 107 } 108 log(String msg)109 private static void log(String msg) { 110 Log.d(LOG_TAG, msg); 111 } 112 } 113