package biz.bokhorst.xprivacy; import java.util.ArrayList; import java.util.List; import android.content.res.Configuration; import android.os.Binder; import android.util.Log; public class XResources extends XHook { private Methods mMethod; private XResources(Methods method) { super(null, method.name(), null); mMethod = method; } public String getClassName() { return "android.content.res.Resources"; } // public void updateConfiguration(Configuration config, ...) // frameworks/base/core/java/android/content/res/Resources.java // http://developer.android.com/reference/android/content/res/Resources.html // http://developer.android.com/reference/android/content/res/Configuration.html private enum Methods { updateConfiguration }; public static List<XHook> getInstances() { List<XHook> listHook = new ArrayList<XHook>(); listHook.add(new XResources(Methods.updateConfiguration)); return listHook; } @Override protected void before(XParam param) throws Throwable { if (mMethod == Methods.updateConfiguration) { if (param.args.length > 0 && param.args[0] != null && param.args[0] instanceof Configuration) { boolean restricted = false; int uid = Binder.getCallingUid(); Configuration config = new Configuration((Configuration) param.args[0]); if (getRestricted(uid, PrivacyManager.cPhone, "Configuration.MCC")) { restricted = true; try { config.mcc = Integer.parseInt((String) PrivacyManager.getDefacedProp(uid, "MCC")); } catch (Throwable ex) { config.mcc = 1; } } if (getRestricted(uid, PrivacyManager.cPhone, "Configuration.MNC")) { restricted = true; try { config.mnc = Integer.parseInt((String) PrivacyManager.getDefacedProp(uid, "MNC")); } catch (Throwable ex) { config.mnc = 1; } } if (restricted) param.args[0] = config; } } else Util.log(this, Log.WARN, "Unknown method=" + param.method.getName()); } @Override protected void after(XParam param) throws Throwable { // Do nothing } }