/*******************************************************************************
* 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 android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.text.Selection;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.MultiAutoCompleteTextView;
import com.fanfou.app.opensource.adapter.AutoCompleteCursorAdapter;
import com.fanfou.app.opensource.adapter.MessageCursorAdapter;
import com.fanfou.app.opensource.adapter.SpaceTokenizer;
import com.fanfou.app.opensource.api.bean.DirectMessage;
import com.fanfou.app.opensource.api.bean.User;
import com.fanfou.app.opensource.db.Contents.BasicColumns;
import com.fanfou.app.opensource.db.Contents.DirectMessageInfo;
import com.fanfou.app.opensource.db.Contents.UserInfo;
import com.fanfou.app.opensource.service.Constants;
import com.fanfou.app.opensource.service.FanfouServiceManager;
import com.fanfou.app.opensource.service.PostMessageService;
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.IOHelper;
import com.fanfou.app.opensource.util.IntentHelper;
import com.fanfou.app.opensource.util.StringHelper;
/**
* @author mcxiaoke
* @version 1.0 2011.10.08
* @version 1.1 2011.10.25
* @version 1.2 2011.10.26
* @version 1.3 2011.11.07
* @version 1.4 2011.11.18
*
*/
public class SendPage extends BaseActivity {
private class SendAction extends AbstractAction {
public SendAction() {
super(R.drawable.ic_send);
}
@Override
public void performAction(final View view) {
doSend(true);
}
}
private static final String TAG = SendPage.class.getSimpleName();
private String mUserId;
private String mUserName;
private Cursor mCursor;
private ListView mListView;
private MessageCursorAdapter mCursorAdapter;
private ViewStub mViewStub;
private ViewGroup mSelectView;
private ImageView mSelectButton;
private MultiAutoCompleteTextView mSelectAutoComplete;
private ActionBar mActionBar;
private EditText mEditText;
private Button mSendButton;
private String mContent;
private static final int REQUEST_CODE_SELECT_USER = 2001;
private void checkUserId() {
if (AppContext.DEBUG) {
Log.d(SendPage.TAG, "checkUserId userId=" + this.mUserId);
}
if (StringHelper.isEmpty(this.mUserId)) {
this.mSelectView = (ViewGroup) this.mViewStub.inflate();
this.mSelectButton = (ImageView) findViewById(R.id.send_select_button);
this.mSelectButton.setOnClickListener(this);
setAutoComplete();
} else {
setListView();
updateUI();
}
}
private void doCopy(final DirectMessage dm) {
IOHelper.copyToClipBoard(this, dm.senderScreenName + ":" + dm.text);
CommonHelper.notify(this, "私信内容已复制到剪贴板");
}
private void doDelete(final DirectMessage dm) {
FanfouServiceManager.doMessageDelete(this, dm.id, null, false);
}
private void doSend(final boolean finish) {
if (StringHelper.isEmpty(this.mContent)) {
CommonHelper.notify(this, "私信内容不能为空");
return;
}
if (StringHelper.isEmpty(this.mUserId)) {
CommonHelper.notify(this, "请选择收件人");
return;
}
startSendService();
if (finish) {
CommonHelper.hideKeyboard(this, this.mEditText);
finish();
} else {
this.mEditText.setText("");
}
}
@Override
protected IntentFilter getIntentFilter() {
final IntentFilter filter = new IntentFilter(
Constants.ACTION_MESSAGE_SENT);
filter.setPriority(1000);
return filter;
}
private void initCursor() {
final String where = DirectMessageInfo.THREAD_USER_ID + "=?";
final String[] whereArgs = new String[] { this.mUserId };
final String orderBy = BasicColumns.CREATED_AT;
this.mCursor = managedQuery(DirectMessageInfo.CONTENT_URI,
DirectMessageInfo.COLUMNS, where, whereArgs, orderBy);
}
@Override
protected void onActivityResult(final int requestCode,
final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == SendPage.REQUEST_CODE_SELECT_USER) {
this.mUserId = data.getStringExtra(Constants.EXTRA_ID);
this.mUserName = data.getStringExtra(Constants.EXTRA_USER_NAME);
this.mSelectAutoComplete.setText(this.mUserName);
Selection.setSelection(
this.mSelectAutoComplete.getEditableText(),
this.mSelectAutoComplete.getEditableText().length());
}
}
}
@Override
protected boolean onBroadcastReceived(final Intent intent) {
// Utils.notify(this, "私信发送成功!");
// mListView.setSelection(mCursorAdapter.getCount());
return true;
}
@Override
public void onClick(final View v) {
final int id = v.getId();
switch (id) {
case R.id.button_ok:
doSend(false);
break;
case R.id.send_select_button:
startSelectUser();
break;
default:
break;
}
}
@Override
public boolean onContextItemSelected(final MenuItem item) {
final AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item
.getMenuInfo();
final int id = item.getItemId();
final Cursor c = (Cursor) this.mCursorAdapter
.getItem(menuInfo.position);
if (c != null) {
final DirectMessage dm = DirectMessage.parse(c);
if ((dm != null) && !dm.isNull()) {
switch (id) {
case R.id.dm_copy:
doCopy(dm);
break;
case R.id.dm_delete:
doDelete(dm);
break;
default:
break;
}
}
}
return true;
// return super.onContextItemSelected(item);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
parseIntent();
setLayout();
checkUserId();
}
@Override
public void onCreateContextMenu(final ContextMenu menu, final View v,
final ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.dm_list_menu, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onRestoreInstanceState(final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
}
private void parseIntent() {
final Intent intent = getIntent();
this.mUserId = intent.getStringExtra(Constants.EXTRA_ID);
this.mUserName = intent.getStringExtra(Constants.EXTRA_USER_NAME);
if (AppContext.DEBUG) {
IntentHelper.logIntent(SendPage.TAG, intent);
}
}
private void setActionBar() {
this.mActionBar = (ActionBar) findViewById(R.id.actionbar);
this.mActionBar.setTitle("写私信");
this.mActionBar.setRightAction(new SendAction());
this.mActionBar.setLeftAction(new ActionBar.BackAction(this));
}
private void setAutoComplete() {
this.mSelectAutoComplete = (MultiAutoCompleteTextView) findViewById(R.id.send_select_edit);
this.mSelectAutoComplete.setTokenizer(new SpaceTokenizer());
this.mSelectAutoComplete.setBackgroundColor(getResources().getColor(
R.color.background_color));
final String[] projection = new String[] { BaseColumns._ID,
BasicColumns.ID, UserInfo.SCREEN_NAME, BasicColumns.TYPE,
BasicColumns.OWNER_ID };
final String where = BasicColumns.TYPE + " = '"
+ Constants.TYPE_USERS_FRIENDS + "'";
final Cursor c = managedQuery(UserInfo.CONTENT_URI, projection, where,
null, null);
this.mSelectAutoComplete.setAdapter(new AutoCompleteCursorAdapter(this,
c));
this.mSelectAutoComplete
.addTextChangedListener(new TextChangeListener() {
@Override
public void onTextChanged(final CharSequence s,
final int start, final int before, final int count) {
SendPage.this.mUserId = null;
SendPage.this.mUserName = null;
}
});
this.mSelectAutoComplete
.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent,
final View view, final int position, final long id) {
if (AppContext.DEBUG) {
Log.d(SendPage.TAG, "onItemClick position="
+ position);
}
final Cursor c = (Cursor) parent
.getItemAtPosition(position);
if (c != null) {
final User user = User.parse(c);
if ((user != null) && !user.isNull()) {
SendPage.this.mUserId = user.id;
SendPage.this.mUserName = user.screenName;
if (AppContext.DEBUG) {
Log.d(SendPage.TAG, "onItemClick user.id="
+ user.id);
}
}
}
}
});
}
private void setLayout() {
setContentView(R.layout.send);
setActionBar();
this.mEditText = (EditText) findViewById(R.id.msgchat_input);
this.mEditText.addTextChangedListener(new TextChangeListener() {
@Override
public void onTextChanged(final CharSequence s, final int start,
final int before, final int count) {
SendPage.this.mContent = s.toString().trim();
}
});
this.mSendButton = (Button) findViewById(R.id.button_ok);
this.mSendButton.setOnClickListener(this);
this.mListView = (ListView) findViewById(R.id.list);
this.mViewStub = (ViewStub) findViewById(R.id.stub);
}
private void setListView() {
initCursor();
registerForContextMenu(this.mListView);
this.mCursorAdapter = new MessageCursorAdapter(this, this.mCursor,
true, true);
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
.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
this.mListView.setAdapter(this.mCursorAdapter);
this.mListView.setSelection(this.mListView.getCount() - 1);
}
private void startSelectUser() {
final Intent intent = new Intent(this, UserSelectPage.class);
startActivityForResult(intent, SendPage.REQUEST_CODE_SELECT_USER);
}
private void startSendService() {
final Intent i = new Intent(this.mContext, PostMessageService.class);
i.putExtra(Constants.EXTRA_ID, this.mUserId);
i.putExtra(Constants.EXTRA_USER_NAME, this.mUserName);
i.putExtra(Constants.EXTRA_TEXT, this.mContent);
startService(i);
}
private void updateUI() {
if (this.mCursor != null) {
this.mCursor.requery();
}
}
}