17e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornpackage android.os; 27e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 37e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn/** 47e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Describes the source of some work that may be done by someone else. 57e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Currently the public representation of what a work source is is not 67e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * defined; this is an opaque container. 77e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 87e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornpublic class WorkSource implements Parcelable { 97e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int mNum; 107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int[] mUids; 117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Internal statics to avoid object allocations in some operations. 147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * The WorkSource object itself is not thread safe, but we need to 157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * hold sTmpWorkSource lock while working with these statics. 167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn static final WorkSource sTmpWorkSource = new WorkSource(0); 187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * For returning newbie work from a modification operation. 207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn static WorkSource sNewbWork; 227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * For returning gone work form a modification operation. 247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn static WorkSource sGoneWork; 267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Create an empty work source. 297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public WorkSource() { 317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = 0; 327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Create a new WorkSource that is a copy of an existing one. 367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * If <var>orig</var> is null, an empty WorkSource is created. 377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public WorkSource(WorkSource orig) { 397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (orig == null) { 407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = 0; 417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return; 427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = orig.mNum; 447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (orig.mUids != null) { 457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = orig.mUids.clone(); 467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = null; 487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** @hide */ 527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public WorkSource(int uid) { 537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = 1; 547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = new int[] { uid, 0 }; 557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn WorkSource(Parcel in) { 587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = in.readInt(); 597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = in.createIntArray(); 607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** @hide */ 637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public int size() { 647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return mNum; 657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** @hide */ 687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public int get(int index) { 697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return mUids[index]; 707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Clear this WorkSource to be empty. 747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void clear() { 767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = 0; 777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Compare this WorkSource with another. 817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * @param other The WorkSource to compare against. 827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * @return If there is a difference, true is returned. 837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public boolean diff(WorkSource other) { 857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = mNum; 867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (N != other.mNum) { 877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return true; 887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn final int[] uids1 = mUids; 907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn final int[] uids2 = other.mUids; 917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (uids1[i] != uids2[i]) { 937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return true; 947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return false; 977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 1007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Replace the current contents of this work source with the given 1017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * work source. If <var>other</var> is null, the current work source 1027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * will be made empty. 1037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 1047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void set(WorkSource other) { 1057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (other == null) { 1067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = 0; 1077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return; 1087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = other.mNum; 1107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (other.mUids != null) { 1117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (mUids != null && mUids.length >= mNum) { 1127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn System.arraycopy(other.mUids, 0, mUids, 0, mNum); 1137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 1147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = other.mUids.clone(); 1157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 1177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = null; 1187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** @hide */ 1227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void set(int uid) { 1237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = 1; 1247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (mUids == null) mUids = new int[2]; 1257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids[0] = uid; 1267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** @hide */ 1297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public WorkSource[] setReturningDiffs(WorkSource other) { 1307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (sTmpWorkSource) { 1317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sNewbWork = null; 1327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sGoneWork = null; 1337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn updateLocked(other, true, true); 1347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (sNewbWork != null || sGoneWork != null) { 1357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn WorkSource[] diffs = new WorkSource[2]; 1367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn diffs[0] = sNewbWork; 1377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn diffs[1] = sGoneWork; 1387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return diffs; 1397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return null; 1417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** 1457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * Merge the contents of <var>other</var> WorkSource in to this one. 1467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * 1477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * @param other The other WorkSource whose contents are to be merged. 1487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn * @return Returns true if any new sources were added. 1497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn */ 1507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public boolean add(WorkSource other) { 1517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (sTmpWorkSource) { 1527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return updateLocked(other, false, false); 1537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** @hide */ 1577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public WorkSource addReturningNewbs(WorkSource other) { 1587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (sTmpWorkSource) { 1597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sNewbWork = null; 1607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn updateLocked(other, false, true); 1617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return sNewbWork; 1627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** @hide */ 1667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public boolean add(int uid) { 1677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (sTmpWorkSource) { 1687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sTmpWorkSource.mUids[0] = uid; 1697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return updateLocked(sTmpWorkSource, false, false); 1707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn /** @hide */ 1747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public WorkSource addReturningNewbs(int uid) { 1757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (sTmpWorkSource) { 1767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sNewbWork = null; 1777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sTmpWorkSource.mUids[0] = uid; 1787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn updateLocked(sTmpWorkSource, false, true); 1797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return sNewbWork; 1807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public boolean remove(WorkSource other) { 1847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N1 = mNum; 1857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn final int[] uids1 = mUids; 1867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn final int N2 = other.mNum; 1877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn final int[] uids2 = other.mUids; 1887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = false; 1897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int i1 = 0; 1907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i2=0; i2<N2 && i1<N1; i2++) { 1917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (uids2[i2] == uids1[i1]) { 1927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn N1--; 19383770289f8eca5aa4c62647a6c4d9a5bd4c80a45Dianne Hackborn if (i1 < N1) System.arraycopy(uids1, i1+1, uids1, i1, N1-i1); 1947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn while (i1 < N1 && uids2[i2] > uids1[i1]) { 1967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn i1++; 1977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = N1; 2017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return changed; 2037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private boolean updateLocked(WorkSource other, boolean set, boolean returnNewbs) { 2067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N1 = mNum; 2077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int[] uids1 = mUids; 2087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn final int N2 = other.mNum; 2097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn final int[] uids2 = other.mUids; 2107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = false; 2117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int i1 = 0; 2127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i2=0; i2<N2; i2++) { 2137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (i1 >= N1 || uids2[i2] < uids1[i1]) { 2147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn // Need to insert a new uid. 2157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn changed = true; 2167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (uids1 == null) { 2177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn uids1 = new int[4]; 2187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn uids1[0] = uids2[i2]; 2197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else if (i1 >= uids1.length) { 2207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int[] newuids = new int[(uids1.length*3)/2]; 2217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (i1 > 0) System.arraycopy(uids1, 0, newuids, 0, i1); 2227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (i1 < N1) System.arraycopy(uids1, i1, newuids, i1+1, N1-i1); 2237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn uids1 = newuids; 2247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn uids1[i1] = uids2[i2]; 2257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (i1 < N1) System.arraycopy(uids1, i1, uids1, i1+1, N1-i1); 2277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn uids1[i1] = uids2[i2]; 2287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (returnNewbs) { 2307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (sNewbWork == null) { 2317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sNewbWork = new WorkSource(uids2[i2]); 2327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sNewbWork.addLocked(uids2[i2]); 2347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn N1++; 2377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn i1++; 2387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (!set) { 2407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn // Skip uids that already exist or are not in 'other'. 2417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn do { 2427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn i1++; 2437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } while (i1 < N1 && uids2[i2] >= uids1[i1]); 2447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn // Remove any uids that don't exist in 'other'. 2467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int start = i1; 2477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn while (i1 < N1 && uids2[i2] > uids1[i1]) { 2487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (sGoneWork == null) { 2497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sGoneWork = new WorkSource(uids1[i1]); 2507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sGoneWork.addLocked(uids1[i1]); 2527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn i1++; 2547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (start < i1) { 2567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn System.arraycopy(uids1, i1, uids1, start, i1-start); 2577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn N1 -= i1-start; 2587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn i1 = start; 2597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn // If there is a matching uid, skip it. 2617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (i1 < N1 && uids2[i1] == uids1[i1]) { 2627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn i1++; 2637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = N1; 2697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = uids1; 2707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return changed; 2727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private void addLocked(int uid) { 2757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (mUids == null) { 2767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = new int[4]; 2777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids[0] = uid; 2787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum = 1; 2797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return; 2807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (mNum >= mUids.length) { 2827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int[] newuids = new int[(mNum*3)/2]; 2837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn System.arraycopy(mUids, 0, newuids, 0, mNum); 2847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids = newuids; 2857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mUids[mNum] = uid; 2887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mNum++; 2897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn @Override 2927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public int describeContents() { 2937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return 0; 2947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn @Override 2977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 2987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn dest.writeInt(mNum); 2997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn dest.writeIntArray(mUids); 3007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 3027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public static final Parcelable.Creator<WorkSource> CREATOR 3037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn = new Parcelable.Creator<WorkSource>() { 3047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public WorkSource createFromParcel(Parcel in) { 3057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return new WorkSource(in); 3067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public WorkSource[] newArray(int size) { 3087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return new WorkSource[size]; 3097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn }; 3117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn} 312