Merge "Update SubscriptionManager API as per API council." into lmp-mr1-dev

This commit is contained in:
Wink Saville
2014-11-12 01:13:01 +00:00
committed by Android (Google) Code Review
12 changed files with 509 additions and 213 deletions

View File

@@ -372,6 +372,7 @@ LOCAL_SRC_FILES += \
telephony/java/com/android/internal/telephony/ITelephony.aidl \ telephony/java/com/android/internal/telephony/ITelephony.aidl \
telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl \ telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl \
telephony/java/com/android/internal/telephony/ISms.aidl \ telephony/java/com/android/internal/telephony/ISms.aidl \
telephony/java/com/android/internal/telephony/ISubscriptionListener.aidl \
telephony/java/com/android/internal/telephony/IWapPushManager.aidl \ telephony/java/com/android/internal/telephony/IWapPushManager.aidl \
telephony/java/com/android/internal/telephony/ISub.aidl \ telephony/java/com/android/internal/telephony/ISub.aidl \
telephony/java/com/android/internal/telephony/IMms.aidl \ telephony/java/com/android/internal/telephony/IMms.aidl \

View File

@@ -28424,6 +28424,7 @@ package android.telephony {
method public void downloadMultimediaMessage(android.content.Context, java.lang.String, android.net.Uri, android.os.Bundle, android.app.PendingIntent); method public void downloadMultimediaMessage(android.content.Context, java.lang.String, android.net.Uri, android.os.Bundle, android.app.PendingIntent);
method public android.os.Bundle getCarrierConfigValues(); method public android.os.Bundle getCarrierConfigValues();
method public static android.telephony.SmsManager getDefault(); method public static android.telephony.SmsManager getDefault();
method public static int getDefaultSmsSubscriptionId();
method public static android.telephony.SmsManager getSmsManagerForSubscriber(int); method public static android.telephony.SmsManager getSmsManagerForSubscriber(int);
method public int getSubId(); method public int getSubId();
method public void injectSmsPdu(byte[], java.lang.String, android.app.PendingIntent); method public void injectSmsPdu(byte[], java.lang.String, android.app.PendingIntent);
@@ -28542,7 +28543,7 @@ package android.telephony {
field public byte[] encodedScAddress; field public byte[] encodedScAddress;
} }
public class SubInfoRecord implements android.os.Parcelable { public class SubscriptionInfo implements android.os.Parcelable {
method public android.graphics.Bitmap createIconBitmap(android.content.Context); method public android.graphics.Bitmap createIconBitmap(android.content.Context);
method public int describeContents(); method public int describeContents();
method public int getDataRoaming(); method public int getDataRoaming();
@@ -28556,25 +28557,23 @@ package android.telephony {
method public int getSimSlotIndex(); method public int getSimSlotIndex();
method public int getSubscriptionId(); method public int getSubscriptionId();
method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.SubInfoRecord> CREATOR; field public static final android.os.Parcelable.Creator<android.telephony.SubscriptionInfo> CREATOR;
}
public class SubscriptionListener {
ctor public SubscriptionListener();
ctor public SubscriptionListener(android.os.Looper);
method public void onSubscriptionInfoChanged();
field public static final int LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED = 1; // 0x1
} }
public class SubscriptionManager implements android.provider.BaseColumns { public class SubscriptionManager implements android.provider.BaseColumns {
method public static java.util.List<android.telephony.SubInfoRecord> getActiveSubInfoList(); method public static java.util.List<android.telephony.SubscriptionInfo> getActiveSubscriptionInfoList();
method public static int getDefaultSmsSubId(); method public static android.telephony.SubscriptionInfo getSubscriptionInfoForSubscriber(int);
method public static int getSlotId(int); method public static java.util.List<android.telephony.SubscriptionInfo> getSubscriptionInfoUsingSlotId(int);
method public static android.telephony.SubInfoRecord getSubInfoForSubscriber(int); method public static void register(android.content.Context, android.telephony.SubscriptionListener, int);
method public static java.util.List<android.telephony.SubInfoRecord> getSubInfoUsingSlotId(int); method public static void unregister(android.content.Context, android.telephony.SubscriptionListener);
method public static boolean isValidSubId(int);
field public static final int ASK_USER_SUB_ID = -1001; // 0xfffffc17
field public static final int DEFAULT_PHONE_ID = 2147483647; // 0x7fffffff
field public static final int DEFAULT_SUB_ID = 2147483647; // 0x7fffffff
field public static final int INVALID_PHONE_ID = -1000; // 0xfffffc18
field public static final int INVALID_SLOT_ID = -1000; // 0xfffffc18
field public static final int INVALID_SUB_ID = -1000; // 0xfffffc18 field public static final int INVALID_SUB_ID = -1000; // 0xfffffc18
field public static final java.lang.String MCC = "mcc";
field public static final java.lang.String MNC = "mnc";
field public static final int SIM_NOT_INSERTED = -1; // 0xffffffff
} }
public class TelephonyManager { public class TelephonyManager {

View File

@@ -34,6 +34,8 @@ import android.os.UserHandle;
import android.telephony.CellLocation; import android.telephony.CellLocation;
import android.telephony.DataConnectionRealTimeInfo; import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.Rlog; import android.telephony.Rlog;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionListener;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
@@ -56,6 +58,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import com.android.internal.app.IBatteryStats; import com.android.internal.app.IBatteryStats;
import com.android.internal.telephony.ISubscriptionListener;
import com.android.internal.telephony.ITelephonyRegistry; import com.android.internal.telephony.ITelephonyRegistry;
import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.IPhoneStateListener;
import com.android.internal.telephony.DefaultPhoneNotifier; import com.android.internal.telephony.DefaultPhoneNotifier;
@@ -90,19 +93,30 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
IBinder binder; IBinder binder;
IPhoneStateListener callback; IPhoneStateListener callback;
ISubscriptionListener subscriptionListenerCallback;
int callerUid; int callerUid;
int events; int events;
int subId; int subId = SubscriptionManager.INVALID_SUB_ID;
int phoneId; int phoneId = SubscriptionManager.INVALID_PHONE_ID;
boolean matchPhoneStateListenerEvent(int events) {
return (callback != null) && ((events & this.events) != 0);
}
boolean matchSubscriptionListenerEvent(int events) {
return (subscriptionListenerCallback != null) && ((events & this.events) != 0);
}
@Override @Override
public String toString() { public String toString() {
return "{pkgForDebug=" + pkgForDebug + " callerUid=" + callerUid + " subId=" + subId + return "{pkgForDebug=" + pkgForDebug + " binder=" + binder + " callback=" + callback
" phoneId=" + phoneId + " events=" + Integer.toHexString(events) + "}"; + " subscriptionListenererCallback=" + subscriptionListenerCallback
+ " callerUid=" + callerUid + " subId=" + subId + " phoneId=" + phoneId
+ " events=" + Integer.toHexString(events) + "}";
} }
} }
@@ -324,6 +338,101 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mContext.registerReceiver(mBroadcastReceiver, filter); mContext.registerReceiver(mBroadcastReceiver, filter);
} }
@Override
public void registerSubscriptionListener(String pkgForDebug, ISubscriptionListener callback,
int events) {
int callerUid = UserHandle.getCallingUserId();
int myUid = UserHandle.myUserId();
if (VDBG) {
log("listen sl: E pkg=" + pkgForDebug + " events=0x" + Integer.toHexString(events)
+ " myUid=" + myUid + " callerUid=" + callerUid + " callback=" + callback
+ " callback.asBinder=" + callback.asBinder());
}
if (events != 0) {
/* Checks permission and throws Security exception */
checkSubscriptionListenerPermission(events);
Record r = null;
synchronized (mRecords) {
// register
find_and_add: {
IBinder b = callback.asBinder();
final int N = mRecords.size();
for (int i = 0; i < N; i++) {
r = mRecords.get(i);
if (b == r.binder) {
break find_and_add;
}
}
r = new Record();
r.binder = b;
mRecords.add(r);
if (DBG) log("listen sl: add new record");
}
r.subscriptionListenerCallback = callback;
r.pkgForDebug = pkgForDebug;
r.callerUid = callerUid;
r.events = events;
if (DBG) {
log("listen sl: Register r=" + r);
}
}
// Always notify when a listen is established.
if (r.matchSubscriptionListenerEvent(
SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED)) {
try {
if (VDBG) log("listen sl: send to r=" + r);
r.subscriptionListenerCallback.onSubscriptionInfoChanged();
if (VDBG) log("listen sl: sent to r=" + r);
} catch (RemoteException e) {
if (VDBG) log("listen sl: remote exception sending to r=" + r + " e=" + e);
remove(r.binder);
}
}
} else {
if (DBG) log("listen sl: Unregister as event is LISTEN_NONE");
unregisterSubscriptionListener(pkgForDebug, callback);
}
}
@Override
public void unregisterSubscriptionListener(String pkgForDebug, ISubscriptionListener callback) {
if (DBG) log("listen sl: Unregister as event is LISTEN_NONE");
remove(callback.asBinder());
}
private void checkSubscriptionListenerPermission(int events) {
if ((events & SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED) != 0) {
mContext.enforceCallingOrSelfPermission(
SubscriptionListener.PERMISSION_LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED, null);
}
}
@Override
public void notifySubscriptionInfoChanged() {
if (VDBG) log("notifySubscriptionInfoChanged:");
synchronized (mRecords) {
mRemoveList.clear();
for (Record r : mRecords) {
if (r.matchSubscriptionListenerEvent(
SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED)) {
try {
if (VDBG) log("notifySubscriptionInfoChanged: send to r=" + r);
r.subscriptionListenerCallback.onSubscriptionInfoChanged();
if (VDBG) log("notifySubscriptionInfoChanged: sent to r=" + r);
} catch (RemoteException ex) {
if (VDBG) log("notifySubscriptionInfoChanged: RemoteException r=" + r);
mRemoveList.add(r.binder);
}
}
}
handleRemoveListLocked();
}
}
@Override @Override
public void listen(String pkgForDebug, IPhoneStateListener callback, int events, public void listen(String pkgForDebug, IPhoneStateListener callback, int events,
boolean notifyNow) { boolean notifyNow) {
@@ -513,6 +622,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
final int recordCount = mRecords.size(); final int recordCount = mRecords.size();
for (int i = 0; i < recordCount; i++) { for (int i = 0; i < recordCount; i++) {
if (mRecords.get(i).binder == binder) { if (mRecords.get(i).binder == binder) {
if (VDBG) log("remove: binder=" + binder);
mRecords.remove(i); mRecords.remove(i);
return; return;
} }
@@ -531,7 +641,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
synchronized (mRecords) { synchronized (mRecords) {
for (Record r : mRecords) { for (Record r : mRecords) {
if (((r.events & PhoneStateListener.LISTEN_CALL_STATE) != 0) && if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_CALL_STATE) &&
(r.subId == SubscriptionManager.DEFAULT_SUB_ID)) { (r.subId == SubscriptionManager.DEFAULT_SUB_ID)) {
try { try {
r.callback.onCallStateChanged(state, incomingNumber); r.callback.onCallStateChanged(state, incomingNumber);
@@ -559,7 +669,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mCallState[phoneId] = state; mCallState[phoneId] = state;
mCallIncomingNumber[phoneId] = incomingNumber; mCallIncomingNumber[phoneId] = incomingNumber;
for (Record r : mRecords) { for (Record r : mRecords) {
if (((r.events & PhoneStateListener.LISTEN_CALL_STATE) != 0) && if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_CALL_STATE) &&
(r.subId == subId) && (r.subId == subId) &&
(r.subId != SubscriptionManager.DEFAULT_SUB_ID)) { (r.subId != SubscriptionManager.DEFAULT_SUB_ID)) {
try { try {
@@ -595,7 +705,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
log("notifyServiceStateForSubscriber: r=" + r + " subId=" + subId log("notifyServiceStateForSubscriber: r=" + r + " subId=" + subId
+ " phoneId=" + phoneId + " state=" + state); + " phoneId=" + phoneId + " state=" + state);
} }
if (((r.events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) && if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_SERVICE_STATE) &&
idMatch(r.subId, subId, phoneId)) { idMatch(r.subId, subId, phoneId)) {
try { try {
if (DBG) { if (DBG) {
@@ -640,7 +750,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
log("notifySignalStrengthForSubscriber: r=" + r + " subId=" + subId log("notifySignalStrengthForSubscriber: r=" + r + " subId=" + subId
+ " phoneId=" + phoneId + " ss=" + signalStrength); + " phoneId=" + phoneId + " ss=" + signalStrength);
} }
if (((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) && if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) &&
idMatch(r.subId, subId, phoneId)) { idMatch(r.subId, subId, phoneId)) {
try { try {
if (DBG) { if (DBG) {
@@ -653,7 +764,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mRemoveList.add(r.binder); mRemoveList.add(r.binder);
} }
} }
if (((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) && if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_SIGNAL_STRENGTH) &&
idMatch(r.subId, subId, phoneId)){ idMatch(r.subId, subId, phoneId)){
try { try {
int gsmSignalStrength = signalStrength.getGsmSignalStrength(); int gsmSignalStrength = signalStrength.getGsmSignalStrength();
@@ -750,7 +861,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (validatePhoneId(phoneId)) { if (validatePhoneId(phoneId)) {
mMessageWaiting[phoneId] = mwi; mMessageWaiting[phoneId] = mwi;
for (Record r : mRecords) { for (Record r : mRecords) {
if (((r.events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) && if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) &&
idMatch(r.subId, subId, phoneId)) { idMatch(r.subId, subId, phoneId)) {
try { try {
r.callback.onMessageWaitingIndicatorChanged(mwi); r.callback.onMessageWaitingIndicatorChanged(mwi);
@@ -781,7 +893,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (validatePhoneId(phoneId)) { if (validatePhoneId(phoneId)) {
mCallForwarding[phoneId] = cfi; mCallForwarding[phoneId] = cfi;
for (Record r : mRecords) { for (Record r : mRecords) {
if (((r.events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) && if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) &&
idMatch(r.subId, subId, phoneId)) { idMatch(r.subId, subId, phoneId)) {
try { try {
r.callback.onCallForwardingIndicatorChanged(cfi); r.callback.onCallForwardingIndicatorChanged(cfi);
@@ -807,7 +920,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
int phoneId = SubscriptionManager.getPhoneId(subId); int phoneId = SubscriptionManager.getPhoneId(subId);
mDataActivity[phoneId] = state; mDataActivity[phoneId] = state;
for (Record r : mRecords) { for (Record r : mRecords) {
if ((r.events & PhoneStateListener.LISTEN_DATA_ACTIVITY) != 0) { if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_DATA_ACTIVITY)) {
try { try {
r.callback.onDataActivity(state); r.callback.onDataActivity(state);
} catch (RemoteException ex) { } catch (RemoteException ex) {
@@ -878,7 +991,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
+ ", " + mDataConnectionNetworkType[phoneId] + ")"); + ", " + mDataConnectionNetworkType[phoneId] + ")");
} }
for (Record r : mRecords) { for (Record r : mRecords) {
if (((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) && if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) &&
idMatch(r.subId, subId, phoneId)) { idMatch(r.subId, subId, phoneId)) {
try { try {
log("Notify data connection state changed on sub: " + log("Notify data connection state changed on sub: " +
@@ -895,7 +1009,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mPreciseDataConnectionState = new PreciseDataConnectionState(state, networkType, mPreciseDataConnectionState = new PreciseDataConnectionState(state, networkType,
apnType, apn, reason, linkProperties, ""); apnType, apn, reason, linkProperties, "");
for (Record r : mRecords) { for (Record r : mRecords) {
if ((r.events & PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE) != 0) { if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
try { try {
r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState); r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState);
} catch (RemoteException ex) { } catch (RemoteException ex) {
@@ -930,7 +1045,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
TelephonyManager.DATA_UNKNOWN,TelephonyManager.NETWORK_TYPE_UNKNOWN, TelephonyManager.DATA_UNKNOWN,TelephonyManager.NETWORK_TYPE_UNKNOWN,
apnType, "", reason, null, ""); apnType, "", reason, null, "");
for (Record r : mRecords) { for (Record r : mRecords) {
if ((r.events & PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE) != 0) { if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
try { try {
r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState); r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState);
} catch (RemoteException ex) { } catch (RemoteException ex) {
@@ -989,7 +1105,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
synchronized (mRecords) { synchronized (mRecords) {
mOtaspMode = otaspMode; mOtaspMode = otaspMode;
for (Record r : mRecords) { for (Record r : mRecords) {
if ((r.events & PhoneStateListener.LISTEN_OTASP_CHANGED) != 0) { if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_OTASP_CHANGED)) {
try { try {
r.callback.onOtaspChanged(otaspMode); r.callback.onOtaspChanged(otaspMode);
} catch (RemoteException ex) { } catch (RemoteException ex) {
@@ -1015,7 +1131,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
DisconnectCause.NOT_VALID, DisconnectCause.NOT_VALID,
PreciseDisconnectCause.NOT_VALID); PreciseDisconnectCause.NOT_VALID);
for (Record r : mRecords) { for (Record r : mRecords) {
if ((r.events & PhoneStateListener.LISTEN_PRECISE_CALL_STATE) != 0) { if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_PRECISE_CALL_STATE)) {
try { try {
r.callback.onPreciseCallStateChanged(mPreciseCallState); r.callback.onPreciseCallStateChanged(mPreciseCallState);
} catch (RemoteException ex) { } catch (RemoteException ex) {
@@ -1038,7 +1154,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mPreciseCallState = new PreciseCallState(mRingingCallState, mForegroundCallState, mPreciseCallState = new PreciseCallState(mRingingCallState, mForegroundCallState,
mBackgroundCallState, disconnectCause, preciseDisconnectCause); mBackgroundCallState, disconnectCause, preciseDisconnectCause);
for (Record r : mRecords) { for (Record r : mRecords) {
if ((r.events & PhoneStateListener.LISTEN_PRECISE_CALL_STATE) != 0) { if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_PRECISE_CALL_STATE)) {
try { try {
r.callback.onPreciseCallStateChanged(mPreciseCallState); r.callback.onPreciseCallStateChanged(mPreciseCallState);
} catch (RemoteException ex) { } catch (RemoteException ex) {
@@ -1062,7 +1178,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
TelephonyManager.DATA_UNKNOWN, TelephonyManager.NETWORK_TYPE_UNKNOWN, TelephonyManager.DATA_UNKNOWN, TelephonyManager.NETWORK_TYPE_UNKNOWN,
apnType, apn, reason, null, failCause); apnType, apn, reason, null, failCause);
for (Record r : mRecords) { for (Record r : mRecords) {
if ((r.events & PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE) != 0) { if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
try { try {
r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState); r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState);
} catch (RemoteException ex) { } catch (RemoteException ex) {
@@ -1083,7 +1200,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
synchronized (mRecords) { synchronized (mRecords) {
mVoLteServiceState = lteState; mVoLteServiceState = lteState;
for (Record r : mRecords) { for (Record r : mRecords) {
if ((r.events & PhoneStateListener.LISTEN_VOLTE_STATE) != 0) { if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_VOLTE_STATE)) {
try { try {
r.callback.onVoLteServiceStateChanged( r.callback.onVoLteServiceStateChanged(
new VoLteServiceState(mVoLteServiceState)); new VoLteServiceState(mVoLteServiceState));
@@ -1106,7 +1223,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (VDBG) { if (VDBG) {
log("notifyOemHookRawEventForSubscriber: r=" + r + " subId=" + subId); log("notifyOemHookRawEventForSubscriber: r=" + r + " subId=" + subId);
} }
if (((r.events & PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT) != 0) && if ((r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT)) &&
((r.subId == subId) || ((r.subId == subId) ||
(r.subId == SubscriptionManager.DEFAULT_SUB_ID))) { (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
try { try {
@@ -1337,7 +1455,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
private void handleRemoveListLocked() { private void handleRemoveListLocked() {
if (mRemoveList.size() > 0) { int size = mRemoveList.size();
if (VDBG) log("handleRemoveListLocked: mRemoveList.size()=" + size);
if (size > 0) {
for (IBinder b: mRemoveList) { for (IBinder b: mRemoveList) {
remove(b); remove(b);
} }
@@ -1351,7 +1471,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
boolean valid = false; boolean valid = false;
try { try {
foregroundUser = ActivityManager.getCurrentUser(); foregroundUser = ActivityManager.getCurrentUser();
valid = r.callerUid == foregroundUser && (r.events & events) != 0; valid = r.callerUid == foregroundUser && r.matchPhoneStateListenerEvent(events);
if (DBG | DBG_LOC) { if (DBG | DBG_LOC) {
log("validateEventsAndUserLocked: valid=" + valid log("validateEventsAndUserLocked: valid=" + valid
+ " r.callerUid=" + r.callerUid + " foregroundUser=" + foregroundUser + " r.callerUid=" + r.callerUid + " foregroundUser=" + foregroundUser

View File

@@ -72,6 +72,9 @@ import android.provider.Settings;
import android.provider.Telephony.Carriers; import android.provider.Telephony.Carriers;
import android.provider.Telephony.Sms.Intents; import android.provider.Telephony.Sms.Intents;
import android.telephony.SmsMessage; import android.telephony.SmsMessage;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionListener;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation; import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils; import android.text.TextUtils;
@@ -88,6 +91,7 @@ import java.io.StringReader;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Properties; import java.util.Properties;
@@ -452,26 +456,35 @@ public class GpsLocationProvider implements LocationProviderInterface {
|| Intent.ACTION_SCREEN_OFF.equals(action) || Intent.ACTION_SCREEN_OFF.equals(action)
|| Intent.ACTION_SCREEN_ON.equals(action)) { || Intent.ACTION_SCREEN_ON.equals(action)) {
updateLowPowerMode(); updateLowPowerMode();
} else if (action.equals(SIM_STATE_CHANGED) } else if (action.equals(SIM_STATE_CHANGED)) {
|| action.equals(TelephonyIntents.ACTION_SUBINFO_CONTENT_CHANGE) subscriptionOrSimChanged(context);
|| action.equals(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED)) {
Log.d(TAG, "received SIM realted action: " + action);
TelephonyManager phone = (TelephonyManager)
mContext.getSystemService(Context.TELEPHONY_SERVICE);
String mccMnc = phone.getSimOperator();
if (!TextUtils.isEmpty(mccMnc)) {
Log.d(TAG, "SIM MCC/MNC is available: " + mccMnc);
synchronized (mLock) {
reloadGpsProperties(context, mProperties);
mNIHandler.setSuplEsEnabled(mSuplEsEnabled);
}
} else {
Log.d(TAG, "SIM MCC/MNC is still not available");
}
} }
} }
}; };
private final SubscriptionListener mSubscriptionListener = new SubscriptionListener() {
@Override
public void onSubscriptionInfoChanged() {
subscriptionOrSimChanged(mContext);
}
};
private void subscriptionOrSimChanged(Context context) {
Log.d(TAG, "received SIM realted action: ");
TelephonyManager phone = (TelephonyManager)
mContext.getSystemService(Context.TELEPHONY_SERVICE);
String mccMnc = phone.getSimOperator();
if (!TextUtils.isEmpty(mccMnc)) {
Log.d(TAG, "SIM MCC/MNC is available: " + mccMnc);
synchronized (mLock) {
reloadGpsProperties(context, mProperties);
mNIHandler.setSuplEsEnabled(mSuplEsEnabled);
}
} else {
Log.d(TAG, "SIM MCC/MNC is still not available");
}
}
private void checkSmsSuplInit(Intent intent) { private void checkSmsSuplInit(Intent intent) {
SmsMessage[] messages = Intents.getMessagesFromIntent(intent); SmsMessage[] messages = Intents.getMessagesFromIntent(intent);
for (int i=0; i <messages.length; i++) { for (int i=0; i <messages.length; i++) {
@@ -626,6 +639,16 @@ public class GpsLocationProvider implements LocationProviderInterface {
mNetInitiatedListener, mNetInitiatedListener,
mSuplEsEnabled); mSuplEsEnabled);
// TODO: When this object "finishes" we should unregister by invoking
// SubscriptionManager.unregister(mContext, mSubscriptionListener);
// This is not strictly necessary because it will be unregistered if the
// notification fails but it is good form.
// Register for SubscriptionInfo list changes which is guaranteed
// to invoke onSubscriptionInfoChanged the first time.
SubscriptionManager.register(mContext, mSubscriptionListener,
SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED);
// construct handler, listen for events // construct handler, listen for events
mHandler = new ProviderHandler(looper); mHandler = new ProviderHandler(looper);
listenForBroadcasts(); listenForBroadcasts();
@@ -735,10 +758,6 @@ public class GpsLocationProvider implements LocationProviderInterface {
intentFilter.addAction(Intent.ACTION_SCREEN_OFF); intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
intentFilter.addAction(Intent.ACTION_SCREEN_ON); intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(SIM_STATE_CHANGED); intentFilter.addAction(SIM_STATE_CHANGED);
// TODO: remove the use TelephonyIntents. We are using it because SIM_STATE_CHANGED
// is not reliable at the moment.
intentFilter.addAction(TelephonyIntents.ACTION_SUBINFO_CONTENT_CHANGE);
intentFilter.addAction(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED);
mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler); mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);
} }

View File

@@ -16,4 +16,4 @@
package android.telephony; package android.telephony;
parcelable SubInfoRecord; parcelable SubscriptionInfo;

View File

@@ -31,7 +31,7 @@ import android.os.Parcelable;
/** /**
* A Parcelable class for Subscription Information. * A Parcelable class for Subscription Information.
*/ */
public class SubInfoRecord implements Parcelable { public class SubscriptionInfo implements Parcelable {
/** /**
* Subscription Identifier, this is a device unique number * Subscription Identifier, this is a device unique number
@@ -99,7 +99,7 @@ public class SubInfoRecord implements Parcelable {
/** /**
* @hide * @hide
*/ */
public SubInfoRecord(int id, String iccId, int simSlotIndex, CharSequence displayName, public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming, CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
Bitmap icon, int mcc, int mnc) { Bitmap icon, int mcc, int mnc) {
this.mId = id; this.mId = id;
@@ -177,12 +177,12 @@ public class SubInfoRecord implements Parcelable {
} }
/** /**
* Creates and returns an icon {@code Bitmap} to represent this {@code SubInfoRecord} in a user * Creates and returns an icon {@code Bitmap} to represent this {@code SubscriptionInfo} in a user
* interface. * interface.
* *
* @param context A {@code Context} to get the {@code DisplayMetrics}s from. * @param context A {@code Context} to get the {@code DisplayMetrics}s from.
* *
* @return A bitmap icon for this {@code SubInfoRecord}. * @return A bitmap icon for this {@code SubscriptionInfo}.
*/ */
public Bitmap createIconBitmap(Context context) { public Bitmap createIconBitmap(Context context) {
int width = mIconBitmap.getWidth(); int width = mIconBitmap.getWidth();
@@ -259,9 +259,9 @@ public class SubInfoRecord implements Parcelable {
return this.mMnc; return this.mMnc;
} }
public static final Parcelable.Creator<SubInfoRecord> CREATOR = new Parcelable.Creator<SubInfoRecord>() { public static final Parcelable.Creator<SubscriptionInfo> CREATOR = new Parcelable.Creator<SubscriptionInfo>() {
@Override @Override
public SubInfoRecord createFromParcel(Parcel source) { public SubscriptionInfo createFromParcel(Parcel source) {
int id = source.readInt(); int id = source.readInt();
String iccId = source.readString(); String iccId = source.readString();
int simSlotIndex = source.readInt(); int simSlotIndex = source.readInt();
@@ -275,13 +275,13 @@ public class SubInfoRecord implements Parcelable {
int mnc = source.readInt(); int mnc = source.readInt();
Bitmap iconBitmap = Bitmap.CREATOR.createFromParcel(source); Bitmap iconBitmap = Bitmap.CREATOR.createFromParcel(source);
return new SubInfoRecord(id, iccId, simSlotIndex, displayName, carrierName, nameSource, return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource,
iconTint, number, dataRoaming, iconBitmap, mcc, mnc); iconTint, number, dataRoaming, iconBitmap, mcc, mnc);
} }
@Override @Override
public SubInfoRecord[] newArray(int size) { public SubscriptionInfo[] newArray(int size) {
return new SubInfoRecord[size]; return new SubscriptionInfo[size];
} }
}; };

View File

@@ -0,0 +1,125 @@
/*
* Copyright (C) 2014 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 com.android.internal.telephony.ISub;
import com.android.internal.telephony.ISubscriptionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.telephony.Rlog;
import java.util.List;
/**
* A listener class for monitoring changes to Subscription state
* changes on the device.
* <p>
* Override the onXxxx methods in this class and passing to the listen method
* bitwise-or of the corresponding LISTEN_Xxxx bit flags below.
* <p>
* Note that access to some of the information is permission-protected. Your
* application won't receive updates for protected information unless it has
* the appropriate permissions declared in its manifest file. Where permissions
* apply, they are noted in the appropriate LISTEN_ flags.
*/
public class SubscriptionListener {
private static final String LOG_TAG = "SubscriptionListener";
private static final boolean DBG = false; // STOPSHIP if true
/**
* Permission for LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED
*
* @hide
*/
public static final String PERMISSION_LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED =
android.Manifest.permission.READ_PHONE_STATE;
/**
* Listen for changes to the SubscriptionInoList when listening for this event
* it is guaranteed that on #onSubscriptionInfoChanged will be invoked. This initial
* invocation should be used to call SubscriptionManager.getActiveSubscriptionInfoList()
* to get the initial list.
*
* Permissions: android.Manifest.permission.READ_PHONE_STATE
* @see #onSubscriptionInfoChanged
*/
public static final int LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED = 0x00000001;
private final Handler mHandler;
/**
* Create a SubscriptionLitener for the device.
*
* This class requires Looper.myLooper() not return null. To supply your
* own non-null looper use PhoneStateListener(Looper looper) below.
*/
public SubscriptionListener() {
this(Looper.myLooper());
}
/**
* Create a PhoneStateListener for the Phone using the specified subscription
* and non-null Looper.
*/
public SubscriptionListener(Looper looper) {
if (DBG) log("ctor: looper=" + looper);
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
mHandler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
if (DBG) {
log("what=0x" + Integer.toHexString(msg.what) + " msg=" + msg);
}
switch (msg.what) {
case LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED:
SubscriptionListener.this.onSubscriptionInfoChanged();
break;
}
}
};
}
/**
* Callback invoked when there is any change to any SubscriptionInfo.
*/
public void onSubscriptionInfoChanged() {
// default implementation empty
}
/**
* The callback methods need to be called on the handler thread where
* this object was created. If the binder did that for us it'd be nice.
*/
ISubscriptionListener callback = new ISubscriptionListener.Stub() {
@Override
public void onSubscriptionInfoChanged() {
Message msg = Message.obtain(mHandler, LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED);
msg.sendToTarget();
}
};
private void log(String s) {
Rlog.d(LOG_TAG, s);
}
}

View File

@@ -18,6 +18,7 @@ package android.telephony;
import android.annotation.SdkConstant; import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SdkConstant.SdkConstantType;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.provider.BaseColumns; import android.provider.BaseColumns;
@@ -26,6 +27,7 @@ import android.os.ServiceManager;
import android.os.RemoteException; import android.os.RemoteException;
import com.android.internal.telephony.ISub; import com.android.internal.telephony.ISub;
import com.android.internal.telephony.ITelephonyRegistry;
import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneConstants;
import java.util.ArrayList; import java.util.ArrayList;
@@ -43,28 +45,29 @@ public class SubscriptionManager implements BaseColumns {
private static final boolean DBG = true; private static final boolean DBG = true;
private static final boolean VDBG = false; private static final boolean VDBG = false;
/** An invalid phone identifier */ /** An invalid subscription identifier */
public static final int INVALID_PHONE_ID = -1000; public static final int INVALID_SUB_ID = -1000;
/** Indicates the caller wants the default phone id. */ /** An invalid phone identifier */
public static final int DEFAULT_PHONE_ID = Integer.MAX_VALUE; /** @hide */
public static final int INVALID_PHONE_ID = -1;
/** An invalid slot identifier */ /** An invalid slot identifier */
public static final int INVALID_SLOT_ID = -1000; /** @hide */
public static final int INVALID_SLOT_ID = -1;
/** Indicates the caller wants the default sub id. */
/** @hide */
public static final int DEFAULT_SUB_ID = Integer.MAX_VALUE;
/** Indicates the caller wants the default phone id. */
/** @hide */
public static final int DEFAULT_PHONE_ID = Integer.MAX_VALUE;
/** Indicates the caller wants the default slot id. */ /** Indicates the caller wants the default slot id. */
/** @hide */ /** @hide */
public static final int DEFAULT_SLOT_ID = Integer.MAX_VALUE; public static final int DEFAULT_SLOT_ID = Integer.MAX_VALUE;
/** Indicates the user should be asked which subscription to use. */
public static final int ASK_USER_SUB_ID = -1001;
/** An invalid subscription identifier */
public static final int INVALID_SUB_ID = -1000;
/** Indicates the caller wants the default sub id. */
public static final int DEFAULT_SUB_ID = Integer.MAX_VALUE;
/** Minimum possible subid that represents a subscription */ /** Minimum possible subid that represents a subscription */
/** @hide */ /** @hide */
public static final int MIN_SUB_ID_VALUE = 0; public static final int MIN_SUB_ID_VALUE = 0;
@@ -77,31 +80,6 @@ public class SubscriptionManager implements BaseColumns {
/** @hide */ /** @hide */
public static final Uri CONTENT_URI = Uri.parse("content://telephony/siminfo"); public static final Uri CONTENT_URI = Uri.parse("content://telephony/siminfo");
/** @hide */
public static final int DEFAULT_INT_VALUE = -100;
/** @hide */
public static final String DEFAULT_STRING_VALUE = "N/A";
/** @hide */
public static final int EXTRA_VALUE_NEW_SIM = 1;
/** @hide */
public static final int EXTRA_VALUE_REMOVE_SIM = 2;
/** @hide */
public static final int EXTRA_VALUE_REPOSITION_SIM = 3;
/** @hide */
public static final int EXTRA_VALUE_NOCHANGE = 4;
/** @hide */
public static final String INTENT_KEY_DETECT_STATUS = "simDetectStatus";
/** @hide */
public static final String INTENT_KEY_SIM_COUNT = "simCount";
/** @hide */
public static final String INTENT_KEY_NEW_SIM_SLOT = "newSIMSlot";
/** @hide */
public static final String INTENT_KEY_NEW_SIM_STATUS = "newSIMStatus";
/** /**
* The ICC ID of a SIM. * The ICC ID of a SIM.
* <P>Type: TEXT (String)</P> * <P>Type: TEXT (String)</P>
@@ -116,6 +94,7 @@ public class SubscriptionManager implements BaseColumns {
public static final String SIM_ID = "sim_id"; public static final String SIM_ID = "sim_id";
/** SIM is not inserted */ /** SIM is not inserted */
/** @hide */
public static final int SIM_NOT_INSERTED = -1; public static final int SIM_NOT_INSERTED = -1;
/** /**
@@ -237,12 +216,14 @@ public class SubscriptionManager implements BaseColumns {
/** /**
* TelephonyProvider column name for the MCC associated with a SIM. * TelephonyProvider column name for the MCC associated with a SIM.
* <P>Type: INTEGER (int)</P> * <P>Type: INTEGER (int)</P>
* @hide
*/ */
public static final String MCC = "mcc"; public static final String MCC = "mcc";
/** /**
* TelephonyProvider column name for the MNC associated with a SIM. * TelephonyProvider column name for the MNC associated with a SIM.
* <P>Type: INTEGER (int)</P> * <P>Type: INTEGER (int)</P>
* @hide
*/ */
public static final String MNC = "mnc"; public static final String MNC = "mnc";
@@ -261,17 +242,70 @@ public class SubscriptionManager implements BaseColumns {
} }
/** /**
* Get the SubInfoRecord associated with the subId * Register for changes to events defined by SubscriptionListener.LISTEN_Xxx. Some of
* @param subId The unique SubInfoRecord index in database * the events will fire as registration completes, this could be before or after
* @return SubInfoRecord, maybe null * this method returns.
*
* @param listener an instance of SubscriptionListner with overridden methods the
* overridden method should match the bits defined in events.
* @param events is one or more of the SubscriptionListener.LISTEN_Xxx bits
*/ */
public static SubInfoRecord getSubInfoForSubscriber(int subId) { public static void register(Context context, SubscriptionListener listener, int events) {
String pkgForDebug = context != null ? context.getPackageName() : "<unknown>";
if (DBG) {
logd("SubscriptionManager listen pkgForDebug=" + pkgForDebug
+ " events=0x" + Integer.toHexString(events) + " listener=" + listener);
}
try {
// We use the TelephonyRegistry as its runs in the system and thus is always
// available where as SubscriptionController could crash and not be available
ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
"telephony.registry"));
if (tr != null) {
tr.registerSubscriptionListener(pkgForDebug, listener.callback, events);
}
} catch (RemoteException ex) {
// Should not happen
}
}
/**
* Unregister the listener.
*
* @param context
* @param listener
*/
public static void unregister(Context context, SubscriptionListener listener) {
String pkgForDebug = context != null ? context.getPackageName() : "<unknown>";
if (DBG) {
logd("SubscriptionManager unregister pkgForDebug=" + pkgForDebug
+ " listener=" + listener);
}
try {
// We use the TelephonyRegistry as its runs in the system and thus is always
// available where as SubscriptionController could crash and not be available
ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
"telephony.registry"));
if (tr != null) {
tr.unregisterSubscriptionListener(pkgForDebug, listener.callback);
}
} catch (RemoteException ex) {
// Should not happen
}
}
/**
* Get the SubscriptionInfo associated with the subId
* @param subId The unique SubscriptionInfo index in database
* @return SubscriptionInfo, maybe null
*/
public static SubscriptionInfo getSubscriptionInfoForSubscriber(int subId) {
if (!isValidSubId(subId)) { if (!isValidSubId(subId)) {
logd("[getSubInfoForSubscriberx]- invalid subId"); logd("[getSubscriptionInfoForSubscriber]- invalid subId");
return null; return null;
} }
SubInfoRecord subInfo = null; SubscriptionInfo subInfo = null;
try { try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -287,19 +321,19 @@ public class SubscriptionManager implements BaseColumns {
} }
/** /**
* Get the SubInfoRecord according to an IccId * Get the SubscriptionInfo according to an IccId
* @param iccId the IccId of SIM card * @param iccId the IccId of SIM card
* @return SubInfoRecord List, maybe empty but not null * @return SubscriptionInfo List, maybe empty but not null
* @hide * @hide
*/ */
public static List<SubInfoRecord> getSubInfoUsingIccId(String iccId) { public static List<SubscriptionInfo> getSubscriptionInfoUsingIccId(String iccId) {
if (VDBG) logd("[getSubInfoUsingIccId]+ iccId=" + iccId); if (VDBG) logd("[getSubscriptionInfoUsingIccId]+ iccId=" + iccId);
if (iccId == null) { if (iccId == null) {
logd("[getSubInfoUsingIccId]- null iccid"); logd("[getSubscriptionInfoUsingIccId]- null iccid");
return null; return null;
} }
List<SubInfoRecord> result = null; List<SubscriptionInfo> result = null;
try { try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -312,24 +346,24 @@ public class SubscriptionManager implements BaseColumns {
if (result == null) { if (result == null) {
result = new ArrayList<SubInfoRecord>(); result = new ArrayList<SubscriptionInfo>();
} }
return result; return result;
} }
/** /**
* Get the SubInfoRecord according to slotId * Get the SubscriptionInfo according to slotId
* @param slotId the slot which the SIM is inserted * @param slotId the slot which the SIM is inserted
* @return SubInfoRecord list, maybe empty but not null * @return SubscriptionInfo list, maybe empty but not null
*/ */
public static List<SubInfoRecord> getSubInfoUsingSlotId(int slotId) { public static List<SubscriptionInfo> getSubscriptionInfoUsingSlotId(int slotId) {
// FIXME: Consider never returning null // FIXME: Consider never returning null
if (!isValidSlotId(slotId)) { if (!isValidSlotId(slotId)) {
logd("[getSubInfoUsingSlotId]- invalid slotId"); logd("[getSubscriptionInfoUsingSlotId]- invalid slotId");
return null; return null;
} }
List<SubInfoRecord> result = null; List<SubscriptionInfo> result = null;
try { try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -342,21 +376,21 @@ public class SubscriptionManager implements BaseColumns {
if (result == null) { if (result == null) {
result = new ArrayList<SubInfoRecord>(); result = new ArrayList<SubscriptionInfo>();
} }
return result; return result;
} }
/** /**
* Get all the SubInfoRecord(s) in subInfo database * Get all the SubscriptionInfo(s) in subInfo database
* @return List of all SubInfoRecords in database, include those that were inserted before * @return List of all SubscriptionInfos in database, include those that were inserted before
* maybe empty but not null. * maybe empty but not null.
* @hide * @hide
*/ */
public static List<SubInfoRecord> getAllSubInfoList() { public static List<SubscriptionInfo> getAllSubscriptionInfoList() {
if (VDBG) logd("[getAllSubInfoList]+"); if (VDBG) logd("[getAllSubscriptionInfoList]+");
List<SubInfoRecord> result = null; List<SubscriptionInfo> result = null;
try { try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -368,17 +402,17 @@ public class SubscriptionManager implements BaseColumns {
} }
if (result == null) { if (result == null) {
result = new ArrayList<SubInfoRecord>(); result = new ArrayList<SubscriptionInfo>();
} }
return result; return result;
} }
/** /**
* Get the SubInfoRecord(s) of the currently inserted SIM(s) * Get the SubscriptionInfo(s) of the currently inserted SIM(s)
* @return Array list of currently inserted SubInfoRecord(s) maybe empty but not null * @return Array list of currently inserted SubscriptionInfo(s) maybe empty but not null
*/ */
public static List<SubInfoRecord> getActiveSubInfoList() { public static List<SubscriptionInfo> getActiveSubscriptionInfoList() {
List<SubInfoRecord> result = null; List<SubscriptionInfo> result = null;
try { try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -390,7 +424,7 @@ public class SubscriptionManager implements BaseColumns {
} }
if (result == null) { if (result == null) {
result = new ArrayList<SubInfoRecord>(); result = new ArrayList<SubscriptionInfo>();
} }
return result; return result;
} }
@@ -400,8 +434,8 @@ public class SubscriptionManager implements BaseColumns {
* @return all SIM count in database, include what was inserted before * @return all SIM count in database, include what was inserted before
* @hide * @hide
*/ */
public static int getAllSubInfoCount() { public static int getAllSubscriptionInfoCount() {
if (VDBG) logd("[getAllSubInfoCount]+"); if (VDBG) logd("[getAllSubscriptionInfoCount]+");
int result = 0; int result = 0;
@@ -422,7 +456,7 @@ public class SubscriptionManager implements BaseColumns {
* @return active SIM count * @return active SIM count
* @hide * @hide
*/ */
public static int getActiveSubInfoCount() { public static int getActiveSubscriptionInfoCount() {
int result = 0; int result = 0;
try { try {
@@ -438,19 +472,19 @@ public class SubscriptionManager implements BaseColumns {
} }
/** /**
* Add a new SubInfoRecord to subinfo database if needed * Add a new SubscriptionInfo to subinfo database if needed
* @param iccId the IccId of the SIM card * @param iccId the IccId of the SIM card
* @param slotId the slot which the SIM is inserted * @param slotId the slot which the SIM is inserted
* @return the URL of the newly created row or the updated row * @return the URL of the newly created row or the updated row
* @hide * @hide
*/ */
public static Uri addSubInfoRecord(String iccId, int slotId) { public static Uri addSubscriptionInfoRecord(String iccId, int slotId) {
if (VDBG) logd("[addSubInfoRecord]+ iccId:" + iccId + " slotId:" + slotId); if (VDBG) logd("[addSubscriptionInfoRecord]+ iccId:" + iccId + " slotId:" + slotId);
if (iccId == null) { if (iccId == null) {
logd("[addSubInfoRecord]- null iccId"); logd("[addSubscriptionInfoRecord]- null iccId");
} }
if (!isValidSlotId(slotId)) { if (!isValidSlotId(slotId)) {
logd("[addSubInfoRecord]- invalid slotId"); logd("[addSubscriptionInfoRecord]- invalid slotId");
} }
try { try {
@@ -500,7 +534,7 @@ public class SubscriptionManager implements BaseColumns {
/** /**
* Set display name by simInfo index * Set display name by simInfo index
* @param displayName the display name of SIM card * @param displayName the display name of SIM card
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated * @return the number of records updated
* @hide * @hide
*/ */
@@ -511,7 +545,7 @@ public class SubscriptionManager implements BaseColumns {
/** /**
* Set display name by simInfo index with name source * Set display name by simInfo index with name source
* @param displayName the display name of SIM card * @param displayName the display name of SIM card
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @param nameSource 0: NAME_SOURCE_DEFAULT_SOURCE, 1: NAME_SOURCE_SIM_SOURCE, * @param nameSource 0: NAME_SOURCE_DEFAULT_SOURCE, 1: NAME_SOURCE_SIM_SOURCE,
* 2: NAME_SOURCE_USER_INPUT, -1 NAME_SOURCE_UNDEFINED * 2: NAME_SOURCE_USER_INPUT, -1 NAME_SOURCE_UNDEFINED
* @return the number of records updated or -1 if invalid subId * @return the number of records updated or -1 if invalid subId
@@ -545,7 +579,7 @@ public class SubscriptionManager implements BaseColumns {
/** /**
* Set phone number by subId * Set phone number by subId
* @param number the phone number of the SIM * @param number the phone number of the SIM
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated * @return the number of records updated
* @hide * @hide
*/ */
@@ -573,7 +607,7 @@ public class SubscriptionManager implements BaseColumns {
/** /**
* Set data roaming by simInfo index * Set data roaming by simInfo index
* @param roaming 0:Don't allow data when roaming, 1:Allow data when roaming * @param roaming 0:Don't allow data when roaming, 1:Allow data when roaming
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated * @return the number of records updated
* @hide * @hide
*/ */
@@ -602,6 +636,7 @@ public class SubscriptionManager implements BaseColumns {
* Get slotId associated with the subscription. * Get slotId associated with the subscription.
* @return slotId as a positive integer or a negative value if an error either * @return slotId as a positive integer or a negative value if an error either
* SIM_NOT_INSERTED or INVALID_SLOT_ID. * SIM_NOT_INSERTED or INVALID_SLOT_ID.
* @hide
*/ */
public static int getSlotId(int subId) { public static int getSlotId(int subId) {
if (!isValidSubId(subId)) { if (!isValidSubId(subId)) {
@@ -724,8 +759,8 @@ public class SubscriptionManager implements BaseColumns {
} }
/** @hide */ /** @hide */
public static SubInfoRecord getDefaultVoiceSubInfo() { public static SubscriptionInfo getDefaultVoiceSubscriptionInfo() {
return getSubInfoForSubscriber(getDefaultVoiceSubId()); return getSubscriptionInfoForSubscriber(getDefaultVoiceSubId());
} }
/** @hide */ /** @hide */
@@ -735,6 +770,7 @@ public class SubscriptionManager implements BaseColumns {
/** /**
* @return subId of the DefaultSms subscription or the value INVALID_SUB_ID if an error. * @return subId of the DefaultSms subscription or the value INVALID_SUB_ID if an error.
* @hide
*/ */
public static int getDefaultSmsSubId() { public static int getDefaultSmsSubId() {
int subId = INVALID_SUB_ID; int subId = INVALID_SUB_ID;
@@ -766,8 +802,8 @@ public class SubscriptionManager implements BaseColumns {
} }
/** @hide */ /** @hide */
public static SubInfoRecord getDefaultSmsSubInfo() { public static SubscriptionInfo getDefaultSmsSubscriptionInfo() {
return getSubInfoForSubscriber(getDefaultSmsSubId()); return getSubscriptionInfoForSubscriber(getDefaultSmsSubId());
} }
/** @hide */ /** @hide */
@@ -806,8 +842,8 @@ public class SubscriptionManager implements BaseColumns {
} }
/** @hide */ /** @hide */
public static SubInfoRecord getDefaultDataSubInfo() { public static SubscriptionInfo getDefaultDataSubscriptionInfo() {
return getSubInfoForSubscriber(getDefaultDataSubId()); return getSubscriptionInfoForSubscriber(getDefaultDataSubId());
} }
/** @hide */ /** @hide */
@@ -816,7 +852,7 @@ public class SubscriptionManager implements BaseColumns {
} }
/** @hide */ /** @hide */
public static void clearSubInfo() { public static void clearSubscriptionInfo() {
try { try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
if (iSub != null) { if (iSub != null) {
@@ -863,6 +899,7 @@ public class SubscriptionManager implements BaseColumns {
/** /**
* @return true if a valid subId else false * @return true if a valid subId else false
* @hide
*/ */
public static boolean isValidSubId(int subId) { public static boolean isValidSubId(int subId) {
return subId > INVALID_SUB_ID ; return subId > INVALID_SUB_ID ;

View File

@@ -17,41 +17,42 @@
package com.android.internal.telephony; package com.android.internal.telephony;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.telephony.SubInfoRecord; import android.telephony.SubscriptionInfo;
import com.android.internal.telephony.ISubscriptionListener;
interface ISub { interface ISub {
/** /**
* Get the SubInfoRecord according to an index * Get the SubscriptionInfo according to an index
* @param subId The unique SubInfoRecord index in database * @param subId The unique SubscriptionInfo index in database
* @return SubInfoRecord, maybe null * @return SubscriptionInfo, maybe null
*/ */
SubInfoRecord getSubInfoForSubscriber(int subId); SubscriptionInfo getSubInfoForSubscriber(int subId);
/** /**
* Get the SubInfoRecord according to an IccId * Get the SubscriptionInfo according to an IccId
* @param iccId the IccId of SIM card * @param iccId the IccId of SIM card
* @return SubInfoRecord, maybe null * @return SubscriptionInfo, maybe null
*/ */
List<SubInfoRecord> getSubInfoUsingIccId(String iccId); List<SubscriptionInfo> getSubInfoUsingIccId(String iccId);
/** /**
* Get the SubInfoRecord according to slotId * Get the SubscriptionInfo according to slotId
* @param slotId the slot which the SIM is inserted * @param slotId the slot which the SIM is inserted
* @return SubInfoRecord, maybe null * @return SubscriptionInfo, maybe null
*/ */
List<SubInfoRecord> getSubInfoUsingSlotId(int slotId); List<SubscriptionInfo> getSubInfoUsingSlotId(int slotId);
/** /**
* Get all the SubInfoRecord(s) in subinfo database * Get all the SubscriptionInfo(s) in subinfo database
* @return Array list of all SubInfoRecords in database, include thsoe that were inserted before * @return Array list of all SubInfoRecords in database, include thsoe that were inserted before
*/ */
List<SubInfoRecord> getAllSubInfoList(); List<SubscriptionInfo> getAllSubInfoList();
/** /**
* Get the SubInfoRecord(s) of the currently inserted SIM(s) * Get the SubscriptionInfo(s) of the currently inserted SIM(s)
* @return Array list of currently inserted SubInfoRecord(s) * @return Array list of currently inserted SubscriptionInfo(s)
*/ */
List<SubInfoRecord> getActiveSubInfoList(); List<SubscriptionInfo> getActiveSubInfoList();
/** /**
* Get the SUB count of all SUB(s) in subinfo database * Get the SUB count of all SUB(s) in subinfo database
@@ -66,7 +67,7 @@ interface ISub {
int getActiveSubInfoCount(); int getActiveSubInfoCount();
/** /**
* Add a new SubInfoRecord to subinfo database if needed * Add a new SubscriptionInfo to subinfo database if needed
* @param iccId the IccId of the SIM card * @param iccId the IccId of the SIM card
* @param slotId the slot which the SIM is inserted * @param slotId the slot which the SIM is inserted
* @return the URL of the newly created row or the updated row * @return the URL of the newly created row or the updated row
@@ -76,7 +77,7 @@ interface ISub {
/** /**
* Set SIM icon tint color by simInfo index * Set SIM icon tint color by simInfo index
* @param tint the icon tint color of the SIM * @param tint the icon tint color of the SIM
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated * @return the number of records updated
*/ */
int setIconTint(int tint, int subId); int setIconTint(int tint, int subId);
@@ -84,7 +85,7 @@ interface ISub {
/** /**
* Set display name by simInfo index * Set display name by simInfo index
* @param displayName the display name of SIM card * @param displayName the display name of SIM card
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated * @return the number of records updated
*/ */
int setDisplayName(String displayName, int subId); int setDisplayName(String displayName, int subId);
@@ -92,7 +93,7 @@ interface ISub {
/** /**
* Set display name by simInfo index with name source * Set display name by simInfo index with name source
* @param displayName the display name of SIM card * @param displayName the display name of SIM card
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @param nameSource, 0: DEFAULT_SOURCE, 1: SIM_SOURCE, 2: USER_INPUT * @param nameSource, 0: DEFAULT_SOURCE, 1: SIM_SOURCE, 2: USER_INPUT
* @return the number of records updated * @return the number of records updated
*/ */
@@ -101,7 +102,7 @@ interface ISub {
/** /**
* Set phone number by subId * Set phone number by subId
* @param number the phone number of the SIM * @param number the phone number of the SIM
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated * @return the number of records updated
*/ */
int setDisplayNumber(String number, int subId); int setDisplayNumber(String number, int subId);
@@ -109,7 +110,7 @@ interface ISub {
/** /**
* Set data roaming by simInfo index * Set data roaming by simInfo index
* @param roaming 0:Don't allow data when roaming, 1:Allow data when roaming * @param roaming 0:Don't allow data when roaming, 1:Allow data when roaming
* @param subId the unique SubInfoRecord index in database * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated * @return the number of records updated
*/ */
int setDataRoaming(int roaming, int subId); int setDataRoaming(int roaming, int subId);

View File

@@ -0,0 +1,24 @@
/*
* Copyright (C) 2014 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 com.android.internal.telephony;
import android.telephony.SubscriptionInfo;
oneway interface ISubscriptionListener {
void onSubscriptionInfoChanged();
}

View File

@@ -27,8 +27,11 @@ import android.telephony.SignalStrength;
import android.telephony.CellInfo; import android.telephony.CellInfo;
import android.telephony.VoLteServiceState; import android.telephony.VoLteServiceState;
import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.IPhoneStateListener;
import com.android.internal.telephony.ISubscriptionListener;
interface ITelephonyRegistry { interface ITelephonyRegistry {
void registerSubscriptionListener(String pkg, ISubscriptionListener callback, int events);
void unregisterSubscriptionListener(String pkg, ISubscriptionListener callback);
void listen(String pkg, IPhoneStateListener callback, int events, boolean notifyNow); void listen(String pkg, IPhoneStateListener callback, int events, boolean notifyNow);
void listenForSubscriber(in int subId, String pkg, IPhoneStateListener callback, int events, void listenForSubscriber(in int subId, String pkg, IPhoneStateListener callback, int events,
boolean notifyNow); boolean notifyNow);
@@ -63,4 +66,5 @@ interface ITelephonyRegistry {
void notifyDataConnectionRealTimeInfo(in DataConnectionRealTimeInfo dcRtInfo); void notifyDataConnectionRealTimeInfo(in DataConnectionRealTimeInfo dcRtInfo);
void notifyVoLteServiceStateChanged(in VoLteServiceState lteState); void notifyVoLteServiceStateChanged(in VoLteServiceState lteState);
void notifyOemHookRawEventForSubscriber(in int subId, in byte[] rawData); void notifyOemHookRawEventForSubscriber(in int subId, in byte[] rawData);
void notifySubscriptionInfoChanged();
} }

View File

@@ -311,57 +311,23 @@ public class TelephonyIntents {
public static final String EXTRA_SHOW_SPN = "showSpn"; public static final String EXTRA_SHOW_SPN = "showSpn";
public static final String EXTRA_SPN = "spn"; public static final String EXTRA_SPN = "spn";
/**
* <p>Broadcast Action: It indicates one column of a siminfo record has been changed
* The intent will have the following extra values:</p>
* <ul>
* <li><em>columnName</em> - The siminfo column that is updated.</li>
* <li><em>stringContent</em> - The string value of the updated column.</li>
* <li><em>intContent</em> - The int value of the updated column.</li>
* </ul>
* <p class="note">This is a protected intent that can only be sent
* by the system.
*/
public static final String ACTION_SIMINFO_CONTENT_CHANGE
= "android.intent.action.ACTION_SIMINFO_CONTENT_CHANGE";
/** /**
* <p>Broadcast Action: It indicates one column of a subinfo record has been changed * <p>Broadcast Action: It indicates one column of a subinfo record has been changed
* The intent will have the following extra values:</p>
* <ul>
* <li><em>columnName</em> - The siminfo column that is updated.</li>
* <li><em>stringContent</em> - The string value of the updated column.</li>
* <li><em>intContent</em> - The int value of the updated column.</li>
* </ul>
* <p class="note">This is a protected intent that can only be sent * <p class="note">This is a protected intent that can only be sent
* by the system. * by the system.
*/ */
public static final String ACTION_SUBINFO_CONTENT_CHANGE public static final String ACTION_SUBINFO_CONTENT_CHANGE
= "android.intent.action.ACTION_SUBINFO_CONTENT_CHANGE"; = "android.intent.action.ACTION_SUBINFO_CONTENT_CHANGE";
/**
* <p>Broadcast Action: It indicates siminfo update is completed when SIM inserted state change
* The intent will have the following extra values:</p>
* <p class="note">This is a protected intent that can only be sent
* by the system.
*/
public static final String ACTION_SIMINFO_UPDATED
= "android.intent.action.ACTION_SIMINFO_UPDATED";
/** /**
* <p>Broadcast Action: It indicates subinfo record update is completed * <p>Broadcast Action: It indicates subinfo record update is completed
* when SIM inserted state change * when SIM inserted state change
* The intent will have the following extra values:</p>
* <p class="note">This is a protected intent that can only be sent * <p class="note">This is a protected intent that can only be sent
* by the system. * by the system.
*/ */
public static final String ACTION_SUBINFO_RECORD_UPDATED public static final String ACTION_SUBINFO_RECORD_UPDATED
= "android.intent.action.ACTION_SUBINFO_RECORD_UPDATED"; = "android.intent.action.ACTION_SUBINFO_RECORD_UPDATED";
public static final String EXTRA_COLUMN_NAME = "columnName";
public static final String EXTRA_INT_CONTENT = "intContent";
public static final String EXTRA_STRING_CONTENT = "stringContent";
/** /**
* Broadcast Action: The default subscription has changed. This has the following * Broadcast Action: The default subscription has changed. This has the following
* extra values:</p> * extra values:</p>