145f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelpackage com.xtremelabs.robolectric.shadows;
245f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
345f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelimport android.accounts.Account;
445f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelimport android.os.Parcel;
5064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport android.os.Parcelable.Creator;
645f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelimport android.text.TextUtils;
7064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
8fb82eae187c0cdff8efd2d93209e775cd0ed6a39Jon Boekenoogenimport com.xtremelabs.robolectric.Robolectric;
945f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelimport com.xtremelabs.robolectric.internal.Implementation;
1045f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelimport com.xtremelabs.robolectric.internal.Implements;
1145f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelimport com.xtremelabs.robolectric.internal.RealObject;
1245f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
1345f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelimport java.lang.reflect.Field;
1445f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
1545f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel@Implements(Account.class)
1645f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkelpublic class ShadowAccount {
1745f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    @RealObject
1845f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    private Account realObject;
1945f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
2045f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    public void __constructor__(String name, String type) throws Exception {
2145f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        set(name, type);
2245f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    }
2345f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
2445f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    public void __constructor__(Parcel parcel) throws Exception {
2545f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        set(parcel.readString(), parcel.readString());
2645f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    }
2745f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
28064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Override
2945f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    @Implementation
3045f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    public String toString() {
3145f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        return "Account {name=" + realObject.name + ", type=" + realObject.type + "}";
3245f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    }
3345f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
34064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
35064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeToParcel(Parcel dest, int flags) {
36064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        dest.writeString(realObject.name);
37064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        dest.writeString(realObject.type);
38064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
39064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
40064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public static final Creator<Account> CREATOR =
41064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        new Creator<Account>() {
42064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            @Override
43064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            public Account createFromParcel(Parcel source) {
44064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return new Account(source);
45064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            }
46064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
47064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            @Override
48064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            public Account[] newArray(int size) {
49064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return new Account[size];
50064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            }
51064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        };
52064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
5345f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    private void set(String name, String type) throws Exception {
5445f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        if (TextUtils.isEmpty(name) || TextUtils.isEmpty(type)) throw new IllegalArgumentException();
5545f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
5645f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        Field nameF = realObject.getClass().getField("name");
5745f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        nameF.setAccessible(true);
5845f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        nameF.set(realObject, name);
5945f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel
6045f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        Field typeF = realObject.getClass().getField("type");
6145f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        typeF.setAccessible(true);
6245f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel        typeF.set(realObject, type);
6345f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel    }
648239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel
65064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Override
668239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel    @Implementation
678239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel    public boolean equals(Object o) {
688239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel        if (o == this) return true;
698239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel        if (!(o instanceof Account)) return false;
708239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel        final Account other = (Account)o;
718239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel        return realObject.name.equals(other.name) && realObject.type.equals(other.type);
728239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel    }
738239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel
74064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Override
758239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel    @Implementation
768239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel    public int hashCode() {
778239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel        int result = 17;
788239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel        result = 31 * result + realObject.name.hashCode();
798239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel        result = 31 * result + realObject.type.hashCode();
808239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel        return result;
818239cec3cb888ed2c71d4bb9cebf63432a3d06deJan Berkel    }
82fb82eae187c0cdff8efd2d93209e775cd0ed6a39Jon Boekenoogen
83fb82eae187c0cdff8efd2d93209e775cd0ed6a39Jon Boekenoogen    public static void reset() {
84fb82eae187c0cdff8efd2d93209e775cd0ed6a39Jon Boekenoogen        Robolectric.Reflection.setFinalStaticField(Account.class, "CREATOR", CREATOR);
85fb82eae187c0cdff8efd2d93209e775cd0ed6a39Jon Boekenoogen    }
8645f283443d645cb7f321b1a0f3eaf28407b699ccJan Berkel}
87