package com.mcxiaoke.minicat.app;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FilterQueryProvider;
import android.widget.ListView;
import com.mcxiaoke.minicat.AppContext;
import com.mcxiaoke.minicat.R;
import com.mcxiaoke.minicat.adapter.UserChooseCursorAdapter;
import com.mcxiaoke.minicat.api.Paging;
import com.mcxiaoke.minicat.controller.DataController;
import com.mcxiaoke.minicat.controller.EmptyViewController;
import com.mcxiaoke.minicat.dao.model.UserModel;
import com.mcxiaoke.minicat.service.Constants;
import com.mcxiaoke.minicat.service.SyncService;
import com.mcxiaoke.minicat.ui.widget.TextChangeListener;
import com.mcxiaoke.minicat.util.StringHelper;
import com.mcxiaoke.minicat.util.Utils;
import java.util.ArrayList;
import java.util.List;
/**
* @author mcxiaoke
* @version 3.2 2012.03.26
*/
public class UIUserChoose extends UIBaseSupport implements FilterQueryProvider,
OnItemClickListener, LoaderCallbacks<Cursor> {
private static final String TAG = UIUserChoose.class.getSimpleName();
private static final int LOADER_ID = 1;
private static final String tag = UIUserChoose.class.getSimpleName();
private ListView mListView;
private EditText mEditText;
private ViewGroup vEmpty;
private EmptyViewController emptyController;
private ViewStub mViewStub;
private View mButtonGroup;
private Button okButton;
private Button cancelButton;
private UserChooseCursorAdapter mCursorAdapter;
private List<String> mUserNames;
private int page = 1;
private boolean isInitialized = false;
private void log(String message) {
Log.d(tag, message);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUserNames = new ArrayList<String>();
setLayout();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onMenuHomeClick() {
onBackPressed();
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.button_ok:
selectUserNames();
break;
case R.id.button_cancel:
finish();
break;
default:
break;
}
}
private void initCheckState() {
if (mCursorAdapter.getCount() > 0) {
showContent();
} else {
doRefresh();
showProgress();
}
}
private void showEmptyView(String text) {
mListView.setVisibility(View.GONE);
emptyController.showEmpty(text);
}
private void showProgress() {
mListView.setVisibility(View.GONE);
mEditText.setVisibility(View.GONE);
emptyController.showProgress();
if (AppContext.DEBUG) {
Log.d(TAG, "showProgress");
}
}
private void showContent() {
isInitialized = true;
emptyController.hideProgress();
mListView.setVisibility(View.VISIBLE);
mEditText.setVisibility(View.VISIBLE);
if (AppContext.DEBUG) {
Log.d(TAG, "showContent");
}
}
protected void setLayout() {
setProgressBarIndeterminateVisibility(false);
getActionBar().setTitle("选择发送对象");
setContentView(R.layout.user_choose);
mViewStub = (ViewStub) findViewById(R.id.stub);
mEditText = (EditText) findViewById(R.id.input);
mEditText.addTextChangedListener(new MyTextWatcher());
vEmpty = (ViewGroup) findViewById(android.R.id.empty);
emptyController = new EmptyViewController(vEmpty);
setListView();
}
private void setListView() {
mListView = (ListView) findViewById(android.R.id.list);
mListView.setOnItemClickListener(this);
mListView.setItemsCanFocus(false);
mListView.setSelector(getResources().getDrawable(R.drawable.selector));
mListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
mCursorAdapter = new UserChooseCursorAdapter(mContext, null);
mCursorAdapter.setFilterQueryProvider(this);
mListView.setAdapter(mCursorAdapter);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
private void initViewStub() {
mButtonGroup = mViewStub.inflate();
mViewStub = null;
okButton = (Button) findViewById(R.id.button_ok);
okButton.setText(android.R.string.ok);
okButton.setOnClickListener(this);
cancelButton = (Button) findViewById(R.id.button_cancel);
cancelButton.setText(android.R.string.cancel);
cancelButton.setOnClickListener(this);
}
private void doRefresh() {
page = 1;
doRetrieve(false);
}
private void doGetMore() {
page++;
doRetrieve(true);
}
private void doRetrieve(boolean isGetMore) {
Paging paging = new Paging();
paging.page = page;
SyncService.getUsers(mContext, AppContext.getAccount(),
UserModel.TYPE_FRIENDS, paging, new ResultHandler());
}
private void updateUI() {
if (AppContext.DEBUG) {
log("updateUI()");
}
}
@Override
protected void onStop() {
super.onStop();
}
private void selectUserNames() {
if (!mUserNames.isEmpty()) {
StringBuilder sb = new StringBuilder();
for (String screenName : mUserNames) {
sb.append("@").append(screenName).append(" ");
}
if (AppContext.DEBUG) {
log("User Names: " + sb.toString());
}
Intent intent = new Intent();
intent.putExtra("text", sb.toString());
setResult(RESULT_OK, intent);
}
finish();
}
private void resetChoices() {
SparseBooleanArray sba = mListView.getCheckedItemPositions();
for (int i = 0; i < sba.size(); i++) {
mCursorAdapter.setItemChecked(sba.keyAt(i), false);
}
mListView.clearChoices();
}
@Override
public Cursor runQuery(CharSequence constraint) {
return DataController.getUserListCursor(this, UserModel.TYPE_FRIENDS,
AppContext.getAccount());
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
SparseBooleanArray sba = mListView.getCheckedItemPositions();
mUserNames.clear();
for (int i = 0; i < sba.size(); i++) {
int key = sba.keyAt(i);
boolean value = sba.valueAt(i);
mCursorAdapter.setItemChecked(key, value);
log("onItemClick key= " + key + " value=" + value + " position="
+ position);
if (value) {
final Cursor cursor = (Cursor) mCursorAdapter.getItem(key);
final UserModel u = UserModel.from(cursor);
mUserNames.add(u.getScreenName());
}
}
if (AppContext.DEBUG) {
log(StringHelper.toString(mUserNames));
}
if (mViewStub != null) {
initViewStub();
}
if (mUserNames.isEmpty()) {
mButtonGroup.setVisibility(View.GONE);
} else {
mButtonGroup.setVisibility(View.VISIBLE);
}
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
return DataController.getAutoCompleteCursorLoader(mContext,
AppContext.getAccount());
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor newCursor) {
mCursorAdapter.swapCursor(newCursor);
if (AppContext.DEBUG) {
Log.d(TAG,
"onLoadFinished() adapter.size="
+ mCursorAdapter.getCount());
}
initCheckState();
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mCursorAdapter.swapCursor(null);
}
private class MyTextWatcher extends TextChangeListener {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
resetChoices();
mCursorAdapter.getFilter().filter(s.toString().trim());
}
}
private class ResultHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SyncService.RESULT_SUCCESS:
if (!isInitialized) {
showContent();
}
int count = msg.getData().getInt("count");
if (count > 0) {
updateUI();
}
break;
case SyncService.RESULT_ERROR:
int code = msg.getData().getInt("error_code");
String errorMessage = msg.getData().getString("error_message");
Utils.notify(mContext, errorMessage);
if (!isInitialized) {
showEmptyView(errorMessage);
}
break;
default:
break;
}
}
}
}