Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14a387d3 authored by Varun Shah's avatar Varun Shah Committed by Android (Google) Code Review
Browse files

Merge "Limit who the SyncStatusObserver broadcasts are sent to."

parents 5e3f50a9 253c9f4d
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -1104,11 +1104,13 @@ public final class ContentService extends IContentService.Stub {

    @Override
    public void addStatusChangeListener(int mask, ISyncStatusObserver callback) {
        final int callingUid = Binder.getCallingUid();
        long identityToken = clearCallingIdentity();
        try {
            SyncManager syncManager = getSyncManager();
            if (syncManager != null && callback != null) {
                syncManager.getSyncStorageEngine().addStatusChangeListener(mask, callback);
                syncManager.getSyncStorageEngine().addStatusChangeListener(
                        mask, UserHandle.getUserId(callingUid), callback);
            }
        } finally {
            restoreCallingIdentity(identityToken);
+4 −2
Original line number Diff line number Diff line
@@ -3375,7 +3375,8 @@ public class SyncManager {
            }

            scheduleSyncOperationH(op);
            mSyncStorageEngine.reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
            mSyncStorageEngine.reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS,
                    target.userId);
        }

        /**
@@ -3877,7 +3878,8 @@ public class SyncManager {
            EventLog.writeEvent(2720,
                    syncOperation.toEventLog(SyncStorageEngine.EVENT_STOP));
            mSyncStorageEngine.stopSyncEvent(rowId, elapsedTime,
                    resultMessage, downstreamActivity, upstreamActivity);
                    resultMessage, downstreamActivity, upstreamActivity,
                    syncOperation.target.userId);
        }
    }

+27 −22
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.EventLog;
import android.util.Log;
@@ -54,6 +55,7 @@ import android.util.Xml;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IntPair;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -588,9 +590,10 @@ public class SyncStorageEngine {
        return mSyncRandomOffset;
    }

    public void addStatusChangeListener(int mask, ISyncStatusObserver callback) {
    public void addStatusChangeListener(int mask, int userId, ISyncStatusObserver callback) {
        synchronized (mAuthorities) {
            mChangeListeners.register(callback, mask);
            final long cookie = IntPair.of(userId, mask);
            mChangeListeners.register(callback, cookie);
        }
    }

@@ -622,14 +625,16 @@ public class SyncStorageEngine {
        }
    }

    void reportChange(int which) {
    void reportChange(int which, int callingUserId) {
        ArrayList<ISyncStatusObserver> reports = null;
        synchronized (mAuthorities) {
            int i = mChangeListeners.beginBroadcast();
            while (i > 0) {
                i--;
                Integer mask = (Integer)mChangeListeners.getBroadcastCookie(i);
                if ((which & mask.intValue()) == 0) {
                final long cookie = (long) mChangeListeners.getBroadcastCookie(i);
                final int userId = IntPair.first(cookie);
                final int mask = IntPair.second(cookie);
                if ((which & mask) == 0 || callingUserId != userId) {
                    continue;
                }
                if (reports == null) {
@@ -719,7 +724,7 @@ public class SyncStorageEngine {
                    new Bundle(),
                    syncExemptionFlag, callingUid, callingPid);
        }
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, userId);
        queueBackup();
    }

@@ -787,7 +792,7 @@ public class SyncStorageEngine {
            requestSync(aInfo, SyncOperation.REASON_IS_SYNCABLE, new Bundle(),
                    ContentResolver.SYNC_EXEMPTION_NONE, callingUid, callingPid);
        }
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, target.userId);
    }

    public Pair<Long, Long> getBackoff(EndPoint info) {
@@ -833,7 +838,7 @@ public class SyncStorageEngine {
            }
        }
        if (changed) {
            reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
            reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, info.userId);
        }
    }

@@ -871,7 +876,7 @@ public class SyncStorageEngine {
    }

    public void clearAllBackoffsLocked() {
        boolean changed = false;
        final ArraySet<Integer> changedUserIds = new ArraySet<>();
        synchronized (mAuthorities) {
            // Clear backoff for all sync adapters.
            for (AccountInfo accountInfo : mAccounts.values()) {
@@ -888,14 +893,14 @@ public class SyncStorageEngine {
                        }
                        authorityInfo.backoffTime = NOT_IN_BACKOFF_MODE;
                        authorityInfo.backoffDelay = NOT_IN_BACKOFF_MODE;
                        changed = true;
                        changedUserIds.add(accountInfo.accountAndUser.userId);
                    }
                }
            }
        }

        if (changed) {
            reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
        for (int i = changedUserIds.size() - 1; i > 0; i--) {
            reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, changedUserIds.valueAt(i));
        }
    }

@@ -921,7 +926,7 @@ public class SyncStorageEngine {
            }
            authority.delayUntil = delayUntil;
        }
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, info.userId);
    }

    /**
@@ -964,7 +969,7 @@ public class SyncStorageEngine {
                    new Bundle(),
                    syncExemptionFlag, callingUid, callingPid);
        }
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, userId);
        mContext.sendBroadcast(ContentResolver.ACTION_SYNC_CONN_STATUS_CHANGED);
        queueBackup();
    }
@@ -1015,7 +1020,7 @@ public class SyncStorageEngine {
            SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
            status.pending = pendingValue;
        }
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_PENDING);
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_PENDING, info.userId);
    }

    /**
@@ -1103,7 +1108,7 @@ public class SyncStorageEngine {
                    activeSyncContext.mStartTime);
            getCurrentSyncs(authorityInfo.target.userId).add(syncInfo);
        }
        reportActiveChange();
        reportActiveChange(activeSyncContext.mSyncOperation.target.userId);
        return syncInfo;
    }

@@ -1120,14 +1125,14 @@ public class SyncStorageEngine {
            getCurrentSyncs(userId).remove(syncInfo);
        }

        reportActiveChange();
        reportActiveChange(userId);
    }

    /**
     * To allow others to send active change reports, to poke clients.
     */
    public void reportActiveChange() {
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE);
    public void reportActiveChange(int userId) {
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE, userId);
    }

    /**
@@ -1162,12 +1167,12 @@ public class SyncStorageEngine {
            if (Log.isLoggable(TAG, Log.VERBOSE)) Slog.v(TAG, "returning historyId " + id);
        }

        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_STATUS);
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_STATUS, op.target.userId);
        return id;
    }

    public void stopSyncEvent(long historyId, long elapsedTime, String resultMessage,
                              long downstreamActivity, long upstreamActivity) {
                              long downstreamActivity, long upstreamActivity, int userId) {
        synchronized (mAuthorities) {
            if (Log.isLoggable(TAG, Log.VERBOSE)) {
                Slog.v(TAG, "stopSyncEvent: historyId=" + historyId);
@@ -1307,7 +1312,7 @@ public class SyncStorageEngine {
            }
        }

        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_STATUS);
        reportChange(ContentResolver.SYNC_OBSERVER_TYPE_STATUS, userId);
    }

    /**