public RState(int uid, String restrictionName, String methodName, Version version) { mUid = uid; mRestrictionName = restrictionName; mMethodName = methodName; int userId = Util.getUserId(Process.myUid()); // Get if on demand boolean onDemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true); if (onDemand) onDemand = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingOnDemand, false); boolean allRestricted = true; boolean someRestricted = false; boolean allAsk = true; boolean someAsk = false; if (methodName == null) { if (restrictionName == null) { // Examine the category state someAsk = onDemand; for (String rRestrictionName : PrivacyManager.getRestrictions()) { PRestriction query = PrivacyManager.getRestrictionEx(uid, rRestrictionName, null); allRestricted = (allRestricted && query.restricted); someRestricted = (someRestricted || query.restricted); allAsk = (allAsk && !query.asked); someAsk = (someAsk || !query.asked); } asked = !onDemand; } else { // Examine the category/method states PRestriction query = PrivacyManager.getRestrictionEx(uid, restrictionName, null); someRestricted = query.restricted; someAsk = !query.asked; for (PRestriction restriction : PrivacyManager.getRestrictionList(uid, restrictionName)) { Hook hook = PrivacyManager.getHook(restrictionName, restriction.methodName); if (version != null && hook != null && hook.getFrom() != null && version.compareTo(hook.getFrom()) < 0) continue; allRestricted = (allRestricted && restriction.restricted); someRestricted = (someRestricted || restriction.restricted); if (hook == null || hook.canOnDemand()) { allAsk = (allAsk && !restriction.asked); someAsk = (someAsk || !restriction.asked); } } asked = query.asked; } } else { // Examine the method state PRestriction query = PrivacyManager.getRestrictionEx(uid, restrictionName, methodName); allRestricted = query.restricted; someRestricted = false; asked = query.asked; } boolean isApp = PrivacyManager.isApplication(uid); boolean odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem, false); restricted = (allRestricted || someRestricted); asked = (!onDemand || !(isApp || odSystem) || asked); partialRestricted = (!allRestricted && someRestricted); partialAsk = (onDemand && (isApp || odSystem) && !allAsk && someAsk); }