static ParseObject createFromParcel(Parcel source, ParseParcelDecoder decoder) { String className = source.readString(); String objectId = source.readByte() == 1 ? source.readString() : null; // Create empty object (might be the same instance if LDS is enabled) // and pass to decoder before unparceling child objects in State ParseObject object = createWithoutData(className, objectId); if (decoder instanceof ParseObjectParcelDecoder) { ((ParseObjectParcelDecoder) decoder).addKnownObject(object); } State state = State.createFromParcel(source, decoder); object.setState(state); if (source.readByte() == 1) object.localId = source.readString(); if (source.readByte() == 1) object.isDeleted = true; // If object.ldsEnabledWhenParceling is true, we got this from OfflineStore. // There is no need to restore operations in that case. boolean restoreOperations = !object.ldsEnabledWhenParceling; ParseOperationSet set = ParseOperationSet.fromParcel(source, decoder); if (restoreOperations) { for (String key : set.keySet()) { ParseFieldOperation op = set.get(key); object.performOperation(key, op); // Update ops and estimatedData } } Bundle bundle = source.readBundle(ParseObject.class.getClassLoader()); object.onRestoreInstanceState(bundle); return object; }
@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())); }