/** * Creates a new point instance from a {@link Parcel} source. This is used when unparceling a * ParseGeoPoint. Subclasses that need Parcelable behavior should provide their own * {@link android.os.Parcelable.Creator} and override this constructor. * * @param source The recovered parcel. */ protected ParseGeoPoint(Parcel source) { this(source, ParseParcelDecoder.get()); }
/** * Creates a ParseRelation from a Parcel with the given decoder. */ /* package */ ParseRelation(Parcel source, ParseParcelDecoder decoder) { if (source.readByte() == 1) this.key = source.readString(); if (source.readByte() == 1) this.targetClass = source.readString(); if (source.readByte() == 1) this.parentClassName = source.readString(); if (source.readByte() == 1) this.parentObjectId = source.readString(); if (source.readByte() == 1) this.parent = new WeakReference<>((ParseObject) decoder.decode(source)); int size = source.readInt(); for (int i = 0; i < size; i++) { knownObjects.add((ParseObject) decoder.decode(source)); } }
return decodeParseObject(source); return decodePointer(source); Map<String, Object> map = new HashMap<>(size); for (int i = 0; i < size; i++) { map.put(source.readString(), decode(source)); List<Object> list = new ArrayList<>(length); for (int i = 0; i < length; i++) { list.add(i, decode(source));
@Test public void testParcelableWithUnresolvedUser() { ParseFieldOperations.registerDefaultDecoders(); // Needed for unparceling ParseObjects ParseACL acl = new ParseACL(); ParseUser unresolved = new ParseUser(); setLazy(unresolved); acl.setReadAccess(unresolved, true); // unresolved users need a local id when parcelling and unparcelling. // Since we don't have an Android environment, local id creation will fail. unresolved.localId = "localId"; Parcel parcel = Parcel.obtain(); acl.writeToParcel(parcel, 0); parcel.setDataPosition(0); // Do not user ParseObjectParcelDecoder because it requires local ids acl = new ParseACL(parcel, new ParseParcelDecoder()); assertTrue(acl.getReadAccess(unresolved)); }
/** * Creates a new point instance from a {@link Parcel} source. This is used when unparceling a * ParsePolygon. Subclasses that need Parcelable behavior should provide their own * {@link android.os.Parcelable.Creator} and override this constructor. * * @param source The recovered parcel. */ protected ParsePolygon(Parcel source) { this(source, ParseParcelDecoder.get()); }
@Override public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { return new ParseIncrementOperation((Number) decoder.decode(source)); } });
/** * Creates a new file instance from a {@link Parcel} source. This is used when unparceling * a non-dirty ParseFile. Subclasses that need Parcelable behavior should provide their own * {@link android.os.Parcelable.Creator} and override this constructor. * * @param source the source Parcel */ protected ParseFile(Parcel source) { this(source, ParseParcelDecoder.get()); }
@Override public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { int size = source.readInt(); List<Object> list = new ArrayList<>(size); for (int i = 0; i < size; i++) { list.add(i, decoder.decode(source)); } return new ParseAddUniqueOperation(list); } });
@Override public ParseGeoPoint createFromParcel(Parcel source) { return new ParseGeoPoint(source, ParseParcelDecoder.get()); }
@Override public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { return new ParseSetOperation(decoder.decode(source)); } });
@Override public ParsePolygon createFromParcel(Parcel source) { return new ParsePolygon(source, ParseParcelDecoder.get()); }
@Override public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { int size = source.readInt(); List<Object> list = new ArrayList<>(size); for (int i = 0; i < size; i++) { list.add(i, decoder.decode(source)); } return new ParseAddOperation(list); } });
@Test public void testParcelable() { long updatedAt = System.currentTimeMillis(); long createdAt = updatedAt + 10; ParseObject.State state = new ParseObject.State.Builder("TestObject") .objectId("fake") .createdAt(new Date(createdAt)) .updatedAt(new Date(updatedAt)) .isComplete(true) .put("foo", "bar") .put("baz", "qux") .availableKeys(Arrays.asList("safe", "keys")) .build(); Parcel parcel = Parcel.obtain(); state.writeToParcel(parcel, ParseParcelEncoder.get()); parcel.setDataPosition(0); ParseObject.State copy = ParseObject.State.createFromParcel(parcel, ParseParcelDecoder.get()); assertEquals(state.className(), copy.className()); assertEquals(state.objectId(), copy.objectId()); assertEquals(state.createdAt(), copy.createdAt()); assertEquals(state.updatedAt(), copy.updatedAt()); assertEquals(state.isComplete(), copy.isComplete()); assertEquals(state.keySet().size(), copy.keySet().size()); assertEquals(state.get("foo"), copy.get("foo")); assertEquals(state.get("baz"), copy.get("baz")); assertEquals(state.availableKeys().size(), copy.availableKeys().size()); assertTrue(state.availableKeys().containsAll(copy.availableKeys())); assertTrue(copy.availableKeys().containsAll(state.availableKeys())); }
@Override public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { int size = source.readInt(); List<Object> list = new ArrayList<>(size); for (int i = 0; i < size; i++) { list.add(i, decoder.decode(source)); } return new ParseRemoveOperation(list); } });
@Override public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { int size = source.readInt(); Set<ParseObject> set = new HashSet<>(size); for (int i = 0; i < size; i++) { set.add((ParseObject) decoder.decode(source)); } return new ParseRelationOperation<>(set, null); } });
@Override public ParseFieldOperation decode(Parcel source, ParseParcelDecoder decoder) { int size = source.readInt(); Set<ParseObject> set = new HashSet<>(size); for (int i = 0; i < size; i++) { set.add((ParseObject) decoder.decode(source)); } return new ParseRelationOperation<>(null, set); } });
State(Parcel parcel, String clazz, ParseParcelDecoder decoder) { className = clazz; // Already read objectId = parcel.readByte() == 1 ? parcel.readString() : null; createdAt = parcel.readLong(); long updated = parcel.readLong(); updatedAt = updated > 0 ? updated : createdAt; int size = parcel.readInt(); HashMap<String, Object> map = new HashMap<>(); for (int i = 0; i < size; i++) { String key = parcel.readString(); Object obj = decoder.decode(parcel); map.put(key, obj); } serverData = Collections.unmodifiableMap(map); isComplete = parcel.readByte() == 1; List<String> available = new ArrayList<>(); parcel.readStringList(available); availableKeys = new HashSet<>(available); }
static ParseOperationSet fromParcel(Parcel source, ParseParcelDecoder decoder) { ParseOperationSet set = new ParseOperationSet(source.readString()); set.setIsSaveEventually(source.readByte() == 1); int size = source.readInt(); for (int i = 0; i < size; i++) { String key = source.readString(); ParseFieldOperation op = (ParseFieldOperation) decoder.decode(source); set.put(key, op); } return set; }
/* package */ ParseACL(Parcel source, ParseParcelDecoder decoder) { shared = source.readByte() == 1; int size = source.readInt(); for (int i = 0; i < size; i++) { String key = source.readString(); Permissions permissions = Permissions.createPermissionsFromParcel(source); permissionsById.put(key, permissions); } if (source.readByte() == 1) { unresolvedUser = (ParseUser) decoder.decode(source); unresolvedUser.registerSaveListener(new UserResolutionListener(this)); } }