diff --git a/src/main/java/net/micode/notes/model/WorkingNote.java b/src/main/java/net/micode/notes/model/WorkingNote.java index e20c6fe..d303c30 100644 --- a/src/main/java/net/micode/notes/model/WorkingNote.java +++ b/src/main/java/net/micode/notes/model/WorkingNote.java @@ -29,7 +29,9 @@ import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.Notes.TextNote; +import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser.NoteBgResources; +import java.util.HashSet; /** @@ -331,6 +333,7 @@ public class WorkingNote { *
* 将当前工作笔记保存到数据库中。如果笔记不存在,则创建新笔记; * 如果笔记已存在,则更新现有笔记。 + * 如果笔记内容为空且已存在于数据库,则删除该笔记。 *
* * @return 保存成功返回true,否则返回false @@ -356,6 +359,15 @@ public class WorkingNote { } return true; } else { + // 添加删除逻辑:如果笔记内容为空且已存在于数据库,则删除该笔记 + if (existInDatabase() && TextUtils.isEmpty(mContent)) { + HashSet* 检查当前工作笔记是否值得保存到数据库中。如果笔记已删除、 - * 内容为空且不存在于数据库中,或者存在于数据库但未修改,则不值得保存。 + * 内容为空,或者存在于数据库但未修改,则不值得保存。 *
* * @return 值得保存返回true,否则返回false */ private boolean isWorthSaving() { - if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) + if (mIsDeleted || TextUtils.isEmpty(mContent) || (existInDatabase() && !mNote.isLocalModified())) { return false; } else { @@ -520,16 +532,29 @@ public class WorkingNote { /** * 设置笔记内容 *+ * 设置笔记的文本内容,支持富文本格式。 + *
+ * + * @param text 笔记内容,支持Spannable等富文本格式 + */ + public void setWorkingText(CharSequence text) { + String textStr = text.toString(); + if (!TextUtils.equals(mContent, textStr)) { + mContent = textStr; + mNote.setTextData(DataColumns.CONTENT, mContent); + } + } + + /** + * 设置笔记内容(字符串重载) + ** 设置笔记的文本内容。 *
* * @param text 笔记内容 */ public void setWorkingText(String text) { - if (!TextUtils.equals(mContent, text)) { - mContent = text; - mNote.setTextData(DataColumns.CONTENT, mContent); - } + setWorkingText((CharSequence) text); } /** diff --git a/src/main/java/net/micode/notes/tool/DataUtils.java b/src/main/java/net/micode/notes/tool/DataUtils.java index 49d5a18..6d84777 100644 --- a/src/main/java/net/micode/notes/tool/DataUtils.java +++ b/src/main/java/net/micode/notes/tool/DataUtils.java @@ -272,11 +272,27 @@ public class DataUtils { * @return 存在返回true,否则返回false */ public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { + return checkVisibleFolderName(resolver, name, Notes.ID_ROOT_FOLDER); + } + + /** + * 检查可见文件夹名称是否存在(重载方法,支持指定父文件夹ID) + *+ * 检查指定名称的文件夹是否存在于指定父文件夹下,且不在垃圾箱中。 + *
+ * + * @param resolver ContentResolver实例,用于与内容提供者交互 + * @param name 文件夹名称 + * @param parentId 父文件夹ID + * @return 存在返回true,否则返回false + */ + public static boolean checkVisibleFolderName(ContentResolver resolver, String name, long parentId) { Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.PARENT_ID + "=?" + " AND " + NoteColumns.SNIPPET + "=?", - new String[] { name }, null); + new String[] { String.valueOf(parentId), name }, null); boolean exist = false; if(cursor != null) { if(cursor.getCount() > 0) { diff --git a/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/main/java/net/micode/notes/ui/NoteEditActivity.java index a5ca2c3..184fe3b 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -30,6 +30,7 @@ import android.content.SharedPreferences; import android.graphics.Paint; import android.os.Bundle; import android.preference.PreferenceManager; +import android.text.Html; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; @@ -43,10 +44,12 @@ import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; +import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.ImageView; import android.database.Cursor; import android.content.ContentResolver; @@ -95,7 +98,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, public TextView tvAlertDate; - public ImageView ibSetBgColor; + public ImageButton ibSetBgColor; } /** 背景颜色选择按钮映射表,将按钮ID映射到颜色ID */ @@ -145,14 +148,25 @@ public class NoteEditActivity extends Activity implements OnClickListener, /** 头部视图面板 */ private View mHeadViewPanel; + /** 粗体按钮 */ + private Button mBtnBold; + /** 斜体按钮 */ + private Button mBtnItalic; + /** 下划线按钮 */ + private Button mBtnUnderline; + /** 字体颜色按钮 */ + private Button mBtnTextColor; + /** 背景颜色选择器视图 */ private View mNoteBgColorSelector; + /** 字体颜色选择器视图 */ + private View mNoteTextColorSelector; /** 字体大小选择器视图 */ private View mFontSizeSelector; /** 笔记编辑文本框 */ - private EditText mNoteEditor; + private NoteEditText mNoteEditor; /** 笔记编辑面板 */ private View mNoteEditorPanel; @@ -326,7 +340,10 @@ public class NoteEditActivity extends Activity implements OnClickListener, if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { switchToListMode(mWorkingNote.getContent()); } else { - mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); + // 解析HTML格式的富文本内容,添加null检查防止闪退 + String content = mWorkingNote.getContent(); + CharSequence htmlContent = Html.fromHtml(content == null ? "" : content); + mNoteEditor.setText(getHighlightQueryResult(htmlContent, mUserQuery)); mNoteEditor.setSelection(mNoteEditor.getText().length()); } for (Integer id : sBgSelectorSelectionMap.keySet()) { @@ -412,6 +429,12 @@ public class NoteEditActivity extends Activity implements OnClickListener, return true; } + if (mNoteTextColorSelector.getVisibility() == View.VISIBLE + && !inRangeOfView(mNoteTextColorSelector, ev)) { + mNoteTextColorSelector.setVisibility(View.GONE); + return true; + } + if (mFontSizeSelector.getVisibility() == View.VISIBLE && !inRangeOfView(mFontSizeSelector, ev)) { mFontSizeSelector.setVisibility(View.GONE); @@ -450,9 +473,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, 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.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color); + mNoteHeaderHolder.ibSetBgColor = (ImageButton) findViewById(R.id.btn_set_bg_color); mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); - mNoteEditor = (EditText) findViewById(R.id.note_edit_view); + mNoteEditor = (NoteEditText) findViewById(R.id.note_edit_view); mNoteEditorPanel = findViewById(R.id.sv_note_edit); mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector); for (int id : sBgSelectorBtnsMap.keySet()) { @@ -460,7 +483,28 @@ public class NoteEditActivity extends Activity implements OnClickListener, iv.setOnClickListener(this); } + // 初始化富文本按钮 + mBtnBold = findViewById(R.id.btn_bold); + mBtnItalic = findViewById(R.id.btn_italic); + mBtnUnderline = findViewById(R.id.btn_underline); + mBtnTextColor = findViewById(R.id.btn_set_text_color); + mBtnBold.setOnClickListener(this); + mBtnItalic.setOnClickListener(this); + mBtnUnderline.setOnClickListener(this); + mBtnTextColor.setOnClickListener(this); + mFontSizeSelector = findViewById(R.id.font_size_selector); + mNoteTextColorSelector = findViewById(R.id.note_text_color_selector); + + // 初始化字体颜色选择器的颜色选项 + ImageView ivTextBlack = findViewById(R.id.iv_text_black); + ImageView ivTextWhite = findViewById(R.id.iv_text_white); + ImageView ivTextRed = findViewById(R.id.iv_text_red); + ImageView ivTextBlue = findViewById(R.id.iv_text_blue); + ivTextBlack.setOnClickListener(this); + ivTextWhite.setOnClickListener(this); + ivTextRed.setOnClickListener(this); + ivTextBlue.setOnClickListener(this); for (int id : sFontSizeBtnsMap.keySet()) { View view = findViewById(id); view.setOnClickListener(this); @@ -476,6 +520,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; } mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list); + + // 将光标改为文本选中光标 + mNoteEditor.setTextIsSelectable(true); } /** @@ -520,15 +567,39 @@ public class NoteEditActivity extends Activity implements OnClickListener, public void onClick(View v) { int id = v.getId(); if (id == R.id.btn_set_bg_color) { + // 显示背景颜色选择器,隐藏其他选择器 mNoteBgColorSelector.setVisibility(View.VISIBLE); + mNoteTextColorSelector.setVisibility(View.GONE); findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - - View.VISIBLE); + View.VISIBLE); + } else if (id == R.id.btn_set_text_color) { + // 显示字体颜色选择器,隐藏其他选择器 + mNoteTextColorSelector.setVisibility(View.VISIBLE); + mNoteBgColorSelector.setVisibility(View.GONE); } else if (sBgSelectorBtnsMap.containsKey(id)) { + // 处理背景颜色选择 findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( View.GONE); mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id)); mNoteBgColorSelector.setVisibility(View.GONE); + } else if (id == R.id.iv_text_black) { + // 应用黑色字体 + mNoteEditor.applyTextColor(0xFF000000); + mNoteTextColorSelector.setVisibility(View.GONE); + } else if (id == R.id.iv_text_white) { + // 应用白色字体 + mNoteEditor.applyTextColor(0xFFFFFFFF); + mNoteTextColorSelector.setVisibility(View.GONE); + } else if (id == R.id.iv_text_red) { + // 应用红色字体 + mNoteEditor.applyTextColor(0xFFFF0000); + mNoteTextColorSelector.setVisibility(View.GONE); + } else if (id == R.id.iv_text_blue) { + // 应用蓝色字体 + mNoteEditor.applyTextColor(0xFF0000FF); + mNoteTextColorSelector.setVisibility(View.GONE); } else if (sFontSizeBtnsMap.containsKey(id)) { + // 处理字体大小选择 findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE); mFontSizeId = sFontSizeBtnsMap.get(id); mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit(); @@ -541,6 +612,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); } mFontSizeSelector.setVisibility(View.GONE); + } else if (id == R.id.btn_bold) { + // 应用粗体 + mNoteEditor.applyBold(); + } else if (id == R.id.btn_italic) { + // 应用斜体 + mNoteEditor.applyItalic(); + } else if (id == R.id.btn_underline) { + // 应用下划线 + mNoteEditor.applyUnderline(); } } @@ -569,6 +649,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { mNoteBgColorSelector.setVisibility(View.GONE); return true; + } else if (mNoteTextColorSelector.getVisibility() == View.VISIBLE) { + mNoteTextColorSelector.setVisibility(View.GONE); + return true; } else if (mFontSizeSelector.getVisibility() == View.VISIBLE) { mFontSizeSelector.setVisibility(View.GONE); return true; @@ -1053,11 +1136,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, ** 该方法在完整文本中查找用户查询的内容,并为匹配项添加背景高亮效果 *
- * @param fullText 完整的文本内容 + * @param fullText 完整的文本内容,支持CharSequence类型 * @param userQuery 用户查询的内容 * @return 带有高亮查询结果的Spannable对象 */ - private Spannable getHighlightQueryResult(String fullText, String userQuery) { + private Spannable getHighlightQueryResult(CharSequence fullText, String userQuery) { SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); if (!TextUtils.isEmpty(userQuery)) { mPattern = Pattern.compile(userQuery); @@ -1191,7 +1274,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, } mWorkingNote.setWorkingText(sb.toString()); } else { - mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); + // 保留富文本格式,将 Spanned 转换为 HTML 字符串保存 + mWorkingNote.setWorkingText(Html.toHtml(mNoteEditor.getText())); } return hasChecked; } diff --git a/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/main/java/net/micode/notes/ui/NoteEditText.java index ae5b78b..5a6842e 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditText.java +++ b/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -20,9 +20,15 @@ import android.content.Context; import android.graphics.Rect; import android.text.Layout; import android.text.Selection; +import android.text.Spannable; +import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; +import android.text.style.StyleSpan; import android.text.style.URLSpan; +import android.text.style.UnderlineSpan; +import android.text.style.ForegroundColorSpan; +import android.graphics.Typeface; import android.util.AttributeSet; import android.util.Log; import android.view.ContextMenu; @@ -316,4 +322,108 @@ public class NoteEditText extends EditText { } super.onCreateContextMenu(menu); } + + /** + * 应用粗体格式到选中文本 + */ + public void applyBold() { + applyStyle(Typeface.BOLD); + } + + /** + * 应用斜体格式到选中文本 + */ + public void applyItalic() { + applyStyle(Typeface.ITALIC); + } + + /** + * 应用下划线格式到选中文本 + */ + public void applyUnderline() { + SpannableStringBuilder ssb = new SpannableStringBuilder(getText()); + int start = getSelectionStart(); + int end = getSelectionEnd(); + + if (start != end) { + // 检查是否已存在下划线样式 + UnderlineSpan[] existingUnderlines = ssb.getSpans(start, end, UnderlineSpan.class); + if (existingUnderlines.length > 0) { + // 移除下划线 + for (UnderlineSpan span : existingUnderlines) { + ssb.removeSpan(span); + } + } else { + // 添加下划线 + ssb.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); + } + setText(ssb); + setSelection(start, end); + } + } + + /** + * 应用指定颜色到选中文本 + * @param color 要应用的颜色值 + */ + public void applyTextColor(int color) { + SpannableStringBuilder ssb = new SpannableStringBuilder(getText()); + int start = getSelectionStart(); + int end = getSelectionEnd(); + + if (start != end) { + // 移除已有的文字颜色 + ForegroundColorSpan[] existingSpans = ssb.getSpans(start, end, ForegroundColorSpan.class); + for (ForegroundColorSpan span : existingSpans) { + ssb.removeSpan(span); + } + + // 添加新的文字颜色 + ssb.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); + + setText(ssb); + setSelection(start, end); + } + } + + /** + * 应用字体样式到选中文本 + */ + private void applyStyle(int style) { + SpannableStringBuilder ssb = new SpannableStringBuilder(getText()); + int start = getSelectionStart(); + int end = getSelectionEnd(); + + if (start != end) { + // 获取当前选中文本的所有样式 + StyleSpan[] existingSpans = ssb.getSpans(start, end, StyleSpan.class); + + // 计算当前选中文本的总样式 + int currentStyle = Typeface.NORMAL; + if (existingSpans.length > 0) { + // 如果有样式,取第一个样式(假设所有样式一致) + currentStyle = existingSpans[0].getStyle(); + } + + // 计算新的字体样式 + int newStyle; + if ((currentStyle & style) != 0) { + // 移除该样式 + newStyle = currentStyle & ~style; + } else { + // 添加该样式 + newStyle = currentStyle | style; + } + + // 移除旧的样式 + for (StyleSpan span : existingSpans) { + ssb.removeSpan(span); + } + + // 添加新的样式 + ssb.setSpan(new StyleSpan(newStyle), start, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); + setText(ssb); + setSelection(start, end); + } + } } diff --git a/src/main/java/net/micode/notes/ui/NoteItemData.java b/src/main/java/net/micode/notes/ui/NoteItemData.java index de815f8..e2dc7c6 100644 --- a/src/main/java/net/micode/notes/ui/NoteItemData.java +++ b/src/main/java/net/micode/notes/ui/NoteItemData.java @@ -269,6 +269,7 @@ public class NoteItemData { mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); mParentId = cursor.getLong(PARENT_ID_COLUMN); mSnippet = cursor.getString(SNIPPET_COLUMN); + // 先替换标签,保留HTML格式以便在列表中显示富文本 mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( NoteEditActivity.TAG_UNCHECKED, ""); mType = cursor.getInt(TYPE_COLUMN); diff --git a/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java index c033aeb..a32e94c 100644 --- a/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -368,7 +368,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt * Insert an introduction when user firstly use this application */ setAppInfoFromRawRes(); - + // 注册Android 13+的返回键回调 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( @@ -1238,7 +1238,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt public void onClick(View v) { hideSoftInput(etName); String name = etName.getText().toString(); - if (DataUtils.checkVisibleFolderName(mContentResolver, name)) { + if (DataUtils.checkVisibleFolderName(mContentResolver, name, mCurrentFolderId)) { Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name), Toast.LENGTH_LONG).show(); etName.setSelection(0, etName.length()); @@ -1259,6 +1259,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt ContentValues values = new ContentValues(); values.put(NoteColumns.SNIPPET, name); values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + values.put(NoteColumns.PARENT_ID, mCurrentFolderId); mContentResolver.insert(Notes.CONTENT_NOTE_URI, values); } dialog.dismiss(); @@ -1304,10 +1305,32 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt private void handleBackPress() { switch (mState) { case SUB_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - startAsyncNotesListQuery(); - mTitleBar.setVisibility(View.GONE); + // 查询当前文件夹的父文件夹ID + Cursor cursor = mContentResolver.query(Notes.CONTENT_NOTE_URI, + new String[]{NoteColumns.PARENT_ID, NoteColumns.SNIPPET}, + NoteColumns.ID + "=?", + new String[]{String.valueOf(mCurrentFolderId)}, + null); + + if (cursor != null && cursor.moveToFirst()) { + long parentId = cursor.getLong(0); + String parentName = cursor.getString(1); + cursor.close(); + + if (parentId == Notes.ID_ROOT_FOLDER) { + // 如果父文件夹是根文件夹,返回根目录 + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mState = ListEditState.NOTE_LIST; + mTitleBar.setVisibility(View.GONE); + } else { + // 否则返回上一级文件夹 + mCurrentFolderId = parentId; + mState = ListEditState.SUB_FOLDER; + mTitleBar.setText(parentName); + mTitleBar.setVisibility(View.VISIBLE); + } + startAsyncNotesListQuery(); + } break; case CALL_RECORD_FOLDER: mCurrentFolderId = Notes.ID_ROOT_FOLDER; @@ -1638,13 +1661,21 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } break; case SUB_FOLDER: - case CALL_RECORD_FOLDER: if (item.getType() == Notes.TYPE_NOTE) { openNode(item); + } else if (item.getType() == Notes.TYPE_FOLDER) { + openFolder(item); } else { Log.e(TAG, "Wrong note type in SUB_FOLDER"); } break; + case CALL_RECORD_FOLDER: + if (item.getType() == Notes.TYPE_NOTE) { + openNode(item); + } else { + Log.e(TAG, "Wrong note type in CALL_RECORD_FOLDER"); + } + break; default: break; } diff --git a/src/main/java/net/micode/notes/ui/NotesListAdapter.java b/src/main/java/net/micode/notes/ui/NotesListAdapter.java index e9f5a8a..138e3e7 100644 --- a/src/main/java/net/micode/notes/ui/NotesListAdapter.java +++ b/src/main/java/net/micode/notes/ui/NotesListAdapter.java @@ -289,15 +289,29 @@ public class NotesListAdapter extends CursorAdapter { */ private void calcNotesCount() { mNotesCount = 0; - for (int i = 0; i < getCount(); i++) { - Cursor c = (Cursor) getItem(i); - if (c != null) { - if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { - mNotesCount++; + Cursor cursor = getCursor(); + if (cursor != null && !cursor.isClosed()) { + // 使用 try-finally 块确保 cursor 位置正确恢复 + int originalPosition = cursor.getPosition(); + try { + if (cursor.moveToFirst()) { + do { + try { + if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { + mNotesCount++; + } + } catch (Exception e) { + // 捕获可能的异常,避免崩溃 + Log.e(TAG, "Error calculating note count: " + e.getMessage()); + break; + } + } while (cursor.moveToNext()); + } + } finally { + // 恢复 cursor 到原始位置 + if (!cursor.isClosed()) { + cursor.moveToPosition(originalPosition); } - } else { - Log.e(TAG, "Invalid cursor"); - return; } } } diff --git a/src/main/java/net/micode/notes/ui/NotesListItem.java b/src/main/java/net/micode/notes/ui/NotesListItem.java index b6222fd..c08425c 100644 --- a/src/main/java/net/micode/notes/ui/NotesListItem.java +++ b/src/main/java/net/micode/notes/ui/NotesListItem.java @@ -17,6 +17,7 @@ package net.micode.notes.ui; import android.content.Context; +import android.text.Html; import android.text.format.DateUtils; import android.view.View; import android.widget.CheckBox; @@ -103,7 +104,7 @@ public class NotesListItem extends LinearLayout { mCallName.setVisibility(View.VISIBLE); mCallName.setText(data.getCallName()); mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); - mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + mTitle.setText(Html.fromHtml(DataUtils.getFormattedSnippet(data.getSnippet()))); if (data.hasAlert()) { mAlert.setImageResource(R.drawable.clock); mAlert.setVisibility(View.VISIBLE); @@ -120,7 +121,7 @@ public class NotesListItem extends LinearLayout { data.getNotesCount())); mAlert.setVisibility(View.GONE); } else { - mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + mTitle.setText(Html.fromHtml(DataUtils.getFormattedSnippet(data.getSnippet()))); if (data.hasAlert()) { mAlert.setImageResource(R.drawable.clock); mAlert.setVisibility(View.VISIBLE); diff --git a/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java b/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java index 69984ff..5cca48d 100644 --- a/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java +++ b/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java @@ -110,7 +110,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { mReceiver = new GTaskReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); - registerReceiver(mReceiver, filter); + registerReceiver(mReceiver, filter, Context.RECEIVER_EXPORTED); mOriAccounts = null; View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); diff --git a/src/main/res/layout/note_edit.xml b/src/main/res/layout/note_edit.xml index e0cf16b..3344dcc 100644 --- a/src/main/res/layout/note_edit.xml +++ b/src/main/res/layout/note_edit.xml @@ -57,11 +57,81 @@ android:layout_marginRight="8dip" android:textAppearance="@style/TextAppearanceSecondaryItem" /> + + + + + + + + + +