Merge "Adding the ability for carrier app to override SPN and carrier name." into lmp-dev
diff --git a/src/java/android/telephony/SmsManager.java b/src/java/android/telephony/SmsManager.java
index 9a6d24a..ff6e46c 100644
--- a/src/java/android/telephony/SmsManager.java
+++ b/src/java/android/telephony/SmsManager.java
@@ -1037,7 +1037,6 @@
* @param sentIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is successfully sent, or failed
* @throws IllegalArgumentException if pdu is empty
- * {@hide}
*/
public void sendMultimediaMessage(long subId, byte[] pdu, String locationUrl,
PendingIntent sentIntent) {
@@ -1078,7 +1077,6 @@
* @param downloadedIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is downloaded, or the download is failed
* @throws IllegalArgumentException if locationUrl is empty
- * {@hide}
*/
public void downloadMultimediaMessage(long subId, String locationUrl,
PendingIntent downloadedIntent) {
@@ -1396,7 +1394,6 @@
* raw pdu of the status report is in the extended data ("pdu").
*
* @throws IllegalArgumentException if messageUri is empty
- * {@hide}
*/
public void sendStoredTextMessage(long subId, Uri messageUri, String scAddress,
PendingIntent sentIntent, PendingIntent deliveryIntent) {
@@ -1483,7 +1480,6 @@
* extended data ("pdu").
*
* @throws IllegalArgumentException if messageUri is empty
- * {@hide}
*/
public void sendStoredMultipartTextMessage(long subId, Uri messageUri, String scAddress,
ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) {
@@ -1525,7 +1521,6 @@
* @param sentIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is successfully sent, or failed
* @throws IllegalArgumentException if messageUri is empty
- * {@hide}
*/
public void sendStoredMultimediaMessage(long subId, Uri messageUri, PendingIntent sentIntent) {
if (messageUri == null) {
diff --git a/src/java/com/android/internal/telephony/CallManager.java b/src/java/com/android/internal/telephony/CallManager.java
index 0f30a4c..75227ad 100644
--- a/src/java/com/android/internal/telephony/CallManager.java
+++ b/src/java/com/android/internal/telephony/CallManager.java
@@ -26,6 +26,7 @@
import android.os.Message;
import android.os.RegistrantList;
import android.os.Registrant;
+import android.telecomm.VideoCallProfile;
import android.telephony.PhoneNumberUtils;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -707,7 +708,8 @@
}
}
- ringingPhone.acceptCall();
+ // We only support the AUDIO_ONLY video state in this scenario.
+ ringingPhone.acceptCall(VideoCallProfile.VIDEO_STATE_AUDIO_ONLY);
if (VDBG) {
Rlog.d(LOG_TAG, "End acceptCall(" +ringingCall + ")");
diff --git a/src/java/com/android/internal/telephony/CommandsInterface.java b/src/java/com/android/internal/telephony/CommandsInterface.java
index e75de0b..3d14b86 100644
--- a/src/java/com/android/internal/telephony/CommandsInterface.java
+++ b/src/java/com/android/internal/telephony/CommandsInterface.java
@@ -1655,10 +1655,14 @@
* Base64 encoded Strings.
* Can support EAP-SIM, EAP-AKA with results encoded per 3GPP TS 31.102.
*
+ * @param authContext is the P2 parameter that specifies the authentication context per 3GPP TS
+ * 31.102 (Section 7.1.2)
* @param data authentication challenge data
+ * @param aid used to determine which application/slot to send the auth command to. See ETSI
+ * 102.221 8.1 and 101.220 4
* @param response a callback message with the String response in the obj field
*/
- public void requestIccSimAuthentication(String data, Message response);
+ public void requestIccSimAuthentication(int authContext, String data, String aid, Message response);
/**
* Get the current Voice Radio Technology.
diff --git a/src/java/com/android/internal/telephony/Connection.java b/src/java/com/android/internal/telephony/Connection.java
index e1ef562..3d096cf 100644
--- a/src/java/com/android/internal/telephony/Connection.java
+++ b/src/java/com/android/internal/telephony/Connection.java
@@ -21,25 +21,52 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
/**
* {@hide}
*/
public abstract class Connection {
-
public interface PostDialListener {
void onPostDialWait();
}
+ /**
+ * Listener interface for events related to the connection which should be reported to the
+ * {@link android.telecomm.Connection}.
+ */
+ public interface Listener {
+ public void onVideoStateChanged(int videoState);
+ public void onLocalVideoCapabilityChanged(boolean capable);
+ public void onRemoteVideoCapabilityChanged(boolean capable);
+ }
+
+ /**
+ * Base listener implementation.
+ */
+ public abstract static class ListenerBase implements Listener {
+ @Override
+ public void onVideoStateChanged(int videoState) {}
+ @Override
+ public void onLocalVideoCapabilityChanged(boolean capable) {}
+ @Override
+ public void onRemoteVideoCapabilityChanged(boolean capable) {}
+ }
+
//Caller Name Display
protected String mCnapName;
protected int mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED;
private List<PostDialListener> mPostDialListeners = new ArrayList<>();
+ private final Set<Listener> mListeners = new CopyOnWriteArraySet<>();
private static String LOG_TAG = "Connection";
Object mUserData;
+ private int mVideoState;
+ private boolean mLocalVideoCapable;
+ private boolean mRemoteVideoCapable;
/* Instance Methods */
@@ -310,6 +337,89 @@
public abstract boolean isMultiparty();
/**
+ * Assign a listener to be notified of state changes.
+ *
+ * @param listener A listener.
+ */
+ public final void addListener(Listener listener) {
+ mListeners.add(listener);
+ }
+
+ /**
+ * Removes a listener.
+ *
+ * @param listener A listener.
+ */
+ public final void removeListener(Listener listener) {
+ mListeners.remove(listener);
+ }
+
+ /**
+ * Returns the current video state of the connection.
+ *
+ * @return The video state of the connection.
+ */
+ public int getVideoState() {
+ return mVideoState;
+ }
+
+ /**
+ * Returns the local video capability state for the connection.
+ *
+ * @return {@code True} if the connection has local video capabilities.
+ */
+ public boolean isLocalVideoCapable() {
+ return mLocalVideoCapable;
+ }
+
+ /**
+ * Returns the remote video capability state for the connection.
+ *
+ * @return {@code True} if the connection has remote video capabilities.
+ */
+ public boolean isRemoteVideoCapable() {
+ return mRemoteVideoCapable;
+ }
+
+
+ /**
+ * Sets the videoState for the current connection and reports the changes to all listeners.
+ * Valid video states are defined in {@link VideoCallProfile}.
+ *
+ * @return The video state.
+ */
+ public void setVideoState(int videoState) {
+ mVideoState = videoState;
+ for (Listener l : mListeners) {
+ l.onVideoStateChanged(mVideoState);
+ }
+ }
+
+ /**
+ * Sets whether video capability is present locally.
+ *
+ * @param capable {@code True} if video capable.
+ */
+ public void setLocalVideoCapable(boolean capable) {
+ mLocalVideoCapable = capable;
+ for (Listener l : mListeners) {
+ l.onLocalVideoCapabilityChanged(mLocalVideoCapable);
+ }
+ }
+
+ /**
+ * Sets whether video capability is present remotely.
+ *
+ * @param capable {@code True} if video capable.
+ */
+ public void setRemoteVideoCapable(boolean capable) {
+ mRemoteVideoCapable = capable;
+ for (Listener l : mListeners) {
+ l.onRemoteVideoCapabilityChanged(mRemoteVideoCapable);
+ }
+ }
+
+ /**
* Build a human representation of a connection instance, suitable for debugging.
* Don't log personal stuff unless in debug mode.
* @return a string representing the internal state of this connection.
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index 6a5a82d..517557c 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -647,9 +647,10 @@
* {@link #registerForPreciseCallStateChanged(android.os.Handler, int,
* java.lang.Object) registerForPreciseCallStateChanged()}.
*
+ * @param videoState The video state in which to answer the call.
* @exception CallStateException when no call is ringing or waiting
*/
- void acceptCall() throws CallStateException;
+ void acceptCall(int videoState) throws CallStateException;
/**
* Reject (ignore) a ringing call. In GSM, this means UDUB
diff --git a/src/java/com/android/internal/telephony/PhoneProxy.java b/src/java/com/android/internal/telephony/PhoneProxy.java
index e043bf9..e78db0d 100644
--- a/src/java/com/android/internal/telephony/PhoneProxy.java
+++ b/src/java/com/android/internal/telephony/PhoneProxy.java
@@ -610,8 +610,8 @@
}
@Override
- public void acceptCall() throws CallStateException {
- mActivePhone.acceptCall();
+ public void acceptCall(int videoState) throws CallStateException {
+ mActivePhone.acceptCall(videoState);
}
@Override
diff --git a/src/java/com/android/internal/telephony/PhoneSubInfo.java b/src/java/com/android/internal/telephony/PhoneSubInfo.java
index 4da8e9e..0e5dffd 100755
--- a/src/java/com/android/internal/telephony/PhoneSubInfo.java
+++ b/src/java/com/android/internal/telephony/PhoneSubInfo.java
@@ -279,7 +279,15 @@
return null;
}
- return uiccApp.getIccRecords().getIccSimChallengeResponse(data);
+ int authContext = uiccApp.getAuthContext();
+
+ if(authContext == UiccCardApplication.AUTH_CONTEXT_UNDEFINED) {
+ Rlog.e(LOG_TAG, "getIccSimChallengeResponse() authContext undefined for app type " +
+ appType);
+ return null;
+ }
+
+ return uiccApp.getIccRecords().getIccSimChallengeResponse(authContext, data);
}
private void log(String s) {
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 3b3c245..6089690 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -2496,7 +2496,7 @@
case RIL_REQUEST_SET_UICC_SUBSCRIPTION: ret = responseVoid(p); break;
case RIL_REQUEST_ALLOW_DATA: ret = responseVoid(p); break;
case RIL_REQUEST_GET_HARDWARE_CONFIG: ret = responseHardwareConfig(p); break;
- case RIL_REQUEST_SIM_AUTHENTICATION: ret = responseString(p); break;
+ case RIL_REQUEST_SIM_AUTHENTICATION: ret = responseICC_IO(p); break;
default:
throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest);
//break;
@@ -4198,10 +4198,13 @@
}
@Override
- public void requestIccSimAuthentication(String data, Message response) {
+ public void requestIccSimAuthentication(int authContext, String data, String aid,
+ Message response) {
RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_AUTHENTICATION, response);
+ rr.mParcel.writeInt(authContext);
rr.mParcel.writeString(data);
+ rr.mParcel.writeString(aid);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
diff --git a/src/java/com/android/internal/telephony/cdma/CDMAPhone.java b/src/java/com/android/internal/telephony/cdma/CDMAPhone.java
index d4fb7e3..8d6757b 100644
--- a/src/java/com/android/internal/telephony/cdma/CDMAPhone.java
+++ b/src/java/com/android/internal/telephony/cdma/CDMAPhone.java
@@ -43,6 +43,7 @@
import android.text.TextUtils;
import android.telephony.Rlog;
+import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.CallTracker;
import com.android.internal.telephony.CommandException;
@@ -316,7 +317,12 @@
}
@Override
- public CdmaCall getRingingCall() {
+ public Call getRingingCall() {
+ if ( mCT.mRingingCall != null && mCT.mRingingCall.isRinging() ) {
+ return mCT.mRingingCall;
+ } else if ( mImsPhone != null ) {
+ return mImsPhone.getRingingCall();
+ }
return mCT.mRingingCall;
}
@@ -466,8 +472,12 @@
@Override
public void
- acceptCall() throws CallStateException {
- mCT.acceptCall();
+ acceptCall(int videoState) throws CallStateException {
+ if ( mImsPhone != null && mImsPhone.getRingingCall().isRinging() ) {
+ mImsPhone.acceptCall(videoState);
+ } else {
+ mCT.acceptCall();
+ }
}
@Override
@@ -971,8 +981,7 @@
mNotifier.notifyCellLocation(this);
}
- /*package*/ void notifyNewRingingConnection(Connection c) {
- /* we'd love it if this was package-scoped*/
+ public void notifyNewRingingConnection(Connection c) {
super.notifyNewRingingConnectionP(c);
}
diff --git a/src/java/com/android/internal/telephony/gsm/GSMPhone.java b/src/java/com/android/internal/telephony/gsm/GSMPhone.java
index 6d2a8ad..7f73edb 100644
--- a/src/java/com/android/internal/telephony/gsm/GSMPhone.java
+++ b/src/java/com/android/internal/telephony/gsm/GSMPhone.java
@@ -435,9 +435,7 @@
super.notifyPreciseCallStateChangedP();
}
- /*package*/ void
- notifyNewRingingConnection(Connection c) {
- /* we'd love it if this was package-scoped*/
+ public void notifyNewRingingConnection(Connection c) {
super.notifyNewRingingConnectionP(c);
}
@@ -507,8 +505,12 @@
@Override
public void
- acceptCall() throws CallStateException {
- mCT.acceptCall();
+ acceptCall(int videoState) throws CallStateException {
+ if ( mImsPhone != null && mImsPhone.getRingingCall().isRinging() ) {
+ mImsPhone.acceptCall(videoState);
+ } else {
+ mCT.acceptCall();
+ }
}
@Override
@@ -565,8 +567,12 @@
}
@Override
- public GsmCall
- getRingingCall() {
+ public Call getRingingCall() {
+ if ( mCT.mRingingCall != null && mCT.mRingingCall.isRinging() ) {
+ return mCT.mRingingCall;
+ } else if ( mImsPhone != null ) {
+ return mImsPhone.getRingingCall();
+ }
return mCT.mRingingCall;
}
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
index ea0def6..fabe022 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
@@ -174,7 +174,7 @@
@Override
public void
- acceptCall() throws CallStateException {
+ acceptCall(int videoState) throws CallStateException {
mCT.acceptCall();
}
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneBase.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneBase.java
index b2b6155..6efc153 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneBase.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneBase.java
@@ -34,10 +34,14 @@
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.Connection;
import com.android.internal.telephony.dataconnection.DataConnection;
+import com.android.internal.telephony.cdma.CDMAPhone;
+import com.android.internal.telephony.gsm.GSMPhone;
+import com.android.internal.telephony.CallManager;
import com.android.internal.telephony.IccCard;
import com.android.internal.telephony.IccPhoneBookInterfaceManager;
import com.android.internal.telephony.MmiCode;
import com.android.internal.telephony.OperatorInfo;
+import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneNotifier;
@@ -213,7 +217,13 @@
}
void notifyNewRingingConnection(Connection c) {
- super.notifyNewRingingConnectionP(c);
+ Phone defaultPhone = CallManager.getInstance().getDefaultPhone();
+ if ( defaultPhone != null && defaultPhone.getPhoneType() ==
+ PhoneConstants.PHONE_TYPE_GSM ) {
+ ((GSMPhone) defaultPhone).notifyNewRingingConnection(c);
+ } else { // Should be CDMA - also go here by default
+ ((CDMAPhone) defaultPhone).notifyNewRingingConnection(c);
+ }
}
void notifyDisconnect(Connection cn) {
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCall.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCall.java
index a6cab1e..0665300 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCall.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCall.java
@@ -32,7 +32,7 @@
/**
* {@hide}
*/
-class ImsPhoneCall extends Call {
+public class ImsPhoneCall extends Call {
/*************************** Instance Variables **************************/
private static final String LOG_TAG = "ImsPhoneCall";
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index 07e4f8f..5dfa43b 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -330,7 +330,9 @@
setMute(false);
int serviceType = PhoneNumberUtils.isEmergencyNumber(conn.getAddress()) ?
ImsCallProfile.SERVICE_TYPE_EMERGENCY : ImsCallProfile.SERVICE_TYPE_NORMAL;
- int callType = getCallType(videoState);
+ int callType = ImsCallProfile.getCallTypeFromVideoState(videoState);
+ //TODO(vt): Is this sufficient? At what point do we know the video state of the call?
+ conn.setVideoState(videoState);
try {
String[] callees = new String[] { conn.getAddress() };
@@ -348,40 +350,6 @@
}
}
- /**
- * Converts from the video state values defined in {@link VideoCallProfile} to the call types
- * defined in {@link ImsCallProfile}.
- *
- * @param videoState The video state.
- * @return The call type.
- */
- private int getCallType(int videoState) {
- boolean videoTx = isVideoStateSet(videoState, VideoCallProfile.VIDEO_STATE_TX_ENABLED);
- boolean videoRx = isVideoStateSet(videoState, VideoCallProfile.VIDEO_STATE_RX_ENABLED);
- boolean isPaused = isVideoStateSet(videoState, VideoCallProfile.VIDEO_STATE_PAUSED);
- if (isPaused) {
- return ImsCallProfile.CALL_TYPE_VT_NODIR;
- } else if (videoTx && !videoRx) {
- return ImsCallProfile.CALL_TYPE_VT_TX;
- } else if (!videoTx && videoRx) {
- return ImsCallProfile.CALL_TYPE_VT_RX;
- } else if (videoTx && videoRx) {
- return ImsCallProfile.CALL_TYPE_VT;
- }
- return ImsCallProfile.CALL_TYPE_VOICE;
- }
-
- /**
- * Determines if a video state is set in a video state bit-mask.
- *
- * @param videoState The video state bit mask.
- * @param videoStateToCheck The particular video state to check.
- * @return True if the video state is set in the bit-mask.
- */
- private boolean isVideoStateSet(int videoState, int videoStateToCheck) {
- return (videoState & videoStateToCheck) == videoStateToCheck;
- }
-
void
acceptCall () throws CallStateException {
if (DBG) log("acceptCall");
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
index d59d4a1..b804075 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
@@ -538,7 +538,7 @@
}
@Override
- public void requestIccSimAuthentication(String data, Message response) {
+ public void requestIccSimAuthentication(int authContext, String data, String aid, Message response) {
}
@Override
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
index 77ae57d..6603cbe 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
@@ -24,6 +24,7 @@
import android.os.PowerManager;
import android.os.Registrant;
import android.os.SystemClock;
+import android.telecomm.VideoCallProfile;
import android.telephony.DisconnectCause;
import android.telephony.PhoneNumberUtils;
import android.telephony.Rlog;
@@ -143,6 +144,15 @@
imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_OIR));
mCnapNamePresentation = presentationFromOir(
imsCall.getCallProfile().getCallExtraInt(ImsCallProfile.EXTRA_CNAP));
+
+ ImsCallProfile imsCallProfile = imsCall.getCallProfile();
+ if (imsCallProfile != null) {
+ int callType = imsCall.getCallProfile().mCallType;
+ setVideoState(ImsCallProfile.getVideoStateFromCallType(callType));
+ }
+ //TODO(vt): Set the local and remote video capabilities appropriately.
+ setLocalVideoCapable(true);
+ setRemoteVideoCapable(true);
} else {
mNumberPresentation = PhoneConstants.PRESENTATION_UNKNOWN;
mCnapNamePresentation = PhoneConstants.PRESENTATION_UNKNOWN;
@@ -641,3 +651,4 @@
}
}
}
+
diff --git a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
index 6223e48..83f95fb 100644
--- a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
+++ b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
@@ -540,7 +540,7 @@
}
@Override
- public void requestIccSimAuthentication(String data, Message response) {
+ public void requestIccSimAuthentication(int authContext, String data, String aid, Message response) {
}
@Override
diff --git a/src/java/com/android/internal/telephony/sip/SipPhone.java b/src/java/com/android/internal/telephony/sip/SipPhone.java
index 4ecfe58..6edee55 100644
--- a/src/java/com/android/internal/telephony/sip/SipPhone.java
+++ b/src/java/com/android/internal/telephony/sip/SipPhone.java
@@ -144,7 +144,7 @@
}
@Override
- public void acceptCall() throws CallStateException {
+ public void acceptCall(int videoState) throws CallStateException {
synchronized (SipPhone.class) {
if ((mRingingCall.getState() == Call.State.INCOMING) ||
(mRingingCall.getState() == Call.State.WAITING)) {
diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommands.java b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
index 250e507..0aef631 100644
--- a/src/java/com/android/internal/telephony/test/SimulatedCommands.java
+++ b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
@@ -1643,7 +1643,7 @@
}
@Override
- public void requestIccSimAuthentication(String data, Message response) {
+ public void requestIccSimAuthentication(int authContext, String data, String aid, Message response) {
unimplemented(response);
}
diff --git a/src/java/com/android/internal/telephony/uicc/IccRecords.java b/src/java/com/android/internal/telephony/uicc/IccRecords.java
index e54dfa4..6c68dae 100644
--- a/src/java/com/android/internal/telephony/uicc/IccRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/IccRecords.java
@@ -67,7 +67,7 @@
protected boolean mIsVoiceMailFixed = false;
protected int mCountVoiceMessages = 0;
protected String mImsi;
- private String auth_rsp;
+ private IccIoResult auth_rsp;
protected int mMncLength = UNINITIALIZED;
protected int mMailboxIndex = 0; // 0 is no mailbox dailing number associated
@@ -432,7 +432,7 @@
loge("Exception ICC SIM AKA: " + ar.exception);
} else {
try {
- auth_rsp = (String)ar.result;
+ auth_rsp = (IccIoResult)ar.result;
if (DBG) log("ICC SIM AKA: auth_rsp = " + auth_rsp);
} catch (Exception e) {
loge("Failed to parse ICC SIM AKA contents: " + e);
@@ -543,19 +543,17 @@
* Base64 encoded Strings.
* Can support EAP-SIM, EAP-AKA with results encoded per 3GPP TS 31.102.
*
+ * @param authContext parameter P2 that specifies the authentication context per 3GPP TS 31.102 (Section 7.1.2)
* @param data authentication challenge data
* @return challenge response
*/
- public String getIccSimChallengeResponse(String data) {
- if (DBG) log("getIccSimChallengeResponse-data: (original) " + data);
-
- data = data + mParentApp.getAid();
-
- if (DBG) log("getIccSimChallengeResponse-data: (with AID) " + data);
+ public String getIccSimChallengeResponse(int authContext, String data) {
+ if (DBG) log("getIccSimChallengeResponse-data: " + data);
try {
synchronized(mLock) {
- mCi.requestIccSimAuthentication(data, obtainMessage(EVENT_AKA_AUTHENTICATE_DONE));
+ mCi.requestIccSimAuthentication(authContext, data, mParentApp.getAid(),
+ obtainMessage(EVENT_AKA_AUTHENTICATE_DONE));
try {
mLock.wait();
} catch (InterruptedException e) {
@@ -569,7 +567,7 @@
if (DBG) log("getIccSimChallengeResponse-auth_rsp" + auth_rsp);
- return auth_rsp;
+ return IccUtils.bytesToHexString(auth_rsp.payload);
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
diff --git a/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java b/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java
index 94efb98..72bb02f 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java
@@ -25,6 +25,7 @@
import android.telephony.Rlog;
import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
@@ -49,10 +50,18 @@
private static final int EVENT_CHANGE_FACILITY_LOCK_DONE = 7;
private static final int EVENT_PIN2_PUK2_DONE = 8;
+ /**
+ * These values are for authContext (parameter P2) per 3GPP TS 31.102 (Section 7.1.2)
+ */
+ public static final int AUTH_CONTEXT_EAP_SIM = 128;
+ public static final int AUTH_CONTEXT_EAP_AKA = 129;
+ public static final int AUTH_CONTEXT_UNDEFINED = -1;
+
private final Object mLock = new Object();
private UiccCard mUiccCard; //parent
private AppState mAppState;
private AppType mAppType;
+ private int mAuthContext;
private PersoSubState mPersoSubState;
private String mAid;
private String mAppLabel;
@@ -84,6 +93,7 @@
mUiccCard = uiccCard;
mAppState = as.app_state;
mAppType = as.app_type;
+ mAuthContext = getAuthContext(mAppType);
mPersoSubState = as.perso_substate;
mAid = as.aid;
mAppLabel = as.app_label;
@@ -116,6 +126,7 @@
AppState oldAppState = mAppState;
PersoSubState oldPersoSubState = mPersoSubState;
mAppType = as.app_type;
+ mAuthContext = getAuthContext(mAppType);
mAppState = as.app_state;
mPersoSubState = as.perso_substate;
mAid = as.aid;
@@ -536,6 +547,39 @@
}
}
+ public int getAuthContext() {
+ synchronized (mLock) {
+ return mAuthContext;
+ }
+ }
+
+ /**
+ * Returns the authContext based on the type of UiccCard.
+ *
+ * @param appType the app type
+ * @return authContext corresponding to the type or AUTH_CONTEXT_UNDEFINED if appType not
+ * supported
+ */
+ private static int getAuthContext(AppType appType) {
+ int authContext;
+
+ switch (appType) {
+ case APPTYPE_SIM:
+ authContext = AUTH_CONTEXT_EAP_SIM;
+ break;
+
+ case APPTYPE_USIM:
+ authContext = AUTH_CONTEXT_EAP_AKA;
+ break;
+
+ default:
+ authContext = AUTH_CONTEXT_UNDEFINED;
+ break;
+ }
+
+ return authContext;
+ }
+
public PersoSubState getPersoSubState() {
synchronized (mLock) {
return mPersoSubState;
diff --git a/src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java b/src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java
index 3a0d01c..55ddef8 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java
@@ -52,7 +52,10 @@
* after the UICC can be read. And it should be deleted when a UICC is changed.
*
* The spec for the rules:
- * TODO: Put link here.
+ * GP Secure Element Access Control:
+ * http://www.globalplatform.org/specifications/review/GPD_SE_Access_Control_v1.0.20.pdf
+ * Extension spec:
+ * https://code.google.com/p/seek-for-android/
*
*
* TODO: Notifications.
@@ -62,7 +65,7 @@
public class UiccCarrierPrivilegeRules extends Handler {
private static final String LOG_TAG = "UiccCarrierPrivilegeRules";
- private static final String AID = "A0000000015141434C00";
+ private static final String AID = "A00000015141434C00";
private static final int CLA = 0x80;
private static final int COMMAND = 0xB0;
private static final int P1 = 0x00;