package net.jejer.hipda.ui; import android.Manifest; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import com.google.android.material.snackbar.Snackbar; import com.mikepenz.fontawesome_typeface_library.FontAwesome; import com.mikepenz.google_material_typeface_library.GoogleMaterial; import com.mikepenz.iconics.IconicsDrawable; import com.vanniktech.emoji.EmojiEditText; import com.vdurmont.emoji.EmojiParser; import com.zhihu.matisse.Matisse; import com.zhihu.matisse.MimeType; import com.zhihu.matisse.internal.entity.CaptureStrategy; import net.jejer.hipda.BuildConfig; import net.jejer.hipda.R; import net.jejer.hipda.async.PostHelper; import net.jejer.hipda.async.PrePostAsyncTask; import net.jejer.hipda.bean.Forum; import net.jejer.hipda.bean.HiSettingsHelper; import net.jejer.hipda.bean.PostBean; import net.jejer.hipda.bean.PrePostInfoBean; import net.jejer.hipda.db.Content; import net.jejer.hipda.db.ContentDao; import net.jejer.hipda.glide.MatisseGlideEngine; import net.jejer.hipda.job.ImageUploadEvent; import net.jejer.hipda.job.ImageUploadJob; import net.jejer.hipda.job.JobMgr; import net.jejer.hipda.job.PostJob; import net.jejer.hipda.job.UploadImage; import net.jejer.hipda.ui.adapter.GridImageAdapter; import net.jejer.hipda.ui.adapter.ThreadTypeAdapter; import net.jejer.hipda.ui.widget.ContentLoadingProgressBar; import net.jejer.hipda.ui.widget.CountdownButton; import net.jejer.hipda.ui.widget.HiProgressDialog; import net.jejer.hipda.ui.widget.OnSingleClickListener; import net.jejer.hipda.ui.widget.OnViewItemSingleClickListener; import net.jejer.hipda.utils.HiUtils; import net.jejer.hipda.utils.HtmlCompat; import net.jejer.hipda.utils.UIUtils; import net.jejer.hipda.utils.Utils; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; public class PostFragment extends BaseFragment { private static final int SELECT_PICTURE = 1; public static final String ARG_FID_KEY = "fid"; public static final String ARG_TID_KEY = "tid"; public static final String ARG_PID_KEY = "pid"; public static final String ARG_FLOOR_KEY = "floor"; public static final String ARG_FLOOR_AUTHOR_KEY = "floor_author"; public static final String ARG_TEXT_KEY = "text"; public static final String ARG_QUOTE_TEXT_KEY = "quote_text"; public static final String ARG_MODE_KEY = "mode"; public static final String ARG_PARENT_ID = "parent_id"; public static final String BUNDLE_POSITION_KEY = "content_position"; private int mFid; private String mTid; private String mPid; private int mFloor; private String mFloorAuthor; private String mText; private String mQuoteText; private String mTypeId = "0"; private int mMode; private TextView mTvQuoteText; private TextView mTvType; private TextView mTvImagesInfo; private EditText mEtSubject; private EmojiEditText mEtContent; private ImageButton mIbEmojiSwitch; private int mContentPosition = -1; private PrePostAsyncTask.PrePostListener mPrePostListener = new PrePostListener(); private PrePostInfoBean mPrePostInfo; private PrePostAsyncTask mPrePostAsyncTask; private Snackbar mSnackbar; private int mFetchInfoCount = 0; private boolean mFetchingInfo = false; private ContentLoadingProgressBar mProgressBar; private String mForumName; private String mParentSessionId; private Map<String, String> mTypeValues; private GridImageAdapter mImageAdapter; private HiProgressDialog mProgressDialog; private boolean mImageUploading = false; private Map<Uri, UploadImage> mUploadImages = new LinkedHashMap<>(); private long mLastSavedTime = -1; private boolean mDeleteMode = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(false); if (getArguments().containsKey(ARG_FID_KEY)) { mFid = getArguments().getInt(ARG_FID_KEY); } if (getArguments().containsKey(ARG_TID_KEY)) { mTid = getArguments().getString(ARG_TID_KEY); } if (getArguments().containsKey(ARG_PID_KEY)) { mPid = getArguments().getString(ARG_PID_KEY); } if (getArguments().containsKey(ARG_FLOOR_KEY)) { mFloor = getArguments().getInt(ARG_FLOOR_KEY); } if (getArguments().containsKey(ARG_FLOOR_AUTHOR_KEY)) { mFloorAuthor = getArguments().getString(ARG_FLOOR_AUTHOR_KEY); } if (getArguments().containsKey(ARG_MODE_KEY)) { mMode = getArguments().getInt(ARG_MODE_KEY); } if (getArguments().containsKey(ARG_TEXT_KEY)) { mText = getArguments().getString(ARG_TEXT_KEY); } if (getArguments().containsKey(ARG_QUOTE_TEXT_KEY)) { mQuoteText = getArguments().getString(ARG_QUOTE_TEXT_KEY); } if (getArguments().containsKey(ARG_PARENT_ID)) { mParentSessionId = getArguments().getString(ARG_PARENT_ID); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_post, container, false); mEtContent = view.findViewById(R.id.et_reply); mTvQuoteText = view.findViewById(R.id.tv_quote_text); mTvType = view.findViewById(R.id.tv_type); mTvImagesInfo = view.findViewById(R.id.tv_image_info); mProgressBar = view.findViewById(R.id.preinfo_loading); mImageAdapter = new GridImageAdapter(getActivity()); mTvImagesInfo.setText("图片信息"); mTvImagesInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mContentPosition = mEtContent.getSelectionStart(); showImagesDialog(); } }); updateImageInfo(); Forum forum = HiUtils.getForumByFid(mFid); if (forum != null) mForumName = forum.getName(); mEtSubject = view.findViewById(R.id.et_subject); mEtContent.setTextSize(HiSettingsHelper.getInstance().getPostTextSize()); UIUtils.setLineSpacing(mEtContent); mEtContent.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { savePostConent(false); } }); mEtContent.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) savePostConent(true); } }); mEtSubject.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus && mEmojiPopup != null && mEmojiPopup.isShowing()) mEmojiPopup.dismiss(); } }); if (!TextUtils.isEmpty(mText)) { mEtContent.setText(mText); } final CountdownButton countdownButton = view.findViewById(R.id.countdown_button); countdownButton.setImageDrawable(new IconicsDrawable(getActivity(), GoogleMaterial.Icon.gmd_send).sizeDp(28).color(Color.GRAY)); countdownButton.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { postReply(); } }); if (mMode != PostHelper.MODE_EDIT_POST) countdownButton.setCountdown(PostHelper.getWaitTimeToPost()); mIbEmojiSwitch = view.findViewById(R.id.ib_emoji_switch); setUpEmojiPopup(mEtContent, mIbEmojiSwitch); setActionBarTitle(R.string.action_reply); switch (mMode) { case PostHelper.MODE_REPLY_THREAD: setActionBarTitle("回复帖子"); break; case PostHelper.MODE_REPLY_POST: setActionBarTitle("回复 " + mFloor + "# " + mFloorAuthor); break; case PostHelper.MODE_QUOTE_POST: setActionBarTitle("引用 " + mFloor + "# " + mFloorAuthor); break; case PostHelper.MODE_NEW_THREAD: setActionBarTitle("发表 · " + mForumName); mEtSubject.setVisibility(View.VISIBLE); break; case PostHelper.MODE_EDIT_POST: setActionBarTitle(getActivity().getResources().getString(R.string.action_edit)); break; } return view; } private void savePostConent(boolean force) { if (force || SystemClock.uptimeMillis() - mLastSavedTime > 3000) { mLastSavedTime = SystemClock.uptimeMillis(); new Handler().post(new Runnable() { @Override public void run() { ContentDao.saveContent(mSessionId, mEtContent.getText().toString()); } }); } } @Override public void onResume() { super.onResume(); if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this); if (mPrePostInfo == null) { fetchPrePostInfo(false); } else { setupPrePostInfo(); } if (mMode == PostHelper.MODE_NEW_THREAD && TextUtils.isEmpty(mEtSubject.getText().toString())) { (new Handler()).postDelayed(new Runnable() { public void run() { mEtSubject.requestFocus(); long t = SystemClock.uptimeMillis(); mEtSubject.dispatchTouchEvent(MotionEvent.obtain(t, t, MotionEvent.ACTION_DOWN, 0, 0, 0)); mEtSubject.dispatchTouchEvent(MotionEvent.obtain(t, t, MotionEvent.ACTION_UP, 0, 0, 0)); } }, 100); } else { (new Handler()).postDelayed(new Runnable() { public void run() { mEtContent.requestFocus(); long t = SystemClock.uptimeMillis(); mEtContent.dispatchTouchEvent(MotionEvent.obtain(t, t, MotionEvent.ACTION_DOWN, 0, 0, 0)); mEtContent.dispatchTouchEvent(MotionEvent.obtain(t, t, MotionEvent.ACTION_UP, 0, 0, 0)); mEtContent.setSelection( (mContentPosition <= 0 || mContentPosition > mEtContent.getText().length()) ? mEtContent.getText().length() : mContentPosition); } }, 100); } } @Override public void onPause() { EventBus.getDefault().unregister(this); mContentPosition = mEtContent.getSelectionStart(); savePostConent(true); if (mPrePostInfo != null) { if (mEtSubject.getVisibility() == View.VISIBLE) mPrePostInfo.setSubject(mEtSubject.getText().toString()); mPrePostInfo.setText(mEtContent.getText().toString()); mPrePostInfo.setTypeId(mTypeId); } super.onPause(); } @Override public void onDestroy() { if (mSnackbar != null) mSnackbar.dismiss(); if (mPrePostAsyncTask != null) mPrePostAsyncTask.cancel(true); super.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(BUNDLE_POSITION_KEY, mContentPosition); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { mContentPosition = savedInstanceState.getInt(BUNDLE_POSITION_KEY, -1); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); inflater.inflate(R.menu.menu_reply, menu); menu.findItem(R.id.action_upload_img).setIcon(new IconicsDrawable(getActivity(), GoogleMaterial.Icon.gmd_add_a_photo).actionBar() .color(HiSettingsHelper.getInstance().getToolbarTextColor())); if (HiUtils.CLIENT_TID == Utils.parseInt(mTid)) { MenuItem menuItem = menu.findItem(R.id.action_device_info); menuItem.setIcon(new IconicsDrawable(getActivity(), GoogleMaterial.Icon.gmd_bug_report).actionBar() .color(HiSettingsHelper.getInstance().getToolbarTextColor())); menuItem.setVisible(true); } super.onCreateOptionsMenu(menu, inflater); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); if (mMode != PostHelper.MODE_EDIT_POST) return; MenuItem deleteMenuItem = menu.findItem(R.id.action_delete_post); if (deleteMenuItem == null) return; deleteMenuItem.setVisible(true); deleteMenuItem.setEnabled(mPrePostInfo != null && mPrePostInfo.isDeleteable()); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // Implemented in activity return false; case R.id.action_upload_img: if (mPrePostInfo == null) { fetchPrePostInfo(false); UIUtils.toast("请等待信息收集结束再选择图片"); } else { if (UIUtils.askForBothPermissions(getActivity())) return true; showImageSelector(); } return true; case R.id.action_device_info: showAppendDeviceInfoDialog(); return true; case R.id.action_restore_content: mEtContent.requestFocus(); showRestoreContentDialog(); return true; case R.id.action_delete_post: showDeletePostDialog(); return true; default: return false; } } protected void showImageSelector() { mContentPosition = mEtContent.getSelectionStart(); Matisse.from(PostFragment.this) .choose(MimeType.ofImage()) .countable(true) .maxSelectable(9) .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) .thumbnailScale(0.85f) .originalEnable(true) .maxOriginalSize(HiSettingsHelper.getInstance().getMaxUploadFileSize() / 1024 / 1024) .imageEngine(new MatisseGlideEngine()) .theme(HiSettingsHelper.getInstance().getImageActivityTheme(getActivity())) .capture(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) .captureStrategy(new CaptureStrategy(false, BuildConfig.APPLICATION_ID + ".provider")) .forResult(SELECT_PICTURE); } private void postReply() { if (mPrePostInfo == null) { fetchPrePostInfo(false); UIUtils.toast("请等待信息收集结束再发送"); return; } if (mMode == PostHelper.MODE_NEW_THREAD && HiUtils.FID_BS == mFid && "0".equals(mTypeId)) { UIUtils.toast("B&S版发帖必须指定分类"); return; } final String subjectText = mEtSubject.getText().toString(); if (mEtSubject.getVisibility() == View.VISIBLE) { if (Utils.getWordCount(subjectText) < 5) { UIUtils.toast("主题字数必须大于 5"); return; } if (Utils.getWordCount(subjectText) > 80) { UIUtils.toast("主题字数必须少于 80"); return; } } final String replyText = mEtContent.getText().toString(); if (Utils.getWordCount(replyText) < 5) { UIUtils.toast("帖子内容字数必须大于 5"); return; } UIUtils.hideSoftKeyboard(getActivity()); final List<String> extraImgs = new ArrayList<>(); if (mPrePostInfo.getAllImages().size() > 0) { for (String imgId : mPrePostInfo.getAllImages()) { String attachStr = "[attachimg]" + imgId + "[/attachimg]"; if (!replyText.contains(attachStr)) { extraImgs.add(imgId); } } if (extraImgs.size() > 0 && !mDeleteMode) { Dialog dialog = new AlertDialog.Builder(getActivity()) .setTitle("未使用的图片") .setMessage(HtmlCompat.fromHtml("有 " + extraImgs.size() + " 张图片未以标签[attachimg]形式显示在帖子中<br>" + "<br>如果您希望显示这些图片,请选择 <b>保留图片</b>" + "<br>否则请选择 <b>丢弃图片</b>")) .setPositiveButton("保留图片", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { StringBuilder sb = new StringBuilder(); String tail = HiSettingsHelper.getInstance().getTailStr(); String content; boolean appendTail = false; if (replyText.trim().endsWith(tail)) { content = replyText.substring(0, replyText.lastIndexOf(tail)); appendTail = true; } else { content = replyText; } sb.append(content).append("\n"); for (String imgId : extraImgs) { sb.append("[attachimg]").append(imgId).append("[/attachimg]").append("\n"); mPrePostInfo.addNewAttach(imgId); } if (appendTail) sb.append(tail); startPostJob(subjectText, sb.toString()); } }) .setNeutralButton("丢弃图片", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { for (String imgId : extraImgs) { mPrePostInfo.addDeleteAttach(imgId); } startPostJob(subjectText, replyText); } }).create(); dialog.show(); return; } } startPostJob(subjectText, replyText); } private void startPostJob(String subjectText, String replyText) { PostBean postBean = new PostBean(); postBean.setContent(replyText); postBean.setTid(mTid); postBean.setPid(mPid); postBean.setFid(mFid); postBean.setTypeid(mTypeId); postBean.setSubject(subjectText); postBean.setFloor(mFloor); postBean.setDelete(mDeleteMode); JobMgr.addJob(new PostJob(mParentSessionId, mMode, mPrePostInfo, postBean, false)); getActivity().finish(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { //avoid double click select button if (mImageUploading) { return; } mImageUploading = true; (new Handler()).postDelayed(new Runnable() { public void run() { mImageUploading = false; } }, 2000); if (resultCode == Activity.RESULT_OK && requestCode == SELECT_PICTURE) { boolean duplicate = false; Collection<Uri> uris = new ArrayList<>(); List<Uri> selects = Matisse.obtainResult(intent); for (Uri uri : selects) { if (!mUploadImages.containsKey(uri)) { uris.add(uri); } else { duplicate = true; } } if (uris.size() == 0) { if (duplicate) { UIUtils.toast("选择的图片重复"); } else { UIUtils.toast("无法获取图片信息"); } return; } boolean original = Matisse.obtainOriginalState(intent); mProgressDialog = HiProgressDialog.show(getActivity(), "正在上传..."); if (mPrePostInfo != null) { JobMgr.addJob(new ImageUploadJob(mSessionId, mPrePostInfo.getUid(), mPrePostInfo.getHash(), uris.toArray(new Uri[0]), original)); } else { UIUtils.toast("无法获取发帖信息"); } } } private void showRestoreContentDialog() { final Content[] contents = ContentDao.getSavedContents(mSessionId); if (contents == null || contents.length == 0) { UIUtils.toast("没有之前输入的内容"); return; } final LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View viewlayout = inflater.inflate(R.layout.dialog_restore_content, null); final ListView listView = (ListView) viewlayout.findViewById(R.id.lv_contents); listView.setAdapter(new SavedContentsAdapter(getActivity(), 0, contents)); final AlertDialog.Builder popDialog = new AlertDialog.Builder(getActivity()); popDialog.setView(viewlayout); final AlertDialog dialog = popDialog.create(); dialog.show(); listView.setOnItemClickListener(new OnViewItemSingleClickListener() { @Override public void onItemSingleClick(AdapterView<?> adapterView, View view, int position, long row) { if (!TextUtils.isEmpty(mEtContent.getText()) && !mEtContent.getText().toString().endsWith("\n")) mEtContent.append("\n"); mEtContent.append(contents[position].getContent()); mEtContent.requestFocus(); mEtContent.setSelection(mEtContent.getText().length()); dialog.dismiss(); } }); } private void showDeletePostDialog() { final AlertDialog.Builder popDialog = new AlertDialog.Builder(getActivity()); popDialog.setTitle("删除本帖?"); popDialog.setMessage(HtmlCompat.fromHtml("确认删除发表的内容吗?<br><br><font color=red>注意:此操作不可恢复。</font>")); popDialog.setPositiveButton("删除", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mDeleteMode = true; postReply(); } }); popDialog.setIcon(new IconicsDrawable(getActivity(), FontAwesome.Icon.faw_exclamation_circle).sizeDp(24).color(Color.RED)); popDialog.setNegativeButton("取消", null); popDialog.create().show(); } private void updateImageInfo() { if (mUploadImages.size() > 0) { mTvImagesInfo.setVisibility(View.VISIBLE); mTvImagesInfo.setText("图片 <" + mUploadImages.size() + ">"); if (mImageAdapter != null) mImageAdapter.setImages(mUploadImages.values()); } else { mTvImagesInfo.setText("没有图片"); mTvImagesInfo.setVisibility(View.GONE); } } private void appendImage(String imgId) { if (isValidImgId(imgId)) { String imgTxt = "[attachimg]" + imgId + "[/attachimg]\n"; int selectionStart = mContentPosition; if (mContentPosition < 0 || mContentPosition > mEtContent.length()) selectionStart = mEtContent.getSelectionStart(); if (selectionStart > 0 && mEtContent.getText().charAt(selectionStart - 1) != '\n') imgTxt = "\n" + imgTxt; mEtContent.getText().insert(selectionStart, imgTxt); mEtContent.setSelection(selectionStart + imgTxt.length()); mContentPosition = selectionStart + imgTxt.length(); mEtContent.requestFocus(); mPrePostInfo.addNewAttach(imgId); mPrePostInfo.addImage(imgId); } } private class PrePostListener implements PrePostAsyncTask.PrePostListener { @Override public void PrePostComplete(int mode, boolean result, String message, PrePostInfoBean info) { mFetchingInfo = false; mProgressBar.hide(); if (result) { mPrePostInfo = info; setupPrePostInfo(); if (mFetchInfoCount > 1) UIUtils.toast("收集信息成功"); } else { if (getView() != null) { mSnackbar = Snackbar.make(getView(), "收集信息失败 : " + message, Snackbar.LENGTH_LONG); UIUtils.setSnackbarMessageTextColor(mSnackbar, ContextCompat.getColor(getActivity(), R.color.md_yellow_500)); mSnackbar.setAction("重试", new View.OnClickListener() { @Override public void onClick(View v) { fetchPrePostInfo(true); mSnackbar.dismiss(); } }); mSnackbar.show(); } } } } private void fetchPrePostInfo(boolean showProgressNow) { if (!mFetchingInfo) { mFetchingInfo = true; mFetchInfoCount++; if (showProgressNow) mProgressBar.showNow(); else mProgressBar.show(); mPrePostAsyncTask = new PrePostAsyncTask(getActivity(), mPrePostListener, mMode); PostBean postBean = new PostBean(); postBean.setTid(mTid); postBean.setPid(mPid); postBean.setFid(mFid); mPrePostAsyncTask.execute(postBean); } } private void setupPrePostInfo() { if (mPrePostInfo == null) return; setHasOptionsMenu(true); getActivity().invalidateOptionsMenu(); mTypeValues = mPrePostInfo.getTypeValues(); mTypeId = mPrePostInfo.getTypeId(); if (mTypeValues.size() > 0) { mTvType.setText(mTypeValues.get(mTypeId)); mTvType.setTag(mTypeId); mTvType.setVisibility(View.VISIBLE); mTvType.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showThreadTypesDialog(); } }); } if (TextUtils.isEmpty(mEtContent.getText())) { mEtContent.setText(EmojiParser.parseToUnicode(mPrePostInfo.getText())); } if (TextUtils.isEmpty(mEtSubject.getText()) && !TextUtils.isEmpty(mPrePostInfo.getSubject())) { mEtSubject.setText(EmojiParser.parseToUnicode(mPrePostInfo.getSubject())); mEtSubject.setVisibility(View.VISIBLE); } if (mMode == PostHelper.MODE_QUOTE_POST || mMode == PostHelper.MODE_REPLY_POST) { mTvQuoteText.setTextSize(HiSettingsHelper.getInstance().getPostTextSize()); UIUtils.setLineSpacing(mTvQuoteText); mTvQuoteText.setText(mQuoteText); mTvQuoteText.setVisibility(View.VISIBLE); mTvQuoteText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UIUtils.showMessageDialog(getActivity(), mFloor + "# " + mFloorAuthor, mQuoteText, true); } }); } } private boolean isValidImgId(String imgId) { return !TextUtils.isEmpty(imgId) && TextUtils.isDigitsOnly(imgId) && imgId.length() > 1; } public boolean isUserInputted() { return !TextUtils.isEmpty(mEtContent.getText()) || !TextUtils.isEmpty(mEtSubject.getText()) || mUploadImages.size() > 0; } @Override public boolean onBackPressed() { if (isUserInputted()) { Dialog dialog = new AlertDialog.Builder(getActivity()) .setTitle("放弃发表?") .setMessage("\n确认放弃已输入的内容吗?\n") .setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { PostFragment.this.getActivity().finish(); } }) .setNegativeButton(getResources().getString(android.R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).create(); dialog.show(); return true; } return false; } private void showAppendDeviceInfoDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("追加系统信息?"); builder.setMessage("反馈问题时,提供系统信息可以帮助开发者更好的定位问题。\n\n" + Utils.getDeviceInfo()); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int selectionStart = 0; String deviceInfo = Utils.getDeviceInfo(); if (mContentPosition < 0 || mContentPosition > mEtContent.length()) selectionStart = mEtContent.getSelectionStart(); if (selectionStart > 0 && mEtContent.getText().charAt(selectionStart - 1) != '\n') deviceInfo = "\n" + deviceInfo; mEtContent.getText().insert(selectionStart, deviceInfo); } }); builder.setNegativeButton(android.R.string.cancel, null); final AlertDialog dialog = builder.create(); dialog.show(); } private void showThreadTypesDialog() { final LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View viewlayout = inflater.inflate(R.layout.dialog_forum_types, null); final ListView listView = (ListView) viewlayout.findViewById(R.id.lv_forum_types); listView.setAdapter(new ThreadTypeAdapter(getActivity(), mTypeValues)); final AlertDialog.Builder popDialog = new AlertDialog.Builder(getActivity()); popDialog.setView(viewlayout); final AlertDialog dialog = popDialog.create(); dialog.show(); listView.setOnItemClickListener(new OnViewItemSingleClickListener() { @Override public void onItemSingleClick(AdapterView<?> adapterView, View view, int position, long row) { mTypeId = mTypeValues.keySet().toArray()[position].toString(); mTvType.setText(mTypeValues.get(mTypeId)); dialog.dismiss(); } }); } private void showImagesDialog() { final LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View viewlayout = inflater.inflate(R.layout.dialog_images, null); final GridView gridView = (GridView) viewlayout.findViewById(R.id.gv_images); gridView.setAdapter(mImageAdapter); final AlertDialog.Builder popDialog = new AlertDialog.Builder(getActivity()); popDialog.setView(viewlayout); final AlertDialog dialog = popDialog.create(); dialog.show(); gridView.setOnItemClickListener(new OnViewItemSingleClickListener() { @Override public void onItemSingleClick(AdapterView<?> adapterView, View view, int position, long row) { if (view.getTag() != null) appendImage(view.getTag().toString()); dialog.dismiss(); } }); } private void imageProcess(int total, int current, int percentage) { mProgressDialog.setMessage("正在上传... (" + (current + 1) + "/" + total + ")"); } private void imageDone(ImageUploadEvent event) { UploadImage image = event.mImage; mUploadImages.put(image.getUri(), image); if (isValidImgId(image.getImgId())) { mEmojiPopup.addImage(image.getImgId(), image.getThumb()); appendImage(image.getImgId()); } else { UIUtils.errorSnack(getView(), "图片上传失败:" + Utils.nullToText(event.mMessage), event.mDetail); } updateImageInfo(); } private void imageAllDone() { mImageUploading = false; mProgressDialog.dismiss(); updateImageInfo(); } @SuppressWarnings("unused") @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEvent(ImageUploadEvent event) { if (!mSessionId.equals(event.mSessionId)) return; Collection<ImageUploadEvent> events = new ArrayList<>(); if (event.holdEvents != null && event.holdEvents.size() > 0) { events.addAll(event.holdEvents); } events.add(event); for (ImageUploadEvent evt : events) { if (evt.mType == ImageUploadEvent.UPLOADING) { imageProcess(evt.mTotal, evt.mCurrent, evt.mPercentage); } else if (evt.mType == ImageUploadEvent.ITEM_DONE) { imageDone(evt); } else if (evt.mType == ImageUploadEvent.ALL_DONE) { imageAllDone(); } } EventBus.getDefault().removeStickyEvent(event); } private class SavedContentsAdapter extends ArrayAdapter { Content[] contents; public SavedContentsAdapter(Context context, int resource, Content[] objects) { super(context, resource, objects); contents = objects; } @Override public View getView(int position, View convertView, ViewGroup parent) { View row; if (convertView == null) { LayoutInflater inflater = getActivity().getLayoutInflater(); row = inflater.inflate(R.layout.item_saved_content, parent, false); } else { row = convertView; } Content content = contents[position]; TextView tvContent = row.findViewById(R.id.tv_content); TextView tvDesc = row.findViewById(R.id.tv_desc); tvContent.setText(content.getContent().replace("\n", " ")); tvDesc.setText(content.getDesc()); return row; } } }