diff options
| -rw-r--r-- | api/current.txt | 7 | ||||
| -rw-r--r-- | api/system-current.txt | 7 | ||||
| -rw-r--r-- | api/test-current.txt | 7 | ||||
| -rw-r--r-- | telephony/java/android/telephony/TelephonyManager.java | 79 | ||||
| -rw-r--r-- | telephony/java/android/telephony/UssdResponse.aidl | 20 | ||||
| -rw-r--r-- | telephony/java/android/telephony/UssdResponse.java | 80 | ||||
| -rw-r--r-- | telephony/java/com/android/internal/telephony/ITelephony.aidl | 9 |
7 files changed, 208 insertions, 1 deletions
diff --git a/api/current.txt b/api/current.txt index f59322a827a4..77b013152caa 100644 --- a/api/current.txt +++ b/api/current.txt @@ -38226,6 +38226,7 @@ package android.telephony { method public boolean isWorldPhone(); method public void listen(android.telephony.PhoneStateListener, int); method public java.lang.String sendEnvelopeWithStatus(java.lang.String); + method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.OnReceiveUssdResponseCallback, android.os.Handler); method public void setDataEnabled(boolean); method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String); method public boolean setOperatorBrandOverride(java.lang.String); @@ -38300,6 +38301,12 @@ package android.telephony { field public static final java.lang.String VVM_TYPE_OMTP = "vvm_type_omtp"; } + public static abstract class TelephonyManager.OnReceiveUssdResponseCallback { + ctor public TelephonyManager.OnReceiveUssdResponseCallback(); + method public void onReceiveUssdResponse(java.lang.String, java.lang.CharSequence); + method public void onReceiveUssdResponseFailed(java.lang.String, int); + } + } package android.telephony.cdma { diff --git a/api/system-current.txt b/api/system-current.txt index dab25acb0fbd..4d7219aa2d67 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -41451,6 +41451,7 @@ package android.telephony { method public void listen(android.telephony.PhoneStateListener, int); method public boolean needsOtaServiceProvisioning(); method public java.lang.String sendEnvelopeWithStatus(java.lang.String); + method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.OnReceiveUssdResponseCallback, android.os.Handler); method public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>); method public void setDataEnabled(boolean); method public void setDataEnabled(int, boolean); @@ -41546,6 +41547,12 @@ package android.telephony { field public static final java.lang.String VVM_TYPE_OMTP = "vvm_type_omtp"; } + public static abstract class TelephonyManager.OnReceiveUssdResponseCallback { + ctor public TelephonyManager.OnReceiveUssdResponseCallback(); + method public void onReceiveUssdResponse(java.lang.String, java.lang.CharSequence); + method public void onReceiveUssdResponseFailed(java.lang.String, int); + } + } package android.telephony.cdma { diff --git a/api/test-current.txt b/api/test-current.txt index 0126ae5571a0..e238b83c7950 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -38325,6 +38325,7 @@ package android.telephony { method public boolean isWorldPhone(); method public void listen(android.telephony.PhoneStateListener, int); method public java.lang.String sendEnvelopeWithStatus(java.lang.String); + method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.OnReceiveUssdResponseCallback, android.os.Handler); method public void setDataEnabled(boolean); method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String); method public boolean setOperatorBrandOverride(java.lang.String); @@ -38399,6 +38400,12 @@ package android.telephony { field public static final java.lang.String VVM_TYPE_OMTP = "vvm_type_omtp"; } + public static abstract class TelephonyManager.OnReceiveUssdResponseCallback { + ctor public TelephonyManager.OnReceiveUssdResponseCallback(); + method public void onReceiveUssdResponse(java.lang.String, java.lang.CharSequence); + method public void onReceiveUssdResponseFailed(java.lang.String, int); + } + } package android.telephony.cdma { diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 1c020aef5417..1d860d1df661 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -16,8 +16,11 @@ package android.telephony; +import static com.android.internal.util.Preconditions.checkNotNull; + import android.annotation.IntDef; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; @@ -28,12 +31,13 @@ import android.content.Intent; import android.net.ConnectivityManager; import android.net.Uri; import android.os.BatteryStats; -import android.os.ResultReceiver; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.os.Bundle; +import android.os.Handler; import android.os.PersistableBundle; import android.os.RemoteException; +import android.os.ResultReceiver; import android.os.ServiceManager; import android.os.SystemProperties; import android.service.carrier.CarrierIdentifier; @@ -838,6 +842,29 @@ public class TelephonyManager { */ public static final String VVM_TYPE_CVVM = "vvm_type_cvvm"; + /** + * @hide + */ + public static final String USSD_RESPONSE = "USSD_RESPONSE"; + + /** + * USSD return code success. + * @hide + */ + public static final int USSD_RETURN_SUCCESS = 100; + + /** + * USSD return code for failure case. + * @hide + */ + public static final int USSD_RETURN_FAILURE = -1; + + /** + * USSD return code for failure case. + * @hide + */ + public static final int USSD_ERROR_SERVICE_UNAVAIL = -2; + // // // Device Info @@ -4965,6 +4992,56 @@ public class TelephonyManager { return new int[0]; } + public static abstract class OnReceiveUssdResponseCallback { + /** + ** Called when USSD has succeeded. + **/ + public void onReceiveUssdResponse(String request, CharSequence response) {}; + + /** + ** Called when USSD has failed. + **/ + public void onReceiveUssdResponseFailed(String request, int failureCode) {}; + } + + /* <p>Requires permission: + * @link android.Manifest.permission#CALL_PHONE} + */ + @RequiresPermission(android.Manifest.permission.CALL_PHONE) + public void sendUssdRequest(String ussdRequest, + final OnReceiveUssdResponseCallback callback, Handler handler) { + checkNotNull(callback, "OnReceiveUssdResponseCallback cannot be null."); + + ResultReceiver wrappedCallback = new ResultReceiver(handler) { + @Override + protected void onReceiveResult(int resultCode, Bundle ussdResponse) { + Rlog.d(TAG, "USSD:" + resultCode); + checkNotNull(ussdResponse, "ussdResponse cannot be null."); + UssdResponse response = ussdResponse.getParcelable(USSD_RESPONSE); + + if (resultCode == USSD_RETURN_SUCCESS) { + callback.onReceiveUssdResponse(response.getUssdRequest(), + response.getReturnMessage()); + } else { + callback.onReceiveUssdResponseFailed(response.getUssdRequest(), resultCode); + } + } + }; + + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + telephony.handleUssdRequest(ussdRequest, wrappedCallback); + } + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelephony#sendUSSDCode", e); + UssdResponse response = new UssdResponse(ussdRequest, ""); + Bundle returnData = new Bundle(); + returnData.putParcelable(USSD_RESPONSE, response); + wrappedCallback.send(USSD_ERROR_SERVICE_UNAVAIL, returnData); + } + } + /** @hide */ @SystemApi public boolean handlePinMmi(String dialString) { diff --git a/telephony/java/android/telephony/UssdResponse.aidl b/telephony/java/android/telephony/UssdResponse.aidl new file mode 100644 index 000000000000..add28a02ae10 --- /dev/null +++ b/telephony/java/android/telephony/UssdResponse.aidl @@ -0,0 +1,20 @@ +/* +** +** Copyright 2007, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +package android.telephony; + +parcelable UssdResponse; diff --git a/telephony/java/android/telephony/UssdResponse.java b/telephony/java/android/telephony/UssdResponse.java new file mode 100644 index 000000000000..5df681d4406e --- /dev/null +++ b/telephony/java/android/telephony/UssdResponse.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.telephony; + +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; + +/** + * Represents the Ussd response, including + * the message and the return code. + * @hide + */ +public final class UssdResponse implements Parcelable { + private CharSequence mReturnMessage; + private String mUssdRequest; + + + /** + * Implement the Parcelable interface + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mUssdRequest); + TextUtils.writeToParcel(mReturnMessage, dest, 0); + } + + public String getUssdRequest() { + return mUssdRequest; + } + + public CharSequence getReturnMessage() { + return mReturnMessage; + } + + /** + * Implement the Parcelable interface + */ + @Override + public int describeContents() { + return 0; + } + + /** + * * Initialize the object from the request and return message. + */ + public UssdResponse(String ussdRequest, CharSequence returnMessage) { + mUssdRequest = ussdRequest; + mReturnMessage = returnMessage; + } + + public static final Parcelable.Creator<UssdResponse> CREATOR = new Creator<UssdResponse>() { + + @Override + public UssdResponse createFromParcel(Parcel in) { + String request = in.readString(); + CharSequence message = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); + return new UssdResponse(request, message); + } + + @Override + public UssdResponse[] newArray(int size) { + return new UssdResponse[size]; + } + }; +} diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index c6b750e71098..2741bd488405 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -273,6 +273,15 @@ interface ITelephony { */ boolean handlePinMmi(String dialString); + + /** + * Handles USSD commands. + * + * @param ussdRequest the USSD command to be executed. + * @param wrappedCallback receives a callback result. + */ + void handleUssdRequest(String ussdRequest, in ResultReceiver wrappedCallback); + /** * Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated * without SEND (so <code>dial</code> is not appropriate) for |