package proton.inject.state; import java.util.ArrayList; import proton.inject.DefaultModule; import proton.inject.Injector; import proton.inject.MockContext; import proton.inject.Proton; import proton.inject.observer.ObserverManager; import proton.inject.observer.event.OnCreateEvent; import proton.inject.observer.event.OnDestroyEvent; import proton.inject.observer.event.OnSaveInstanceStateEvent; import android.app.Application; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.test.AndroidTestCase; import android.test.mock.MockApplication; public class StateRecoveryTest extends AndroidTestCase { private Application mMockApplication; private Injector mInjector; private ObserverManager mObserverManager; @SuppressWarnings("unused") private StateEventObserver mStateEventObserver; @Override protected void setUp() throws Exception { super.setUp(); mMockApplication = new MockApplication(); Proton.initialize(mMockApplication, new DefaultModule() { @Override protected void configure() { super.configure(); bind(Aaa.class); } }); mInjector = Proton.getInjector(new MockContext(mMockApplication)); mObserverManager = mInjector.getInstance(ObserverManager.class); mStateEventObserver = mInjector.getInstance(StateEventObserver.class); } @Override protected void tearDown() throws Exception { Proton.destroy(); super.tearDown(); } public void testRecovery() { mObserverManager.fire(new OnCreateEvent(null)); Aaa a1 = mInjector.getInstance(Aaa.class); a1.intState = 1; a1.integerState = Integer.valueOf(1); a1.intArrayState[0] = 1; ArrayList<Integer> integerList = new ArrayList<Integer>(); integerList.add(1); a1.integerListState = integerList; a1.stringState = "a"; a1.stringArrayState = new String[] { "aa" }; ParcelableClass parcelable = new ParcelableClass("a"); a1.parcelableState = parcelable; ParcelableClass[] parcelableArray = new ParcelableClass[1]; parcelableArray[0] = new ParcelableClass("a"); a1.parcelableArrayState = parcelableArray; Bundle outState = new Bundle(); mObserverManager.fire(new OnSaveInstanceStateEvent(outState)); mObserverManager.fire(new OnDestroyEvent()); Injector injector = Proton.getInjector(new MockContext(mMockApplication)); injector.getInstance(StateEventObserver.class); injector.getInstance(ObserverManager.class).fire(new OnCreateEvent(outState)); Aaa a2 = injector.getInstance(Aaa.class); assertNotSame(a1, a2); assertEquals(1, a2.intState); assertEquals(Integer.valueOf(1), a2.integerState); assertEquals(1, a2.intArrayState[0]); assertEquals("a", a2.stringState); assertEquals("aa", a2.stringArrayState[0]); assertEquals(integerList, a2.integerListState); assertEquals("a", a2.parcelableState.string); assertEquals("a", a2.parcelableArrayState[0].string); injector.getInstance(ObserverManager.class).fire(new OnDestroyEvent()); } public static class Aaa { @RetainState private int intState; @RetainState private int[] intArrayState = new int[1]; @RetainState private Integer integerState; @RetainState private ArrayList<Integer> integerListState; @RetainState private String stringState; @RetainState private String[] stringArrayState; @RetainState private ParcelableClass parcelableState; @RetainState private ParcelableClass[] parcelableArrayState; } public static class ParcelableClass implements Parcelable { private String string; public ParcelableClass(String string) { this.string = string; } public ParcelableClass(Parcel src) { string = src.readString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(string); } public static final Parcelable.Creator<ParcelableClass> CREATOR = new Parcelable.Creator<ParcelableClass>() { @Override public ParcelableClass createFromParcel(Parcel source) { return new ParcelableClass(source); } @Override public ParcelableClass[] newArray(int size) { return new ParcelableClass[size]; } }; } }