/*
* Firetweet - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.getlantern.firetweet.util;
import org.getlantern.firetweet.Constants;
import org.getlantern.firetweet.model.ParcelableStatus;
import org.getlantern.firetweet.model.ParcelableUser;
import org.getlantern.firetweet.util.collection.NoDuplicatesArrayList;
import java.util.ArrayList;
import java.util.List;
public class MultiSelectManager implements Constants {
private final NoDuplicatesArrayList<Long> mSelectedStatusIds = new NoDuplicatesArrayList<Long>();
private final NoDuplicatesArrayList<Long> mSelectedUserIds = new NoDuplicatesArrayList<Long>();
private final NoDuplicatesArrayList<Callback> mCallbacks = new NoDuplicatesArrayList<Callback>();
private final ItemsList mSelectedItems = new ItemsList(this);
private long mAccountId;
public void clearSelectedItems() {
mSelectedItems.clear();
}
public long getAccountId() {
if (mAccountId <= 0) return getFirstSelectAccountId(mSelectedItems);
return mAccountId;
}
public int getCount() {
return mSelectedItems.size();
}
public long getFirstSelectAccountId() {
return getFirstSelectAccountId(mSelectedItems);
}
public List<Object> getSelectedItems() {
return mSelectedItems;
}
public boolean isActive() {
return !mSelectedItems.isEmpty();
}
public boolean isSelected(final Object object) {
return mSelectedItems.contains(object);
}
public boolean isStatusSelected(final long status_id) {
return mSelectedStatusIds.contains(status_id);
}
public boolean isUserSelected(final long user_id) {
return mSelectedUserIds.contains(user_id);
}
public void registerCallback(final Callback callback) {
if (callback == null) return;
mCallbacks.add(callback);
}
public boolean selectItem(final Object item) {
return mSelectedItems.add(item);
}
public void setAccountId(final long accountId) {
mAccountId = accountId;
}
public void unregisterCallback(final Callback callback) {
mCallbacks.remove(callback);
}
public boolean unselectItem(final Object item) {
return mSelectedItems.remove(item);
}
private void onItemsCleared() {
for (final Callback callback : mCallbacks) {
callback.onItemsCleared();
}
mAccountId = -1;
}
private void onItemSelected(final Object object) {
for (final Callback callback : mCallbacks) {
callback.onItemSelected(object);
}
}
private void onItemUnselected(final Object object) {
for (final Callback callback : mCallbacks) {
callback.onItemUnselected(object);
}
}
public static long getFirstSelectAccountId(final List<Object> selected_items) {
final Object obj = selected_items.get(0);
if (obj instanceof ParcelableUser)
return ((ParcelableUser) obj).account_id;
else if (obj instanceof ParcelableStatus) return ((ParcelableStatus) obj).account_id;
return -1;
}
public static long[] getSelectedUserIds(final List<Object> selected_items) {
final ArrayList<Long> ids_list = new ArrayList<Long>();
for (final Object item : selected_items) {
if (item instanceof ParcelableUser) {
ids_list.add(((ParcelableUser) item).id);
} else if (item instanceof ParcelableStatus) {
ids_list.add(((ParcelableStatus) item).user_id);
}
}
return FiretweetArrayUtils.fromList(ids_list);
}
public static interface Callback {
public void onItemsCleared();
public void onItemSelected(Object item);
public void onItemUnselected(Object item);
}
@SuppressWarnings("serial")
static class ItemsList extends NoDuplicatesArrayList<Object> {
private final MultiSelectManager manager;
ItemsList(final MultiSelectManager manager) {
this.manager = manager;
}
@Override
public boolean add(final Object object) {
if (object instanceof ParcelableStatus) {
manager.mSelectedStatusIds.add(((ParcelableStatus) object).id);
} else if (object instanceof ParcelableUser) {
manager.mSelectedUserIds.add(((ParcelableUser) object).id);
} else
return false;
final boolean ret = super.add(object);
manager.onItemSelected(object);
return ret;
}
@Override
public void clear() {
super.clear();
manager.mSelectedStatusIds.clear();
manager.mSelectedUserIds.clear();
manager.onItemsCleared();
}
@Override
public boolean remove(final Object object) {
final boolean ret = super.remove(object);
if (object instanceof ParcelableStatus) {
manager.mSelectedStatusIds.remove(((ParcelableStatus) object).id);
} else if (object instanceof ParcelableUser) {
manager.mSelectedUserIds.remove(((ParcelableUser) object).id);
}
if (ret) {
if (isEmpty()) {
manager.onItemsCleared();
} else {
manager.onItemUnselected(object);
}
}
return ret;
}
}
}