package com.dwdesign.tweetings.activity;
import static com.dwdesign.tweetings.util.Utils.getAccountScreenNames;
import java.util.ArrayList;
import java.util.Arrays;
import com.dwdesign.actionbarcompat.ActionMode;
import com.dwdesign.tweetings.R;
import com.dwdesign.tweetings.app.TweetingsApplication;
import com.dwdesign.tweetings.model.ParcelableStatus;
import com.dwdesign.tweetings.model.ParcelableUser;
import com.dwdesign.tweetings.provider.TweetStore.Filters;
import com.dwdesign.tweetings.util.ArrayUtils;
import com.dwdesign.tweetings.util.ListUtils;
import com.dwdesign.tweetings.util.NoDuplicatesLinkedList;
import com.dwdesign.tweetings.util.ServiceInterface;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import com.twitter.Extractor;
@SuppressLint("Registered")
public class MultiSelectActivity extends DualPaneActivity implements ActionMode.Callback {
private TweetingsApplication mApplication;
private ServiceInterface mService;
private ActionMode mActionMode;
private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
final String action = intent.getAction();
if (BROADCAST_MULTI_SELECT_STATE_CHANGED.equals(action)) {
updateMultiSelectState();
} else if (BROADCAST_MULTI_SELECT_ITEM_CHANGED.equals(action)) {
updateMultiSelectCount();
}
}
};
@Override
public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) {
final NoDuplicatesLinkedList<Object> selected_items = mApplication.getSelectedItems();
final int count = selected_items.size();
if (count < 1) return false;
switch (item.getItemId()) {
case MENU_REPLY: {
final Extractor extractor = new Extractor();
final Intent intent = new Intent(INTENT_ACTION_COMPOSE);
final Bundle bundle = new Bundle();
final String[] account_names = getAccountScreenNames(this);
final NoDuplicatesLinkedList<String> all_mentions = new NoDuplicatesLinkedList<String>();
for (final Object object : selected_items) {
if (object instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) object;
all_mentions.add(status.screen_name);
all_mentions.addAll(extractor.extractMentionedScreennames(status.text_plain));
} else if (object instanceof ParcelableUser) {
final ParcelableUser user = (ParcelableUser) object;
all_mentions.add(user.screen_name);
}
}
all_mentions.removeAll(Arrays.asList(account_names));
final Object first_obj = selected_items.getFirst();
if (first_obj instanceof ParcelableStatus) {
final ParcelableStatus first_status = (ParcelableStatus) first_obj;
bundle.putLong(INTENT_KEY_ACCOUNT_ID, first_status.account_id);
bundle.putLong(INTENT_KEY_IN_REPLY_TO_ID, first_status.status_id);
bundle.putString(INTENT_KEY_IN_REPLY_TO_SCREEN_NAME, first_status.screen_name);
bundle.putString(INTENT_KEY_IN_REPLY_TO_NAME, first_status.name);
} else if (first_obj instanceof ParcelableUser) {
final ParcelableUser first_user = (ParcelableUser) first_obj;
bundle.putLong(INTENT_KEY_ACCOUNT_ID, first_user.account_id);
bundle.putString(INTENT_KEY_IN_REPLY_TO_SCREEN_NAME, first_user.screen_name);
bundle.putString(INTENT_KEY_IN_REPLY_TO_NAME, first_user.name);
}
bundle.putStringArray(INTENT_KEY_MENTIONS, all_mentions.toArray(new String[all_mentions.size()]));
intent.putExtras(bundle);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
mode.finish();
break;
}
case MENU_MUTE_USER: {
final ContentResolver resolver = getContentResolver();
final Uri uri = Filters.Users.CONTENT_URI;
final SharedPreferences.Editor editor = getSharedPreferences(SHARED_PREFERENCES_NAME,
Context.MODE_PRIVATE).edit();
final ArrayList<ContentValues> values_list = new ArrayList<ContentValues>();
final NoDuplicatesLinkedList<String> names_list = new NoDuplicatesLinkedList<String>();
for (final Object object : selected_items) {
if (object instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) object;
names_list.add(status.screen_name);
} else if (object instanceof ParcelableUser) {
final ParcelableUser user = (ParcelableUser) object;
names_list.add(user.screen_name);
} else {
continue;
}
}
resolver.delete(uri, Filters.Users.TEXT + " IN (" + ListUtils.toStringForSQL(names_list) + ")", null);
for (final String screen_name : names_list) {
final ContentValues values = new ContentValues();
values.put(Filters.TEXT, screen_name);
values_list.add(values);
}
resolver.bulkInsert(uri, values_list.toArray(new ContentValues[values_list.size()]));
editor.putBoolean(PREFERENCE_KEY_ENABLE_FILTER, true).commit();
Toast.makeText(this, R.string.users_muted, Toast.LENGTH_SHORT).show();
mode.finish();
break;
}
case MENU_BLOCK: {
final long account_id = getFirstSelectAccountId(selected_items);
final long[] user_ids = getSelectedUserIds(selected_items);
if (account_id > 0 && user_ids != null) {
mService.createMultiBlock(account_id, user_ids);
}
mode.finish();
break;
}
case MENU_REPORT_SPAM: {
final long account_id = getFirstSelectAccountId(selected_items);
final long[] user_ids = getSelectedUserIds(selected_items);
if (account_id > 0 && user_ids != null) {
mService.reportMultiSpam(account_id, user_ids);
}
mode.finish();
break;
}
}
return true;
}
/** Called when the activity is first created. */
@Override
public void onCreate(final Bundle savedInstanceState) {
mApplication = getTweetingsApplication();
mService = mApplication.getServiceInterface();
super.onCreate(savedInstanceState);
}
@Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
new MenuInflater(this).inflate(R.menu.action_multi_select, menu);
return true;
}
@Override
public void onDestroyActionMode(final ActionMode mode) {
mApplication.stopMultiSelect();
mActionMode = null;
}
@Override
public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) {
return true;
}
@Override
public void onStart() {
super.onStart();
final IntentFilter filter = new IntentFilter();
filter.addAction(BROADCAST_MULTI_SELECT_STATE_CHANGED);
filter.addAction(BROADCAST_MULTI_SELECT_ITEM_CHANGED);
registerReceiver(mStateReceiver, filter);
updateMultiSelectState();
updateMultiSelectCount();
}
@Override
public void onStop() {
unregisterReceiver(mStateReceiver);
super.onStop();
}
private void updateMultiSelectCount() {
if (mActionMode != null) {
final int count = mApplication.getSelectedItems().size();
mActionMode.setTitle(getResources().getQuantityString(R.plurals.Nitems_selected, count, count));
}
}
private void updateMultiSelectState() {
if (mApplication.isMultiSelectActive()) {
if (mActionMode == null) {
mActionMode = startActionMode(this);
}
} else {
if (mActionMode != null) {
mActionMode.finish();
mActionMode = null;
}
}
}
private static long getFirstSelectAccountId(final NoDuplicatesLinkedList<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;
}
private static long[] getSelectedUserIds(final NoDuplicatesLinkedList<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).user_id);
} else if (item instanceof ParcelableStatus) {
ids_list.add(((ParcelableStatus) item).user_id);
}
}
return ArrayUtils.fromList(ids_list);
}
}