From d3a1910b2e3523dfce0e638a78340b6c26bccbb2 Mon Sep 17 00:00:00 2001
From: str4d <str4d@mail.i2p>
Date: Wed, 20 Aug 2014 02:37:27 +0000
Subject: [PATCH] Return null on unknown State in Parcel

---
 .../net/i2p/android/router/service/IRouterState.aidl     | 9 +++++++--
 .../i2p/android/router/service/IRouterStateCallback.aidl | 5 ++++-
 .../main/java/net/i2p/android/router/service/State.java  | 7 ++++++-
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/client/src/main/aidl/net/i2p/android/router/service/IRouterState.aidl b/client/src/main/aidl/net/i2p/android/router/service/IRouterState.aidl
index 92bc3f321..bc20ece79 100644
--- a/client/src/main/aidl/net/i2p/android/router/service/IRouterState.aidl
+++ b/client/src/main/aidl/net/i2p/android/router/service/IRouterState.aidl
@@ -27,8 +27,13 @@ interface IRouterState {
     boolean isStarted();
 
     /**
-    * Get the state of the I2P router
-    **/
+     * Get the state of the I2P router.
+     *
+     * @return null if the State is not known, e.g. a new state has been added
+     * to State.aidl in I2P Android. Client app devs should update their client
+     * library, or their copy of State.aidl, if they are getting null States.
+     * Future State.aidl versions will be backwards-compatible.
+     */
     State getState();
 
 }
diff --git a/client/src/main/aidl/net/i2p/android/router/service/IRouterStateCallback.aidl b/client/src/main/aidl/net/i2p/android/router/service/IRouterStateCallback.aidl
index 5158ce44e..0397618c5 100644
--- a/client/src/main/aidl/net/i2p/android/router/service/IRouterStateCallback.aidl
+++ b/client/src/main/aidl/net/i2p/android/router/service/IRouterStateCallback.aidl
@@ -9,7 +9,10 @@ import net.i2p.android.router.service.State;
  */
 oneway interface IRouterStateCallback {
     /**
-     * Called when the state of the I2P router changes
+     * Called when the state of the I2P router changes.
+     *
+     * @param newState may be null if the State is not known. See
+     * {@link net.i2p.android.router.service.IRouterState#getState()}.
      */
     void stateChanged(in State newState);
 }
diff --git a/client/src/main/java/net/i2p/android/router/service/State.java b/client/src/main/java/net/i2p/android/router/service/State.java
index 469165966..148016e6e 100644
--- a/client/src/main/java/net/i2p/android/router/service/State.java
+++ b/client/src/main/java/net/i2p/android/router/service/State.java
@@ -34,7 +34,12 @@ public enum State implements Parcelable {
     public static final Creator<State> CREATOR = new Creator<State>() {
         @Override
         public State createFromParcel(final Parcel source) {
-            return State.valueOf(source.readString());
+            try {
+                return State.valueOf(source.readString());
+            } catch (IllegalArgumentException e) {
+                // Parcel is from a newer version of State with new states.
+                return null;
+            }
         }
 
         @Override
-- 
GitLab