am e494a81f: Merge "Restricted account visibility" into jb-mr2-dev

* commit 'e494a81f9b2727edd1c537f34bf0ea83b2fb0097':
  Restricted account visibility
This commit is contained in:
Amith Yamasani
2013-03-28 13:34:52 -07:00
committed by Android Git Automerger
6 changed files with 44 additions and 8 deletions

View File

@ -858,6 +858,7 @@ package android {
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

View File

@ -221,6 +221,9 @@ public class PackageInfo implements Parcelable {
/** @hide */
public boolean requiredForAllUsers;
/** @hide */
public String restrictedAccountType;
public PackageInfo() {
}
@ -262,6 +265,7 @@ public class PackageInfo implements Parcelable {
dest.writeTypedArray(reqFeatures, parcelableFlags);
dest.writeInt(installLocation);
dest.writeInt(requiredForAllUsers ? 1 : 0);
dest.writeString(restrictedAccountType);
}
public static final Parcelable.Creator<PackageInfo> CREATOR
@ -301,5 +305,6 @@ public class PackageInfo implements Parcelable {
reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
installLocation = source.readInt();
requiredForAllUsers = source.readInt() != 0;
restrictedAccountType = source.readString();
}
}

View File

@ -290,6 +290,7 @@ public class PackageParser {
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) {
@ -1764,6 +1765,11 @@ public class PackageParser {
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(
@ -3191,6 +3197,7 @@ public class PackageParser {
}
public final static class Package {
public String packageName;
// For now we only support one application per package.
@ -3278,6 +3285,9 @@ public class PackageParser {
/* 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.

View File

@ -889,6 +889,11 @@
<!-- 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

View File

@ -2041,6 +2041,7 @@
<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" />

View File

@ -2708,7 +2708,7 @@ public class AccountManagerService
}
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(
@ -2721,16 +2721,30 @@ public class AccountManagerService
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()];