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