From 707b933d43f9fe685289656f8f2ce63e5e33c220 Mon Sep 17 00:00:00 2001 From: Kay-Uwe Janssen Date: Tue, 7 Mar 2017 19:42:49 +0100 Subject: [PATCH 1/2] Move super call onRestoreInstanceState below state restoration --- .../holder/EActivityHolder.java | 6 ++++++ .../holder/EFragmentHolder.java | 5 +++++ .../holder/EViewHolder.java | 5 +++++ .../holder/HasInstanceState.java | 3 +++ .../holder/InstanceStateDelegate.java | 13 +++++++++++- .../holder/ViewInstanceStateDelegate.java | 20 +++++++++++++++---- .../core/handler/InstanceStateHandler.java | 2 +- 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java index 7547db3f3c..cde89b7ba0 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -468,6 +469,11 @@ public JMethod getRestoreStateMethod() { return instanceStateDelegate.getRestoreStateMethod(); } + @Override + public JBlock getRestoreStateMethodBody() { + return instanceStateDelegate.getRestoreStateMethodBody(); + } + @Override public JVar getRestoreStateBundleParam() { return instanceStateDelegate.getRestoreStateBundleParam(); diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java index 08cc101762..fe44fbe27a 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java @@ -401,6 +401,11 @@ public JMethod getRestoreStateMethod() { return instanceStateDelegate.getRestoreStateMethod(); } + @Override + public JBlock getRestoreStateMethodBody() { + return instanceStateDelegate.getRestoreStateMethodBody(); + } + @Override public JVar getRestoreStateBundleParam() { return instanceStateDelegate.getRestoreStateBundleParam(); diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EViewHolder.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EViewHolder.java index 0d84dc50f6..e9add2060b 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EViewHolder.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EViewHolder.java @@ -266,6 +266,11 @@ public JMethod getRestoreStateMethod() { return instanceStateDelegate.getRestoreStateMethod(); } + @Override + public JBlock getRestoreStateMethodBody() { + return instanceStateDelegate.getRestoreStateMethodBody(); + } + @Override public JVar getRestoreStateBundleParam() { return instanceStateDelegate.getRestoreStateBundleParam(); diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/HasInstanceState.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/HasInstanceState.java index 344d36d95f..5a20bf7034 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/HasInstanceState.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/HasInstanceState.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -26,5 +27,7 @@ public interface HasInstanceState extends GeneratedClassHolder { JMethod getRestoreStateMethod(); + JBlock getRestoreStateMethodBody(); + JVar getRestoreStateBundleParam(); } diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/InstanceStateDelegate.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/InstanceStateDelegate.java index 7aeb338741..5cbf8d0e8c 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/InstanceStateDelegate.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/InstanceStateDelegate.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -31,6 +32,7 @@ public class InstanceStateDelegate extends GeneratedClassHolderDelegate Date: Tue, 14 Mar 2017 19:06:29 +0100 Subject: [PATCH 2/2] Add test case to ensure that super.onRestoreInstanceState() is called correctly --- .../test/instancestate/InstanceStateView.java | 42 ++++++++++++++++ .../instancestate/InstanceStateViewTest.java | 50 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/instancestate/InstanceStateView.java create mode 100644 AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/instancestate/InstanceStateViewTest.java diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/instancestate/InstanceStateView.java b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/instancestate/InstanceStateView.java new file mode 100644 index 0000000000..9676496a6c --- /dev/null +++ b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/instancestate/InstanceStateView.java @@ -0,0 +1,42 @@ +/** + * Copyright (C) 2016-2017 the AndroidAnnotations project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.test.instancestate; + +import org.androidannotations.annotations.EView; +import org.androidannotations.annotations.InstanceState; + +import android.content.Context; +import android.os.Parcelable; +import android.view.View; + +@EView +public class InstanceStateView extends View { + + @InstanceState + int instanceField = -1; + + int restoredInRestoreInstanceState = -2; + + public InstanceStateView(Context context) { + super(context); + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + super.onRestoreInstanceState(state); + restoredInRestoreInstanceState = instanceField; + } +} diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/instancestate/InstanceStateViewTest.java b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/instancestate/InstanceStateViewTest.java new file mode 100644 index 0000000000..c4bf726e4c --- /dev/null +++ b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/instancestate/InstanceStateViewTest.java @@ -0,0 +1,50 @@ +/** + * Copyright (C) 2016-2017 the AndroidAnnotations project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.test.instancestate; + +import static org.fest.assertions.api.Assertions.assertThat; + +import org.androidannotations.test.EmptyActivityWithoutLayout_; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; + +import android.content.Context; +import android.os.Bundle; + +@RunWith(RobolectricTestRunner.class) +public class InstanceStateViewTest { + + @Test + public void testInstanceState() { + int restoredValue = 42; + + Bundle bundle = new Bundle(); + bundle.putInt("instanceField", restoredValue); + + Context context = Robolectric.buildActivity(EmptyActivityWithoutLayout_.class).create().get(); + InstanceStateView stateView = InstanceStateView_.build(context); + + assertThat(stateView.instanceField).isEqualTo(-1); + assertThat(stateView.restoredInRestoreInstanceState).isEqualTo(-2); + + stateView.onRestoreInstanceState(bundle); + + assertThat(stateView.instanceField).isEqualTo(restoredValue); + assertThat(stateView.restoredInRestoreInstanceState).isEqualTo(restoredValue); + } +}