十日冲刺(DAY7)
第七天,开始第一步增
package com.example.myactivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.myactivity.comm.GlideSimpleLoader;
import com.example.myactivity.util.ContentUriUtil;
import com.example.myactivity.view.imagewatcher.ImageWatcherHelper;
import com.example.myactivity.ui.BaseActivity;
import com.example.myactivity.view.RichTextEditor;
import com.example.myactivity.db.bean.Group;
import com.example.myactivity.db.bean.Note;
import com.example.myactivity.comm.MyGlideEngine;
import com.example.myactivity.db.GroupDao;
import com.example.myactivity.db.NoteDao;
import com.example.myactivity.util.CommonUtil;
import com.example.myactivity.util.ImageUtils;
import com.example.myactivity.util.SDCardUtil;
import com.example.myactivity.util.StringUtils;
import com.example.myactivity.view.matisse.Matisse;
import com.example.myactivity.view.matisse.MimeType;
import com.example.myactivity.view.matisse.internal.entity.CaptureStrategy;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import androidx.appcompat.widget.Toolbar;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
-
新建日记
*/
public class NewActivity extends BaseActivity {
private static final int REQUEST_CODE_CHOOSE = 23;//定义请求码常量private EditText et_new_title;
private RichTextEditor et_new_content;
private TextView tv_new_time;
private TextView tv_new_group;private GroupDao groupDao;
private NoteDao noteDao;
private Note note;//日记对象
private String myTitle;
private String myContent;
private String myGroupName;
private String myNoteTime;
private int flag;//区分是新建日记还是编辑日记private static final int cutTitleLength = 20;//截取的标题长度
private ProgressDialog loadingDialog;
private ProgressDialog insertDialog;
private int screenWidth;
private int screenHeight;
private Disposable subsLoading;
private Disposable subsInsert;
private ImageWatcherHelper iwHelper;@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);initView();
}
private void initView() {
Toolbar toolbar = findViewById(R.id.toolbar_new);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
//toolbar.setNavigationIcon(R.drawable.ic_dialog_info);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dealwithExit();
}
});iwHelper = ImageWatcherHelper.with(this, new GlideSimpleLoader()); groupDao = new GroupDao(this); noteDao = new NoteDao(this); note = new Note(); screenWidth = CommonUtil.getScreenWidth(this); screenHeight = CommonUtil.getScreenHeight(this); insertDialog = new ProgressDialog(this); insertDialog.setMessage("正在插入图片..."); insertDialog.setCanceledOnTouchOutside(false); et_new_title = findViewById(R.id.et_new_title); et_new_content = findViewById(R.id.et_new_content); tv_new_time = findViewById(R.id.tv_new_time); tv_new_group = findViewById(R.id.tv_new_group); openSoftKeyInput();//打开软键盘显示 try { Intent intent = getIntent(); flag = intent.getIntExtra("flag", 0);//0新建,1编辑 if (flag == 1) {//编辑 setTitle("编辑"); Bundle bundle = intent.getBundleExtra("data"); note = (Note) bundle.getSerializable("note"); if (note != null) { myTitle = note.getTitle(); myContent = note.getContent(); myNoteTime = note.getCreateTime(); Group group = groupDao.queryGroupById(note.getGroupId()); if (group != null) { myGroupName = group.getName(); tv_new_group.setText(myGroupName); } loadingDialog = new ProgressDialog(this); loadingDialog.setMessage("数据加载中..."); loadingDialog.setCanceledOnTouchOutside(false); loadingDialog.show(); tv_new_time.setText(note.getCreateTime()); et_new_title.setText(note.getTitle()); et_new_content.post(new Runnable() { @Override public void run() { dealWithContent(); } }); } } else { setTitle("新建"); if (myGroupName == null || "全部".equals(myGroupName)) { myGroupName = "默认日记"; } tv_new_group.setText(myGroupName); myNoteTime = CommonUtil.date2string(new Date()); tv_new_time.setText(myNoteTime); } } catch (Exception e) { e.printStackTrace(); }
}
private void dealWithContent() {
//showEditData(note.getContent());
et_new_content.clearAllLayout();
showDataSync(note.getContent());// 图片删除事件 et_new_content.setOnRtImageDeleteListener(new RichTextEditor.OnRtImageDeleteListener() { @Override public void onRtImageDelete(String imagePath) { if (!TextUtils.isEmpty(imagePath)) { boolean isOK = SDCardUtil.deleteFile(imagePath); if (isOK) { showToast("删除成功:" + imagePath); } } } }); // 图片点击事件 et_new_content.setOnRtImageClickListener(new RichTextEditor.OnRtImageClickListener() { @Override public void onRtImageClick(View view, String imagePath) { try { myContent = getEditData(); if (!TextUtils.isEmpty(myContent)) { List<String> imageList = StringUtils.getTextFromHtml(myContent, true); if (!TextUtils.isEmpty(imagePath)) { int currentPosition = imageList.indexOf(imagePath);
// showToast("点击图片:" + currentPosition + ":" + imagePath);
List<Uri> dataList = new ArrayList<>();
for (int i = 0; i < imageList.size(); i++) {
dataList.add(ImageUtils.getUriFromPath(imageList.get(i)));
}
iwHelper.show(dataList, currentPosition);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* 关闭软键盘
*/
private void closeSoftKeyInput() {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
//boolean isOpen=imm.isActive();//isOpen若返回true,则表示输入法打开
if (imm != null && imm.isActive() && getCurrentFocus() != null) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
/**
* 打开软键盘
*/
private void openSoftKeyInput() {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
//boolean isOpen=imm.isActive();//isOpen若返回true,则表示输入法打开
if (imm != null && !imm.isActive() && et_new_content != null) {
et_new_content.requestFocus();
//第二个参数可设置为0
//imm.showSoftInput(et_content, InputMethodManager.SHOW_FORCED);//强制显示
imm.showSoftInputFromInputMethod(et_new_content.getWindowToken(),
InputMethodManager.SHOW_FORCED);
}
}
/**
* 异步方式显示数据
*/
private void showDataSync(final String html) {
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) {
showEditData(emitter, html);
}
})
//.onBackpressureBuffer()
.subscribeOn(Schedulers.io())//生产事件在io
.observeOn(AndroidSchedulers.mainThread())//消费事件在UI线程
.subscribe(new Observer<String>() {
@Override
public void onComplete() {
if (loadingDialog != null) {
loadingDialog.dismiss();
}
if (et_new_content != null) {
//在图片全部插入完毕后,再插入一个EditText,防止最后一张图片后无法插入文字
et_new_content.addEditTextAtIndex(et_new_content.getLastIndex(), "");
}
}
@Override
public void onError(Throwable e) {
if (loadingDialog != null) {
loadingDialog.dismiss();
}
showToast("解析错误:图片不存在或已损坏");
}
@Override
public void onSubscribe(Disposable d) {
subsLoading = d;
}
@Override
public void onNext(String text) {
try {
if (et_new_content != null) {
if (text.contains("<img") && text.contains("src=")) {
//imagePath可能是本地路径,也可能是网络地址
String imagePath = StringUtils.getImgSrc(text);
//Log.e("---", "###imagePath=" + imagePath);
//插入空的EditText,以便在图片前后插入文字
et_new_content.addEditTextAtIndex(et_new_content.getLastIndex(), "");
et_new_content.addImageViewAtIndex(et_new_content.getLastIndex(), imagePath);
} else {
et_new_content.addEditTextAtIndex(et_new_content.getLastIndex(), text);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* 显示数据
*/
protected void showEditData(ObservableEmitter<String> emitter, String html) {
try {
List<String> textList = StringUtils.cutStringByImgTag(html);
for (int i = 0; i < textList.size(); i++) {
String text = textList.get(i);
emitter.onNext(text);
}
emitter.onComplete();
} catch (Exception e) {
e.printStackTrace();
emitter.onError(e);
}
}
/**
* 负责处理编辑数据提交等事宜,请自行实现
*/
private String getEditData() {
StringBuilder content = new StringBuilder();
try {
List<RichTextEditor.EditData> editList = et_new_content.buildEditData();
for (RichTextEditor.EditData itemData : editList) {
if (itemData.inputStr != null) {
content.append(itemData.inputStr);
} else if (itemData.imagePath != null) {
content.append("<img src=\"").append(itemData.imagePath).append("\"/>");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return content.toString();
}
/**
* 保存数据,=0销毁当前界面,=1不销毁界面,为了防止在后台时保存日记并销毁,应该只保存日记
*/
private void saveNoteData(boolean isBackground) {
String noteTitle = et_new_title.getText().toString();
String noteContent = getEditData();
String groupName = tv_new_group.getText().toString();
String noteTime = tv_new_time.getText().toString();
try {
Group group = groupDao.queryGroupByName(myGroupName);
if (group != null) {
if (noteTitle.length() == 0) {//如果标题为空,则截取内容为标题
if (noteContent.length() > cutTitleLength) {
noteTitle = noteContent.substring(0, cutTitleLength);
} else if (noteContent.length() > 0) {
noteTitle = noteContent;
}
}
int groupId = group.getId();
note.setTitle(noteTitle);
note.setContent(noteContent);
note.setGroupId(groupId);
note.setGroupName(groupName);
note.setType(2);
note.setBgColor("#FFFFFF");
note.setIsEncrypt(0);
note.setCreateTime(CommonUtil.date2string(new Date()));
if (flag == 0) {//新建日记
if (noteTitle.length() == 0 && noteContent.length() == 0) {
if (!isBackground) {
Toast.makeText(NewActivity.this, "请输入内容", Toast.LENGTH_SHORT).show();
}
} else {
long noteId = noteDao.insertNote(note);
note.setId((int) noteId);
flag = 1;
if (!isBackground) {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
}
}
} else if (flag == 1) {//编辑日记
if (!noteTitle.equals(myTitle) || !noteContent.equals(myContent)
|| !groupName.equals(myGroupName) || !noteTime.equals(myNoteTime)) {
noteDao.updateNote(note);
}
if (!isBackground) {
finish();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_new, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_insert_image:
closeSoftKeyInput();//关闭软键盘
callGallery();
break;
case R.id.action_new_save:
try {
saveNoteData(false);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
return super.onOptionsItemSelected(item);
}
/**
* 调用图库选择
*/
private void callGallery() {
//调用系统图库
// Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "video/*");// 相片类型
// startActivityForResult(intent, 1);
Matisse.from(this)
// .choose(MimeType.ofAll())
.choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))//MimeType.MP4
.countable(true)//true:选中后显示数字;false:选中后显示对号
.maxSelectable(3)//最大选择数量为9
//.addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))//图片显示表格的大小
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)//图像选择和预览活动所需的方向
.thumbnailScale(0.85f)//缩放比例
.theme(R.style.Matisse_Zhihu)//主题 暗色主题 R.style.Matisse_Dracula
.imageEngine(new MyGlideEngine())//图片加载方式,Glide4需要自定义实现
.capture(true) //是否提供拍照功能,兼容7.0系统需要下面的配置
//参数1 true表示拍照存储在共有目录,false表示存储在私有目录;参数2与 AndroidManifest中authorities值相同,用于适配7.0系统 必须设置
.captureStrategy(new CaptureStrategy(true, "com.example.myactivity.view.matisse.fileprovider"))//存储到哪里
.forResult(REQUEST_CODE_CHOOSE);//请求码
}
@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (data != null) {
if (requestCode == 1) {
//处理调用系统图库
Uri uri = data.getData();
String mFilePath = ContentUriUtil.getPath(this, uri);
// Log.e("视频路径","视频路径 mFilePath = "+mFilePath);
} else if (requestCode == REQUEST_CODE_CHOOSE) {
//异步方式插入图片
insertImagesSync(data);
}
}
}
}
/**
* 异步方式插入图片
*/
private void insertImagesSync(final Intent data) {
insertDialog.show();
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) {
try {
et_new_content.measure(0, 0);
List<Uri> mSelected = Matisse.obtainResult(data);
// 可以同时插入多张图片
for (Uri imageUri : mSelected) {
String imagePath = SDCardUtil.getFilePathFromUri(NewActivity.this, imageUri);
emitter.onNext(imagePath);
}
emitter.onComplete();
} catch (Exception e) {
e.printStackTrace();
emitter.onError(e);
}
}
})
//.onBackpressureBuffer()
.subscribeOn(Schedulers.io())//生产事件在io
.observeOn(AndroidSchedulers.mainThread())//消费事件在UI线程
.subscribe(new Observer<String>() {
@Override
public void onComplete() {
if (insertDialog != null && insertDialog.isShowing()) {
insertDialog.dismiss();
}
showToast("插入成功");
}
@Override
public void onError(Throwable e) {
if (insertDialog != null && insertDialog.isShowing()) {
insertDialog.dismiss();
}
showToast("插入失败:" + e.getMessage());
}
@Override
public void onSubscribe(Disposable d) {
subsInsert = d;
}
@Override
public void onNext(String imagePath) {
et_new_content.insertImage(imagePath);
}
});
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
try {
//如果APP处于后台,或者手机锁屏,则保存数据
if (CommonUtil.isAppOnBackground(getApplicationContext()) ||
CommonUtil.isLockScreeen(getApplicationContext())) {
saveNoteData(true);//处于后台时保存数据
}
if (subsLoading != null && subsLoading.isDisposed()) {
subsLoading.dispose();
}
if (subsInsert != null && subsInsert.isDisposed()) {
subsInsert.dispose();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 退出处理
*/
private void dealwithExit() {
try {
String noteTitle = et_new_title.getText().toString();
String noteContent = getEditData();
String groupName = tv_new_group.getText().toString();
String noteTime = tv_new_time.getText().toString();
if (flag == 0) {//新建日记
if (noteTitle.length() > 0 || noteContent.length() > 0) {
saveNoteData(false);
}
} else if (flag == 1) {//编辑日记
if (!noteTitle.equals(myTitle) || !noteContent.equals(myContent)
|| !groupName.equals(myGroupName) || !noteTime.equals(myNoteTime)) {
saveNoteData(false);
}
}
} catch (Exception e) {
e.printStackTrace();
}
finish();
}
@Override
public void onBackPressed() {
if (!iwHelper.handleBackPressed()) {
super.onBackPressed();
}
dealwithExit();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2023-05-04 c++打卡练习(20)