field public static final int resource = 16842789; // 0x1010025
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
+ field public static final int restrictedAccountType = 16843733; // 0x10103d5
field public static final int right = 16843183; // 0x10101af
field public static final int ringtonePreferenceStyle = 16842899; // 0x1010093
field public static final int ringtoneType = 16843257; // 0x10101f9
/** @hide */
public boolean requiredForAllUsers;
+ /** @hide */
+ public String restrictedAccountType;
+
public PackageInfo() {
}
dest.writeTypedArray(reqFeatures, parcelableFlags);
dest.writeInt(installLocation);
dest.writeInt(requiredForAllUsers ? 1 : 0);
+ dest.writeString(restrictedAccountType);
}
public static final Parcelable.Creator<PackageInfo> CREATOR
reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
installLocation = source.readInt();
requiredForAllUsers = source.readInt() != 0;
+ restrictedAccountType = source.readString();
}
}
pi.applicationInfo = generateApplicationInfo(p, flags, state, userId);
pi.installLocation = p.installLocation;
pi.requiredForAllUsers = p.mRequiredForAllUsers;
+ pi.restrictedAccountType = p.mRestrictedAccountType;
pi.firstInstallTime = firstInstallTime;
pi.lastUpdateTime = lastUpdateTime;
if ((flags&PackageManager.GET_GIDS) != 0) {
false)) {
owner.mRequiredForAllUsers = true;
}
+ String accountType = sa.getString(com.android.internal.R.styleable
+ .AndroidManifestApplication_restrictedAccountType);
+ if (accountType != null && accountType.length() > 0) {
+ owner.mRestrictedAccountType = accountType;
+ }
}
if (sa.getBoolean(
}
public final static class Package {
+
public String packageName;
// For now we only support one application per package.
/* An app that's required for all users and cannot be uninstalled for a user */
public boolean mRequiredForAllUsers;
+ /* The restricted account authenticator type that is used by this application */
+ public String mRestrictedAccountType;
+
/**
* Digest suitable for comparing whether this package's manifest is the
* same as another.
<!-- Declare that your application will be able to deal with RTL (right to left) layouts.
If set to false (default value), your application will not care about RTL layouts. -->
<attr name="supportsRtl" format="boolean" />
+ <!-- Declare that this application requires access to restricted accounts of a certain
+ type. The default value is null and restricted accounts won\'t be visible to this
+ application. The type should correspond to the account authenticator type, such as
+ "com.google" -->
+ <attr name="restrictedAccountType" format="string"/>
</declare-styleable>
<!-- The <code>permission</code> tag declares a security permission that can be
<public type="attr" name="indicatorEnd" />
<public type="attr" name="childIndicatorStart" />
<public type="attr" name="childIndicatorEnd" />
+ <public type="attr" name="restrictedAccountType" />
<public type="style" name="Theme.NoTitleBar.Overscan" />
<public type="style" name="Theme.Light.NoTitleBar.Overscan" />
}
if (mUserManager.getUserInfo(userAccounts.userId).isRestricted()) {
String[] packages = mPackageManager.getPackagesForUid(callingUid);
- // If any of the packages includes a white listed package, return the full set,
+ // If any of the packages is a white listed package, return the full set,
// otherwise return non-shared accounts only.
// This might be a temporary way to specify a whitelist
String whiteList = mContext.getResources().getString(
ArrayList<Account> allowed = new ArrayList<Account>();
Account[] sharedAccounts = getSharedAccountsAsUser(userAccounts.userId);
if (sharedAccounts == null || sharedAccounts.length == 0) return unfiltered;
- for (Account account : unfiltered) {
- boolean found = false;
- for (Account shared : sharedAccounts) {
- if (shared.equals(account)) {
- found = true;
- break;
+ String requiredAccountType = "";
+ try {
+ for (String packageName : packages) {
+ PackageInfo pi = mPackageManager.getPackageInfo(packageName, 0);
+ if (pi != null && pi.restrictedAccountType != null) {
+ requiredAccountType = pi.restrictedAccountType;
}
}
- if (!found) {
+ } catch (NameNotFoundException nnfe) {
+ }
+ for (Account account : unfiltered) {
+ if (account.type.equals(requiredAccountType)) {
allowed.add(account);
+ } else {
+ boolean found = false;
+ for (Account shared : sharedAccounts) {
+ if (shared.equals(account)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ allowed.add(account);
+ }
}
}
Account[] filtered = new Account[allowed.size()];