package com.aiyou.bbs; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import com.aiyou.BaseActivity; import com.aiyou.R; import com.aiyou.bbs.adapter.FaceGridViewAdapter; import com.aiyou.bbs.adapter.ViewPagerAdapter; import com.aiyou.bbs.bean.Article; import com.aiyou.bbs.bean.Attachment; import com.aiyou.bbs.bean.Board; import com.aiyou.bbs.bean.Mail; import com.aiyou.bbs.bean.Mailbox.MailboxType; import com.aiyou.bbs.faceviewlistener.MyGridViewListener; import com.aiyou.bbs.faceviewlistener.MyOnPageChangeListener; import com.aiyou.bbs.fileselect.DirectoryChooserView; import com.aiyou.bbs.fileselect.DirectoryChooserView.ChosenDirectoryListener; import com.aiyou.bbs.utils.BBSManager; import com.aiyou.utils.AiYouManager; import com.aiyou.utils.JsonHelper; import com.aiyou.utils.NetWorkManager; import com.aiyou.utils.SwitchManager; import com.aiyou.utils.filecache.FileManager; import com.aiyou.utils.image.ImageFactory; import com.aiyou.utils.thread.ThreadUtils; import com.aiyou.view.ControlScrollViewPager; import com.aiyou.view.CustomDialog; import com.aiyou.view.ScrollTextView; import external.GifImageViewEx.net.frakbot.imageviewex.Converters; import external.GifImageViewEx.net.frakbot.imageviewex.ImageViewEx; import external.colorpicker.ColorPickerDialog; import external.colorpicker.ColorPickerPreference; import external.colorpicker.ColorPickerDialog.OnColorChangedListener; import external.otherview.Win8ProgressBar; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.text.Editable; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.ImageSpan; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import android.widget.ImageView.ScaleType; /** * 发表文章、回复、写信 * * @author sollian */ public class BBSWriteActivity extends BaseActivity implements OnClickListener, ChosenDirectoryListener, OnColorChangedListener, OnItemLongClickListener, OnTouchListener { public static final String NEW_MAIL = "newMail"; public static final String MAIL_TO = "mailTo"; public static final String WRITE_ARTICLE = "write_article"; public static final String REPLY_ARTICLE = "reply_article"; public static final String EDIT_ARTICLE = "edit_article"; /** * 5项功能 */ private final static int ARTICLE = 0; private final static int BOARD = 1; private final static int MAIL = 2; private final static int EDIT = 3; private final static int NEWMAIL = 4; private static final int RESULT_LOAD_IMAGE = 0x1110; private static final int RESULT_TAKE_PHOTO = 0x1120; private static final int MSG_ARTICLE_SEND = 0; private static final int MSG_ERROR = -1; private static final String KEY_DATA = "data"; private static final float BMP_WIDTH = 72f; private static final float BMP_HEIGHT = 72f; private SwitchManager mSwitchMgr; private BBSManager mBBSMgr; private AiYouManager mIUMgr; // 用于为拍摄的照片命名 private String mTimeStamp; /** * 取值为ARTICLE|BOARD|MAIL|EDIT|NEWMAIL */ private int mMode; // 回复的Article private Article mArticle; // 发表新话题所在的版面 private Board mBoard; // 回信 private Mail mMail; /** * viewpager相关 */ private ArrayList<View> mTabList = new ArrayList<>(); // Tab页面列表 /** * 附件相关 */ // 文件选择对话框 private DirectoryChooserView mDirChooserView; // 存储附件的列表 private ArrayList<String> mAttachList = new ArrayList<>(); /** * 拖动附件显示的图片 */ private ImageView mDragView; private Bitmap mDragBmp; /** * 拾色器对话框 */ private ColorPickerDialog mColorDialog; /** * 动态表情相关 */ private int vpLocation[] = new int[2]; private ArrayList<Map<String, String>> mDynamicFaceList = new ArrayList<>(); /** * 控件 */ // 标题 private ScrollTextView mTitleSTV; // 主题 private EditText mSubjectET; // 收信人,仅在撰写新邮件时可见 private EditText mToET; // 内容 private EditText mContentET; // 表情相关 private LinearLayout mFaceLLayout; private ControlScrollViewPager mViewPager; /* * 查看动态表情的view */ private LinearLayout mDynamicFaceLLayout; private ImageViewEx mDynamicFaceIVE; // help private ImageView mHelpIV; // 转载附件的布局 private LinearLayout mAttachLLayout; // 选项 private ImageView mFaceIV, mPhotoIV, mCameraIV, mAttachIV, mFontIV; // 文字选项布局 private LinearLayout mFontLLayout; // 文字大小选择布局 private LinearLayout mFontSizeLLayout; // 进度条 private FrameLayout mProgressFLayout; private Win8ProgressBar mProgressBar; private Handler mHandler = new Handler(new Handler.Callback() { public boolean handleMessage(Message msg) { if (MSG_ARTICLE_SEND == msg.what) { String info = null; if (ARTICLE == mMode) { info = "回复成功"; } else if (BOARD == mMode) { info = "发表成功"; } else if (EDIT == mMode) { info = "更新成功"; } else if (MAIL == mMode) { info = "回复成功"; } else if (NEWMAIL == mMode) { info = "发送成功"; } if (!TextUtils.isEmpty(info)) { Toast.makeText(getBaseContext(), info, Toast.LENGTH_SHORT).show(); } scrollToFinishActivity(); } else if (MSG_ERROR == msg.what) { Bundle data = msg.getData(); String strError = data.getString(KEY_DATA); if (TextUtils.isEmpty(strError)) { strError = NetWorkManager.MSG_NONET; } // 连接服务器失败 Toast.makeText(getBaseContext(), strError, Toast.LENGTH_SHORT) .show(); } showProgress(false); return true; } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSwitchMgr = SwitchManager.getInstance(getBaseContext()); if (mSwitchMgr.isNightModeEnabled()) { // 夜间模式 setTheme(R.style.ThemeNight); } else { // 日间模式 setTheme(R.style.ThemeDay); } setContentView(R.layout.activity_bbs_write); init(); Intent intent = getIntent(); mBoard = (Board) intent.getSerializableExtra(WRITE_ARTICLE); if (null != mBoard) { // 发表 mMode = BOARD; mTitleSTV.setText("新话题"); if (!mBoard.allow_attachment) { mPhotoIV.setVisibility(View.INVISIBLE); mCameraIV.setVisibility(View.INVISIBLE); mAttachIV.setVisibility(View.INVISIBLE); } return; } mArticle = (Article) intent.getSerializableExtra(EDIT_ARTICLE); if (mArticle != null) { // 编辑 mMode = EDIT; mTitleSTV.setText("编辑"); mSubjectET.setText(mArticle.title); mContentET.setText(mArticle.content); if (!mBBSMgr.isAllowAttachment(mArticle.board_name)) { mPhotoIV.setVisibility(View.INVISIBLE); mCameraIV.setVisibility(View.INVISIBLE); mAttachIV.setVisibility(View.INVISIBLE); } return; } mArticle = (Article) intent.getSerializableExtra(REPLY_ARTICLE); if (null != mArticle) { // 回复 mMode = ARTICLE; mTitleSTV.setText("新回复"); mSubjectET.setText("Re:" + mArticle.title); if (!mBBSMgr.isAllowAttachment(mArticle.board_name)) { mPhotoIV.setVisibility(View.INVISIBLE); mCameraIV.setVisibility(View.INVISIBLE); mAttachIV.setVisibility(View.INVISIBLE); } return; } mMail = (Mail) intent.getSerializableExtra(NEW_MAIL); if (null != mMail) { // 回信 mMode = MAIL; mTitleSTV.setText("回信:" + mMail.user.id); mSubjectET.setText("Re:" + mMail.title); mPhotoIV.setVisibility(View.INVISIBLE); mCameraIV.setVisibility(View.INVISIBLE); mAttachIV.setVisibility(View.INVISIBLE); return; } String strTo = intent.getStringExtra(MAIL_TO); // 新邮件 mMode = NEWMAIL; mTitleSTV.setText("新邮件"); mToET.setVisibility(View.VISIBLE); mPhotoIV.setVisibility(View.INVISIBLE); mCameraIV.setVisibility(View.INVISIBLE); mAttachIV.setVisibility(View.INVISIBLE); if (null != strTo) { mToET.setText(strTo); } } @SuppressLint("InflateParams") private void init() { mBBSMgr = BBSManager.getInstance(getBaseContext()); mIUMgr = AiYouManager.getInstance(getBaseContext()); /** * 拾色器 */ mColorDialog = new ColorPickerDialog(this, Color.BLACK); mColorDialog.setOnColorChangedListener(this); /** * 动态表情 */ mDynamicFaceLLayout = (LinearLayout) findViewById(R.id.activity_bbswrite_ll_ive); mDynamicFaceIVE = (ImageViewEx) findViewById(R.id.activity_bbswrite_ive); /** * help */ mHelpIV = (ImageView) findViewById(R.id.activity_bbswrite_iv_help); mTitleSTV = (ScrollTextView) findViewById(R.id.activity_bbswrite_stv_title); mSubjectET = (EditText) findViewById(R.id.activity_bbswrite_et_subject); mToET = (EditText) findViewById(R.id.activity_bbswrite_et_to); mContentET = (EditText) findViewById(R.id.activity_bbswrite_et_content); mFaceLLayout = (LinearLayout) findViewById(R.id.activity_bbswrite_ll_face); mViewPager = (ControlScrollViewPager) findViewById(R.id.activity_bbswrite_vp); ImageView mCursorIV = (ImageView) findViewById(R.id.activity_bbswrite_iv_cursor); TextView mClassicTV = (TextView) findViewById(R.id.activity_bbswrite_tv_classic); TextView mOnionTV = (TextView) findViewById(R.id.activity_bbswrite_tv_onion); TextView mTuzkiTV = (TextView) findViewById(R.id.activity_bbswrite_tv_tuzki); TextView mYociTV = (TextView) findViewById(R.id.activity_bbswrite_tv_yoci); mAttachLLayout = (LinearLayout) findViewById(R.id.activity_bbswrite_ll_attach); mFaceIV = (ImageView) findViewById(R.id.activity_bbswrite_iv_face); mPhotoIV = (ImageView) findViewById(R.id.activity_bbswrite_iv_photo); mCameraIV = (ImageView) findViewById(R.id.activity_bbswrite_iv_camera); mAttachIV = (ImageView) findViewById(R.id.activity_bbswrite_iv_attachment); mFontIV = (ImageView) findViewById(R.id.activity_bbswrite_iv_font); mFontLLayout = (LinearLayout) findViewById(R.id.activity_bbswrite_ll_font); mFontSizeLLayout = (LinearLayout) findViewById(R.id.activity_bbswrite_ll_font_size); mDragView = (ImageView) findViewById(R.id.activity_bbswrite_iv_drag); mDirChooserView = (DirectoryChooserView) findViewById(R.id.activity_bbswrite_dsv); mDirChooserView.setChosenDirectoryListener(this); mFaceIV.setOnClickListener(this); mPhotoIV.setOnClickListener(this); mCameraIV.setOnClickListener(this); mAttachIV.setOnClickListener(this); mFontIV.setOnClickListener(this); // 动画图片宽度 int bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.face_cursor).getWidth();// 获取图片宽度 // 动画图片偏移量 int offset = ((AiYouManager.getScreenWidth() - mIUMgr.dip2px(20)) / 4 - bmpW) / 2;// 计算偏移量 Matrix matrix = new Matrix(); matrix.postTranslate(offset, 0); mCursorIV.setImageMatrix(matrix);// 设置动画初始位置 // 页卡 mClassicTV.setOnClickListener(new FaceTypeListener(0)); mOnionTV.setOnClickListener(new FaceTypeListener(1)); mTuzkiTV.setOnClickListener(new FaceTypeListener(2)); mYociTV.setOnClickListener(new FaceTypeListener(3)); // viewpager LayoutInflater mInflater = getLayoutInflater(); GridView mClassicGV = (GridView) mInflater.inflate(R.layout.face_classic, null); GridView mOnionGV = (GridView) mInflater.inflate(R.layout.face_onion, null); GridView mTuzkiGV = (GridView) mInflater.inflate(R.layout.face_tuzki, null); GridView mYociGV = (GridView) mInflater.inflate(R.layout.face_yoci, null); mClassicGV.setAdapter(new FaceGridViewAdapter(getBaseContext(), 0)); mOnionGV.setAdapter(new FaceGridViewAdapter(getBaseContext(), 1)); mTuzkiGV.setAdapter(new FaceGridViewAdapter(getBaseContext(), 2)); mYociGV.setAdapter(new FaceGridViewAdapter(getBaseContext(), 3)); mClassicGV.setOnItemClickListener(new MyGridViewListener( getBaseContext(), 0, mContentET)); mOnionGV.setOnItemClickListener(new MyGridViewListener( getBaseContext(), 1, mContentET)); mTuzkiGV.setOnItemClickListener(new MyGridViewListener( getBaseContext(), 2, mContentET)); mYociGV.setOnItemClickListener(new MyGridViewListener(getBaseContext(), 3, mContentET)); if (Build.VERSION.SDK_INT >= 11) { mClassicGV.setOnItemLongClickListener(this); mOnionGV.setOnItemLongClickListener(this); mTuzkiGV.setOnItemLongClickListener(this); mYociGV.setOnItemLongClickListener(this); mClassicGV.setOnTouchListener(this); mOnionGV.setOnTouchListener(this); mTuzkiGV.setOnTouchListener(this); mYociGV.setOnTouchListener(this); } mTabList.add(mClassicGV); mTabList.add(mOnionGV); mTabList.add(mTuzkiGV); mTabList.add(mYociGV); mViewPager.setAdapter(new ViewPagerAdapter(mTabList)); mViewPager.setCurrentItem(0); mViewPager.setOnPageChangeListener(new MyOnPageChangeListener(mCursorIV, offset, bmpW, 0)); /** * 进度条 */ mProgressFLayout = (FrameLayout) findViewById(R.id.fl_progress); mProgressBar = (Win8ProgressBar) findViewById(R.id.progress_bar); } private class FaceTypeListener implements OnClickListener { private int index = 0; public FaceTypeListener(int index) { this.index = index; } @Override public void onClick(View v) { mViewPager.setCurrentItem(index); } } @Override public void onClick(View v) { if (v == mFaceIV) { // 打开|关闭表情栏 if (View.VISIBLE == mFaceLLayout.getVisibility()) { mFaceLLayout.setVisibility(View.GONE); } else { mFaceLLayout.setVisibility(View.VISIBLE); if (mSwitchMgr.needShowFaceHelp()) { mHelpIV.setVisibility(View.VISIBLE); mHelpIV.bringToFront(); mSwitchMgr.disableShowFaceHelp(); } } } else if (v == mPhotoIV) { if (mAttachList.size() == 0) { Toast.makeText(getBaseContext(), "向下拖动附件可删除", Toast.LENGTH_SHORT).show(); } // 选择照片 if (mAttachList.size() >= 20) { Toast.makeText(getBaseContext(), "附件数量已达上限", Toast.LENGTH_SHORT) .show(); return; } Intent i = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE); overridePendingTransition(android.R.anim.fade_in, 0); } else if (v == mCameraIV) { if (mAttachList.size() == 0) { Toast.makeText(getBaseContext(), "向下拖动附件可删除", Toast.LENGTH_SHORT).show(); } // 相机拍照 if (mAttachList.size() >= 20) { Toast.makeText(getBaseContext(), "附件数量已达上限", Toast.LENGTH_SHORT) .show(); return; } long time = System.currentTimeMillis() / 1000; mTimeStamp = time + ""; String path = Environment.getExternalStorageDirectory() .getAbsolutePath() + FileManager.DIR_CAMERA; File dir = new File(path); if (!dir.exists()) { dir.mkdir(); } Intent i = new Intent("android.media.action.IMAGE_CAPTURE"); i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(path, mTimeStamp + FileManager.BMP_SUFFIX))); startActivityForResult(i, RESULT_TAKE_PHOTO); overridePendingTransition(android.R.anim.fade_in, 0); } else if (v == mAttachIV) { if (mAttachList.size() == 0) { Toast.makeText(getBaseContext(), "向下拖动附件可删除", Toast.LENGTH_SHORT).show(); } // 选择附件 if (mAttachList.size() >= 20) { Toast.makeText(getBaseContext(), "附件数量已达上限", Toast.LENGTH_SHORT) .show(); return; } mDirChooserView.chooseDirectory(); } else if (v == mFontIV) { // 打开|关闭字体设置面板 if (View.VISIBLE == mFontLLayout.getVisibility()) { mFontLLayout.setVisibility(View.GONE); } else { mFontLLayout.setVisibility(View.VISIBLE); } mFontSizeLLayout.setVisibility(View.GONE); } else if (R.id.activity_bbswrite_iv_help == v.getId()) { mHelpIV.setVisibility(View.GONE); } } public void onFontClick(View view) { int nId = view.getId(); if (R.id.activity_bbswrite_iv_font_bold == nId) { // 粗体 Editable edit = mContentET.getText(); int start = mContentET.getSelectionStart(); int end = mContentET.getSelectionEnd(); edit.insert(end, "[/b]"); edit.insert(start, "[b]"); mContentET.setSelection(start + 3); } else if (R.id.activity_bbswrite_iv_font_italic == nId) { // 斜体 Editable edit = mContentET.getText(); int start = mContentET.getSelectionStart(); int end = mContentET.getSelectionEnd(); edit.insert(end, "[/i]"); edit.insert(start, "[i]"); mContentET.setSelection(start + 3); } else if (R.id.activity_bbswrite_iv_font_underline == nId) { // 下划线 Editable edit = mContentET.getText(); int start = mContentET.getSelectionStart(); int end = mContentET.getSelectionEnd(); edit.insert(end, "[/u]"); edit.insert(start, "[u]"); mContentET.setSelection(start + 3); } else if (R.id.activity_bbswrite_iv_font_size == nId) { // 打开|关闭字体大小面板 if (View.VISIBLE == mFontSizeLLayout.getVisibility()) { mFontSizeLLayout.setVisibility(View.GONE); } else { mFontSizeLLayout.setVisibility(View.VISIBLE); } } else if (R.id.activity_bbswrite_iv_font_color == nId) { // 打开字体颜色对话框 mColorDialog.show(); return; } // 打开输入法 AiYouManager.viewInputMethod(BBSWriteActivity.this, true, mContentET); } public void onFontSizeClick(View view) { int nId = view.getId(); int size = 1; if (R.id.activity_bbswrite_tv_font_size_1 == nId) { size = 1; } else if (R.id.activity_bbswrite_tv_font_size_2 == nId) { size = 2; } else if (R.id.activity_bbswrite_tv_font_size_3 == nId) { size = 3; } else if (R.id.activity_bbswrite_tv_font_size_4 == nId) { size = 4; } else if (R.id.activity_bbswrite_tv_font_size_5 == nId) { size = 5; } else if (R.id.activity_bbswrite_tv_font_size_6 == nId) { size = 6; } else if (R.id.activity_bbswrite_tv_font_size_7 == nId) { size = 7; } else if (R.id.activity_bbswrite_tv_font_size_8 == nId) { size = 8; } else if (R.id.activity_bbswrite_tv_font_size_9 == nId) { size = 9; } Editable edit = mContentET.getText(); int start = mContentET.getSelectionStart(); int end = mContentET.getSelectionEnd(); edit.insert(end, "[/size]"); edit.insert(start, "[size=" + size + "]"); mContentET.setSelection(start + 8); // 打开输入法 AiYouManager.viewInputMethod(BBSWriteActivity.this, true, mContentET); } @Override public void onColorChanged(int color) { String strColor = ColorPickerPreference.convertToRGB(color); Editable edit = mContentET.getText(); int start = mContentET.getSelectionStart(); int end = mContentET.getSelectionEnd(); edit.insert(end, "[/color]"); edit.insert(start, "[color=" + strColor + "]"); mContentET.setSelection(start + 15); } /** * 发送 * * @param view */ public void onSend(View view) { String subject = mSubjectET.getText().toString().trim(); String content = mContentET.getText().toString().trim(); if ("".equals(subject) || "".equals(content)) { Toast.makeText(getBaseContext(), "主题或内容为空", Toast.LENGTH_SHORT) .show(); return; } // 关闭输入法 AiYouManager.viewInputMethod(BBSWriteActivity.this, false, mContentET); AiYouManager.viewInputMethod(BBSWriteActivity.this, false, mToET); AiYouManager.viewInputMethod(BBSWriteActivity.this, false, mSubjectET); // 设置进度条 showProgress(true); String tail = mBBSMgr.getAppTail(); if (NEWMAIL == mMode) { String strTo = mToET.getText().toString().trim(); if ("".equals(strTo)) { Toast.makeText(getBaseContext(), "收信人为空", Toast.LENGTH_SHORT) .show(); mToET.requestFocus(); return; } // 添加应用小尾巴 if (null != tail) { String str = content.trim(); if (!str.endsWith(tail)) { content += "\n\n" + tail; } } threadSendArticle(subject, content, strTo); return; } if (ARTICLE == mMode || MAIL == mMode) { // 回复 String strContent; if (ARTICLE == mMode) { String[] arr = JsonHelper.toHtml(mArticle, true); String strReply = arr[1]; strContent = mArticle.content.replace(strReply, "").trim(); } else { String[] arr = JsonHelper.toHtml(mMail, false); String strReply = arr[1]; strContent = mMail.content.replace(strReply, "").trim(); } // 去除多余的尾巴 while (strContent.endsWith("-") || strContent.endsWith("\n")) { strContent = strContent.substring(0, strContent.length() - 1); } if (strContent.length() > 500) { strContent = strContent.substring(0, 500); strContent += "\n..................."; } String[] array = strContent.split("\n"); strContent = ""; for (int i = 0; i < array.length; i++) { array[i] = AiYouManager.getTxtWithoutNTSRElement(array[i], ""); array[i] = array[i].trim(); if (!array[i].equals("")) { if (i < array.length - 1) { strContent += array[i] + "\n: "; } else { strContent += array[i]; } } } if (ARTICLE == mMode) { content = content + "\n【 在 " + mArticle.user.id + " 的大作中提到: 】\n: " + strContent; } else if (MAIL == mMode) { content = content + "\n【 在 " + mMail.user.id + " 的大作中提到: 】\n: " + strContent; } } // 添加应用小尾巴 if (null != tail) { if (mMode == EDIT) { // 去除多余的尾巴 while (content.endsWith("-") || content.endsWith("\n")) { content = content.substring(0, content.length() - 1); } } String str = content.trim(); if (!str.endsWith(tail)) { content += "\n\n" + tail; } } threadSendArticle(subject, content, null); } private void threadSendArticle(final String subject, final String content, final String strTo) { if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) { if (null != mHandler) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } ThreadUtils.execute(new Runnable() { @Override public void run() { String strJson = null; if (ARTICLE == mMode) { // 新回复 strJson = Article.sendArticle(BBSWriteActivity.this, mArticle.board_name, subject, content, mArticle.id + ""); } else if (BOARD == mMode) { // 新话题 strJson = Article.sendArticle(BBSWriteActivity.this, mBoard.name, subject, content, null); } else if (EDIT == mMode) { // 编辑 strJson = Article.updateArticle(BBSWriteActivity.this, mArticle.board_name, mArticle.id, subject, content); } else if (NEWMAIL == mMode) { // 新邮件 strJson = Mail.sendMail(BBSWriteActivity.this, subject, content, strTo); } else if (MAIL == mMode) { // 回复邮件 strJson = Mail.replyMail(BBSWriteActivity.this, MailboxType.INBOX, mMail.index, subject, content); } if (TextUtils.isEmpty(strJson)) { if (mHandler != null) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } String strError = JsonHelper.checkError(strJson); if (null != strError) { // 是 错误信息 if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, strError); mHandler.sendMessage(msg); } return; } if (mAttachList.size() > 0) { Article arti = new Article(strJson); File file; for (int i = 0; i < mAttachList.size(); i++) { file = new File(mAttachList.get(i)); strError = Attachment.sendAttachment(BBSWriteActivity.this, arti.board_name, arti.id, file); strError = JsonHelper.checkError(strError); if (null != strError) { // 是 错误信息 if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, strError); mHandler.sendMessage(msg); } return; } } } if (null != mHandler) { mHandler.sendEmptyMessage(MSG_ARTICLE_SEND); } } }); } /** * 结束 * * @param view */ public void selfFinish(View view) { final CustomDialog dialog = new CustomDialog(this); dialog.setMessage("确定退出吗?") .setOKButton(new OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); scrollToFinishActivity(); } }).setCancelButton(null).show(); } @SuppressLint("DefaultLocale") @Override public void onChosenDir(String chosenDir) { mAttachList.add(chosenDir); // 判断附件是否超过5MB if (showAttachListSize() > 5) { mAttachList.remove(mAttachList.size() - 1); new CustomDialog(this) .setMessage("附件最大为5MB\n目前附件个数:" + mAttachList.size()) .setOKButton(null).show(); return; } ImageView iv = new ImageView(getBaseContext()); LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, 72); iv.setLayoutParams(params); iv.setScaleType(ScaleType.CENTER_INSIDE); iv.setAdjustViewBounds(true); String path = chosenDir.toLowerCase(); if (FileManager.isImage(path)) { Bitmap bmp = ImageFactory.getFixedBmp(path, BMP_WIDTH, BMP_HEIGHT, false); if (bmp != null) { iv.setImageBitmap(bmp); } } else { int id; if (path.endsWith(".ppt") || path.endsWith(".pptx")) { id = R.drawable.file_ppt; } else if (path.endsWith(".doc") || path.endsWith(".docx")) { id = R.drawable.file_word; } else if (path.endsWith(".xls") || path.endsWith(".xlsx")) { id = R.drawable.file_xls; } else if (path.endsWith(".pdf")) { id = R.drawable.file_pdf; } else if (path.endsWith(".mp4") || path.endsWith(".mov") || path.endsWith(".avi") || path.endsWith(".wmv") || path.endsWith(".mkv") || path.endsWith(".flv") || path.endsWith(".3gp") || path.endsWith(".rmvb") || path.endsWith(".mpeg")) { id = R.drawable.file_vedio; } else if (path.endsWith(".mp3") || path.endsWith(".wav") || path.endsWith(".wma") || path.endsWith(".amr") || path.endsWith(".ogg")) { id = R.drawable.file_music; } else if (path.endsWith(".txt")) { id = R.drawable.file_txt; } else if (path.endsWith(".zip") || path.endsWith(".rar")) { id = R.drawable.file_zip; } else { id = R.drawable.file_file; } iv.setImageResource(id); } TextView tv = new TextView(getBaseContext()); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); tv.setLayoutParams(params); tv.setBackgroundColor(Color.TRANSPARENT); tv.setTextColor(Color.parseColor("#008800")); tv.setTextSize(20); tv.setGravity(Gravity.CENTER); tv.setText(mAttachList.size() + ""); mAttachLLayout.addView(tv); mAttachLLayout.addView(iv); iv.setOnClickListener(new MyClickListener()); if (Build.VERSION.SDK_INT >= 11) { iv.setOnTouchListener(new MyTouchListener()); } Toast.makeText(getBaseContext(), chosenDir, Toast.LENGTH_SHORT).show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { String picturePath = null; if (requestCode == RESULT_LOAD_IMAGE) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); if (cursor != null) { try { cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); picturePath = cursor.getString(columnIndex); } catch (Exception e) { e.printStackTrace(); } finally { cursor.close(); } } } else if (requestCode == RESULT_TAKE_PHOTO) { picturePath = Environment.getExternalStorageDirectory() .getAbsolutePath() + FileManager.DIR_CAMERA + "/" + mTimeStamp + FileManager.BMP_SUFFIX; File file = new File(picturePath); if (!file.isFile()) { picturePath = null; } } if (picturePath != null) { mAttachList.add(picturePath); // 判断附件是否超过5MB if (showAttachListSize() > 5) { mAttachList.remove(mAttachList.size() - 1); String strInfo = "附件最大为5MB\n目前附件个数:" + mAttachList.size() + "\n总大小:" + String.format("%.2f", showAttachListSize()) + "MB"; new CustomDialog(this).setMessage(strInfo) .setOKButton(null).show(); return; } ImageView iv = new ImageView(getBaseContext()); LayoutParams params = new LayoutParams( LayoutParams.WRAP_CONTENT, AiYouManager.getInstance(getBaseContext()).dip2px(40)); iv.setLayoutParams(params); iv.setAdjustViewBounds(true); iv.setScaleType(ScaleType.CENTER_CROP); Bitmap bmp = ImageFactory.getFixedBmp(picturePath, BMP_WIDTH, BMP_HEIGHT, false); if (bmp != null) { iv.setImageBitmap(bmp); } TextView tv = new TextView(getBaseContext()); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); tv.setLayoutParams(params); tv.setBackgroundColor(Color.TRANSPARENT); tv.setTextColor(Color.parseColor("#008800")); tv.setTextSize(AiYouManager.getInstance(getBaseContext()).sp2px(10)); tv.setGravity(Gravity.CENTER); tv.setText(mAttachList.size() + ""); mAttachLLayout.addView(tv); mAttachLLayout.addView(iv); iv.setOnClickListener(new MyClickListener()); if (Build.VERSION.SDK_INT >= 11) { iv.setOnTouchListener(new MyTouchListener()); } Toast.makeText(getBaseContext(), picturePath, Toast.LENGTH_SHORT).show(); } } } private class MyClickListener implements OnClickListener { @Override public void onClick(View view) { mDragBmp = ((BitmapDrawable) ((ImageView) view).getDrawable()) .getBitmap(); int position = mAttachLLayout.indexOfChild(view); position = (position + 1) / 2; String imageName = "[upload=" + position + "][/upload]"; BBSManager.addPic(getBaseContext(), mContentET, mDragBmp, imageName, true); } } /** * 附件的OnTouchListener * * @author sollian */ private class MyTouchListener implements OnTouchListener { @SuppressLint("ClickableViewAccessibility") @TargetApi(Build.VERSION_CODES.HONEYCOMB) @SuppressWarnings("deprecation") @Override public boolean onTouch(View view, MotionEvent event) { float y = 0; int location[] = new int[2]; // 获取控件在窗口中的绝对位置,不包括最顶部的状态栏 view.getLocationInWindow(location); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: y = event.getY(); mDragBmp = ((BitmapDrawable) ((ImageView) view).getDrawable()) .getBitmap(); mDragView.setX(location[0]); mDragView.setY(location[1] - mIUMgr.dip2px(50) - mDragBmp.getHeight()); mDragView.setImageBitmap(mDragBmp); mDragView.setAlpha(150); mDragView.bringToFront(); break; case MotionEvent.ACTION_MOVE: mDragView.setX(location[0]); mDragView.setY(location[1] + event.getY() - mIUMgr.dip2px(50) - mDragBmp.getHeight()); int position = mAttachLLayout.indexOfChild(view); if (Math.abs(y - event.getY()) > mIUMgr.dip2px(150)) { // 向下拖动100dp的距离即删除附件 if (position > -1 && position < mAttachLLayout.getChildCount()) { mAttachLLayout.removeView(view); mAttachLLayout.removeViewAt(position - 1); position = (position - 1) / 2; mAttachList.remove(position); Editable edit = mContentET.getText(); String etContent = edit.toString(); String delStr = "[upload=" + (position + 1) + "][/upload]"; int start = etContent.indexOf(delStr); if (start != -1) { edit.delete(start, start + delStr.length()); } if (position < mAttachList.size()) { String oldName; String newName; for (; position < mAttachList.size(); position++) { mDragBmp = ((BitmapDrawable) ((ImageView) mAttachLLayout .getChildAt(2 * position + 1)) .getDrawable()).getBitmap(); oldName = "[upload=" + (position + 2) + "][/upload]"; newName = "[upload=" + (position + 1) + "][/upload]"; etContent = edit.toString();// 更新et_Content start = etContent.indexOf(oldName); if (start != -1) { ImageSpan imageSpan = new ImageSpan( getBaseContext(), mDragBmp); SpannableString spannableString = new SpannableString( newName); spannableString .setSpan( imageSpan, 0, spannableString.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE); edit.replace(start, start + oldName.length(), spannableString); } } } TextView tv; for (int i = 0; i < mAttachLLayout.getChildCount(); i++) { if (i % 2 == 0) { tv = (TextView) mAttachLLayout.getChildAt(i); tv.setText(1 + i / 2 + ""); } } mDragView.setImageBitmap(null); if (mDragBmp != null) { mDragBmp = null; } } } break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: mDragView.setImageBitmap(null); if (mDragBmp != null) { mDragBmp = null; } break; } return false; } } private double showAttachListSize() { double size = 0; FileInputStream fis = null; File file; for (int i = 0; i < mAttachList.size(); i++) { file = new File(mAttachList.get(i)); if (file.exists()) { try { fis = new FileInputStream(file); size += fis.available(); } catch (IOException e) { e.printStackTrace(); } } else { Toast.makeText(getBaseContext(), "第" + i + "个文件不存在,请检查", Toast.LENGTH_SHORT).show(); } } if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } String message; if (size < 1024) { message = "附件大小:" + size + "B"; } else if (size / 1024 < 1024) { message = "附件大小:" + String.format("%.2f", size / 1024) + "kB"; } else if (size / 1024 / 1024 < 1024) { message = "附件大小:" + String.format("%.2f", size / 1024 / 1024) + "MB"; } else { message = "附件大小:" + String.format("%.2f", size / 1024 / 1024 / 1024) + "GB"; } Toast.makeText(getBaseContext(), message, Toast.LENGTH_SHORT).show(); return size / 1024 / 1024; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (mDirChooserView.onKeyDown(keyCode, event)) { return true; } // 按下键盘上返回按钮 if (keyCode == KeyEvent.KEYCODE_BACK) { if (View.VISIBLE == mHelpIV.getVisibility()) { mHelpIV.setVisibility(View.GONE); return true; } selfFinish(null); return true; } return super.onKeyDown(keyCode, event); } /** * 设置cpb_progress的状态和是否显示 * * @param flag */ private void showProgress(boolean flag) { if (flag) { mProgressFLayout.setVisibility(View.VISIBLE); mProgressBar.start(); } else { mProgressFLayout.setVisibility(View.GONE); mProgressBar.stop(); } } @Override protected void onDestroy() { super.onDestroy(); mArticle = null; mBoard = null; mMail = null; mTabList.clear(); mTabList = null; // mAttachList.clear(); // mAttachList = null; mDragView = null; if (null != mDragBmp && !mDragBmp.isRecycled()) { mDragBmp.recycle(); } mDragBmp = null; mColorDialog = null; mHandler.removeCallbacksAndMessages(null); mHandler = null; System.gc(); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { // 禁用滑动结束Activity getSwipeBackLayout().setEnableGesture(false); // 震动 mIUMgr.vibrate(300); // 获取viewpager的屏幕坐标 mViewPager.getLocationInWindow(vpLocation); // 获取可见的gif图位置、名称 mDynamicFaceList.clear(); int start = parent.getFirstVisiblePosition(); int end = parent.getLastVisiblePosition(); View v = null; for (int i = 0; i <= end - start; i++) { Map<String, String> map = new HashMap<>(); v = parent.getChildAt(i); int location[] = new int[2]; if (null == v) { continue; } v.getLocationInWindow(location); if (v == view) { mDynamicFaceIVE.setId(i); } map.put("x", location[0] + ""); map.put("y", location[1] + ""); map.put("imgName", parent.getItemAtPosition(i + start).toString()); mDynamicFaceList.add(map); } // 锁定vp,使不能滚动 mViewPager.setScrollable(false); // 获取图片名称 String imgName = parent.getItemAtPosition(position).toString(); mDynamicFaceIVE.setSource(Converters.assetToByteArray(getAssets(), "face/" + imgName)); // 获取控件在窗口中的绝对位置,不包括最顶部的状态栏 int location[] = new int[2]; view.getLocationInWindow(location); mDynamicFaceLLayout.setX(location[0] - mIUMgr.dip2px(10)); mDynamicFaceLLayout.setY(location[1] - mIUMgr.dip2px(120)); mDynamicFaceLLayout.setVisibility(View.VISIBLE); // 返回true可禁止gridview滚动 return true; } @SuppressLint("ClickableViewAccessibility") @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: if (mViewPager.getScrollable()) { return false; } // 获取触摸点相对于屏幕的坐标 float eventX = vpLocation[0] + event.getX(); float eventY = vpLocation[1] + event.getY(); int x, y; String imgName; for (int i = 0; i < mDynamicFaceList.size(); i++) { Map<String, String> map = mDynamicFaceList.get(i); x = Integer.parseInt(map.get("x")); y = Integer.parseInt(map.get("y")); if (eventX >= x && eventX <= x + mIUMgr.dip2px(40) && eventY >= y && eventY <= y + mIUMgr.dip2px(40)) { if (i == mDynamicFaceIVE.getId()) { // 如果是正在播放的gif则返回 return false; } // 更新显示的gif imgName = map.get("imgName"); mDynamicFaceIVE.setSource(Converters.assetToByteArray( getAssets(), "face/" + imgName)); mDynamicFaceIVE.setId(i); mDynamicFaceLLayout.setX(x - mIUMgr.dip2px(10)); mDynamicFaceLLayout.setY(y - mIUMgr.dip2px(120)); break; } } break; case MotionEvent.ACTION_UP: // 重新初始化滑动结束Activity initSwipeOut(); mViewPager.setScrollable(true); mDynamicFaceLLayout.setVisibility(View.GONE); break; } return false; } }