1 /*******************************************************************************
2  *      Copyright (C) 2011 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 package com.android.mail.ui;
18 
19 import android.content.Context;
20 import android.os.Parcel;
21 import android.os.Parcelable;
22 
23 import com.android.mail.R;
24 import com.android.mail.providers.Folder;
25 
26 /**
27  * A simple holder class that stores the information to undo the application of a folder.
28  */
29 public class ToastBarOperation implements Parcelable,
30         ActionableToastBar.ActionClickedListener {
31     public static final int UNDO = 0;
32     public static final int ERROR = 1;
33     private final int mAction;
34     private final int mCount;
35     private final boolean mBatch;
36     private final int mType;
37     private final Folder mFolder;
38 
39     /**
40      * Create a ToastBarOperation
41      *
42      * @param count Number of conversations this action would be applied to.
43      * @param menuId res id identifying the menu item tapped; used to determine what action was
44      *        performed
45      * @param operationFolder The {@link Folder} upon which the operation was run. This may be
46      *        <code>null</code>, but is required in {@link #getDescription(Context)} for certain
47      *        actions.
48      */
ToastBarOperation(int count, int menuId, int type, boolean batch, final Folder operationFolder)49     public ToastBarOperation(int count, int menuId, int type, boolean batch,
50             final Folder operationFolder) {
51         mCount = count;
52         mAction = menuId;
53         mBatch = batch;
54         mType = type;
55         mFolder = operationFolder;
56     }
57 
getType()58     public int getType() {
59         return mType;
60     }
61 
isBatchUndo()62     public boolean isBatchUndo() {
63         return mBatch;
64     }
65 
ToastBarOperation(final Parcel in, final ClassLoader loader)66     public ToastBarOperation(final Parcel in, final ClassLoader loader) {
67         mCount = in.readInt();
68         mAction = in.readInt();
69         mBatch = in.readInt() != 0;
70         mType = in.readInt();
71         mFolder = in.readParcelable(loader);
72     }
73 
74     @Override
toString()75     public String toString() {
76         final StringBuilder sb = new StringBuilder("{");
77         sb.append(super.toString());
78         sb.append(" mAction=");
79         sb.append(mAction);
80         sb.append(" mCount=");
81         sb.append(mCount);
82         sb.append(" mBatch=");
83         sb.append(mBatch);
84         sb.append(" mType=");
85         sb.append(mType);
86         sb.append(" mFolder=");
87         sb.append(mFolder);
88         sb.append("}");
89         return sb.toString();
90     }
91 
92     @Override
writeToParcel(Parcel dest, int flags)93     public void writeToParcel(Parcel dest, int flags) {
94         dest.writeInt(mCount);
95         dest.writeInt(mAction);
96         dest.writeInt(mBatch ? 1 : 0);
97         dest.writeInt(mType);
98         dest.writeParcelable(mFolder, 0);
99     }
100 
101     public static final ClassLoaderCreator<ToastBarOperation> CREATOR =
102             new ClassLoaderCreator<ToastBarOperation>() {
103         @Override
104         public ToastBarOperation createFromParcel(final Parcel source) {
105             return createFromParcel(source, null);
106         }
107 
108         @Override
109         public ToastBarOperation[] newArray(final int size) {
110             return new ToastBarOperation[size];
111         }
112 
113         @Override
114         public ToastBarOperation createFromParcel(final Parcel source, final ClassLoader loader) {
115             return new ToastBarOperation(source, loader);
116         }
117     };
118 
119     /**
120      * Get a string description of the operation that will be performed
121      * when the user taps the undo bar.
122      */
getDescription(Context context)123     public String getDescription(Context context) {
124         final int resId;
125         if (mAction == R.id.delete) {
126             resId = R.plurals.conversation_deleted;
127         } else if (mAction == R.id.remove_folder) {
128             return context.getString(R.string.folder_removed, mFolder.name);
129         } else if (mAction == R.id.change_folders) {
130             resId = R.plurals.conversation_folder_changed;
131         } else if (mAction == R.id.move_folder) {
132             return context.getString(R.string.conversation_folder_moved, mFolder.name);
133         } else if (mAction == R.id.archive) {
134             resId = R.plurals.conversation_archived;
135         } else if (mAction == R.id.report_spam) {
136             resId = R.plurals.conversation_spammed;
137         } else if (mAction == R.id.mark_not_spam) {
138             resId = R.plurals.conversation_not_spam;
139         } else if (mAction == R.id.mark_not_important) {
140             resId = R.plurals.conversation_not_important;
141         } else if (mAction == R.id.mute) {
142             resId = R.plurals.conversation_muted;
143         } else if (mAction == R.id.remove_star) {
144             resId = R.plurals.conversation_unstarred;
145         } else if (mAction == R.id.report_phishing) {
146             resId = R.plurals.conversation_phished;
147         } else {
148             resId = -1;
149         }
150         final String desc = (resId == -1) ? "" :
151                 String.format(context.getResources().getQuantityString(resId, mCount), mCount);
152         return desc;
153     }
154 
getSingularDescription(Context context, Folder folder)155     public String getSingularDescription(Context context, Folder folder) {
156         if (mAction == R.id.remove_folder) {
157             return context.getString(R.string.folder_removed, folder.name);
158         }
159         final int resId;
160         if (mAction ==  R.id.delete) {
161             resId = R.string.deleted;
162         } else if (mAction == R.id.archive) {
163             resId = R.string.archived;
164         } else {
165             resId = -1;
166         }
167         return (resId == -1) ? "" : context.getString(resId);
168     }
169 
170     @Override
describeContents()171     public int describeContents() {
172         return 0;
173     }
174 
175     /**
176      * Returns true if this object should take precedence
177      * when the {@link ActionableToastBar}'s action button is clicked.
178      * If <code>true</code>, the listener passed in {@link ActionableToastBar#show}
179      * will not be used. The default implementation returns false. Derived
180      * classes should override if this behavior is desired.
181      */
shouldTakeOnActionClickedPrecedence()182     public boolean shouldTakeOnActionClickedPrecedence() {
183         return false;
184     }
185 
186     @Override
onActionClicked(Context context)187     public void onActionClicked(Context context) {
188         // DO NOTHING
189     }
190 
onToastBarTimeout(Context context)191     public void onToastBarTimeout(Context context) {
192         // DO NOTHING
193     }
194 }
195