package biz.bokhorst.xprivacy; import biz.bokhorst.xprivacy.XHook; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import android.bluetooth.BluetoothDevice; import android.os.Binder; public class XBluetoothAdapter extends XHook { private Methods mMethod; private String mClassName; private XBluetoothAdapter(Methods method, String restrictionName) { super(restrictionName, method.name().replace("Srv_", ""), "Bluetooth." + method.name()); mMethod = method; if (method.name().startsWith("Srv_")) mClassName = "com.android.server.BluetoothManagerService"; else mClassName = "android.bluetooth.BluetoothAdapter"; } public String getClassName() { return mClassName; } // @formatter:off // public String getAddress() // public Set<BluetoothDevice> getBondedDevices() // public String getName() // frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java // http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html // http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.4_r1/com/android/server/BluetoothManagerService.java // @formatter:on private enum Methods { getAddress, getBondedDevices, Srv_getAddress, Srv_getName }; public static List<XHook> getInstances(boolean server) { List<XHook> listHook = new ArrayList<XHook>(); if (server) { listHook.add(new XBluetoothAdapter(Methods.Srv_getAddress, PrivacyManager.cNetwork)); listHook.add(new XBluetoothAdapter(Methods.Srv_getName, PrivacyManager.cNetwork)); } else { listHook.add(new XBluetoothAdapter(Methods.getAddress, PrivacyManager.cNetwork)); listHook.add(new XBluetoothAdapter(Methods.getBondedDevices, PrivacyManager.cNetwork)); } return listHook; } @Override protected void before(XParam param) throws Throwable { // Do nothing } @Override protected void after(XParam param) throws Throwable { int uid = Binder.getCallingUid(); switch (mMethod) { case getAddress: case Srv_getAddress: if (param.getResult() != null) if (isRestricted(param)) param.setResult(PrivacyManager.getDefacedProp(uid, "MAC")); break; case Srv_getName: if (param.getResult() != null) if (isRestricted(param)) param.setResult(PrivacyManager.getDefacedProp(uid, "BTName")); break; case getBondedDevices: if (param.getResult() != null && isRestricted(param)) param.setResult(new HashSet<BluetoothDevice>()); break; } } }