package biz.bokhorst.xprivacy;
import java.util.ArrayList;
import java.util.List;
import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Process;
import android.util.Log;
public class XApplication extends XHook {
private Methods mMethod;
private static boolean mReceiverInstalled = false;
public static String cAction = "Action";
public static String cActionKillProcess = "Kill";
public static String cActionFlush = "Flush";
public static String ACTION_MANAGE_PACKAGE = "biz.bokhorst.xprivacy.ACTION_MANAGE_PACKAGE";
public static String PERMISSION_MANAGE_PACKAGES = "biz.bokhorst.xprivacy.MANAGE_PACKAGES";
public XApplication(Methods method, String restrictionName, String actionName) {
super(restrictionName, method.name(), actionName);
mMethod = method;
}
@Override
public String getClassName() {
return "android.app.Application";
}
// public void onCreate()
// frameworks/base/core/java/android/app/Application.java
// http://developer.android.com/reference/android/app/Application.html
private enum Methods {
onCreate
};
public static List<XHook> getInstances() {
List<XHook> listHook = new ArrayList<XHook>();
listHook.add(new XApplication(Methods.onCreate, null, null));
return listHook;
}
@Override
protected void before(XParam param) throws Throwable {
// do nothing
}
@Override
protected void after(XParam param) throws Throwable {
switch (mMethod) {
case onCreate:
// Install receiver for package management
if (PrivacyManager.isApplication(Process.myUid()) && !mReceiverInstalled)
try {
Application app = (Application) param.thisObject;
if (app != null) {
mReceiverInstalled = true;
Util.log(this, Log.INFO, "Installing receiver uid=" + Process.myUid());
app.registerReceiver(new Receiver(app), new IntentFilter(ACTION_MANAGE_PACKAGE),
PERMISSION_MANAGE_PACKAGES, null);
}
} catch (SecurityException ignored) {
} catch (Throwable ex) {
Util.bug(this, ex);
}
break;
}
}
public static void manage(Context context, int uid, String action) {
if (uid == 0)
manage(context, null, action);
else {
String[] packageName = context.getPackageManager().getPackagesForUid(uid);
if (packageName != null && packageName.length > 0)
manage(context, packageName[0], action);
else
Util.log(null, Log.WARN, "No packages uid=" + uid + " action=" + action);
}
}
public static void manage(Context context, String packageName, String action) {
Util.log(null, Log.INFO, "Manage package=" + packageName + " action=" + action);
if (packageName == null && XApplication.cActionKillProcess.equals(action)) {
Util.log(null, Log.WARN, "Kill all");
return;
}
Intent manageIntent = new Intent(XApplication.ACTION_MANAGE_PACKAGE);
manageIntent.putExtra(XApplication.cAction, action);
if (packageName != null)
manageIntent.setPackage(packageName);
context.sendBroadcast(manageIntent);
}
private class Receiver extends BroadcastReceiver {
public Receiver(Application app) {
}
@Override
public void onReceive(Context context, Intent intent) {
try {
String action = intent.getExtras().getString(cAction);
Util.log(null, Log.WARN, "Managing uid=" + Process.myUid() + " action=" + action);
if (cActionKillProcess.equals(action))
android.os.Process.killProcess(Process.myPid());
else if (cActionFlush.equals(action)) {
PrivacyManager.flush();
} else
Util.log(null, Log.WARN, "Unknown management action=" + action);
} catch (Throwable ex) {
Util.bug(null, ex);
}
}
}
}