package com.abewy.android.apps.klyph.app; import java.util.ArrayList; import java.util.List; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.ListView; import com.abewy.android.apps.klyph.KlyphBundleExtras; import com.abewy.android.apps.klyph.R; import com.abewy.android.apps.klyph.adapter.MultiObjectAdapter; import com.abewy.android.apps.klyph.adapter.SpecialLayout; import com.abewy.android.apps.klyph.core.fql.Friend; import com.abewy.android.apps.klyph.core.graph.GraphObject; import com.abewy.android.apps.klyph.core.util.AttrUtil; import com.abewy.android.apps.klyph.request.AsyncRequest.Query; public class FriendPickerActivity extends KlyphListActivity { private static List<GraphObject> FRIEND_LIST; private ActionMode actionMode; private EditText searchText; private List<GraphObject> friends; private ArrayList<String> initialIds; private boolean selectionConfirmed = false; private boolean singleChoice = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); singleChoice = getIntent().getBooleanExtra(KlyphBundleExtras.SINGLE_CHOICE, false); setTitle(singleChoice ? R.string.friend_picker_single_choice_title : R.string.friend_picker_title); setListAdapter(new MultiObjectAdapter(getListView(), singleChoice ? SpecialLayout.FRIEND_PICKER_SINGLE : SpecialLayout.FRIEND_PICKER)); getListView().setItemsCanFocus(false); getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); searchText = (EditText) findViewById(R.id.search_text); searchText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { filter(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); setRequestType(Query.ALL_FRIENDS); if (getIntent().hasExtra(KlyphBundleExtras.FRIEND_PICKER_IDS)) { ArrayList<String> ids = getIntent().getStringArrayListExtra(KlyphBundleExtras.FRIEND_PICKER_IDS); if (ids != null && ids.size() > 0) { initialIds = ids; } } if (FRIEND_LIST == null) { load(); } else { // reset previously selected objects for (GraphObject graphObject : FRIEND_LIST) { graphObject.setSelected(false); } populate(FRIEND_LIST); } } private void filter(String filterText) { if (filterText.length() == 0) { getAdapter().setData(friends); } else { List<GraphObject> filteredUsers = new ArrayList<GraphObject>(); final String f = filterText.toLowerCase(); for (GraphObject graphObject : friends) { Friend u = (Friend) graphObject; if (u.getName().toLowerCase().contains(f) == true) { filteredUsers.add(u); } } getAdapter().setData(filteredUsers); } refreshCheckedViews(); } @Override protected void populate(List<GraphObject> data) { super.populate(data); setNoMoreData(true); FRIEND_LIST = data; friends = data; boolean friendsSelected = false; if (initialIds != null) { int n = data.size(); for (int i = 0; i < n; i++) { Friend friend = (Friend) data.get(i); for (int j = 0; j < initialIds.size(); j++) { if (friend.getUid().equals(initialIds.get(j))) { friendsSelected = true; friend.setSelected(true); getListView().setItemChecked(i, true); initialIds.remove(j); j--; break; } } } } if (friendsSelected == true) { startActionMode(); refreshCheckedViews(); refreshActionModeTitle(); } searchText.setVisibility(View.VISIBLE); } private void refreshCheckedViews() { int i = 0; for (GraphObject graphObject : getAdapter().getItems()) { getListView().setItemChecked(i, graphObject.isSelected()); i++; } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { Friend friend = (Friend) getAdapter().getItem(position); if (singleChoice) { Intent intent = new Intent(); intent.putExtra(KlyphBundleExtras.USER_ID, friend.getUid()); intent.putExtra(KlyphBundleExtras.USER_NAME, friend.getName()); setResult(RESULT_OK, intent); finish(); } else { startActionMode(); friend.setSelected(!friend.isSelected()); refreshActionModeTitle(); } } private void startActionMode() { if (actionMode == null) { actionMode = startActionMode(new FriendPickerActionMode()); int doneButtonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android"); View doneButton = findViewById(doneButtonId); if (doneButton != null) { doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectionConfirmed = true; actionMode.finish(); } }); } } } private void refreshActionModeTitle() { int n = 0; for (int i = 0; i < friends.size(); i++) { GraphObject friend = (GraphObject) friends.get(i); if (friend.isSelected()) n++; } if (n == 0) { actionMode.setTitle(R.string.no_friend_selected); } else if (n == 1) { actionMode.setTitle(R.string.one_friend_selected); } else { actionMode.setTitle(getString(R.string.several_friends_selected, n)); } } @Override protected int getLayout() { return R.layout.activity_friend_picker; } private List<Friend> getSelectedUsers() { List<Friend> retUsers = new ArrayList<Friend>(); for (int i = 0; i < friends.size(); i++) { Friend friend = (Friend) friends.get(i); if (friend.isSelected()) { retUsers.add(friend); } } return retUsers; } private void deselectAll() { int n = friends.size(); for (int i = 0; i < n; i++) { Friend friend = (Friend) friends.get(i); friend.setSelected(false); } refreshCheckedViews(); refreshActionModeTitle(); } private void goBack() { if (selectionConfirmed == true && friends.size() > 0) { List<Friend> friends = getSelectedUsers(); String[] names = new String[friends.size()]; String[] ids = new String[friends.size()]; for (int i = 0; i < friends.size(); i++) { Friend friend = friends.get(i); names[i] = friend.getName(); ids[i] = friend.getUid(); } Intent intent = new Intent(); intent.putExtra(KlyphBundleExtras.FRIEND_PICKER_NAMES, names); intent.putExtra(KlyphBundleExtras.FRIEND_PICKER_IDS, ids); setResult(RESULT_OK, intent); } else { setResult(RESULT_CANCELED, null); } finish(); } private final class FriendPickerActionMode implements ActionMode.Callback { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Used to put dark icons on light action bar menu.add("Clear").setIcon(AttrUtil.getResourceId(FriendPickerActivity.this, R.attr.eventDeclinedIcon)) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { deselectAll(); return true; } @Override public void onDestroyActionMode(ActionMode mode) { goBack(); } } }