|
|
|
@ -35,6 +35,8 @@ import android.text.SpannableString;
|
|
|
|
|
import android.text.TextUtils;
|
|
|
|
|
import android.text.format.DateUtils;
|
|
|
|
|
import android.text.style.BackgroundColorSpan;
|
|
|
|
|
import android.text.Editable;
|
|
|
|
|
import android.text.TextWatcher;
|
|
|
|
|
import android.util.Log;
|
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
|
import android.view.Menu;
|
|
|
|
@ -51,6 +53,10 @@ import android.widget.ImageView;
|
|
|
|
|
import android.widget.LinearLayout;
|
|
|
|
|
import android.widget.TextView;
|
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
import android.os.Environment;
|
|
|
|
|
import android.graphics.Bitmap;
|
|
|
|
|
import android.graphics.Typeface; // 自带四种字体
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import net.micode.notes.R;
|
|
|
|
|
import net.micode.notes.data.Notes;
|
|
|
|
@ -65,15 +71,27 @@ import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
|
|
|
|
|
import net.micode.notes.widget.NoteWidgetProvider_2x;
|
|
|
|
|
import net.micode.notes.widget.NoteWidgetProvider_4x;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
import java.util.LinkedList;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.regex.Matcher;
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
import java.util.Vector;
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.FileOutputStream;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
NoteSettingChangedListener, OnTextViewChangeListener {
|
|
|
|
|
|
|
|
|
|
public class NoteEditActivity extends Activity //NOTE: extends--单继承,但可多重继承 @zhoukexing 2023/12/17 23:29
|
|
|
|
|
implements OnClickListener, NoteSettingChangedListener, OnTextViewChangeListener {
|
|
|
|
|
private Intent intent; //NOTE: implements--实现接口 @zhoukexing 2023/12/17 23:24
|
|
|
|
|
/** NOTE:
|
|
|
|
|
*
|
|
|
|
|
* @zhoukexing 2023/12/17 23:39
|
|
|
|
|
*/
|
|
|
|
|
private class HeadViewHolder {
|
|
|
|
|
public TextView tvModified;
|
|
|
|
|
|
|
|
|
@ -81,6 +99,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
|
|
|
|
|
public TextView tvAlertDate;
|
|
|
|
|
|
|
|
|
|
// 顶部置顶文本
|
|
|
|
|
public TextView tvTopText;
|
|
|
|
|
|
|
|
|
|
// 顶部长度统计文本
|
|
|
|
|
public TextView tvTextNum;
|
|
|
|
|
|
|
|
|
|
public ImageView ibSetBgColor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -118,8 +142,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final String TAG = "NoteEditActivity";
|
|
|
|
|
|
|
|
|
|
private static int mMaxRevokeTimes = 10;
|
|
|
|
|
|
|
|
|
|
private HeadViewHolder mNoteHeaderHolder;
|
|
|
|
|
|
|
|
|
|
private View mHeadViewPanel;
|
|
|
|
@ -136,8 +165,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
|
|
|
|
|
private SharedPreferences mSharedPrefs;
|
|
|
|
|
private int mFontSizeId;
|
|
|
|
|
private int mFontStyleId;
|
|
|
|
|
|
|
|
|
|
private static final String PREFERENCE_FONT_SIZE = "pref_font_size";
|
|
|
|
|
private static final String PREFERENCE_FONT_STYLE = "pref_font_style";
|
|
|
|
|
|
|
|
|
|
private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10;
|
|
|
|
|
|
|
|
|
@ -149,15 +180,36 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
private String mUserQuery;
|
|
|
|
|
private Pattern mPattern;
|
|
|
|
|
|
|
|
|
|
// 存储改变的数据
|
|
|
|
|
private Vector<SpannableString> mHistory = new Vector<SpannableString>(mMaxRevokeTimes);
|
|
|
|
|
private boolean mIsRvoke;
|
|
|
|
|
|
|
|
|
|
/*--- 以上是此类中的数据区,以下是方法区 ---*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @zkx 2023/12/18 复写了Activity类中的onCreate函数,当用户点击创建时,会进入这个函数
|
|
|
|
|
*/
|
|
|
|
|
/**
|
|
|
|
|
* @method: onCreate
|
|
|
|
|
* @description: 进入场景:在list页面,点击“写便签”时进入;在挂件页面,生成挂件时不进入,点进挂件时才进入;……
|
|
|
|
|
* allinall:在进入编辑页面前都会进入
|
|
|
|
|
* 创建一个编辑活动
|
|
|
|
|
* @date: 2023/12/18 23:22
|
|
|
|
|
* @author: zhoukexing
|
|
|
|
|
* @param: [savedInstanceState]
|
|
|
|
|
* @return: void
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
|
this.setContentView(R.layout.note_edit);
|
|
|
|
|
|
|
|
|
|
if (savedInstanceState == null && !initActivityState(getIntent())) {
|
|
|
|
|
// 表示之前保存的状态,用于还原数据 @lzk 2024/1/3 23:33
|
|
|
|
|
finish();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 初始化资源。我要的设置字体就在这儿
|
|
|
|
|
initResources();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -180,18 +232,26 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean initActivityState(Intent intent) {
|
|
|
|
|
/**
|
|
|
|
|
* @method: initActivityState
|
|
|
|
|
* @description: 根据intent(Key-Value)内容,初始化一个便签活动
|
|
|
|
|
* @date: 2023/12/18 23:31
|
|
|
|
|
* @author: zhoukexing
|
|
|
|
|
* @param: [intent]
|
|
|
|
|
* @return: boolean 为真则初始化成功,为假则失败。失败原因:不存在、(call)load失败、intent内容错误
|
|
|
|
|
*/
|
|
|
|
|
/**
|
|
|
|
|
* If the user specified the {@link Intent#ACTION_VIEW} but not provided with id,
|
|
|
|
|
* then jump to the NotesListActivity
|
|
|
|
|
*/
|
|
|
|
|
mWorkingNote = null;
|
|
|
|
|
if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) {
|
|
|
|
|
// 进入场景:点进一个已有便签 @zhoukexing 2023/12/21 0:14
|
|
|
|
|
long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0);
|
|
|
|
|
mUserQuery = "";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Starting from the searched result
|
|
|
|
|
*/
|
|
|
|
|
// 高亮搜索内容 @lzk 2024/1/3 10:10
|
|
|
|
|
if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) {
|
|
|
|
|
noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));
|
|
|
|
|
mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY);
|
|
|
|
@ -203,7 +263,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
showToast(R.string.error_note_not_exist);
|
|
|
|
|
finish();
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
else {// 如果在数据库里存在,就根据noteId从数据库中加载到工作便签里来 @zhoukexing 2023/12/21 0:16
|
|
|
|
|
mWorkingNote = WorkingNote.load(this, noteId);
|
|
|
|
|
if (mWorkingNote == null) {
|
|
|
|
|
Log.e(TAG, "load note failed with note id" + noteId);
|
|
|
|
@ -211,20 +272,22 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
getWindow().setSoftInputMode(
|
|
|
|
|
getWindow().setSoftInputMode(// 猜:平滑地展示便签内容 @zhoukexing 2023/12/21 0:18
|
|
|
|
|
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
|
|
|
|
|
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
|
|
|
|
|
} else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {
|
|
|
|
|
// New note
|
|
|
|
|
}
|
|
|
|
|
else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {
|
|
|
|
|
// 进入场景:一个New note
|
|
|
|
|
long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0);
|
|
|
|
|
int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID,
|
|
|
|
|
AppWidgetManager.INVALID_APPWIDGET_ID);
|
|
|
|
|
int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE,
|
|
|
|
|
Notes.TYPE_WIDGET_INVALIDE);
|
|
|
|
|
Notes.TYPE_WIDGET_INVALIDE); // widgetType=0: 新建的挂件,空的 @zhoukexing 2023/12/21 0:02
|
|
|
|
|
int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID,
|
|
|
|
|
ResourceParser.getDefaultBgId(this));
|
|
|
|
|
ResourceParser.getDefaultBgId(this));// TODO: 2023/12/21 背景色的设置
|
|
|
|
|
|
|
|
|
|
// Parse call-record note
|
|
|
|
|
// Parse call-record note todo
|
|
|
|
|
// 解析文档,看是否有号码存在,以便展示的时候渲染 @zhoukexing 2023/12/20 23:49
|
|
|
|
|
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
|
|
|
|
|
long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0);
|
|
|
|
|
if (callDate != 0 && phoneNumber != null) {
|
|
|
|
@ -234,6 +297,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
long noteId = 0;
|
|
|
|
|
if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(),
|
|
|
|
|
phoneNumber, callDate)) > 0) {
|
|
|
|
|
// TODO: 2023/12/20
|
|
|
|
|
mWorkingNote = WorkingNote.load(this, noteId);
|
|
|
|
|
if (mWorkingNote == null) {
|
|
|
|
|
Log.e(TAG, "load call note failed with note id" + noteId);
|
|
|
|
@ -245,7 +309,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
widgetType, bgResId);
|
|
|
|
|
mWorkingNote.convertToCallNote(phoneNumber, callDate);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
else { // 没有要显示的电话
|
|
|
|
|
mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType,
|
|
|
|
|
bgResId);
|
|
|
|
|
}
|
|
|
|
@ -253,12 +318,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
getWindow().setSoftInputMode(
|
|
|
|
|
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
|
|
|
|
|
| WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
Log.e(TAG, "Intent not specified action, should not support");
|
|
|
|
|
finish();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
mWorkingNote.setOnSettingStatusChangedListener(this);
|
|
|
|
|
// this是WorkingNote @zhoukexing 2023/12/21 0:08
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -268,9 +335,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
initNoteScreen();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void showTopHeader(){
|
|
|
|
|
if(mWorkingNote.getmTop() == 1){
|
|
|
|
|
mNoteHeaderHolder.tvTopText.setText("已置顶");
|
|
|
|
|
mNoteHeaderHolder.tvTopText.setVisibility(View.VISIBLE);
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
mNoteHeaderHolder.tvTopText.setVisibility(View.GONE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void initNoteScreen() {
|
|
|
|
|
mNoteEditor.setTextAppearance(this, TextAppearanceResources
|
|
|
|
|
.getTexAppearanceResource(mFontSizeId));
|
|
|
|
|
initFontStyle(mNoteEditor, mFontStyleId);
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
switchToListMode(mWorkingNote.getContent());
|
|
|
|
|
} else {
|
|
|
|
@ -293,17 +371,57 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
* is not ready
|
|
|
|
|
*/
|
|
|
|
|
showAlertHeader();
|
|
|
|
|
showTopHeader();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void initFontStyle(EditText edit, int i) {
|
|
|
|
|
if (i == 0) {
|
|
|
|
|
edit.setTypeface(Typeface.DEFAULT);
|
|
|
|
|
} else if (i == 1) {
|
|
|
|
|
edit.setTypeface(Typeface.DEFAULT_BOLD);
|
|
|
|
|
} else if (i == 2) {
|
|
|
|
|
edit.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));
|
|
|
|
|
} else if (i == 3) {
|
|
|
|
|
edit.setTypeface(Typeface.SERIF);
|
|
|
|
|
} else if (i == 4) {
|
|
|
|
|
Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/FZSTK.ttf");
|
|
|
|
|
edit.setTypeface(tf);
|
|
|
|
|
} else if (i == 5) {
|
|
|
|
|
Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/STXINGKA.ttf");
|
|
|
|
|
edit.setTypeface(tf);
|
|
|
|
|
} else if (i == 6) {
|
|
|
|
|
Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/VINERITC.ttf");
|
|
|
|
|
edit.setTypeface(tf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Method showAlertHeader
|
|
|
|
|
* @Date 2023/12/13 11:32
|
|
|
|
|
* @Author lenovo
|
|
|
|
|
* @Return void
|
|
|
|
|
* @Description 在便签页面的上方栏显示提醒信息
|
|
|
|
|
*/
|
|
|
|
|
private void showAlertHeader() {
|
|
|
|
|
if (mWorkingNote.hasClockAlert()) {
|
|
|
|
|
long time = System.currentTimeMillis();
|
|
|
|
|
if (time > mWorkingNote.getAlertDate()) {
|
|
|
|
|
// 闹钟时间大于当前时间, 显示 "Expired", 闹钟失效
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);
|
|
|
|
|
} else {
|
|
|
|
|
// 显示正常闹钟信息
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString(
|
|
|
|
|
mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS));
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* setVisibility()
|
|
|
|
|
* 用于设置空间的可见性
|
|
|
|
|
* VISIBLE 可见
|
|
|
|
|
* INVISIBLE 不可见,但是占用一个位置
|
|
|
|
|
* GNONE 不可见且不占用位置
|
|
|
|
|
* lenovo 2023/12/13 11:28
|
|
|
|
|
*/
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE);
|
|
|
|
|
mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE);
|
|
|
|
|
} else {
|
|
|
|
@ -315,7 +433,15 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
@Override
|
|
|
|
|
protected void onNewIntent(Intent intent) {
|
|
|
|
|
super.onNewIntent(intent);
|
|
|
|
|
initActivityState(intent);
|
|
|
|
|
// 若为搜索事件则设置高亮
|
|
|
|
|
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
|
|
|
|
|
mUserQuery = intent.getStringExtra(SearchManager.QUERY);
|
|
|
|
|
mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
|
|
|
|
|
mNoteEditor.setSelection(mNoteEditor.getText().length());
|
|
|
|
|
}
|
|
|
|
|
else if(!initActivityState(intent)) {
|
|
|
|
|
Log.e(TAG, "Intent Type Error");
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -363,15 +489,61 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Method textFilter
|
|
|
|
|
* @Date 2024/1/18 9:45
|
|
|
|
|
* @param oriText
|
|
|
|
|
* @Author lenovo
|
|
|
|
|
* @Return java.lang.String
|
|
|
|
|
* @Description 过滤掉空格换行等不可见字符
|
|
|
|
|
*/
|
|
|
|
|
private String textFilter(String oriText){
|
|
|
|
|
String newText = oriText;
|
|
|
|
|
newText = newText.replaceAll("\\s", "");
|
|
|
|
|
return newText;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @method: initResources
|
|
|
|
|
* @description: 初始化资源。被onCreate唯一调用
|
|
|
|
|
* @date: 2023/12/18 23:36
|
|
|
|
|
* @author: zhoukexing
|
|
|
|
|
* @param: []
|
|
|
|
|
* @return: void
|
|
|
|
|
*/
|
|
|
|
|
private void initResources() {
|
|
|
|
|
mHeadViewPanel = findViewById(R.id.note_title);
|
|
|
|
|
mNoteHeaderHolder = new HeadViewHolder();
|
|
|
|
|
mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date);
|
|
|
|
|
mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon);
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date);
|
|
|
|
|
mNoteHeaderHolder.tvTopText = (TextView) findViewById(R.id.tv_top_text);
|
|
|
|
|
mNoteHeaderHolder.tvTextNum = (TextView) findViewById(R.id.tv_text_num);
|
|
|
|
|
mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color);
|
|
|
|
|
mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this);
|
|
|
|
|
mNoteEditor = (EditText) findViewById(R.id.note_edit_view);
|
|
|
|
|
mNoteEditor.addTextChangedListener(new TextWatcher() {
|
|
|
|
|
int currentLength = 0;
|
|
|
|
|
@Override
|
|
|
|
|
public void beforeTextChanged(CharSequence s, int start, int count, int after)
|
|
|
|
|
{
|
|
|
|
|
mNoteHeaderHolder.tvTextNum.setVisibility(View.VISIBLE);
|
|
|
|
|
mNoteHeaderHolder.tvTextNum.setText("长度" + String.valueOf(currentLength));
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
|
|
|
|
currentLength = textFilter(mNoteEditor.getText().toString()).length();
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public void afterTextChanged(Editable s) {//储存文本更改的编辑
|
|
|
|
|
if(!mIsRvoke) {
|
|
|
|
|
saveHistory();
|
|
|
|
|
}else {
|
|
|
|
|
mIsRvoke = false;
|
|
|
|
|
}
|
|
|
|
|
mNoteHeaderHolder.tvTextNum.setText("长度" + String.valueOf(currentLength));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
mNoteEditorPanel = findViewById(R.id.sv_note_edit);
|
|
|
|
|
mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector);
|
|
|
|
|
for (int id : sBgSelectorBtnsMap.keySet()) {
|
|
|
|
@ -394,6 +566,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) {
|
|
|
|
|
mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE;
|
|
|
|
|
}
|
|
|
|
|
mFontStyleId = mSharedPrefs.getInt(PREFERENCE_FONT_STYLE, 0); // defult style id--0,即对应“默认”字体 @zkx
|
|
|
|
|
if(mFontStyleId >= 7) {
|
|
|
|
|
mFontStyleId = 0;
|
|
|
|
|
}
|
|
|
|
|
mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -406,6 +582,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
clearSettingState();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @method updateWidget
|
|
|
|
|
* @description 该方法用于实现与桌面小工具同步的功能
|
|
|
|
|
* @date: 2023-12-18 21:37
|
|
|
|
|
* @author: 郑鲲鹏
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
private void updateWidget() {
|
|
|
|
|
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
|
|
|
|
|
if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) {
|
|
|
|
@ -430,7 +613,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
if (id == R.id.btn_set_bg_color) {
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.VISIBLE);
|
|
|
|
|
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
|
|
|
|
|
- View.VISIBLE);
|
|
|
|
|
View.VISIBLE);
|
|
|
|
|
} else if (sBgSelectorBtnsMap.containsKey(id)) {
|
|
|
|
|
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
|
|
|
|
|
View.GONE);
|
|
|
|
@ -442,13 +625,15 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit();
|
|
|
|
|
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
getWorkingText();
|
|
|
|
|
getWorkingText(); // DONE:切换到清单模式后,字体保留
|
|
|
|
|
switchToListMode(mWorkingNote.getContent());
|
|
|
|
|
} else {
|
|
|
|
|
mNoteEditor.setTextAppearance(this,
|
|
|
|
|
TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
|
|
|
|
|
initFontStyle(mNoteEditor, mFontStyleId); // 因为上面的操作会覆盖掉style的显示,所以在这里重新设置一下 @zkx
|
|
|
|
|
}
|
|
|
|
|
mFontSizeSelector.setVisibility(View.GONE);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -502,59 +687,122 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
} else {
|
|
|
|
|
menu.findItem(R.id.menu_delete_remind).setVisible(false);
|
|
|
|
|
}
|
|
|
|
|
if(mWorkingNote.getmTop() == 1){
|
|
|
|
|
menu.findItem(R.id.menu_top).setTitle(R.string.cancel_top);
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
menu.findItem(R.id.menu_top).setTitle(R.string.menu_top);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
|
case R.id.menu_new_note:
|
|
|
|
|
createNewNote();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_delete:
|
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
|
|
|
builder.setTitle(getString(R.string.alert_title_delete));
|
|
|
|
|
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
|
|
|
|
builder.setMessage(getString(R.string.alert_message_delete_note));
|
|
|
|
|
builder.setPositiveButton(android.R.string.ok,
|
|
|
|
|
new DialogInterface.OnClickListener() {
|
|
|
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
|
|
|
deleteCurrentNote();
|
|
|
|
|
finish();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
builder.setNegativeButton(android.R.string.cancel, null);
|
|
|
|
|
builder.show();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_font_size:
|
|
|
|
|
mFontSizeSelector.setVisibility(View.VISIBLE);
|
|
|
|
|
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_list_mode:
|
|
|
|
|
mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?
|
|
|
|
|
TextNote.MODE_CHECK_LIST : 0);
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_share:
|
|
|
|
|
getWorkingText();
|
|
|
|
|
sendTo(this, mWorkingNote.getContent());
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_send_to_desktop:
|
|
|
|
|
sendToDesktop();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_alert:
|
|
|
|
|
setReminder();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_delete_remind:
|
|
|
|
|
mWorkingNote.setAlertDate(0, false);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
/**
|
|
|
|
|
* @method: onOptionsItemSelected
|
|
|
|
|
* @description: 覆写了Activity.java里的onOptionsItemSelected,路线是menu-->item,
|
|
|
|
|
* 这里就是处理识别到的item
|
|
|
|
|
* @date: 2023/12/19 23:35
|
|
|
|
|
* @author: zhoukexing
|
|
|
|
|
* @param: [item]
|
|
|
|
|
* @return: boolean
|
|
|
|
|
*/
|
|
|
|
|
int itemId = item.getItemId();
|
|
|
|
|
if (itemId == R.id.menu_new_note) { // 从item到itemid,用itemid导向对应的不同的动作 @zhoukexing 2023/12/19 23:38
|
|
|
|
|
createNewNote();
|
|
|
|
|
} else if (itemId == R.id.menu_delete) {
|
|
|
|
|
// 构建一个警告⚠对话框,让用户确认是否真的要删除便签 @zhoukexing 2023/12/21 0:41
|
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
|
|
|
builder.setTitle(getString(R.string.alert_title_delete));
|
|
|
|
|
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
|
|
|
|
builder.setMessage(getString(R.string.alert_message_delete_note));
|
|
|
|
|
builder.setPositiveButton(android.R.string.ok,
|
|
|
|
|
new DialogInterface.OnClickListener() {// TODO: 2023/12/21 传入了一个函数作为参数?
|
|
|
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
|
|
|
deleteCurrentNote(); //TODO: 修改这里达成“在便签内点删除进回收站”
|
|
|
|
|
finish();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
builder.setNegativeButton(android.R.string.cancel, null);
|
|
|
|
|
builder.show();
|
|
|
|
|
} else if (itemId == R.id.menu_font_size) {
|
|
|
|
|
mFontSizeSelector.setVisibility(View.VISIBLE);
|
|
|
|
|
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
|
|
|
|
|
} else if (itemId == R.id.menu_list_mode) {
|
|
|
|
|
mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?
|
|
|
|
|
TextNote.MODE_CHECK_LIST : 0);
|
|
|
|
|
} else if (itemId == R.id.menu_share) {
|
|
|
|
|
getWorkingText();
|
|
|
|
|
sendTo(this, mWorkingNote.getContent());
|
|
|
|
|
} else if (itemId == R.id.menu_send_to_desktop) {
|
|
|
|
|
sendToDesktop();
|
|
|
|
|
} else if (itemId == R.id.menu_alert) {
|
|
|
|
|
setReminder();
|
|
|
|
|
} else if (itemId == R.id.menu_delete_remind) {
|
|
|
|
|
mWorkingNote.setAlertDate(0, false);
|
|
|
|
|
} else if (itemId == R.id.menu_search) {
|
|
|
|
|
onSearchRequested();
|
|
|
|
|
} else if (itemId == R.id.menu_top) {
|
|
|
|
|
mWorkingNote.reverseTopState();
|
|
|
|
|
showTopHeader();
|
|
|
|
|
} else if (itemId == R.id.menu_revoke) {
|
|
|
|
|
doRevoke();
|
|
|
|
|
} else if (itemId == R.id.menu_screenshot) {
|
|
|
|
|
doScreenshot();
|
|
|
|
|
} else if (itemId == R.id.menu_font_select) {
|
|
|
|
|
setFontStyle();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean onSearchRequested() {
|
|
|
|
|
startSearch(null, false, null /* appData */, false);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void setFontStyle() {
|
|
|
|
|
final String[] items = {"普通", "加粗", "斜体", "等宽", "方正舒体", "行楷", "VINERITC-en"};
|
|
|
|
|
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
|
|
|
|
dialog.setTitle("设置字体");
|
|
|
|
|
dialog.setCancelable(true);
|
|
|
|
|
dialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onClick(DialogInterface dialog, int i) {
|
|
|
|
|
mFontStyleId = i;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onClick(DialogInterface dialog, int i) {
|
|
|
|
|
mSharedPrefs.edit().putInt(PREFERENCE_FONT_STYLE, mFontStyleId).commit();
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
getWorkingText(); // DONE:切换到清单模式后,字体保留
|
|
|
|
|
switchToListMode(mWorkingNote.getContent());
|
|
|
|
|
} else {
|
|
|
|
|
initFontStyle(mNoteEditor, mFontStyleId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onClick(DialogInterface dialog, int i) {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
dialog.show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Method setReminder
|
|
|
|
|
* @Date 2023/12/13 12:52
|
|
|
|
|
* @Author lenovo
|
|
|
|
|
* @Return void
|
|
|
|
|
* @Description 显示时间选择器,默认时间为当前时间
|
|
|
|
|
*/
|
|
|
|
|
private void setReminder() {
|
|
|
|
|
DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis());
|
|
|
|
|
// 设置时间选择器的监听事件,当选中 date 之后调用 setAlertDate 设置提醒时间
|
|
|
|
|
d.setOnDateTimeSetListener(new OnDateTimeSetListener() {
|
|
|
|
|
public void OnDateTimeSet(AlertDialog dialog, long date) {
|
|
|
|
|
mWorkingNote.setAlertDate(date , true);
|
|
|
|
@ -567,25 +815,53 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
* Share note to apps that support {@link Intent#ACTION_SEND} action
|
|
|
|
|
* and {@text/plain} type
|
|
|
|
|
*/
|
|
|
|
|
/**
|
|
|
|
|
* @method sendTo
|
|
|
|
|
* @description 该方法用于共享便签
|
|
|
|
|
* @date: 2023-12-18 0:57
|
|
|
|
|
* @author: 郑鲲鹏
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
private void sendTo(Context context, String info) {
|
|
|
|
|
// 新建intent消息
|
|
|
|
|
// 2023-12-18 1:00
|
|
|
|
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
|
|
|
|
// 将要分享的便签内容放入intent中
|
|
|
|
|
// 2023-12-18 1:01
|
|
|
|
|
intent.putExtra(Intent.EXTRA_TEXT, info);
|
|
|
|
|
intent.setType("text/plain");
|
|
|
|
|
context.startActivity(intent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void createNewNote() {
|
|
|
|
|
/**
|
|
|
|
|
* @method: createNewNote
|
|
|
|
|
* @description: 从编辑页面,点击“add note”会进入这个创建便签的方法。
|
|
|
|
|
* 此方法会保存并结束当前便签,用NoteEditActivity类实例化一个新的intent(活动意图),
|
|
|
|
|
* 设置行为和指定报错对象后,启动intent活动意图
|
|
|
|
|
* @date: 2023/12/19 23:03
|
|
|
|
|
* @author: zhoukexing
|
|
|
|
|
* @param: []
|
|
|
|
|
* @return: void
|
|
|
|
|
*/
|
|
|
|
|
// Firstly, save current editing notes
|
|
|
|
|
saveNote();
|
|
|
|
|
|
|
|
|
|
// For safety, start a new NoteEditActivity
|
|
|
|
|
finish();
|
|
|
|
|
Intent intent = new Intent(this, NoteEditActivity.class);
|
|
|
|
|
intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
|
|
|
|
|
Intent intent = new Intent(this, NoteEditActivity.class); //Q: 在类的内部,还没有实现完全时,启动这个类自己?@zkx 2023/12/17
|
|
|
|
|
intent.setAction(Intent.ACTION_INSERT_OR_EDIT); // 创建便签后,要插入或者编辑。Q: 为什么要插入 @zhoukexing 2023/12/19 22:57
|
|
|
|
|
intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId());
|
|
|
|
|
startActivity(intent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @method: deleteCurrentNote
|
|
|
|
|
* @description: 删除当前便签。如果在数据库里,还要进一步判断是否在根目录下,是否为同步模式
|
|
|
|
|
* @date: 2023/12/21 0:48
|
|
|
|
|
* @author: zhoukexing
|
|
|
|
|
* @param: []
|
|
|
|
|
* @return: void
|
|
|
|
|
*/
|
|
|
|
|
private void deleteCurrentNote() {
|
|
|
|
|
if (mWorkingNote.existInDatabase()) {
|
|
|
|
|
HashSet<Long> ids = new HashSet<Long>();
|
|
|
|
@ -595,11 +871,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
} else {
|
|
|
|
|
Log.d(TAG, "Wrong note id, should not happen");
|
|
|
|
|
}
|
|
|
|
|
if (!isSyncMode()) {
|
|
|
|
|
if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) {
|
|
|
|
|
Log.e(TAG, "Delete Note error");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (mWorkingNote.getFolderId() == Notes.ID_TRASH_FOLER) {
|
|
|
|
|
if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) {
|
|
|
|
|
Log.e(TAG, "Delete Note error");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) {
|
|
|
|
|
Log.e(TAG, "Move notes to trash folder error, should not happens");
|
|
|
|
|
}
|
|
|
|
@ -612,6 +888,15 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Method onClockAlertChanged
|
|
|
|
|
* @Date 2023/12/13 9:52
|
|
|
|
|
* @param date
|
|
|
|
|
* @param set 0 取消 1 设置
|
|
|
|
|
* @Author lenovo
|
|
|
|
|
* @Return void
|
|
|
|
|
* @Description 设置提醒的监听事件
|
|
|
|
|
*/
|
|
|
|
|
public void onClockAlertChanged(long date, boolean set) {
|
|
|
|
|
/**
|
|
|
|
|
* User could set clock to an unsaved note, so before setting the
|
|
|
|
@ -627,8 +912,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE));
|
|
|
|
|
showAlertHeader();
|
|
|
|
|
if(!set) {
|
|
|
|
|
// 取消监听事件
|
|
|
|
|
alarmManager.cancel(pendingIntent);
|
|
|
|
|
} else {
|
|
|
|
|
// 设置监听事件,到时间启动提醒
|
|
|
|
|
alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
@ -691,7 +978,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void switchToListMode(String text) {
|
|
|
|
|
private void switchToListMode(String text) { // TODO: 在清单模式下设置的字体大小、样式没法保留
|
|
|
|
|
mEditTextList.removeAllViews();
|
|
|
|
|
String[] items = text.split("\n");
|
|
|
|
|
int index = 0;
|
|
|
|
@ -729,6 +1016,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null);
|
|
|
|
|
final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
|
|
|
|
|
edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
|
|
|
|
|
initFontStyle(edit, mFontStyleId);
|
|
|
|
|
CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item));
|
|
|
|
|
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
|
|
|
|
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
|
|
|
@ -806,8 +1094,16 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean saveNote() {
|
|
|
|
|
/**
|
|
|
|
|
* @method: saveNote
|
|
|
|
|
* @description: 获取工作文本,调用真正的保存便签的方法,设置便签在list界面的位置
|
|
|
|
|
* @date: 2023/12/19 23:50
|
|
|
|
|
* @author: zhoukexing
|
|
|
|
|
* @param: []
|
|
|
|
|
* @return: boolean
|
|
|
|
|
*/
|
|
|
|
|
getWorkingText();
|
|
|
|
|
boolean saved = mWorkingNote.saveNote();
|
|
|
|
|
boolean saved = mWorkingNote.saveNote();// TODO: 2023/12/19 工作便签下的saveNote
|
|
|
|
|
if (saved) {
|
|
|
|
|
/**
|
|
|
|
|
* There are two modes from List view to edit view, open one note,
|
|
|
|
@ -816,11 +1112,19 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
* new node requires to the top of the list. This code
|
|
|
|
|
* {@link #RESULT_OK} is used to identify the create/edit state
|
|
|
|
|
*/
|
|
|
|
|
setResult(RESULT_OK);
|
|
|
|
|
setResult(RESULT_OK); // RESULT_OK指示将该便签保存到list界面的顶端(因为这是新建的便签) @zhoukexing 2023/12/19 23:41
|
|
|
|
|
//Q: 这个setResult只在这里调用了,怎么实现的 @zkx 2023/12/19
|
|
|
|
|
}
|
|
|
|
|
return saved;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @method sendToDesktop
|
|
|
|
|
* @description 该方法用于将便签发送至桌面,创建快捷方式
|
|
|
|
|
* @date: 2023-12-18 17:27
|
|
|
|
|
* @author: 郑鲲鹏
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
private void sendToDesktop() {
|
|
|
|
|
/**
|
|
|
|
|
* Before send message to home, we should make sure that current
|
|
|
|
@ -832,9 +1136,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mWorkingNote.getNoteId() > 0) {
|
|
|
|
|
// 新建intent消息,为创建桌面快捷方式的连接器
|
|
|
|
|
// 2023-12-18 17:29
|
|
|
|
|
Intent sender = new Intent();
|
|
|
|
|
Intent shortcutIntent = new Intent(this, NoteEditActivity.class);
|
|
|
|
|
shortcutIntent.setAction(Intent.ACTION_VIEW);
|
|
|
|
|
// 将便签的相关信息添加进intent中
|
|
|
|
|
// 2023-12-18 17:36
|
|
|
|
|
shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId());
|
|
|
|
|
sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
|
|
|
|
|
sender.putExtra(Intent.EXTRA_SHORTCUT_NAME,
|
|
|
|
@ -844,6 +1152,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
sender.putExtra("duplicate", true);
|
|
|
|
|
sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
|
|
|
|
|
showToast(R.string.info_note_enter_desktop);
|
|
|
|
|
// 将便签显示于桌面
|
|
|
|
|
// 2023-12-18 17:38
|
|
|
|
|
sendBroadcast(sender);
|
|
|
|
|
} else {
|
|
|
|
|
/**
|
|
|
|
@ -870,4 +1180,86 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
private void showToast(int resId, int duration) {
|
|
|
|
|
Toast.makeText(this, resId, duration).show();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @method saveHistory
|
|
|
|
|
* @description 将每次编辑的内容保存在栈中
|
|
|
|
|
* @date: 2024-01-08 8:56
|
|
|
|
|
* @author: 郑鲲鹏
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
private void saveHistory() {
|
|
|
|
|
SpannableString text = new SpannableString(mNoteEditor.getText());
|
|
|
|
|
if (mHistory.size() >= mMaxRevokeTimes) {
|
|
|
|
|
mHistory.removeElementAt(0);
|
|
|
|
|
mHistory.add(text);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
mHistory.add(text);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @method doRevoke
|
|
|
|
|
* @description 该方法实现撤回的操作
|
|
|
|
|
* @date: 2024-01-08 15:56
|
|
|
|
|
* @author: 郑鲲鹏
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
private void doRevoke() {
|
|
|
|
|
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
|
|
|
|
dialog.setTitle(R.string.tips_of_revoke);
|
|
|
|
|
dialog.setCancelable(true);
|
|
|
|
|
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
mIsRvoke = true;
|
|
|
|
|
if(mHistory.size() <= 1){
|
|
|
|
|
dialog.setMessage(R.string.cannot_revoke_anything);
|
|
|
|
|
dialog.show();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
mNoteEditor.setText((CharSequence)mHistory.elementAt(mHistory.size() - 2));
|
|
|
|
|
mHistory.removeElementAt(mHistory.size() - 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @method doScreenshot
|
|
|
|
|
* @description 该方法实现截取除了导航栏之外的屏幕的功能
|
|
|
|
|
* @date: 2024-01-17 17:20
|
|
|
|
|
* @author: 郑鲲鹏
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private void doScreenshot() {
|
|
|
|
|
// 调用 getWindow().getDecorView().getRootView() 获取屏幕的根视图
|
|
|
|
|
// 使用 getDrawingCache() 获取视图的缓存位图
|
|
|
|
|
// 2024-01-17 23:22
|
|
|
|
|
View view = getWindow().getDecorView();
|
|
|
|
|
view.setDrawingCacheEnabled(true);
|
|
|
|
|
view.buildDrawingCache();
|
|
|
|
|
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
|
|
|
|
|
view.setDrawingCacheEnabled(false);
|
|
|
|
|
// 保存Bitmap对象至文件中
|
|
|
|
|
// 2024-01-17 23:21
|
|
|
|
|
if (bitmap != null) {
|
|
|
|
|
try {
|
|
|
|
|
String sdCardPath = Environment.getExternalStorageDirectory().getPath();
|
|
|
|
|
String filePath = sdCardPath + File.separator + "screenshot.png";
|
|
|
|
|
File file = new File(filePath);
|
|
|
|
|
FileOutputStream fos = new FileOutputStream(file);
|
|
|
|
|
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
|
|
|
|
|
fos.flush();
|
|
|
|
|
fos.close();
|
|
|
|
|
// showToast(R.string.success_screenshot_saved);
|
|
|
|
|
Toast.makeText(this, "Successfully saved the screenshot to" + filePath, Toast.LENGTH_LONG).show();
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
Log.e(TAG, "Take a screenshot error");
|
|
|
|
|
showToast(R.string.error_screenshot_saved);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} //NOTE: 这一整个文件就是这一个类 @zhoukexing 2023/12/17 23:41
|
|
|
|
|