@Override
  public boolean isPermissionRequested(String key) {
    if (key == null) {
      return false;
    }

    return requestedPermissions.contains(key) || isPermissionRequested(Util.getParentKey(key));
  }
  private void addAvailablePermission(String permission) {
    String parent = Util.getParentKey(permission);
    if (parent == null) {
      parent = ROOT;
    }
    Set<String> lookupSet = availablePermissionLookup.get(parent);
    if (lookupSet == null) {
      lookupSet = new TreeSet<String>();
      availablePermissionLookup.put(parent, lookupSet);
    }

    lookupSet.add(permission);
  }
  private void setRequestedPermission(String requested, boolean set, boolean setSubPermissions) {
    if (requested == null) {
      return;
    }

    if (set) {
      requestedPermissions.add(requested);
      if (setSubPermissions) {
        List<String> subPermissions = getAvailablePermissions(requested);
        requestedPermissions.addAll(subPermissions);
      }
    } else {
      requestedPermissions.remove(requested);
      if (setSubPermissions) {
        List<String> subPermissions = getAvailablePermissions(requested);
        requestedPermissions.removeAll(subPermissions);
      }
    }

    String parentPermission = Util.getParentKey(requested);
    setRequestedPermission(parentPermission, allSubPermissionsSet(parentPermission), false);
    save();
  }