package biz.bokhorst.xprivacy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.usage.ConfigurationStats; import android.app.usage.UsageStats; import biz.bokhorst.xprivacy.XHook; public class XUsageStatsManager extends XHook { private Methods mMethod; private XUsageStatsManager(Methods method, String restrictionName) { super(restrictionName, method.name().replace("Srv_", ""), method.name()); mMethod = method; } @Override public boolean isVisible() { return !mMethod.name().startsWith("Srv_"); } public String getClassName() { if (mMethod.name().startsWith("Srv_")) return "com.android.server.usage.UserUsageStatsService"; else return "android.app.usage.UsageStatsManager"; } // @formatter:off // public Map<String, UsageStats> queryAndAggregateUsageStats(long beginTime, long endTime) // public List<ConfigurationStats> queryConfigurations(int intervalType, long beginTime, long endTime) // public UsageEvents queryEvents(long beginTime, long endTime) // public List<UsageStats> queryUsageStats(int intervalType, long beginTime, long endTime) // https://developer.android.com/reference/android/app/usage/UsageStatsManager.html // List<ConfigurationStats> queryConfigurationStats(int userId, int bucketType, long beginTime, long endTime) // UsageEvents queryEvents(int userId, long beginTime, long endTime) // List<UsageStats> queryUsageStats(int userId, int bucketType, long beginTime, long endTime) // http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/android/server/usage/UsageStatsService.java private enum Methods { queryAndAggregateUsageStats, queryConfigurations, queryEvents, queryUsageStats, Srv_queryConfigurationStats, Srv_queryEvents, Srv_queryUsageStats }; // @formatter:on public static List<XHook> getInstances(boolean server) { List<XHook> listHook = new ArrayList<XHook>(); if (server) { listHook.add(new XUsageStatsManager(Methods.Srv_queryConfigurationStats, PrivacyManager.cSystem)); listHook.add(new XUsageStatsManager(Methods.Srv_queryEvents, PrivacyManager.cSystem)); listHook.add(new XUsageStatsManager(Methods.Srv_queryUsageStats, PrivacyManager.cSystem)); } else { listHook.add(new XUsageStatsManager(Methods.queryAndAggregateUsageStats, PrivacyManager.cSystem)); listHook.add(new XUsageStatsManager(Methods.queryConfigurations, PrivacyManager.cSystem)); listHook.add(new XUsageStatsManager(Methods.queryEvents, PrivacyManager.cSystem)); listHook.add(new XUsageStatsManager(Methods.queryUsageStats, PrivacyManager.cSystem)); } return listHook; } @Override protected void before(XParam param) throws Throwable { switch (mMethod) { case queryAndAggregateUsageStats: case queryConfigurations: case queryUsageStats: case Srv_queryConfigurationStats: case Srv_queryUsageStats: // Do nothing break; case queryEvents: if (isRestricted(param)) if (param.args.length > 1) { param.args[0] = 0; param.args[1] = 0; } break; case Srv_queryEvents: if (isRestricted(param)) if (param.args.length > 2) { param.args[1] = 0; param.args[2] = 0; } break; } } @Override protected void after(XParam param) throws Throwable { switch (mMethod) { case queryAndAggregateUsageStats: if (isRestricted(param)) param.setResult(new HashMap<String, UsageStats>()); break; case queryConfigurations: case Srv_queryConfigurationStats: if (isRestricted(param)) param.setResult(new ArrayList<ConfigurationStats>()); break; case queryEvents: case Srv_queryEvents: // Do nothing break; case queryUsageStats: case Srv_queryUsageStats: if (isRestricted(param)) param.setResult(new ArrayList<UsageStats>()); break; } } }