package biz.bokhorst.xprivacy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
public class XWindowManager extends XHook {
private Methods mMethod;
private String mClassName;
private static final String cClassName = "android.view.WindowManagerImpl";
private static final Map<View, WindowManager.LayoutParams> mViewParam = new WeakHashMap<View, WindowManager.LayoutParams>();
private XWindowManager(Methods method, String restrictionName, String className) {
super(restrictionName, method.name(), null);
mMethod = method;
mClassName = className;
}
public String getClassName() {
return mClassName;
}
// @formatter:off
// public void addView(View view, ViewGroup.LayoutParams params)
// public void removeView(View view)
// public void updateViewLayout(View view, ViewGroup.LayoutParams params)
// http://developer.android.com/reference/android/view/ViewManager.html
// http://developer.android.com/reference/android/view/WindowManager.html
// @formatter:on
private enum Methods {
addView, removeView, updateViewLayout
};
public static List<XHook> getInstances(String className, boolean server) {
List<XHook> listHook = new ArrayList<XHook>();
if (!cClassName.equals(className)) {
if (className == null)
className = cClassName;
listHook.add(new XWindowManager(Methods.addView, PrivacyManager.cOverlay, className));
listHook.add(new XWindowManager(Methods.removeView, null, className));
listHook.add(new XWindowManager(Methods.updateViewLayout, null, className));
}
return listHook;
}
@Override
protected void before(XParam param) throws Throwable {
if (mMethod == Methods.addView || mMethod == Methods.removeView || mMethod == Methods.updateViewLayout) {
View view = (View) param.args[0];
if (view != null) {
// Get params
WindowManager.LayoutParams wmParams = null;
synchronized (mViewParam) {
if (param.args.length > 1) {
wmParams = (WindowManager.LayoutParams) param.args[1];
if (wmParams != null)
mViewParam.put(view, wmParams);
} else if (mViewParam.containsKey(view))
wmParams = mViewParam.get(view);
}
// Check for system alert/overlay
if (wmParams != null)
if (wmParams.type == WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
|| wmParams.type == WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY)
if (mMethod == Methods.removeView || mMethod == Methods.updateViewLayout) {
if (isRestricted(param, PrivacyManager.cOverlay, "addView"))
param.setResult(null);
}
else if (isRestricted(param))
param.setResult(null);
}
} else
Util.log(this, Log.WARN, "Unknown method=" + param.method.getName());
}
@Override
protected void after(XParam param) throws Throwable {
// Do nothing
}
}