package biz.bokhorst.xprivacy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.annotation.SuppressLint; import android.content.Intent; import android.net.Uri; import android.provider.MediaStore; public class XActivity extends XHook { private Methods mMethod; private String mActionName; private XActivity(Methods method, String restrictionName, String actionName) { super(restrictionName, method.name(), actionName); mMethod = method; mActionName = actionName; } public String getClassName() { return "android.app.Activity"; } // @formatter:off // public Object getSystemService(String name) // public void startActivities(Intent[] intents) // public void startActivities(Intent[] intents, Bundle options) // public void startActivity(Intent intent) // public void startActivity(Intent intent, Bundle options) // public void startActivityForResult(Intent intent, int requestCode) // public void startActivityForResult(Intent intent, int requestCode, Bundle options) // public void startActivityFromChild(Activity child, Intent intent, int requestCode) // public void startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options) // public void startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) // public void startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options) // public boolean startActivityIfNeeded(Intent intent, int requestCode) // public boolean startActivityIfNeeded(Intent intent, int requestCode, Bundle options) // public boolean startNextMatchingActivity(Intent intent) // public boolean startNextMatchingActivity(Intent intent, Bundle options) // frameworks/base/core/java/android/app/Activity.java // @formatter:on // @formatter:off private enum Methods { getSystemService, startActivities, startActivity, startActivityForResult, startActivityFromChild, startActivityFromFragment, startActivityIfNeeded, startNextMatchingActivity }; // @formatter:on @SuppressLint("InlinedApi") public static List<XHook> getInstances() { List<XHook> listHook = new ArrayList<XHook>(); listHook.add(new XActivity(Methods.getSystemService, null, null)); List<Methods> startMethods = new ArrayList<Methods>(Arrays.asList(Methods.values())); startMethods.remove(Methods.getSystemService); // Intent send: browser for (Methods activity : startMethods) listHook.add(new XActivity(activity, PrivacyManager.cView, Intent.ACTION_VIEW)); // Intent send: call/dial for (Methods activity : startMethods) { listHook.add(new XActivity(activity, PrivacyManager.cCalling, Intent.ACTION_CALL)); listHook.add(new XActivity(activity, PrivacyManager.cCalling, Intent.ACTION_DIAL)); } // Intent send: media for (Methods activity : startMethods) { listHook.add(new XActivity(activity, PrivacyManager.cMedia, MediaStore.ACTION_IMAGE_CAPTURE)); listHook.add(new XActivity(activity, PrivacyManager.cMedia, MediaStore.ACTION_IMAGE_CAPTURE_SECURE)); listHook.add(new XActivity(activity, PrivacyManager.cMedia, MediaStore.ACTION_VIDEO_CAPTURE)); } return listHook; } @Override @SuppressLint("DefaultLocale") protected void before(XParam param) throws Throwable { // Get intent(s) Intent[] intents = null; switch (mMethod) { case getSystemService: // Do nothing break; case startActivity: case startActivityForResult: case startActivityIfNeeded: case startNextMatchingActivity: if (param.args.length > 0 && param.args[0] instanceof Intent) intents = new Intent[] { (Intent) param.args[0] }; break; case startActivityFromChild: case startActivityFromFragment: if (param.args.length > 1 && param.args[1] instanceof Intent) intents = new Intent[] { (Intent) param.args[1] }; break; case startActivities: if (param.args.length > 0 && param.args[0] instanceof Intent[]) intents = (Intent[]) param.args[0]; break; } // Process intent(s) if (intents != null) for (Intent intent : intents) if (mActionName.equals(intent.getAction())) { boolean restricted = false; if (mActionName.equals(Intent.ACTION_VIEW)) { Uri uri = intent.getData(); if (uri != null) if (isRestrictedExtra(param, mActionName, uri.toString())) restricted = true; } else restricted = isRestricted(param, mActionName); if (restricted) { if (mMethod == Methods.startActivityIfNeeded) param.setResult(true); else param.setResult(null); return; } } } @Override protected void after(XParam param) throws Throwable { if (mMethod == Methods.getSystemService) if (param.args.length > 0 && param.args[0] instanceof String && param.getResult() != null) { String name = (String) param.args[0]; Object instance = param.getResult(); XPrivacy.handleGetSystemService(name, instance.getClass().getName(), getSecret()); } } }