package eoc.studio.voicecard.facebook.friends; import java.util.ArrayList; import java.util.List; import org.json.JSONException; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.util.Log; import android.view.View; import android.view.WindowManager; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.facebook.Request; import com.facebook.Response; import com.facebook.Session; import com.facebook.model.GraphUser; import eoc.studio.voicecard.BaseActivity; import eoc.studio.voicecard.R; import eoc.studio.voicecard.facebook.FacebookManager; import eoc.studio.voicecard.facebook.enetities.FriendInfo; import eoc.studio.voicecard.facebook.utils.BundleTag; import eoc.studio.voicecard.facebook.utils.JSONTag; import eoc.studio.voicecard.utils.ListUtility; public class SelectFriendActivity extends BaseActivity { private static final String TAG = "SelectFriendActivity"; private FacebookManager facebookManager; private FriendsAdapterView friendsAdapterView; private FriendsAdapterData friendsAdapterData; // private List<FriendInfo> friendList; private int firstVisiblePosition = 0; private int currentListSize = 0; private int lastVisiblePosition = 0; private boolean isSingleOption = false; private String lastSelectedId = ""; // for single option // Views private ListView showFriends; private EditText searchFriend; private TextView displayMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_friend); Log.d(TAG, "onCreate"); findViews(); getBundle(); facebookManager = FacebookManager.getInstance(SelectFriendActivity.this); friendsAdapterData = new FriendsAdapterData(SelectFriendActivity.this); getFriendsfromWeb(); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); // if (friendList != null) { // friendList.clear(); // } if (friendsAdapterView != null) { friendsAdapterView.setPause(true); // friendsAdapterView.clearList(); } if (friendsAdapterData != null) { friendsAdapterData.delete(); friendsAdapterData.close(); } facebookManager.cancelRequest(); facebookManager.dialogHandler.sendEmptyMessage(ListUtility.DISMISS_WAITING_DIALOG); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } private void findViews() { searchFriend = (EditText) findViewById(R.id.act_select_friend_et_search_bar); showFriends = (ListView) findViewById(R.id.act_select_friend_lv); ImageView returnButton = (ImageView) findViewById(R.id.act_select_friend_iv_button_return); ImageView okButton = (ImageView) findViewById(R.id.act_select_friend_iv_button_ok); ImageView searchButton = (ImageView) findViewById(R.id.act_select_friend_iv_search_button); displayMessage = (TextView) findViewById(R.id.act_select_friend_tv_display_message); this.getWindow() .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); showFriends.setOnItemClickListener(new UserListClickListener()); showFriends.setOnScrollListener(listScrollListener); returnButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { confirmAction(); } }); searchButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { searchAction(); } }); } private void getBundle() { Bundle option = this.getIntent().getExtras(); if (option != null) { isSingleOption = option.getBoolean(BundleTag.SELECTED_OPTION); } if (isSingleOption) { displayMessage.setText(getResources().getString(R.string.please_select_one_friend)); } else { displayMessage.setText(getResources().getString(R.string.please_select_friends)); } } private void confirmAction() { String friendId, friendName, firendBirthday, friendImgLink; ArrayList<FriendInfo> selectedFriendList = new ArrayList<FriendInfo>(); Cursor cursor = friendsAdapterData.getSelectedFriend(); if (cursor != null) { Log.d(TAG, "confirmAction() cursor size is " + cursor.getCount()); while (cursor.moveToNext()) { friendId = cursor .getString(cursor.getColumnIndex(FriendsAdapterData.KEY_FRIEND_ID)); friendName = cursor.getString(cursor .getColumnIndex(FriendsAdapterData.KEY_FRIEND_NAME)); firendBirthday = cursor.getString(cursor .getColumnIndex(FriendsAdapterData.KEY_FRIEND_BIRTHDAY)); friendImgLink = cursor.getString(cursor .getColumnIndex(FriendsAdapterData.KEY_FRIEND_IMG_LINK)); Log.d(TAG, "firendBirthday is " + firendBirthday); selectedFriendList.add(new FriendInfo(friendId, friendName, firendBirthday, friendImgLink, null, FriendsAdapterData.UNSELECT)); } } cursor.close(); Intent returnIntent = new Intent(); Bundle returnBundle = new Bundle(); returnBundle.putParcelableArrayList(FriendInfo.GET_FRIEND, selectedFriendList); returnIntent.putExtras(returnBundle); setResult(RESULT_OK, returnIntent); finish(); } private void searchAction() { facebookManager.dialogHandler.sendEmptyMessage(ListUtility.SHOW_WAITING_DIALOG); friendsAdapterView.setInterrupt(true); // friendList.clear(); LoadDbThread loadDbThread = new LoadDbThread(searchFriend.getText().toString()); loadDbThread.start(); } private void getFriendsfromWeb() { if (facebookManager != null) { facebookManager.getFriendList(SelectFriendActivity.this, new RequestGraphUserListCallback()); } } private void getFriendsImgfromDB() { if (friendsAdapterData != null) { Log.d(TAG, "firstVisiblePosition is " + firstVisiblePosition); Log.d(TAG, "lastVisiblePosition is " + lastVisiblePosition); friendsAdapterView.loadImagefromPosition(firstVisiblePosition, lastVisiblePosition); } } private void processUserListReponse(List<GraphUser> users) { if (users != null) { Log.d(TAG, "user list size is " + users.size()); CreateDbThread createDbThread = new CreateDbThread(users); createDbThread.start(); } } private void createDb(List<GraphUser> users) { String friendId = "", friendName = "", firendBirthday = "", friendImgLink = ""; ArrayList<FriendInfo> friendList = new ArrayList<FriendInfo>(); if (friendsAdapterData != null) { friendsAdapterData.open(); currentListSize = users.size(); for (int i = 0; i < users.size(); i++) { try { friendImgLink = users.get(i).getInnerJSONObject() .getJSONObject(JSONTag.PICTURE).getJSONObject(JSONTag.DATA) .getString(JSONTag.URL); } catch (JSONException e) { e.printStackTrace(); } friendId = users.get(i).getId(); friendName = users.get(i).getName(); firendBirthday = users.get(i).getBirthday(); friendsAdapterData.create(friendId, friendName, firendBirthday, friendImgLink, null, FriendsAdapterData.UNSELECT); friendList.add(new FriendInfo(friendId, friendName, firendBirthday, friendImgLink, null, FriendsAdapterData.UNSELECT)); } Log.d(TAG, "Create Db finish() "); } Message msg = new Message(); Bundle bundle = new Bundle(); bundle.putParcelableArrayList(FriendInfo.GET_FRIEND, friendList); msg.what = ListUtility.CREATE_DB_COMPLETE; msg.setData(bundle); uiHandler.sendMessage(msg); } private void updateView(Bundle bundle) { ArrayList<FriendInfo> friendList = bundle.getParcelableArrayList(FriendInfo.GET_FRIEND); if (friendList.size() > 0) { if (isSingleOption) { displayMessage.setText(getResources().getString(R.string.please_select_one_friend)); } else { displayMessage.setText(getResources().getString(R.string.please_select_friends)); } friendsAdapterView = new FriendsAdapterView(SelectFriendActivity.this, friendList, friendsAdapterData, showFriends); showFriends.setVisibility(View.VISIBLE); showFriends.setAdapter(friendsAdapterView); } else { displayMessage.setText(getResources().getString(R.string.user_no_result)); showFriends.setVisibility(View.INVISIBLE); } facebookManager.dialogHandler.sendEmptyMessage(ListUtility.DISMISS_WAITING_DIALOG); } private Handler uiHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case ListUtility.CREATE_DB_COMPLETE: updateView(msg.getData()); break; case ListUtility.SEARCH_COMPLETE: // friendsAdapterView.clearList(); updateView(msg.getData()); break; } } }; private Handler downloadHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case ListUtility.GET_THUMBNAIL: Log.d(TAG, "GET_THUMBNAIL "); friendsAdapterView.setInterrupt(false); getFriendsImgfromDB(); break; } } }; private AbsListView.OnScrollListener listScrollListener = new AbsListView.OnScrollListener() { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { firstVisiblePosition = firstVisibleItem; lastVisiblePosition = firstVisiblePosition + visibleItemCount; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { Log.d(TAG, "scrollState " + scrollState); if (currentListSize != 0) { if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && friendsAdapterView != null) { downloadHandler.sendEmptyMessageDelayed(ListUtility.GET_THUMBNAIL, 1500); } if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL && friendsAdapterView != null) { downloadHandler.removeMessages(ListUtility.GET_THUMBNAIL); } friendsAdapterView.setInterrupt(true); } else { Log.d(TAG, "currentListSize is zero "); } } }; private class CreateDbThread extends Thread { List<GraphUser> users; public CreateDbThread(List<GraphUser> users) { this.users = users; } @Override public void run() { createDb(users); } } private class LoadDbThread extends Thread { String keyword; public LoadDbThread(String keyword) { this.keyword = keyword; } @Override public void run() { List<FriendInfo> friendList = new ArrayList<FriendInfo>(); String friendId = "", friendName = "", firendBirthday = "", friendImgLink = ""; byte[] friendImg = null; int selectState = 0; Cursor cursor = friendsAdapterData.seachResult(keyword); if (cursor != null) { Log.d(TAG, "cursor size is " + cursor.getCount()); while (cursor.moveToNext()) { friendId = cursor.getString(cursor .getColumnIndex(FriendsAdapterData.KEY_FRIEND_ID)); friendName = cursor.getString(cursor .getColumnIndex(FriendsAdapterData.KEY_FRIEND_NAME)); firendBirthday = cursor.getString(cursor .getColumnIndex(FriendsAdapterData.KEY_FRIEND_BIRTHDAY)); friendImgLink = cursor.getString(cursor .getColumnIndex(FriendsAdapterData.KEY_FRIEND_IMG_LINK)); friendImg = cursor.getBlob(cursor .getColumnIndex(FriendsAdapterData.KEY_FRIEND_IMG)); selectState = cursor.getInt(cursor .getColumnIndex(FriendsAdapterData.KEY_SELECT_STATE)); friendList.add(new FriendInfo(friendId, friendName, firendBirthday, friendImgLink, friendImg, selectState)); } } cursor.close(); Message msg = new Message(); Bundle bundle = new Bundle(); bundle.putParcelableArrayList(FriendInfo.GET_FRIEND, (ArrayList<? extends Parcelable>) friendList); msg.what = ListUtility.SEARCH_COMPLETE; msg.setData(bundle); uiHandler.sendMessage(msg); } } private class RequestGraphUserListCallback implements Request.GraphUserListCallback { @Override public void onCompleted(List<GraphUser> users, Response response) { if (response.getError() == null) { processUserListReponse(users); } else { Toast.makeText(SelectFriendActivity.this, getResources().getString(R.string.error_is, response.getError()), Toast.LENGTH_SHORT).show(); facebookManager.dialogHandler.sendEmptyMessage(ListUtility.DISMISS_WAITING_DIALOG); finish(); } } } private class UserListClickListener implements AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (friendsAdapterData != null) { ImageView selectIcon = (ImageView) view .findViewById(R.id.glb_selectfriend_list_item_check_icon); int state = 0; state = friendsAdapterData.getSelectedState(((FriendInfo) friendsAdapterView .getItem(position)).getFriendId()); Log.d(TAG, "state is === " + state); if (state == FriendsAdapterData.UNSELECT) { selectIcon.setImageDrawable(SelectFriendActivity.this.getResources() .getDrawable(R.drawable.icon_checkbox_check)); if (!isSingleOption) { friendsAdapterData.updateSelectedState( ((FriendInfo) friendsAdapterView.getItem(position)).getFriendId(), FriendsAdapterData.SELECT); friendsAdapterView.updateSelectedState(position, FriendsAdapterData.SELECT); } else { // single option friendsAdapterView.changeSelectedState(position, FriendsAdapterData.SELECT); friendsAdapterData.updateSelectedState( ((FriendInfo) friendsAdapterView.getItem(position)).getFriendId(), FriendsAdapterData.SELECT); if (!lastSelectedId.equals("")) { friendsAdapterData.updateSelectedState(lastSelectedId, FriendsAdapterData.UNSELECT); } lastSelectedId = ((FriendInfo) friendsAdapterView.getItem(position)) .getFriendId(); } } else { if (!isSingleOption) { selectIcon.setImageDrawable(SelectFriendActivity.this.getResources() .getDrawable(R.drawable.icon_checkbox)); friendsAdapterData.updateSelectedState( ((FriendInfo) friendsAdapterView.getItem(position)).getFriendId(), FriendsAdapterData.UNSELECT); friendsAdapterView.updateSelectedState(position, FriendsAdapterData.UNSELECT); } else { // single option } } } } } }