diff --git a/Parse/src/main/java/com/parse/ParseInstallation.java b/Parse/src/main/java/com/parse/ParseInstallation.java index 5a9cf3625..4fe460e20 100644 --- a/Parse/src/main/java/com/parse/ParseInstallation.java +++ b/Parse/src/main/java/com/parse/ParseInstallation.java @@ -30,6 +30,7 @@ public class ParseInstallation extends ParseObject { private static final String TAG = "com.parse.ParseInstallation"; + private static final String KEY_OBJECT_ID = "objectId"; private static final String KEY_INSTALLATION_ID = "installationId"; private static final String KEY_DEVICE_TYPE = "deviceType"; private static final String KEY_APP_NAME = "appName"; @@ -45,7 +46,7 @@ public class ParseInstallation extends ParseObject { private static final List READ_ONLY_FIELDS = Collections.unmodifiableList( Arrays.asList(KEY_DEVICE_TYPE, KEY_INSTALLATION_ID, KEY_DEVICE_TOKEN, KEY_PUSH_TYPE, KEY_TIME_ZONE, KEY_LOCALE, KEY_APP_VERSION, KEY_APP_NAME, KEY_PARSE_VERSION, - KEY_APP_IDENTIFIER)); + KEY_APP_IDENTIFIER, KEY_OBJECT_ID)); // TODO(mengyan): Inject into ParseInstallationInstanceController /* package */ static ParseCurrentInstallationController getCurrentInstallationController() { @@ -94,6 +95,11 @@ public String getInstallationId() { return getString(KEY_INSTALLATION_ID); } + @Override + public void setObjectId(String newObjectId) { + throw new RuntimeException("Installation's objectId cannot be changed"); + } + @Override /* package */ boolean needsDefaultACL() { return false; @@ -149,7 +155,7 @@ public Task then(Task task) throws Exception { && task.getError() instanceof ParseException && ((ParseException) task.getError()).getCode() == ParseException.OBJECT_NOT_FOUND) { synchronized (mutex) { - setObjectId(null); + setState(new State.Builder(getState()).objectId(null).build()); markAllFieldsDirty(); return ParseInstallation.super.saveAsync(sessionToken, toAwait); } diff --git a/Parse/src/test/java/com/parse/ParseInstallationTest.java b/Parse/src/test/java/com/parse/ParseInstallationTest.java index 82904c3f7..c46f80703 100644 --- a/Parse/src/test/java/com/parse/ParseInstallationTest.java +++ b/Parse/src/test/java/com/parse/ParseInstallationTest.java @@ -106,6 +106,20 @@ public void testImmutableKeys() { } } + @Test (expected = RuntimeException.class) + public void testInstallationObjectIdCannotBeChanged() throws Exception { + boolean hasException = false; + ParseInstallation installation = new ParseInstallation(); + try { + installation.put("objectId", "abc"); + } catch (IllegalArgumentException e) { + assertTrue(e.getMessage().contains("Cannot modify")); + hasException = true; + } + assertTrue(hasException); + installation.setObjectId("abc"); + } + @Test public void testSaveAsync() throws Exception { String sessionToken = "sessionToken";