1 /*******************************************************************************
2  *      Copyright (C) 2012 Google Inc.
3  *      Licensed to The Android Open Source Project.
4  *
5  *      Licensed under the Apache License, Version 2.0 (the "License");
6  *      you may not use this file except in compliance with the License.
7  *      You may obtain a copy of the License at
8  *
9  *           http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *      Unless required by applicable law or agreed to in writing, software
12  *      distributed under the License is distributed on an "AS IS" BASIS,
13  *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *      See the License for the specific language governing permissions and
15  *      limitations under the License.
16  *******************************************************************************/
17 
18 package com.android.mail.ui;
19 
20 import com.android.mail.providers.Folder;
21 import com.android.mail.utils.LogTag;
22 import com.android.mail.utils.LogUtils;
23 
24 import com.google.common.collect.Lists;
25 import com.google.common.collect.Maps;
26 
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Set;
30 
31 /**
32  * Object that contains a list of folder operations (application/removals of folders)
33  *
34  */
35 // This was earlier called FolderOperations
36 public class FolderOperations {
37     /**
38      * Map of the Folders that that either need to be applied or removed
39      * The key is the canonical name of the Folder, and the value is a boolean,
40      * when true, the Folder should be added, and when false, the Folder
41      * should be removed
42      */
43     private final Map<String, Operation> mOperations;
44 
45     private static final String LOG_TAG = LogTag.getLogTag();
46 
FolderOperations()47     public FolderOperations() {
48         mOperations = Maps.newHashMap();
49     }
50 
FolderOperations(Folder folder, boolean add)51     public FolderOperations(Folder folder, boolean add) {
52         this();
53         if (folder != null) {
54             add(folder, add);
55         } else {
56             LogUtils.e(LOG_TAG, "FolderOperation created with null Folder object");
57         }
58     }
59 
60     /**
61      * Adds an operation to the list of folder operations to be applied. The last
62      * operation for a folder will be retained in the list of operations.
63      * @param folder Folder to be applied
64      * @param add True if the folder should be applied, or false if the folder should be removed
65      */
add(Folder folder, boolean add)66     public void add(Folder folder, boolean add) {
67         Operation operation = new Operation(folder, add);
68 
69         mOperations.put(folder.name, operation);
70     }
71 
72     /**
73      * Returns true if there is an operation for the specified folder
74      * @param folder Folder
75      * @return Returns true if there is a add or remove operation for
76      * the specified folder
77      */
hasOperation(Folder folder)78     public boolean hasOperation(Folder folder) {
79         return hasOperation(folder.name);
80     }
81 
82     /**
83      * Returns true if there is an operation for the specified folder
84      * @param canonicalName Canonical name of the folder
85      * @return Returns true if there is a add or remove operation for
86      * the specified folder
87      */
hasOperation(String canonicalName)88     public boolean hasOperation(String canonicalName) {
89         return mOperations.containsKey(canonicalName);
90     }
91 
92     /**
93      * Returns true if the specified folder will be applied
94      * @param folder Folder
95      * @return Returns true if there is an operation that will apply the folder
96      */
hasApplyOperation(Folder folder)97     public boolean hasApplyOperation(Folder folder) {
98         return hasApplyOperation(folder.name);
99     }
100 
101     /**
102      * Returns true if the specified folder will be applied
103      * @param canonicalName Canonical name of the folder
104      * @return Returns true if there is an operation that will apply the folder
105      */
hasApplyOperation(String canonicalName)106     public boolean hasApplyOperation(String canonicalName) {
107         if (hasOperation(canonicalName)) {
108             Operation operation = mOperations.get(canonicalName);
109             return operation.mAdd;
110         }
111         return false;
112     }
113 
114     /**
115      * Returns true if the specified folder will be removed
116      * @param folder folder
117      * @return Returns true if there is an operation that will remove the folder
118      */
hasRemoveOperation(Folder folder)119     public boolean hasRemoveOperation(Folder folder) {
120         return hasRemoveOperation(folder.name);
121     }
122 
123     /**
124      * Returns true if the specified folder will be removed
125      * @param canonicalName Canonical name of the folder
126      * @return Returns true if there is an operation that will remove the folder
127      */
hasRemoveOperation(String canonicalName)128     public boolean hasRemoveOperation(String canonicalName) {
129         if (hasOperation(canonicalName)) {
130             Operation operation = mOperations.get(canonicalName);
131             return !operation.mAdd;
132         }
133         return false;
134     }
135 
clear()136     public void clear() {
137         mOperations.clear();
138     }
139 
140     /**
141      * Return the number of folder operations
142      */
count()143     public int count() {
144         return mOperations.size();
145     }
146 
147     /**
148      * Returns a FolderOperations object that will revert the operations described in
149      * this FolderOperations instance
150      * @return FolderOperations object that will revert
151      */
undoOperation()152     public FolderOperations undoOperation() {
153         FolderOperations undoOperations = new FolderOperations();
154         Set<Map.Entry<String, Operation>> operationSet = mOperations.entrySet();
155         for (Map.Entry<String, Operation> operationItem : operationSet) {
156             Operation operationToUndo = operationItem.getValue();
157             undoOperations.add(operationToUndo.mFolder, !operationToUndo.mAdd);
158         }
159         return undoOperations;
160     }
161 
162     /**
163      * Returns an array of the folder operations
164      * @return Array of the folder operations to perform
165      */
getOperationList()166     public List<Operation> getOperationList() {
167         List<Operation> results = Lists.newArrayList();
168         Set<Map.Entry<String, Operation>> operationSet = mOperations.entrySet();
169         for (Map.Entry<String, Operation> operationItem : operationSet) {
170             results.add(operationItem.getValue());
171         }
172         return results;
173     }
174 
175     /**
176      * Serialize the FolderOperations
177      * Not implemented!!
178      * TODO(viki): Copy over from Gmail Labels#serialize(FolderOperations)
179      * @return Serialized representation of the folder operations
180      */
serialize(FolderOperations operations)181     public static String serialize(FolderOperations operations) {
182         return "";
183     }
184 
185     /**
186      * Deserialize a encoded string and instantiates a FolderOperations object
187      * Not implemented!!
188      * TODO(viki): Copy over from Gmail Labels#deSerialize(String)
189      * @param encodedFolderOperations Encode FolderOperations string
190      * @return FolderOperations object
191      */
deserialize(String encodedFolderOperations)192     public static FolderOperations deserialize(String encodedFolderOperations) {
193         return null;
194     }
195 
196     /**
197      * An operation that can be performed on the folder.
198      *
199      */
200     private class Operation {
201         /**
202          * True if the action is to include in the folder, false if the action is to remove it
203          * from the folder.
204          */
205         public final boolean mAdd;
206 
207         /**
208          * The  name of the folder for which the operation is performed.
209          */
210         public final Folder mFolder;
211 
212         /**
213          * Create a new operation, which is to add the message to the given folder
214          * @param folder Name of the folder.
215          * @param add true if message has to be added to the folder. False if it has to be removed
216          * from the existing folder.
217          */
Operation(Folder folder, boolean add)218         private Operation(Folder folder, boolean add) {
219             mFolder = folder;
220             mAdd = add;
221         }
222     }
223 
224 }
225