Merge "Provide an API to make USSD calls and read the responses."

This commit is contained in:
Pankaj Kanwar
2017-04-24 19:52:32 +00:00
committed by Gerrit Code Review
7 changed files with 208 additions and 1 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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];
}
};
}

View File

@@ -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