Home | History | Annotate | Download | only in shadows
      1 package org.robolectric.shadows;
      2 
      3 import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
      4 import static android.os.Build.VERSION_CODES.N;
      5 import static org.robolectric.RuntimeEnvironment.getApiLevel;
      6 import static org.robolectric.shadow.api.Shadow.directlyOn;
      7 
      8 import android.content.ClipData;
      9 import android.content.ClipDescription;
     10 import android.content.ClipboardManager;
     11 import android.content.ClipboardManager.OnPrimaryClipChangedListener;
     12 import java.util.Collection;
     13 import java.util.concurrent.CopyOnWriteArrayList;
     14 import org.robolectric.annotation.Implementation;
     15 import org.robolectric.annotation.Implements;
     16 import org.robolectric.annotation.RealObject;
     17 import org.robolectric.util.ReflectionHelpers;
     18 
     19 @SuppressWarnings("UnusedDeclaration")
     20 @Implements(ClipboardManager.class)
     21 public class ShadowClipboardManager {
     22   @RealObject private ClipboardManager realClipboardManager;
     23   private final Collection<OnPrimaryClipChangedListener> listeners = new CopyOnWriteArrayList<OnPrimaryClipChangedListener>();
     24   private ClipData clip;
     25 
     26   @Implementation
     27   public void setPrimaryClip(ClipData clip) {
     28     if (getApiLevel() >= N) {
     29       if (clip != null) {
     30         clip.prepareToLeaveProcess(true);
     31       }
     32     } else if (getApiLevel() >= JELLY_BEAN_MR2) {
     33       if (clip != null) {
     34         ReflectionHelpers.callInstanceMethod(ClipData.class, clip, "prepareToLeaveProcess");
     35       }
     36     }
     37 
     38     this.clip = clip;
     39 
     40     for (OnPrimaryClipChangedListener listener : listeners) {
     41       listener.onPrimaryClipChanged();
     42     }
     43   }
     44 
     45   @Implementation
     46   public ClipData getPrimaryClip() {
     47     return clip;
     48   }
     49 
     50   @Implementation
     51   public ClipDescription getPrimaryClipDescription() {
     52     return clip == null ? null : clip.getDescription();
     53   }
     54 
     55   @Implementation
     56   public boolean hasPrimaryClip() {
     57     return clip != null;
     58   }
     59 
     60   @Implementation
     61   public void addPrimaryClipChangedListener(OnPrimaryClipChangedListener listener) {
     62     listeners.add(listener);
     63   }
     64 
     65   @Implementation
     66   public void removePrimaryClipChangedListener(OnPrimaryClipChangedListener listener) {
     67     listeners.remove(listener);
     68   }
     69 
     70   @Implementation
     71   public void setText(CharSequence text) {
     72     setPrimaryClip(ClipData.newPlainText(null, text));
     73   }
     74 
     75   @Implementation
     76   public boolean hasText() {
     77     CharSequence text = directlyOn(realClipboardManager, ClipboardManager.class).getText();
     78     return text != null && text.length() > 0;
     79   }
     80 }
     81