/* * Copyright 2016. SHENQINCI(沈钦赐)<dev@qinc.me> * * 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 ren.qinc.markdowneditors.view; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.FragmentActivity; import android.support.v7.app.AlertDialog; import android.text.Editable; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.Toast; import java.io.File; import butterknife.Bind; import de.mrapp.android.bottomsheet.BottomSheet; import ren.qinc.edit.PerformEdit; import ren.qinc.markdowneditors.AppContext; import ren.qinc.markdowneditors.R; import ren.qinc.markdowneditors.base.BaseApplication; import ren.qinc.markdowneditors.base.BaseFragment; import ren.qinc.markdowneditors.base.mvp.IMvpView; import ren.qinc.markdowneditors.engine.PerformEditable; import ren.qinc.markdowneditors.engine.PerformInputAfter; import ren.qinc.markdowneditors.event.RxEvent; import ren.qinc.markdowneditors.event.RxEventBus; import ren.qinc.markdowneditors.presenter.EditorFragmentPresenter; import ren.qinc.markdowneditors.presenter.IEditorFragmentView; import ren.qinc.markdowneditors.utils.SystemUtils; /** * 编辑界面 * Created by 沈钦赐 on 16/1/21. */ public class EditorFragment extends BaseFragment implements IEditorFragmentView, View.OnClickListener { public static final String FILE_PATH_KEY = "FILE_PATH_KEY"; @Bind(R.id.title) protected EditText mName; @Bind(R.id.content) protected EditText mContent; private EditorFragmentPresenter mPresenter; private PerformEditable mPerformEditable; private PerformEdit mPerformEdit; private PerformEdit mPerformNameEdit; public EditorFragment() { } public static EditorFragment getInstance(String filePath) { EditorFragment editorFragment = new EditorFragment(); Bundle bundle = new Bundle(); bundle.putString(FILE_PATH_KEY, filePath); editorFragment.setArguments(bundle); return editorFragment; } @Override public int getLayoutId() { return R.layout.fragment_editor; } @Override public void onCreateAfter(Bundle savedInstanceState) { Bundle arguments = getArguments(); String fileTemp = arguments.getString(FILE_PATH_KEY); if (fileTemp == null) { Toast.makeText(AppContext.context(), "路径参数有误!", Toast.LENGTH_SHORT).show(); return; } File file = new File(fileTemp); //创建新文章 mPresenter = new EditorFragmentPresenter(file); mPresenter.attachView(this); //代码格式化或者插入操作 mPerformEditable = new PerformEditable(mContent); //撤销和恢复初始化 mPerformEdit = new PerformEdit(mContent) { @Override protected void onTextChanged(Editable s) { //文本改变 mPresenter.textChange(); } }; mPerformNameEdit = new PerformEdit(mName) { @Override protected void onTextChanged(Editable s) { //文本改变 mPresenter.textChange(); } }; //文本输入监听(用于自动输入) PerformInputAfter.start(mContent); //装置数据 if (file.isFile()) mPresenter.loadFile(); } @Override public void initData() { } @Override public void onDestroyView() { super.onDestroyView(); if (mPresenter != null) mPresenter.detachView();//VP分离 mPresenter = null; } @Override public void otherSuccess(int flag) { switch (flag) { case CALL_EXIT: getActivity().finish(); break; case CALL_NO_SAVE: noSave(); break; case CALL_SAVE: saved(); break; } } @Override public void onFailure(int errorCode, String message, int flag) { switch (flag) { case CALL_SAVE: case CALL_LOAOD_FILE: BaseApplication.showSnackbar(mContent, message); break; default: BaseApplication.showSnackbar(mContent, message); break; } } @Override public void showWait(String message, boolean canBack, int flag) { FragmentActivity activity = getActivity(); if (activity == null) { return; } if (!(activity instanceof IMvpView)) { return; } IMvpView iMvpView = (IMvpView) activity; iMvpView.showWait(message, canBack, flag); } @Override public void hideWait(int flag) { FragmentActivity activity = getActivity(); if (activity == null) { return; } if (!(activity instanceof IMvpView)) { return; } IMvpView iMvpView = (IMvpView) activity; iMvpView.hideWait(flag); } public PerformEditable getPerformEditable() { return mPerformEditable; } @Override public boolean hasMenu() { return true; } //菜单 private MenuItem mActionSave; @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_editor_frag, menu); mActionSave = menu.findItem(R.id.action_save); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_share://分享 shareMenu(); return true; case R.id.action_undo://撤销 mPerformEdit.undo(); return true; case R.id.action_redo://重做 mPerformEdit.redo(); return true; case R.id.action_save://保存 mPresenter.save(mName.getText().toString().trim(), mContent.getText().toString().trim()); return true; } return super.onOptionsItemSelected(item); } private void shareMenu() { SystemUtils.hideSoftKeyboard(mContent); if (mName.getText().toString().isEmpty()) { AppContext.showSnackbar(mContent, "当前标题为空"); return; } if (mContent.getText().toString().isEmpty()) { AppContext.showSnackbar(mContent, "当前内容为空"); return; } mPresenter.save(mName.getText().toString(), mContent.getText().toString()); BottomSheet.Builder builder = new BottomSheet.Builder(getActivity()); // builder.setTitle(R.string.bottom_sheet_title); builder.addItem(0, R.string.share_copy_text); builder.addItem(1, R.string.share_text); builder.addItem(2, R.string.share_md); // builder.addDivider(); // builder.addItem(3, R.string.share_html); // builder.addItem(4, R.string.share_png); builder.setOnItemClickListener((parent, view, position, id) -> { switch ((int) id) { case 0://复制 shareCopyText(); break; case 1://分享文本 shareText(); break; case 2://分享md文件 shareMD(); break; } }); BottomSheet bottomSheet = builder.create(); bottomSheet.show(); } private void shareCopyText() { SystemUtils.copyToClipBoard(getActivity(), mContent.getText().toString()); } private void shareText() { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_TEXT, mContent.getText().toString()); shareIntent.setType("text/plain"); BottomSheet.Builder builder = new BottomSheet.Builder(getActivity(), R.style.AppTheme); builder.setIntent(getActivity(), shareIntent); BottomSheet bottomSheet = builder.create(); bottomSheet.show(); } private void shareMD() { Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mPresenter.getMDFile())); shareIntent.setType("*/*"); // startActivity(Intent.createChooser(share,"Share Image")); BottomSheet.Builder builder = new BottomSheet.Builder(getActivity()); builder.setIntent(getActivity(), shareIntent); BottomSheet bottomSheet = builder.create(); bottomSheet.show(); } @Override public void onReadSuccess(@NonNull String name, @NonNull String content) { mPerformNameEdit.setDefaultText(name.substring(0, name.lastIndexOf("."))); mPerformEdit.setDefaultText(content); if (content.length() > 0) { //切换到预览界面 // RxEventBus.getInstance().send(new RxEvent(RxEvent.TYPE_SHOW_PREVIEW, mName.getText().toString(), mContent.getText().toString())); } } public void noSave() { if (mActionSave == null) return; mActionSave.setIcon(R.drawable.ic_action_unsave); } public void saved() { if (mActionSave == null) return; mActionSave.setIcon(R.drawable.ic_action_save); } @Override public boolean hasNeedEvent(int type) { //接受刷新数据 return type == RxEvent.TYPE_REFRESH_NOTIFY; } @Override public void onEventMainThread(RxEvent event) { if (event.isType(RxEvent.TYPE_REFRESH_NOTIFY)) { //刷新markdown渲染 RxEventBus.getInstance().send(new RxEvent(RxEvent.TYPE_REFRESH_DATA, mName.getText().toString(), mContent.getText().toString())); } } @Override public boolean onBackPressed() { if (mPresenter.isSave()) { return false; } onNoSave(); return true; } private void onNoSave() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.DialogTheme); builder.setMessage("当前文件未保存,是否退出?"); builder.setNegativeButton("不保存", (dialog, which) -> { getActivity().finish(); }).setNeutralButton("取消", (dialog, which) -> { dialog.dismiss(); }).setPositiveButton("保存", (dialog, which) -> { mPresenter.saveForExit(mName.getText().toString().trim(), mContent.getText().toString().trim(), true); }).show(); } @Override public void onClick(View v) { } }