Home | History | Annotate | Download | only in shadows
      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
     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)
     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
     43     public void show() {
     44         Robolectric.getShadowApplication().getShownToasts().add(toast);
     45     }
     46 
     47     @Implementation
     48     public void setView(View view) {
     49         this.view = view;
     50     }
     51 
     52     @Implementation
     53     public View getView() {
     54         return view;
     55     }
     56 
     57     @Implementation
     58     public void setGravity(int gravity, int xOffset, int yOffset) {
     59         this.gravity = gravity;
     60     }
     61 
     62     @Implementation
     63     public int getGravity() {
     64         return gravity;
     65     }
     66 
     67     @Implementation
     68     public void setDuration(int duration) {
     69         this.duration = duration;
     70     }
     71 
     72     @Implementation
     73     public int getDuration() {
     74         return duration;
     75     }
     76 
     77     /**
     78      * Non-Android accessor that discards the recorded {@code Toast}s
     79      */
     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      */
     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      */
    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      */
    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      */
    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      */
    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