133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
290008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher
390008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisherimport android.content.Context;
4b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richardimport android.view.View;
5b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richardimport android.widget.TextView;
690008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisherimport android.widget.Toast;
7854ca0a46da43847ab5b2ed9ce4ad8f580ae5a17Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.Robolectric;
822c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
922c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
1022c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
1190008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher
12854ca0a46da43847ab5b2ed9ce4ad8f580ae5a17Christian Williams & Phil Goodwinimport java.util.List;
1390008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher
14a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
15a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams
16ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/**
17ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Shadow of {@code Toast} that tracks {@code Toast} requests. Hear hear! (*clink*)
18ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */
1990008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher@SuppressWarnings({"UnusedDeclaration"})
2090008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher@Implements(Toast.class)
21afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowToast {
22b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    private String text;
23af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki    private int duration;
24266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard    private int gravity;
25b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    private View view;
26b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard
27b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    @RealObject Toast toast;
2890008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher
29de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
30f2eb4647ac5fdd487c8ce9719a0c48e01c63cccbPhil Goodwin & Tyler Schultz    public static Toast makeText(Context context, int resId, int duration) {
31ad3e5856ac3eaa208869f2f528a2609b4b12197bChristian Williams & Ian Fisher        return makeText(context, context.getResources().getString(resId), duration);
32f2eb4647ac5fdd487c8ce9719a0c48e01c63cccbPhil Goodwin & Tyler Schultz    }
33f2eb4647ac5fdd487c8ce9719a0c48e01c63cccbPhil Goodwin & Tyler Schultz
34a11e5662854971ff223b39bae85a4854f0b6bcc5Michael Portuesi    @Implementation(i18nSafe=false)
3590008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher    public static Toast makeText(Context context, CharSequence text, int duration) {
36ad3e5856ac3eaa208869f2f528a2609b4b12197bChristian Williams & Ian Fisher        Toast toast = new Toast(null);
37af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki        toast.setDuration(duration);
38433b46be67768332f764eab6879e0649993d79e3Christian Williams        shadowOf(toast).text = text.toString();
39ad3e5856ac3eaa208869f2f528a2609b4b12197bChristian Williams & Ian Fisher        return toast;
4090008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher    }
4190008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher
42aa6a29345c483758f62f7a2a624d5e31ca790af5Phil Goodwin & Ryan Richard    @Implementation
43aa6a29345c483758f62f7a2a624d5e31ca790af5Phil Goodwin & Ryan Richard    public void show() {
44854ca0a46da43847ab5b2ed9ce4ad8f580ae5a17Christian Williams & Phil Goodwin        Robolectric.getShadowApplication().getShownToasts().add(toast);
45b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    }
46b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard
47b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    @Implementation
48b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    public void setView(View view) {
49b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard        this.view = view;
50b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    }
51b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard
52b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    @Implementation
53b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    public View getView() {
54b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard        return view;
55aa6a29345c483758f62f7a2a624d5e31ca790af5Phil Goodwin & Ryan Richard    }
56aa6a29345c483758f62f7a2a624d5e31ca790af5Phil Goodwin & Ryan Richard
57266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard    @Implementation
58266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard    public void setGravity(int gravity, int xOffset, int yOffset) {
59266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard        this.gravity = gravity;
60266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard    }
61266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard
62266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard    @Implementation
63266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard    public int getGravity() {
64266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard        return gravity;
65266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard    }
66266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard
67af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki    @Implementation
68af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki    public void setDuration(int duration) {
69af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki        this.duration = duration;
70af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki    }
71af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki
72af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki    @Implementation
73af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki    public int getDuration() {
74af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki        return duration;
75af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki    }
76af192a2568d2c463726c92303fc16cb1b3bae8e6Kevin Sawicki
77ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
78ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Non-Android accessor that discards the recorded {@code Toast}s
79ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
8090008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher    public static void reset() {
81854ca0a46da43847ab5b2ed9ce4ad8f580ae5a17Christian Williams & Phil Goodwin        Robolectric.getShadowApplication().getShownToasts().clear();
82ad3e5856ac3eaa208869f2f528a2609b4b12197bChristian Williams & Ian Fisher    }
83ad3e5856ac3eaa208869f2f528a2609b4b12197bChristian Williams & Ian Fisher
84ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
85ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Non-Android accessor that returns the number of {@code Toast} requests that have been made during this test run
86ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * or since {@link #reset()} has been called.
87ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
88ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the number of {@code Toast} requests that have been made during this test run
8940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     *         or since {@link #reset()} has been called.
90ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
91aa6a29345c483758f62f7a2a624d5e31ca790af5Phil Goodwin & Ryan Richard    public static int shownToastCount() {
92854ca0a46da43847ab5b2ed9ce4ad8f580ae5a17Christian Williams & Phil Goodwin        return Robolectric.getShadowApplication().getShownToasts().size();
9390008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher    }
9470721982e6f564ddc32e599e7d6a2241527cb42dChristian Williams & Tyler Schultz
95ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
96ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Non-Android query method that returns whether or not a particular custom {@code Toast} has been shown.
97ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
98ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param message the message to search for
9940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param layoutResourceIdToCheckForMessage
10040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     *                the id of the resource that contains the toast messages
101ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether the {@code Toast} was requested
102ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
103b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    public static boolean showedCustomToast(CharSequence message, int layoutResourceIdToCheckForMessage) {
104854ca0a46da43847ab5b2ed9ce4ad8f580ae5a17Christian Williams & Phil Goodwin        for (Toast toast : Robolectric.getShadowApplication().getShownToasts()) {
105b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard            String text = ((TextView) toast.getView().findViewById(layoutResourceIdToCheckForMessage)).getText().toString();
106b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard            if (text.equals(message.toString())) {
107b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard                return true;
10870721982e6f564ddc32e599e7d6a2241527cb42dChristian Williams & Tyler Schultz            }
10970721982e6f564ddc32e599e7d6a2241527cb42dChristian Williams & Tyler Schultz        }
110b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard        return false;
11170721982e6f564ddc32e599e7d6a2241527cb42dChristian Williams & Tyler Schultz    }
112266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard
113ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
114ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * query method that returns whether or not a particular {@code Toast} has been shown.
115ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
116ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param message the message to search for
117ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether the {@code Toast} was requested
118ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
119b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    public static boolean showedToast(CharSequence message) {
120854ca0a46da43847ab5b2ed9ce4ad8f580ae5a17Christian Williams & Phil Goodwin        for (Toast toast : Robolectric.getShadowApplication().getShownToasts()) {
121433b46be67768332f764eab6879e0649993d79e3Christian Williams            String text = shadowOf(toast).text;
122b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard            if (text != null && text.equals(message.toString())) {
123b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard                return true;
124b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard            }
125266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard        }
126b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard        return false;
127b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    }
128b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard
129ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
130ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Non-Android accessor that returns the text of the most recently shown {@code Toast}
131ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
132ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the text of the most recently shown {@code Toast}
133ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
134b1eb228fe4bc08b877fca59c8b73db3d1fda0057Ryan Richard    public static String getTextOfLatestToast() {
1356eae653574bc6d5083bfa1a861933fc68d021c09Ryan Richard        List<Toast> shownToasts = Robolectric.getShadowApplication().getShownToasts();
1369ac65b29f675ced50bbbf49dee70cd5a9dba7beeMichael Portuesi        return (shownToasts.size() == 0) ? null : shadowOf(shownToasts.get(shownToasts.size() - 1)).text;
137266b07844b029a5fe7aa588950e049572d0dde42Phil Goodwin & Ryan Richard    }
138ce4195de02a069601dc6a02a4485a69b03b60077Joe Moore & Ryan Richard
139ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
140ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Non-Android accessor that returns the most recently shown {@code Toast}
141ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
142ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the most recently shown {@code Toast}
143ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
144ce4195de02a069601dc6a02a4485a69b03b60077Joe Moore & Ryan Richard    public static Toast getLatestToast() {
145854ca0a46da43847ab5b2ed9ce4ad8f580ae5a17Christian Williams & Phil Goodwin        List<Toast> shownToasts = Robolectric.getShadowApplication().getShownToasts();
1469ac65b29f675ced50bbbf49dee70cd5a9dba7beeMichael Portuesi        return (shownToasts.size() == 0) ? null : shownToasts.get(shownToasts.size() - 1);
147ce4195de02a069601dc6a02a4485a69b03b60077Joe Moore & Ryan Richard    }
14890008046fcb6aac20be2df7a0aa07129f6f0d62bIan Fisher}
149