package biz.bokhorst.xprivacy;
import java.util.ArrayList;
import java.util.List;
import android.os.Build;
public class XClipboardManager extends XHook {
private Methods mMethod;
private String mClassName;
private static final String cClassName = "android.content.ClipboardManager";
private XClipboardManager(Methods method, String restrictionName) {
super(restrictionName, method.name().replace("Srv_", ""), method.name());
mMethod = method;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
mClassName = "com.android.server.clipboard.ClipboardService";
else
mClassName = "com.android.server.ClipboardService";
}
private XClipboardManager(Methods method, String restrictionName, String className) {
super(restrictionName, method.name(), null);
mMethod = method;
mClassName = className;
}
public String getClassName() {
return mClassName;
}
// @formatter:off
// public void addPrimaryClipChangedListener(OnPrimaryClipChangedListener what)
// public ClipData getPrimaryClip()
// public ClipDescription getPrimaryClipDescription()
// public CharSequence getText()
// public boolean hasPrimaryClip()
// public boolean hasText()
// public void removePrimaryClipChangedListener(ClipboardManager.OnPrimaryClipChangedListener what)
// frameworks/base/core/java/android/content/ClipboardManager.java
// http://developer.android.com/reference/android/content/ClipboardManager.html
// @formatter:on
// @formatter:off
private enum Methods {
addPrimaryClipChangedListener,
getPrimaryClip,
getPrimaryClipDescription,
getText,
hasPrimaryClip,
hasText,
removePrimaryClipChangedListener,
Srv_addPrimaryClipChangedListener,
Srv_getPrimaryClip,
Srv_getPrimaryClipDescription,
Srv_hasClipboardText,
Srv_hasPrimaryClip,
Srv_removePrimaryClipChangedListener
};
// @formatter:on
public static List<XHook> getInstances(String className, boolean server) {
List<XHook> listHook = new ArrayList<XHook>();
if (!cClassName.equals(className)) {
if (className == null)
className = cClassName;
for (Methods clip : Methods.values())
if (clip.name().startsWith("Srv_")) {
if (server)
if (clip == Methods.Srv_removePrimaryClipChangedListener)
listHook.add(new XClipboardManager(clip, null));
else
listHook.add(new XClipboardManager(clip, PrivacyManager.cClipboard));
} else if (!server) {
if (clip == Methods.removePrimaryClipChangedListener)
listHook.add(new XClipboardManager(clip, null, className));
else
listHook.add(new XClipboardManager(clip, PrivacyManager.cClipboard, className));
}
}
return listHook;
}
@Override
protected void before(XParam param) throws Throwable {
switch (mMethod) {
case addPrimaryClipChangedListener:
case Srv_addPrimaryClipChangedListener:
if (isRestricted(param))
param.setResult(null);
break;
case getPrimaryClip:
case getPrimaryClipDescription:
case getText:
case hasPrimaryClip:
case hasText:
break;
case removePrimaryClipChangedListener:
if (isRestricted(param, PrivacyManager.cClipboard, "addPrimaryClipChangedListener"))
param.setResult(null);
break;
case Srv_removePrimaryClipChangedListener:
if (isRestricted(param, PrivacyManager.cClipboard, "Srv_addPrimaryClipChangedListener"))
param.setResult(null);
break;
case Srv_getPrimaryClip:
case Srv_getPrimaryClipDescription:
case Srv_hasClipboardText:
case Srv_hasPrimaryClip:
break;
}
}
@Override
protected void after(XParam param) throws Throwable {
switch (mMethod) {
case addPrimaryClipChangedListener:
case removePrimaryClipChangedListener:
case Srv_addPrimaryClipChangedListener:
case Srv_removePrimaryClipChangedListener:
break;
case getPrimaryClip:
case getPrimaryClipDescription:
case getText:
case Srv_getPrimaryClip:
case Srv_getPrimaryClipDescription:
if (param.getResult() != null)
if (isRestricted(param))
param.setResult(null);
break;
case hasPrimaryClip:
case hasText:
case Srv_hasClipboardText:
case Srv_hasPrimaryClip:
if (param.getResult() instanceof Boolean)
if (isRestricted(param))
param.setResult(false);
break;
}
}
}