1 package com.xtremelabs.robolectric.shadows;
2 
3 import android.content.Context;
4 import android.view.View;
5 import android.widget.TextView;
6 import android.widget.Toast;
7 import com.xtremelabs.robolectric.Robolectric;
8 import com.xtremelabs.robolectric.internal.Implementation;
9 import com.xtremelabs.robolectric.internal.Implements;
10 import com.xtremelabs.robolectric.internal.RealObject;
11 
12 import java.util.List;
13 
14 import static com.xtremelabs.robolectric.Robolectric.shadowOf;
15 
16 /**
17  * Shadow of {@code Toast} that tracks {@code Toast} requests. Hear hear! (*clink*)
18  */
19 @SuppressWarnings({"UnusedDeclaration"})
20 @Implements(Toast.class)
21 public class ShadowToast {
22     private String text;
23     private int duration;
24     private int gravity;
25     private View view;
26 
27     @RealObject Toast toast;
28 
29     @Implementation
makeText(Context context, int resId, int duration)30     public static Toast makeText(Context context, int resId, int duration) {
31         return makeText(context, context.getResources().getString(resId), duration);
32     }
33 
34     @Implementation(i18nSafe=false)
makeText(Context context, CharSequence text, int duration)35     public static Toast makeText(Context context, CharSequence text, int duration) {
36         Toast toast = new Toast(null);
37         toast.setDuration(duration);
38         shadowOf(toast).text = text.toString();
39         return toast;
40     }
41 
42     @Implementation
show()43     public void show() {
44         Robolectric.getShadowApplication().getShownToasts().add(toast);
45     }
46 
47     @Implementation
setView(View view)48     public void setView(View view) {
49         this.view = view;
50     }
51 
52     @Implementation
getView()53     public View getView() {
54         return view;
55     }
56 
57     @Implementation
setGravity(int gravity, int xOffset, int yOffset)58     public void setGravity(int gravity, int xOffset, int yOffset) {
59         this.gravity = gravity;
60     }
61 
62     @Implementation
getGravity()63     public int getGravity() {
64         return gravity;
65     }
66 
67     @Implementation
setDuration(int duration)68     public void setDuration(int duration) {
69         this.duration = duration;
70     }
71 
72     @Implementation
getDuration()73     public int getDuration() {
74         return duration;
75     }
76 
77     /**
78      * Non-Android accessor that discards the recorded {@code Toast}s
79      */
reset()80     public static void reset() {
81         Robolectric.getShadowApplication().getShownToasts().clear();
82     }
83 
84     /**
85      * Non-Android accessor that returns the number of {@code Toast} requests that have been made during this test run
86      * or since {@link #reset()} has been called.
87      *
88      * @return the number of {@code Toast} requests that have been made during this test run
89      *         or since {@link #reset()} has been called.
90      */
shownToastCount()91     public static int shownToastCount() {
92         return Robolectric.getShadowApplication().getShownToasts().size();
93     }
94 
95     /**
96      * Non-Android query method that returns whether or not a particular custom {@code Toast} has been shown.
97      *
98      * @param message the message to search for
99      * @param layoutResourceIdToCheckForMessage
100      *                the id of the resource that contains the toast messages
101      * @return whether the {@code Toast} was requested
102      */
showedCustomToast(CharSequence message, int layoutResourceIdToCheckForMessage)103     public static boolean showedCustomToast(CharSequence message, int layoutResourceIdToCheckForMessage) {
104         for (Toast toast : Robolectric.getShadowApplication().getShownToasts()) {
105             String text = ((TextView) toast.getView().findViewById(layoutResourceIdToCheckForMessage)).getText().toString();
106             if (text.equals(message.toString())) {
107                 return true;
108             }
109         }
110         return false;
111     }
112 
113     /**
114      * query method that returns whether or not a particular {@code Toast} has been shown.
115      *
116      * @param message the message to search for
117      * @return whether the {@code Toast} was requested
118      */
showedToast(CharSequence message)119     public static boolean showedToast(CharSequence message) {
120         for (Toast toast : Robolectric.getShadowApplication().getShownToasts()) {
121             String text = shadowOf(toast).text;
122             if (text != null && text.equals(message.toString())) {
123                 return true;
124             }
125         }
126         return false;
127     }
128 
129     /**
130      * Non-Android accessor that returns the text of the most recently shown {@code Toast}
131      *
132      * @return the text of the most recently shown {@code Toast}
133      */
getTextOfLatestToast()134     public static String getTextOfLatestToast() {
135         List<Toast> shownToasts = Robolectric.getShadowApplication().getShownToasts();
136         return (shownToasts.size() == 0) ? null : shadowOf(shownToasts.get(shownToasts.size() - 1)).text;
137     }
138 
139     /**
140      * Non-Android accessor that returns the most recently shown {@code Toast}
141      *
142      * @return the most recently shown {@code Toast}
143      */
getLatestToast()144     public static Toast getLatestToast() {
145         List<Toast> shownToasts = Robolectric.getShadowApplication().getShownToasts();
146         return (shownToasts.size() == 0) ? null : shownToasts.get(shownToasts.size() - 1);
147     }
148 }
149