/*******************************************************************************
* Copyright 2011, 2012, 2013 fanfou.com, Xiaoke, Zhang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package com.fanfou.app.opensource;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
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.fanfou.app.opensource.adapter.UserChooseCursorAdapter;
import com.fanfou.app.opensource.api.bean.User;
import com.fanfou.app.opensource.db.Contents.BasicColumns;
import com.fanfou.app.opensource.db.Contents.UserInfo;
import com.fanfou.app.opensource.service.AutoCompleteService;
import com.fanfou.app.opensource.service.Constants;
import com.fanfou.app.opensource.service.FanfouServiceManager;
import com.fanfou.app.opensource.service.WakefulIntentService;
import com.fanfou.app.opensource.ui.ActionBar;
import com.fanfou.app.opensource.ui.ActionBar.AbstractAction;
import com.fanfou.app.opensource.ui.TextChangeListener;
import com.fanfou.app.opensource.util.CommonHelper;
import com.fanfou.app.opensource.util.StringHelper;
/**
* @author mcxiaoke
* @version 1.0 2011.10.21
* @version 2.0 2011.10.24
* @version 2.1 2011.10.26
* @version 2.2 2011.11.01
* @version 2.3 2011.11.07
* @version 2.4 2011.11.18
* @version 2.5 2011.11.21
* @version 2.6 2011.11.25
* @version 2.7 2011.12.02
* @version 2.8 2011.12.23
*/
public class UserChoosePage extends BaseActivity implements
FilterQueryProvider, OnItemClickListener {
private class ConfirmAction extends AbstractAction {
public ConfirmAction() {
super(R.drawable.ic_ok);
}
@Override
public void performAction(final View view) {
doAddUserNames();
}
}
private class MyTextWatcher extends TextChangeListener {
@Override
public void onTextChanged(final CharSequence s, final int start,
final int before, final int count) {
resetChoices();
UserChoosePage.this.mCursorAdapter.getFilter().filter(
s.toString().trim());
}
}
protected class ResultHandler extends Handler {
@Override
public void handleMessage(final Message msg) {
switch (msg.what) {
case Constants.RESULT_SUCCESS:
if (!UserChoosePage.this.isInitialized) {
showContent();
}
final int count = msg.getData().getInt(Constants.EXTRA_COUNT);
if (count > 0) {
updateUI();
}
break;
case Constants.RESULT_ERROR:
msg.getData().getInt(Constants.EXTRA_CODE);
final String errorMessage = msg.getData().getString(
Constants.EXTRA_ERROR);
CommonHelper.notify(UserChoosePage.this.mContext, errorMessage);
if (!UserChoosePage.this.isInitialized) {
showContent();
}
break;
default:
break;
}
}
}
protected ActionBar mActionBar;
protected ListView mListView;
protected EditText mEditText;
protected ViewGroup mEmptyView;
private ViewStub mViewStub;
private View mButtonGroup;
private Button okButton;
private Button cancelButton;
protected Cursor mCursor;
protected UserChooseCursorAdapter mCursorAdapter;
private List<String> mUserNames;
protected int page = 1;
private boolean isInitialized = false;
private static final String tag = UserChoosePage.class.getSimpleName();
private void doAddUserNames() {
if (!this.mUserNames.isEmpty()) {
final StringBuilder sb = new StringBuilder();
for (final String screenName : this.mUserNames) {
sb.append("@").append(screenName).append(" ");
}
if (AppContext.DEBUG) {
log("User Names: " + sb.toString());
}
final Intent intent = new Intent();
intent.putExtra(Constants.EXTRA_TEXT, sb.toString());
setResult(Activity.RESULT_OK, intent);
}
finish();
}
protected void doGetMore() {
this.page++;
doRetrieve(true);
}
protected void doRefresh() {
this.page = 1;
doRetrieve(false);
}
protected void doRetrieve(final boolean isGetMore) {
FanfouServiceManager.doFetchFriends(this, new ResultHandler(),
this.page, AppContext.getUserId());
}
protected void initCheckState() {
if (this.mCursor.getCount() > 0) {
showContent();
} else {
doRefresh();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
WakefulIntentService.sendWakefulWork(
UserChoosePage.this.mContext,
AutoCompleteService.class);
}
}, 30000);
showProgress();
}
}
protected void initCursorAdapter() {
final String where = BasicColumns.TYPE + "=? AND "
+ BasicColumns.OWNER_ID + "=?";
final String[] whereArgs = new String[] {
String.valueOf(Constants.TYPE_USERS_FRIENDS),
AppContext.getUserId() };
this.mCursor = managedQuery(UserInfo.CONTENT_URI, UserInfo.COLUMNS,
where, whereArgs, null);
this.mCursorAdapter = new UserChooseCursorAdapter(this.mContext,
this.mCursor);
this.mCursorAdapter.setFilterQueryProvider(this);
}
protected void initialize() {
this.mUserNames = new ArrayList<String>();
initCursorAdapter();
}
private void initViewStub() {
this.mButtonGroup = this.mViewStub.inflate();
this.mViewStub = null;
this.okButton = (Button) findViewById(R.id.button_ok);
this.okButton.setText(android.R.string.ok);
this.okButton.setOnClickListener(this);
this.cancelButton = (Button) findViewById(R.id.button_cancel);
this.cancelButton.setText(android.R.string.cancel);
this.cancelButton.setOnClickListener(this);
}
private void log(final String message) {
Log.d(UserChoosePage.tag, message);
}
@Override
public void onClick(final View v) {
final int id = v.getId();
switch (id) {
case R.id.button_ok:
doAddUserNames();
break;
case R.id.button_cancel:
finish();
break;
default:
break;
}
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (AppContext.DEBUG) {
log("onCreate");
}
initialize();
setLayout();
initCheckState();
}
@Override
public void onItemClick(final AdapterView<?> parent, final View view,
final int position, final long id) {
final SparseBooleanArray sba = this.mListView.getCheckedItemPositions();
this.mUserNames.clear();
for (int i = 0; i < sba.size(); i++) {
final int key = sba.keyAt(i);
final boolean value = sba.valueAt(i);
this.mCursorAdapter.setItemChecked(key, value);
if (AppContext.DEBUG) {
log("sba.values i=" + i + " key=" + key + " value=" + value
+ " cursor.size=" + this.mCursor.getCount()
+ " adapter.size=" + this.mCursorAdapter.getCount());
}
if (value) {
final Cursor cc = (Cursor) this.mCursorAdapter.getItem(key);
final User uu = User.parse(cc);
this.mUserNames.add(uu.screenName);
}
}
if (AppContext.DEBUG) {
log(StringHelper.toString(this.mUserNames));
}
if (this.mViewStub != null) {
initViewStub();
}
if (this.mUserNames.isEmpty()) {
this.mButtonGroup.setVisibility(View.GONE);
} else {
this.mButtonGroup.setVisibility(View.VISIBLE);
}
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
AppContext.getImageLoader().clearQueue();
}
private void resetChoices() {
final SparseBooleanArray sba = this.mListView.getCheckedItemPositions();
for (int i = 0; i < sba.size(); i++) {
this.mCursorAdapter.setItemChecked(sba.keyAt(i), false);
}
this.mListView.clearChoices();
}
@Override
public Cursor runQuery(final CharSequence constraint) {
final String where = BasicColumns.TYPE + " = "
+ Constants.TYPE_USERS_FRIENDS + " AND "
+ BasicColumns.OWNER_ID + " = '" + AppContext.getUserId()
+ "' AND (" + UserInfo.SCREEN_NAME + " like '%" + constraint
+ "%' OR " + BasicColumns.ID + " like '%" + constraint + "%' )";
;
return managedQuery(UserInfo.CONTENT_URI, UserInfo.COLUMNS, where,
null, null);
}
/**
* 初始化和设置ActionBar
*/
private void setActionBar() {
this.mActionBar = (ActionBar) findViewById(R.id.actionbar);
this.mActionBar.setTitle("我关注的人");
this.mActionBar.setRightAction(new ConfirmAction());
this.mActionBar.setLeftAction(new ActionBar.BackAction(this));
}
private void setLayout() {
setContentView(R.layout.user_choose);
setActionBar();
this.mViewStub = (ViewStub) findViewById(R.id.stub);
this.mEmptyView = (ViewGroup) findViewById(R.id.empty);
this.mEditText = (EditText) findViewById(R.id.choose_input);
this.mEditText.addTextChangedListener(new MyTextWatcher());
setListView();
}
private void setListView() {
this.mListView = (ListView) findViewById(R.id.list);
this.mListView.setCacheColorHint(0);
this.mListView.setHorizontalScrollBarEnabled(false);
this.mListView.setVerticalScrollBarEnabled(false);
this.mListView.setSelector(getResources().getDrawable(
R.drawable.list_selector));
this.mListView.setDivider(getResources().getDrawable(
R.drawable.separator));
this.mListView.setOnItemClickListener(this);
this.mListView.setItemsCanFocus(false);
this.mListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
this.mListView.setAdapter(this.mCursorAdapter);
}
private void showContent() {
if (AppContext.DEBUG) {
log("showContent()");
}
this.isInitialized = true;
this.mEmptyView.setVisibility(View.GONE);
this.mEditText.setVisibility(View.VISIBLE);
this.mListView.setVisibility(View.VISIBLE);
}
private void showProgress() {
this.mListView.setVisibility(View.GONE);
this.mEditText.setVisibility(View.GONE);
this.mEmptyView.setVisibility(View.VISIBLE);
}
protected void updateUI() {
if (AppContext.DEBUG) {
log("updateUI()");
}
if (this.mCursor != null) {
this.mCursor.requery();
}
}
}