/*******************************************************************************
* Copyright (C) 2011 Google Inc.
* Licensed to The Android Open Source Project.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package com.android.mail.ui;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.mail.R;
import com.android.mail.providers.Folder;
/**
* A simple holder class that stores the information to undo the application of a folder.
*/
public class ToastBarOperation implements Parcelable,
ActionableToastBar.ActionClickedListener {
public static final int UNDO = 0;
public static final int ERROR = 1;
private final int mAction;
private final int mCount;
private final boolean mBatch;
private final int mType;
private final Folder mFolder;
/**
* Create a ToastBarOperation
*
* @param count Number of conversations this action would be applied to.
* @param menuId res id identifying the menu item tapped; used to determine what action was
* performed
* @param operationFolder The {@link Folder} upon which the operation was run. This may be
* null
, but is required in {@link #getDescription(Context)} for certain
* actions.
*/
public ToastBarOperation(int count, int menuId, int type, boolean batch,
final Folder operationFolder) {
mCount = count;
mAction = menuId;
mBatch = batch;
mType = type;
mFolder = operationFolder;
}
public int getType() {
return mType;
}
public boolean isBatchUndo() {
return mBatch;
}
public ToastBarOperation(final Parcel in, final ClassLoader loader) {
mCount = in.readInt();
mAction = in.readInt();
mBatch = in.readInt() != 0;
mType = in.readInt();
mFolder = in.readParcelable(loader);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append(super.toString());
sb.append(" mAction=");
sb.append(mAction);
sb.append(" mCount=");
sb.append(mCount);
sb.append(" mBatch=");
sb.append(mBatch);
sb.append(" mType=");
sb.append(mType);
sb.append(" mFolder=");
sb.append(mFolder);
sb.append("}");
return sb.toString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mCount);
dest.writeInt(mAction);
dest.writeInt(mBatch ? 1 : 0);
dest.writeInt(mType);
dest.writeParcelable(mFolder, 0);
}
public static final ClassLoaderCreator CREATOR =
new ClassLoaderCreator() {
@Override
public ToastBarOperation createFromParcel(final Parcel source) {
return createFromParcel(source, null);
}
@Override
public ToastBarOperation[] newArray(final int size) {
return new ToastBarOperation[size];
}
@Override
public ToastBarOperation createFromParcel(final Parcel source, final ClassLoader loader) {
return new ToastBarOperation(source, loader);
}
};
/**
* Get a string description of the operation that will be performed
* when the user taps the undo bar.
*/
public String getDescription(Context context) {
final int resId;
if (mAction == R.id.delete) {
resId = R.plurals.conversation_deleted;
} else if (mAction == R.id.remove_folder) {
return context.getString(R.string.folder_removed, mFolder.name);
} else if (mAction == R.id.change_folders) {
resId = R.plurals.conversation_folder_changed;
} else if (mAction == R.id.move_folder) {
return context.getString(R.string.conversation_folder_moved, mFolder.name);
} else if (mAction == R.id.archive) {
resId = R.plurals.conversation_archived;
} else if (mAction == R.id.report_spam) {
resId = R.plurals.conversation_spammed;
} else if (mAction == R.id.mark_not_spam) {
resId = R.plurals.conversation_not_spam;
} else if (mAction == R.id.mark_not_important) {
resId = R.plurals.conversation_not_important;
} else if (mAction == R.id.mute) {
resId = R.plurals.conversation_muted;
} else if (mAction == R.id.remove_star) {
resId = R.plurals.conversation_unstarred;
} else if (mAction == R.id.report_phishing) {
resId = R.plurals.conversation_phished;
} else {
resId = -1;
}
final String desc = (resId == -1) ? "" :
String.format(context.getResources().getQuantityString(resId, mCount), mCount);
return desc;
}
public String getSingularDescription(Context context, Folder folder) {
if (mAction == R.id.remove_folder) {
return context.getString(R.string.folder_removed, folder.name);
}
final int resId;
if (mAction == R.id.delete) {
resId = R.string.deleted;
} else if (mAction == R.id.archive) {
resId = R.string.archived;
} else {
resId = -1;
}
return (resId == -1) ? "" : context.getString(resId);
}
@Override
public int describeContents() {
return 0;
}
/**
* Returns true if this object should take precedence
* when the {@link ActionableToastBar}'s action button is clicked.
* If true
, the listener passed in {@link ActionableToastBar#show}
* will not be used. The default implementation returns false. Derived
* classes should override if this behavior is desired.
*/
public boolean shouldTakeOnActionClickedPrecedence() {
return false;
}
@Override
public void onActionClicked(Context context) {
// DO NOTHING
}
public void onToastBarTimeout(Context context) {
// DO NOTHING
}
}