package biz.bokhorst.xprivacy; import java.util.ArrayList; import java.util.List; import android.os.Process; public class RState { public int mUid; public String mRestrictionName; public String mMethodName; public boolean restricted; public boolean asked = false; public boolean partialRestricted = false; public boolean partialAsk = false; 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); } public void toggleRestriction() { if (mMethodName == null) { // Get restrictions to change List<String> listRestriction; if (mRestrictionName == null) listRestriction = PrivacyManager.getRestrictions(); else { listRestriction = new ArrayList<String>(); listRestriction.add(mRestrictionName); } // Change restriction if (restricted) PrivacyManager.deleteRestrictions(mUid, mRestrictionName, (mRestrictionName == null)); else { for (String restrictionName : listRestriction) PrivacyManager.setRestriction(mUid, restrictionName, null, true, false); PrivacyManager.updateState(mUid); } } else { PRestriction query = PrivacyManager.getRestrictionEx(mUid, mRestrictionName, null); PrivacyManager.setRestriction(mUid, mRestrictionName, mMethodName, !restricted, query.asked); PrivacyManager.updateState(mUid); } } public void toggleAsked() { asked = !asked; if (mRestrictionName == null) PrivacyManager.setSetting(mUid, PrivacyManager.cSettingOnDemand, Boolean.toString(!asked)); else { // Avoid re-doing all exceptions for dangerous functions List<PRestriction> listPRestriction = new ArrayList<PRestriction>(); listPRestriction.add(new PRestriction(mUid, mRestrictionName, mMethodName, restricted, asked)); PrivacyManager.setRestrictionList(listPRestriction); PrivacyManager.setSetting(mUid, PrivacyManager.cSettingState, Integer.toString(ApplicationInfoEx.STATE_CHANGED)); PrivacyManager.setSetting(mUid, PrivacyManager.cSettingModifyTime, Long.toString(System.currentTimeMillis())); } } }