package biz.bokhorst.xprivacy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.telephony.CellLocation;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.CellInfo;
import android.telephony.gsm.GsmCellLocation;
import android.util.Log;
public class XTelephonyManager extends XHook {
private Methods mMethod;
private String mClassName;
private static final String cClassName = "android.telephony.TelephonyManager";
private static final Map<PhoneStateListener, XPhoneStateListener> mListener = new WeakHashMap<PhoneStateListener, XPhoneStateListener>();
private enum Srv {
SubInfo, Registry, Phone, SICtl
};
private XTelephonyManager(Methods method, String restrictionName, Srv srv) {
super(restrictionName, method.name().replace("Srv_", "").replace("5", ""), method.name());
mMethod = method;
if (srv == Srv.SubInfo)
mClassName = "com.android.internal.telephony.PhoneSubInfo";
else if (srv == Srv.Registry)
mClassName = "com.android.server.TelephonyRegistry";
else if (srv == Srv.Phone)
mClassName = "com.android.phone.PhoneInterfaceManager";
else if (srv == Srv.SICtl)
mClassName = "com.android.internal.telephony.PhoneSubInfoController";
else
Util.log(null, Log.ERROR, "Unknown srv=" + srv.name());
}
private XTelephonyManager(Methods method, String restrictionName, String className) {
super(restrictionName, method.name(), null);
mMethod = method;
mClassName = className;
}
public String getClassName() {
return mClassName;
}
// @formatter:off
// public void disableLocationUpdates()
// public void enableLocationUpdates()
// public List<CellInfo> getAllCellInfo()
// public CellLocation getCellLocation()
// public String getDeviceId()
// public String getGroupIdLevel1()
// public String getIsimDomain()
// public String getIsimImpi()
// public String[] getIsimImpu()
// public String getLine1AlphaTag()
// public String getLine1Number()
// public String getMsisdn()
// public List<NeighboringCellInfo> getNeighboringCellInfo()
// public String getNetworkCountryIso()
// public String getNetworkOperator()
// public String getNetworkOperatorName()
// public String getSimCountryIso()
// public String getSimOperator()
// public String getSimOperatorName()
// public static int getPhoneType(int networkMode)
// public String getSimSerialNumber()
// public String getSubscriberId()
// public String getVoiceMailAlphaTag()
// public String getVoiceMailNumber()
// public void listen(PhoneStateListener listener, int events)
// frameworks/base/telephony/java/android/telephony/TelephonyManager.java
// http://developer.android.com/reference/android/telephony/TelephonyManager.html
// public String getDeviceId()
// public String getSubscriberId()
// public String getGroupIdLevel1()
// public String getIccSerialNumber()
// public String getImei()
// public String getLine1Number()
// public String getLine1AlphaTag()
// public String getMsisdn()
// public String getVoiceMailNumber()
// public String getVoiceMailAlphaTag()
// public String getCompleteVoiceMailNumber()
// public String getIsimImpi()
// public String getIsimDomain()
// public String[] getIsimImpu()
// public String getIsimIst()
// public String[] getIsimPcscf()
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/android/internal/telephony/PhoneSubInfo.java
// public void listen(java.lang.String pkg, IPhoneStateListener callback, int events, boolean notifyNow)
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/android/server/TelephonyRegistry.java
// public void enableLocationUpdates()
// public void enableLocationUpdatesForSubscriber(long subId)
// public void disableLocationUpdates()
// public void disableLocationUpdatesForSubscriber(long subId)
// public List<android.telephony.CellInfo> getAllCellInfo()
// public android.os.Bundle getCellLocation()
// public String getCdmaMdn(long subId)
// public String getCdmaMin(long subId)
// public String getLine1AlphaTagForDisplay(long subId)
// public String getLine1NumberForDisplay(long subId)
// public List<android.telephony.NeighboringCellInfo> getNeighboringCellInfo()
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/android/internal/telephony/ITelephony.java
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/5.0.0_r1/com/android/phone/PhoneInterfaceManager.java
// @formatter:on
// @formatter:off
private enum Methods {
disableLocationUpdates, enableLocationUpdates,
getAllCellInfo, getCellLocation,
getDeviceId, getGroupIdLevel1,
getIsimDomain, getIsimImpi, getIsimImpu,
getLine1AlphaTag, getLine1Number, getMsisdn,
getNeighboringCellInfo,
getNetworkCountryIso, getNetworkOperator, getNetworkOperatorName,
getSimCountryIso, getSimOperator, getSimOperatorName, getSimSerialNumber,
getSubscriberId,
getVoiceMailAlphaTag, getVoiceMailNumber,
listen,
Srv_getDeviceId, Srv_getGroupIdLevel1,
Srv_getIccSerialNumber,
Srv_getIsimDomain, Srv_getIsimImpi, Srv_getIsimImpu,
Srv_getLine1AlphaTag, Srv_getLine1Number,
Srv_getMsisdn,
Srv_getSubscriberId,
Srv_getCompleteVoiceMailNumber, Srv_getVoiceMailNumber, Srv_getVoiceMailAlphaTag,
Srv_getImei, Srv_getIsimIst, Srv_getIsimPcscf,
Srv_listen,
Srv_enableLocationUpdates, Srv_disableLocationUpdates,
Srv_getAllCellInfo, Srv_getCellLocation, Srv_getNeighboringCellInfo,
Srv_enableLocationUpdatesForSubscriber, Srv_disableLocationUpdatesForSubscriber,
Srv_getCdmaMdn, Srv_getCdmaMin,
Srv_getLine1AlphaTagForDisplay, Srv_getLine1NumberForDisplay,
// Android 5.x
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.0_r1/com/android/internal/telephony/PhoneSubInfoController.java
Srv_getCompleteVoiceMailNumberForSubscriber5,
Srv_getDeviceId5,
Srv_getDeviceIdForPhone5,
Srv_getDeviceIdForSubscriber5,
Srv_getGroupIdLevel1ForSubscriber5,
Srv_getIccSerialNumberForSubscriber5,
Srv_getImeiForSubscriber5,
Srv_getIsimDomain5,
Srv_getIsimImpi5,
Srv_getIsimImpu5,
Srv_getIsimIst5,
Srv_getIsimPcscf5,
Srv_getLine1AlphaTagForSubscriber5,
Srv_getLine1NumberForSubscriber5,
Srv_getMsisdnForSubscriber5,
Srv_getNaiForSubscriber5, // new
Srv_getSubscriberIdForSubscriber5,
Srv_getVoiceMailAlphaTagForSubscriber5,
Srv_getVoiceMailNumberForSubscriber5
};
// @formatter:on
public static List<XHook> getInstances(String className, boolean server) {
List<XHook> listHook = new ArrayList<XHook>();
if (!cClassName.equals(className)) {
if (className == null)
className = cClassName;
if (server) {
// PhoneSubInfo/Controller
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
listHook.add(new XTelephonyManager(Methods.Srv_getDeviceId, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getGroupIdLevel1, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getIccSerialNumber, PrivacyManager.cPhone,
Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimDomain, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimImpi, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimImpu, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getLine1AlphaTag, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getLine1Number, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getMsisdn, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getSubscriberId, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getCompleteVoiceMailNumber, PrivacyManager.cPhone,
Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getVoiceMailAlphaTag, PrivacyManager.cPhone,
Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getVoiceMailNumber, PrivacyManager.cPhone,
Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getImei, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimIst, PrivacyManager.cPhone, Srv.SubInfo));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimPcscf, PrivacyManager.cPhone, Srv.SubInfo));
} else {
listHook.add(new XTelephonyManager(Methods.Srv_getDeviceIdForPhone5, PrivacyManager.cPhone,
Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getDeviceIdForSubscriber5, PrivacyManager.cPhone,
Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getGroupIdLevel1ForSubscriber5,
PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getIccSerialNumberForSubscriber5,
PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimDomain5, PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimImpi5, PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimImpu5, PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getLine1AlphaTagForSubscriber5,
PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getLine1NumberForSubscriber5, PrivacyManager.cPhone,
Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getMsisdnForSubscriber5, PrivacyManager.cPhone,
Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getSubscriberIdForSubscriber5,
PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getCompleteVoiceMailNumberForSubscriber5,
PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getVoiceMailAlphaTagForSubscriber5,
PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getVoiceMailNumberForSubscriber5,
PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getImeiForSubscriber5, PrivacyManager.cPhone,
Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimIst5, PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getIsimPcscf5, PrivacyManager.cPhone, Srv.SICtl));
listHook.add(new XTelephonyManager(Methods.Srv_getNaiForSubscriber5, PrivacyManager.cPhone,
Srv.SICtl));
}
} else {
listHook.add(new XTelephonyManager(Methods.disableLocationUpdates, null, className));
listHook.add(new XTelephonyManager(Methods.enableLocationUpdates, PrivacyManager.cLocation, className));
listHook.add(new XTelephonyManager(Methods.getAllCellInfo, PrivacyManager.cLocation, className));
listHook.add(new XTelephonyManager(Methods.getCellLocation, PrivacyManager.cLocation, className));
listHook.add(new XTelephonyManager(Methods.getDeviceId, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getGroupIdLevel1, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getIsimDomain, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getIsimImpi, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getIsimImpu, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getLine1AlphaTag, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getLine1Number, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getMsisdn, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getNeighboringCellInfo, PrivacyManager.cLocation, className));
listHook.add(new XTelephonyManager(Methods.getSimSerialNumber, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getSubscriberId, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getVoiceMailAlphaTag, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getVoiceMailNumber, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.listen, PrivacyManager.cLocation, className));
listHook.add(new XTelephonyManager(Methods.listen, PrivacyManager.cPhone, className));
// No permissions required
listHook.add(new XTelephonyManager(Methods.getNetworkCountryIso, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getNetworkOperator, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getNetworkOperatorName, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getSimCountryIso, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getSimOperator, PrivacyManager.cPhone, className));
listHook.add(new XTelephonyManager(Methods.getSimOperatorName, PrivacyManager.cPhone, className));
}
}
return listHook;
}
public static List<XHook> getPhoneInstances() {
List<XHook> listHook = new ArrayList<XHook>();
if (Hook.isAOSP(19)) {
listHook.add(new XTelephonyManager(Methods.Srv_enableLocationUpdates, PrivacyManager.cLocation, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_disableLocationUpdates, null, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_getAllCellInfo, PrivacyManager.cLocation, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_getCellLocation, PrivacyManager.cLocation, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_getNeighboringCellInfo, PrivacyManager.cLocation, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_enableLocationUpdatesForSubscriber,
PrivacyManager.cLocation, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_disableLocationUpdatesForSubscriber, null, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_getCdmaMdn, PrivacyManager.cPhone, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_getCdmaMin, PrivacyManager.cPhone, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_getLine1AlphaTagForDisplay, PrivacyManager.cPhone, Srv.Phone));
listHook.add(new XTelephonyManager(Methods.Srv_getLine1NumberForDisplay, PrivacyManager.cPhone, Srv.Phone));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
listHook.add(new XTelephonyManager(Methods.Srv_getDeviceId5, PrivacyManager.cPhone, Srv.Phone));
return listHook;
}
public static List<XHook> getRegistryInstances() {
List<XHook> listHook = new ArrayList<XHook>();
listHook.add(new XTelephonyManager(Methods.Srv_listen, PrivacyManager.cLocation, Srv.Registry));
listHook.add(new XTelephonyManager(Methods.Srv_listen, PrivacyManager.cPhone, Srv.Registry));
return listHook;
}
@Override
protected void before(XParam param) throws Throwable {
switch (mMethod) {
case disableLocationUpdates:
if (isRestricted(param, PrivacyManager.cLocation, "enableLocationUpdates"))
param.setResult(null);
break;
case Srv_disableLocationUpdates:
if (isRestricted(param, PrivacyManager.cLocation, "Srv_enableLocationUpdates"))
param.setResult(null);
break;
case Srv_disableLocationUpdatesForSubscriber:
if (isRestricted(param, PrivacyManager.cLocation, "Srv_enableLocationUpdatesForSubscriber"))
param.setResult(null);
break;
case enableLocationUpdates:
case Srv_enableLocationUpdates:
case Srv_enableLocationUpdatesForSubscriber:
if (isRestricted(param))
param.setResult(null);
break;
case getAllCellInfo:
case getCellLocation:
case getDeviceId:
case getGroupIdLevel1:
case getIsimDomain:
case getIsimImpi:
case getIsimImpu:
case getLine1AlphaTag:
case getLine1Number:
case getMsisdn:
case getNeighboringCellInfo:
case getNetworkCountryIso:
case getNetworkOperator:
case getNetworkOperatorName:
case getSimCountryIso:
case getSimOperator:
case getSimOperatorName:
case getSimSerialNumber:
case getSubscriberId:
case getVoiceMailAlphaTag:
case getVoiceMailNumber:
case Srv_getAllCellInfo:
case Srv_getCellLocation:
case Srv_getNeighboringCellInfo:
break;
case listen:
if (param.args.length > 1 && param.args[0] instanceof PhoneStateListener
&& param.args[1] instanceof Integer) {
PhoneStateListener listener = (PhoneStateListener) param.args[0];
int event = (Integer) param.args[1];
if (event == PhoneStateListener.LISTEN_NONE) {
// Remove
synchronized (mListener) {
XPhoneStateListener xListener = mListener.get(listener);
if (xListener != null) {
param.args[0] = xListener;
Util.log(this, Log.WARN,
"Removed count=" + mListener.size() + " uid=" + Binder.getCallingUid());
}
}
} else if (isRestricted(param))
try {
// Replace
XPhoneStateListener xListener;
synchronized (mListener) {
xListener = mListener.get(listener);
if (xListener == null) {
xListener = new XPhoneStateListener(listener);
mListener.put(listener, xListener);
Util.log(this, Log.WARN,
"Added count=" + mListener.size() + " uid=" + Binder.getCallingUid());
}
}
param.args[0] = xListener;
} catch (Throwable ignored) {
// Some implementations require a looper
// which is not according to the documentation
// and stock source code
}
}
break;
case Srv_listen:
if (isRestricted(param))
param.setResult(null);
break;
case Srv_getDeviceId:
case Srv_getGroupIdLevel1:
case Srv_getIccSerialNumber:
case Srv_getIsimDomain:
case Srv_getIsimImpi:
case Srv_getIsimImpu:
case Srv_getLine1AlphaTag:
case Srv_getLine1Number:
case Srv_getMsisdn:
case Srv_getSubscriberId:
case Srv_getCompleteVoiceMailNumber:
case Srv_getVoiceMailNumber:
case Srv_getVoiceMailAlphaTag:
case Srv_getImei:
case Srv_getIsimIst:
case Srv_getIsimPcscf:
case Srv_getCdmaMdn:
case Srv_getCdmaMin:
case Srv_getLine1AlphaTagForDisplay:
case Srv_getLine1NumberForDisplay:
break;
case Srv_getCompleteVoiceMailNumberForSubscriber5:
case Srv_getDeviceId5:
case Srv_getDeviceIdForPhone5:
case Srv_getDeviceIdForSubscriber5:
case Srv_getGroupIdLevel1ForSubscriber5:
case Srv_getIccSerialNumberForSubscriber5:
case Srv_getImeiForSubscriber5:
case Srv_getIsimDomain5:
case Srv_getIsimImpi5:
case Srv_getIsimImpu5:
case Srv_getIsimIst5:
case Srv_getIsimPcscf5:
case Srv_getLine1AlphaTagForSubscriber5:
case Srv_getLine1NumberForSubscriber5:
case Srv_getMsisdnForSubscriber5:
case Srv_getNaiForSubscriber5:
case Srv_getSubscriberIdForSubscriber5:
case Srv_getVoiceMailAlphaTagForSubscriber5:
case Srv_getVoiceMailNumberForSubscriber5:
break;
}
}
@Override
protected void after(XParam param) throws Throwable {
int uid = Binder.getCallingUid();
switch (mMethod) {
case disableLocationUpdates:
case enableLocationUpdates:
case Srv_disableLocationUpdates:
case Srv_enableLocationUpdates:
case Srv_disableLocationUpdatesForSubscriber:
case Srv_enableLocationUpdatesForSubscriber:
break;
case getAllCellInfo:
case Srv_getAllCellInfo:
if (param.getResult() != null)
if (isRestricted(param))
param.setResult(new ArrayList<CellInfo>());
break;
case getCellLocation:
if (param.getResult() != null)
if (isRestricted(param))
param.setResult(getDefacedCellLocation(uid));
break;
case Srv_getCellLocation:
if (param.getResult() != null)
if (isRestricted(param))
param.setResult(getDefacedCellBundle(uid));
break;
case getNeighboringCellInfo:
case Srv_getNeighboringCellInfo:
if (param.getResult() != null && isRestricted(param))
param.setResult(new ArrayList<NeighboringCellInfo>());
break;
case listen:
case Srv_listen:
break;
case getDeviceId:
case getGroupIdLevel1:
case getIsimDomain:
case getIsimImpi:
case getIsimImpu:
case getNetworkCountryIso:
case getNetworkOperator:
case getNetworkOperatorName:
case getSimCountryIso:
case getSimOperator:
case getSimOperatorName:
case getSimSerialNumber:
case getSubscriberId:
if (param.getResult() != null)
if (isRestricted(param))
param.setResult(PrivacyManager.getDefacedProp(uid, mMethod.name()));
break;
case getLine1AlphaTag:
case getLine1Number:
case getMsisdn:
case getVoiceMailAlphaTag:
case getVoiceMailNumber:
String phoneNumber = (String) param.getResult();
if (phoneNumber != null)
if (isRestrictedValue(param, phoneNumber))
param.setResult(PrivacyManager.getDefacedProp(uid, mMethod.name()));
break;
case Srv_getDeviceId:
case Srv_getGroupIdLevel1:
case Srv_getIccSerialNumber:
case Srv_getIsimDomain:
case Srv_getIsimImpi:
case Srv_getIsimImpu:
case Srv_getSubscriberId:
case Srv_getImei:
case Srv_getDeviceId5:
case Srv_getDeviceIdForPhone5:
case Srv_getDeviceIdForSubscriber5:
case Srv_getGroupIdLevel1ForSubscriber5:
case Srv_getIccSerialNumberForSubscriber5:
case Srv_getImeiForSubscriber5:
case Srv_getIsimDomain5:
case Srv_getIsimImpi5:
case Srv_getIsimImpu5:
case Srv_getNaiForSubscriber5:
case Srv_getSubscriberIdForSubscriber5:
if (param.getResult() != null)
if (isRestricted(param)) {
String name = mMethod.name();
name = name.replace("Srv_", "");
name = name.replace("ForPhone", "");
name = name.replace("ForSubscriber", "");
name = name.replace("5", "");
param.setResult(PrivacyManager.getDefacedProp(uid, name));
}
break;
case Srv_getLine1AlphaTag:
case Srv_getLine1Number:
case Srv_getMsisdn:
case Srv_getCompleteVoiceMailNumber:
case Srv_getVoiceMailNumber:
case Srv_getVoiceMailAlphaTag:
case Srv_getLine1AlphaTagForDisplay:
case Srv_getLine1NumberForDisplay:
case Srv_getCompleteVoiceMailNumberForSubscriber5:
case Srv_getLine1AlphaTagForSubscriber5:
case Srv_getLine1NumberForSubscriber5:
case Srv_getMsisdnForSubscriber5:
case Srv_getVoiceMailAlphaTagForSubscriber5:
case Srv_getVoiceMailNumberForSubscriber5:
String srvPhoneNumber = (String) param.getResult();
if (srvPhoneNumber != null)
if (isRestrictedValue(param, srvPhoneNumber)) {
String name = mMethod.name();
name = name.replace("Srv_", "");
name = name.replace("ForSubscriber", "");
name = name.replace("5", "");
param.setResult(PrivacyManager.getDefacedProp(uid, name));
}
break;
case Srv_getIsimIst:
case Srv_getIsimPcscf:
case Srv_getCdmaMdn:
case Srv_getCdmaMin:
case Srv_getIsimIst5:
case Srv_getIsimPcscf5:
if (param.getResult() != null)
if (isRestricted(param))
param.setResult(null);
break;
}
}
private static CellLocation getDefacedCellLocation(int uid) {
int cid = (Integer) PrivacyManager.getDefacedProp(uid, "CID");
int lac = (Integer) PrivacyManager.getDefacedProp(uid, "LAC");
if (cid > 0 && lac > 0) {
GsmCellLocation cellLocation = new GsmCellLocation();
cellLocation.setLacAndCid(lac, cid);
return cellLocation;
} else
return CellLocation.getEmpty();
}
private static Bundle getDefacedCellBundle(int uid) {
Bundle result = new Bundle();
int cid = (Integer) PrivacyManager.getDefacedProp(uid, "CID");
int lac = (Integer) PrivacyManager.getDefacedProp(uid, "LAC");
if (cid > 0 && lac > 0) {
result.putInt("lac", lac);
result.putInt("cid", cid);
}
return result;
}
private class XPhoneStateListener extends PhoneStateListener {
private PhoneStateListener mListener;
public XPhoneStateListener(PhoneStateListener listener) {
mListener = listener;
}
@Override
public void onCallForwardingIndicatorChanged(boolean cfi) {
mListener.onCallForwardingIndicatorChanged(cfi);
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
mListener.onCallStateChanged(state,
(String) PrivacyManager.getDefacedProp(Binder.getCallingUid(), "PhoneNumber"));
}
@Override
public void onCellInfoChanged(List<CellInfo> cellInfo) {
mListener.onCellInfoChanged(new ArrayList<CellInfo>());
}
@Override
public void onCellLocationChanged(CellLocation location) {
mListener.onCellLocationChanged(getDefacedCellLocation(Binder.getCallingUid()));
}
@Override
public void onDataActivity(int direction) {
mListener.onDataActivity(direction);
}
@Override
public void onDataConnectionStateChanged(int state) {
mListener.onDataConnectionStateChanged(state);
}
@Override
public void onDataConnectionStateChanged(int state, int networkType) {
mListener.onDataConnectionStateChanged(state, networkType);
}
@Override
public void onMessageWaitingIndicatorChanged(boolean mwi) {
mListener.onMessageWaitingIndicatorChanged(mwi);
}
@Override
public void onServiceStateChanged(ServiceState serviceState) {
mListener.onServiceStateChanged(serviceState);
}
@Override
@SuppressWarnings("deprecation")
public void onSignalStrengthChanged(int asu) {
mListener.onSignalStrengthChanged(asu);
}
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
mListener.onSignalStrengthsChanged(signalStrength);
}
}
}