summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/ContentResolver.java21
-rw-r--r--core/java/android/content/IContentService.aidl4
-rw-r--r--services/core/java/com/android/server/content/ContentService.java23
3 files changed, 41 insertions, 7 deletions
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index be70411..de3b881 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -1926,8 +1926,17 @@ public abstract class ContentResolver {
* @param sync true if the provider should be synced when tickles are received for it
*/
public static void setSyncAutomatically(Account account, String authority, boolean sync) {
+ setSyncAutomaticallyAsUser(account, authority, sync, UserHandle.getCallingUserId());
+ }
+
+ /**
+ * @see #setSyncAutomatically(Account, String, boolean)
+ * @hide
+ */
+ public static void setSyncAutomaticallyAsUser(Account account, String authority, boolean sync,
+ int userId) {
try {
- getContentService().setSyncAutomatically(account, authority, sync);
+ getContentService().setSyncAutomaticallyAsUser(account, authority, sync, userId);
} catch (RemoteException e) {
// exception ignored; if this is thrown then it means the runtime is in the midst of
// being restarted
@@ -2268,8 +2277,16 @@ public abstract class ContentResolver {
* @return true if there is a pending sync with the matching account and authority
*/
public static boolean isSyncPending(Account account, String authority) {
+ return isSyncPendingAsUser(account, authority, UserHandle.getCallingUserId());
+ }
+
+ /**
+ * @see #requestSync(Account, String, Bundle)
+ * @hide
+ */
+ public static boolean isSyncPendingAsUser(Account account, String authority, int userId) {
try {
- return getContentService().isSyncPending(account, authority, null);
+ return getContentService().isSyncPendingAsUser(account, authority, null, userId);
} catch (RemoteException e) {
throw new RuntimeException("the ContentService should always be reachable", e);
}
diff --git a/core/java/android/content/IContentService.aidl b/core/java/android/content/IContentService.aidl
index 1e96713..d363ad1 100644
--- a/core/java/android/content/IContentService.aidl
+++ b/core/java/android/content/IContentService.aidl
@@ -82,6 +82,8 @@ interface IContentService {
* @param sync true if the provider should be synced when tickles are received for it
*/
void setSyncAutomatically(in Account account, String providerName, boolean sync);
+ void setSyncAutomaticallyAsUser(in Account account, String providerName, boolean sync,
+ int userId);
/**
* Get a list of periodic operations for a specified authority, or service.
@@ -170,6 +172,8 @@ interface IContentService {
* non-null.
*/
boolean isSyncPending(in Account account, String authority, in ComponentName cname);
+ boolean isSyncPendingAsUser(in Account account, String authority, in ComponentName cname,
+ int userId);
void addStatusChangeListener(int mask, ISyncStatusObserver callback);
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index a6485e9..1279c6e 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -537,19 +537,26 @@ public final class ContentService extends IContentService.Stub {
@Override
public void setSyncAutomatically(Account account, String providerName, boolean sync) {
+ setSyncAutomaticallyAsUser(account, providerName, sync, UserHandle.getCallingUserId());
+ }
+
+ @Override
+ public void setSyncAutomaticallyAsUser(Account account, String providerName, boolean sync,
+ int userId) {
if (TextUtils.isEmpty(providerName)) {
throw new IllegalArgumentException("Authority must be non-empty");
}
mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS,
"no permission to write the sync settings");
+ enforceCrossUserPermission(userId,
+ "no permission to modify the sync settings for user " + userId);
- int userId = UserHandle.getCallingUserId();
long identityToken = clearCallingIdentity();
try {
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
- syncManager.getSyncStorageEngine()
- .setSyncAutomatically(account, userId, providerName, sync);
+ syncManager.getSyncStorageEngine().setSyncAutomatically(account, userId,
+ providerName, sync);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -806,11 +813,17 @@ public final class ContentService extends IContentService.Stub {
}
public boolean isSyncPending(Account account, String authority, ComponentName cname) {
+ return isSyncPendingAsUser(account, authority, cname, UserHandle.getCallingUserId());
+ }
+
+ @Override
+ public boolean isSyncPendingAsUser(Account account, String authority, ComponentName cname,
+ int userId) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS,
"no permission to read the sync stats");
-
+ enforceCrossUserPermission(userId,
+ "no permission to retrieve the sync settings for user " + userId);
int callerUid = Binder.getCallingUid();
- int userId = UserHandle.getCallingUserId();
long identityToken = clearCallingIdentity();
SyncManager syncManager = getSyncManager();
if (syncManager == null) return false;