Home | History | Annotate | Download | only in providers
      1 package com.android.mail.providers;
      2 
      3 import android.os.Parcel;
      4 import android.os.Parcelable;
      5 
      6 import com.google.common.collect.ImmutableList;
      7 
      8 import java.util.Collection;
      9 import java.util.Collections;
     10 import java.util.List;
     11 
     12 /**
     13  * Simple class to encapsulate an immutable list of {@link Folder} objects, and handle serialization
     14  * and de-serialization.
     15  */
     16 public class FolderList implements Parcelable {
     17 
     18     private static final FolderList EMPTY = new FolderList(Collections.<Folder> emptyList());
     19 
     20     public final ImmutableList<Folder> folders;
     21 
     22     // Private to reinforce the copyOf() API, which makes it more clear that creating a FolderList
     23     // has copy overhead.
     24     private FolderList(Collection<Folder> in) {
     25         if (in == null) {
     26             folders = ImmutableList.of();
     27         } else {
     28             folders = ImmutableList.copyOf(in);
     29         }
     30     }
     31 
     32     public FolderList(Parcel in) {
     33         folders = ImmutableList.copyOf(in.createTypedArrayList(Folder.CREATOR));
     34     }
     35 
     36     @Override
     37     public int describeContents() {
     38         return 0;
     39     }
     40 
     41     @Override
     42     public void writeToParcel(Parcel dest, int flags) {
     43         dest.writeTypedList(folders);
     44     }
     45 
     46     public byte[] toBlob() {
     47         final Parcel p = Parcel.obtain();
     48         writeToParcel(p, 0);
     49         final byte[] result = p.marshall();
     50         p.recycle();
     51         return result;
     52     }
     53 
     54     /**
     55      * Directly turns a list of {@link Folder}s into a byte-array. Avoids the
     56      * list-copy overhead of {@link #copyOf(Collection)} + {@link #toBlob()}.
     57      *
     58      * @param in a list of Folders
     59      * @return the marshalled byte-array form of a {@link FolderList}
     60      */
     61     public static byte[] listToBlob(List<Folder> in) {
     62         final Parcel p = Parcel.obtain();
     63         p.writeTypedList(in);
     64         final byte[] result = p.marshall();
     65         p.recycle();
     66         return result;
     67     }
     68 
     69     public static FolderList fromBlob(byte[] blob) {
     70         if (blob == null) {
     71             return EMPTY;
     72         }
     73 
     74         final Parcel p = Parcel.obtain();
     75         p.unmarshall(blob, 0, blob.length);
     76         p.setDataPosition(0);
     77         final FolderList result = CREATOR.createFromParcel(p);
     78         p.recycle();
     79         return result;
     80     }
     81 
     82     public static FolderList copyOf(Collection<Folder> in) {
     83         return new FolderList(in);
     84     }
     85 
     86     @Override
     87     public boolean equals(Object o) {
     88         return folders.equals(o);
     89     }
     90 
     91     @Override
     92     public int hashCode() {
     93         return folders.hashCode();
     94     }
     95 
     96     public static final Creator<FolderList> CREATOR = new Creator<FolderList>() {
     97 
     98         @Override
     99         public FolderList createFromParcel(Parcel source) {
    100             return new FolderList(source);
    101         }
    102 
    103         @Override
    104         public FolderList[] newArray(int size) {
    105             return new FolderList[size];
    106         }
    107     };
    108 
    109 }
    110