Compare commits

..

1 Commits

@ -2,7 +2,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

@ -265,13 +265,6 @@ public class Notes {
*/
public static final String LOCK_TYPE = "lock_type";
/**
*
* <P> : TEXT </P>
* <P> </P>
*/
public static final String LOCK_HINT = "lock_hint";
/**
* 便
* <P> : INTEGER (long) </P>

@ -35,7 +35,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
// 数据库文件名
private static final String DB_NAME = "note.db";
// 数据库版本号,用于升级控制
private static final int DB_VERSION = 8;
private static final int DB_VERSION = 7;
/**
*
@ -79,7 +79,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
NoteColumns.IS_LOCKED + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.LOCK_PASSWORD + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.LOCK_TYPE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.LOCK_HINT + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.DELETED_DATE + " INTEGER NOT NULL DEFAULT 0" +
")";
@ -426,12 +425,6 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
oldVersion++;
}
// 版本7升级到版本8添加密码提示字段
if (oldVersion == 7) {
upgradeToV8(db);
oldVersion++;
}
// 如果需要,重新创建触发器
if (reCreateTriggers) {
reCreateNoteTableTriggers(db);
@ -537,14 +530,4 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.ID + ";" +
" END");
}
/**
* 8
* @param db
*/
private void upgradeToV8(SQLiteDatabase db) {
// 添加LOCK_HINT字段用于存储密码提示
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.LOCK_HINT
+ " TEXT NOT NULL DEFAULT ''");
}
}

@ -23,10 +23,8 @@ import android.content.ContentValues;
import android.content.Intent;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
@ -86,15 +84,15 @@ public class NotesProvider extends ContentProvider {
/**
*
* x'0A' SQLite '\n'
* '\n' HTML
* '\n'
*/
private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," +
NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," +
NoteColumns.SNIPPET + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," +
NoteColumns.SNIPPET + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," +
R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," +
"'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," +
"'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + ","
+ NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
+ "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
+ "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
+ R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
+ "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
+ "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
/**
* 便SQL
@ -102,9 +100,10 @@ public class NotesProvider extends ContentProvider {
*/
private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION
+ " FROM " + TABLE.NOTE
+ " WHERE REPLACE(REPLACE(" + NoteColumns.SNIPPET + ", '<', ''), '>', '') LIKE ?"
+ " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
+ " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
+ " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
/**
*
* @return truefalse
@ -187,10 +186,6 @@ public class NotesProvider extends ContentProvider {
searchString = String.format("%%%s%%", searchString);
c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY,
new String[] { searchString });
// 创建一个自定义的Cursor包装器用于处理HTML标签
if (c != null && c.moveToFirst()) {
c = new HtmlCleaningCursorWrapper(c);
}
} catch (IllegalStateException ex) {
Log.e(TAG, "got exception: " + ex.toString());
}
@ -426,36 +421,4 @@ public class NotesProvider extends ContentProvider {
// TODO: 实现此方法返回合适的MIME类型
return null;
}
/**
* HTMLCursor
* <p>
* CursorgetString()HTML
*
* </p>
*/
private class HtmlCleaningCursorWrapper extends CursorWrapper {
private int mText1ColumnIndex;
private int mText2ColumnIndex;
/**
*
* @param cursor Cursor
*/
public HtmlCleaningCursorWrapper(Cursor cursor) {
super(cursor);
mText1ColumnIndex = cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1);
mText2ColumnIndex = cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2);
}
@Override
public String getString(int column) {
String value = super.getString(column);
if ((column == mText1ColumnIndex || column == mText2ColumnIndex) && value != null) {
// 清理HTML标签返回纯文本
return Html.fromHtml(value).toString();
}
return value;
}
}
}

@ -27,7 +27,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Paint;
import android.os.Bundle;
import android.preference.PreferenceManager;
@ -47,9 +46,6 @@ import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.util.TypedValue;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
@ -57,28 +53,11 @@ import android.widget.ImageButton;
import android.widget.ImageView;
import android.database.Cursor;
import android.content.ContentResolver;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.content.Intent;
import android.provider.MediaStore;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.util.Base64;
import android.os.Bundle;
import android.net.Uri;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import android.content.pm.ResolveInfo;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
@ -193,9 +172,6 @@ public class NoteEditActivity extends Activity implements OnClickListener,
/** 笔记编辑面板 */
private View mNoteEditorPanel;
/** 字符统计显示文本框 */
private TextView mTvCharCount;
/** 工作笔记对象,用于处理笔记数据 */
private WorkingNote mWorkingNote;
@ -217,13 +193,6 @@ public class NoteEditActivity extends Activity implements OnClickListener,
/** 模板选择请求码 */
private static final int REQUEST_CODE_TEMPLATE = 1001;
/** 图片选择请求码 */
private static final int REQUEST_CODE_IMAGE_PICK = 1002;
/** 拍照请求码 */
private static final int REQUEST_CODE_CAMERA = 1003;
/** 相机权限请求码 */
private static final int REQUEST_CAMERA_PERMISSION = 1004;
/** 清单模式下的编辑文本列表 */
private LinearLayout mEditTextList;
@ -377,37 +346,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} else {
// 解析HTML格式的富文本内容添加null检查防止闪退
String content = mWorkingNote.getContent();
CharSequence htmlContent = Html.fromHtml(content == null ? "" : content, new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
// 处理data:image格式的图片
if (source.startsWith("data:image/")) {
try {
// 提取Base64部分
String base64 = source.substring(source.indexOf(",") + 1);
// 解码Base64
byte[] data = Base64.decode(base64, Base64.DEFAULT);
// 创建Bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
if (bitmap != null) {
// 创建Drawable
BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
// 设置Drawable的边界
drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
return drawable;
}
} catch (Exception e) {
Log.e(TAG, "Error loading image: " + e.getMessage());
}
}
return null;
}
}, null);
CharSequence htmlContent = Html.fromHtml(content == null ? "" : content);
mNoteEditor.setText(getHighlightQueryResult(htmlContent, mUserQuery));
mNoteEditor.setSelection(mNoteEditor.getText().length());
}
// 初始化字符统计显示
updateCharCount();
for (Integer id : sBgSelectorSelectionMap.keySet()) {
findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE);
}
@ -538,9 +480,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mNoteHeaderHolder.ibSetBgColor = (ImageButton) findViewById(R.id.btn_set_bg_color);
mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this);
mNoteEditor = (NoteEditText) findViewById(R.id.note_edit_view);
mNoteEditor.setOnTextViewChangeListener(this);
mNoteEditorPanel = findViewById(R.id.sv_note_edit);
mTvCharCount = (TextView) findViewById(R.id.tv_char_count);
mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector);
for (int id : sBgSelectorBtnsMap.keySet()) {
ImageView iv = (ImageView) findViewById(id);
@ -828,15 +768,9 @@ public class NoteEditActivity extends Activity implements OnClickListener,
case R.id.menu_unlock:
showPasswordDialogForUnlock();
break;
case R.id.menu_change_password:
showChangePasswordDialog();
break;
case R.id.menu_note_template:
openTemplateSelector();
break;
case R.id.menu_insert_image:
showImageSourceDialog();
break;
default:
break;
}
@ -878,41 +812,23 @@ public class NoteEditActivity extends Activity implements OnClickListener,
/**
*
* <p>
*
*
* </p>
*/
private void showPasswordDialogForLock() {
// 创建布局并添加密码输入框
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(60, 40, 60, 40);
layout.setPadding(60, 40, 60, 40);
// 设置子视图间距
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 0, 20); // 底部外边距作为间距
final EditText passwordEditText = new EditText(this);
passwordEditText.setHint(R.string.hint_enter_password);
passwordEditText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD);
layout.addView(passwordEditText);
// 添加密码提示输入框
final EditText hintEditText = new EditText(this);
hintEditText.setHint(R.string.hint_enter_password_hint);
layout.addView(hintEditText);
new AlertDialog.Builder(this)
.setTitle(R.string.dialog_enter_password)
.setView(layout)
.setView(passwordEditText)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String password = passwordEditText.getText().toString();
String hint = hintEditText.getText().toString();
if (!TextUtils.isEmpty(password)) {
lockCurrentNote(password, hint);
lockCurrentNote(password);
}
}
})
@ -927,50 +843,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
* </p>
*/
private void showPasswordDialogForUnlock() {
// 查询当前笔记的密码提示
String[] projection = {NoteColumns.LOCK_HINT};
String selection = NoteColumns.ID + "=?";
String[] selectionArgs = {String.valueOf(mWorkingNote.getNoteId())};
Cursor cursor = getContentResolver().query(Notes.CONTENT_NOTE_URI, projection, selection, selectionArgs, null);
String lockHint = null;
if (cursor != null && cursor.moveToFirst()) {
lockHint = cursor.getString(0);
cursor.close();
}
// 创建布局并添加密码输入框
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(60, 40, 60, 40);
// 创建布局参数,用于设置子视图间距
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 0, 20); // 底部外边距作为间距
final EditText passwordEditText = new EditText(this);
passwordEditText.setHint(R.string.hint_enter_password);
passwordEditText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD);
layout.addView(passwordEditText, params);
// 如果有密码提示,显示提示信息
if (!TextUtils.isEmpty(lockHint)) {
TextView hintTextView = new TextView(this);
hintTextView.setText(getString(R.string.password_hint_prefix) + lockHint);
hintTextView.setTextColor(getResources().getColor(R.color.secondary_text_dark));
hintTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
// 提示文本不需要底部间距
LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(hintTextView, hintParams);
}
new AlertDialog.Builder(this)
.setTitle(R.string.dialog_enter_password)
.setView(layout)
.setView(passwordEditText)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
@ -987,20 +866,17 @@ public class NoteEditActivity extends Activity implements OnClickListener,
/**
*
* <p>
*
*
* </p>
* @param password
* @param hint
*/
private void lockCurrentNote(String password, String hint) {
private void lockCurrentNote(String password) {
// 设置锁定状态为1已锁定
mWorkingNote.setNoteValue(NoteColumns.IS_LOCKED, "1");
// 设置加密后的密码
mWorkingNote.setNoteValue(NoteColumns.LOCK_PASSWORD, encryptPassword(password));
// 设置锁定类型为笔记类型
mWorkingNote.setNoteValue(NoteColumns.LOCK_TYPE, String.valueOf(Notes.LOCK_TYPE_NOTE));
// 设置密码提示
mWorkingNote.setNoteValue(NoteColumns.LOCK_HINT, hint);
// 保存笔记
saveNote();
// 显示提示信息
@ -1065,97 +941,6 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return password; // 加密失败时返回原始密码
}
}
/**
*
* <p>
*
* </p>
*/
private void showChangePasswordDialog() {
// 创建布局并添加输入框
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(60, 40, 60, 40);
// 创建布局参数,用于设置子视图间距
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 0, 20); // 底部外边距作为间距
// 旧密码输入框
final EditText oldPasswordEditText = new EditText(this);
oldPasswordEditText.setHint(R.string.hint_enter_password);
oldPasswordEditText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD);
layout.addView(oldPasswordEditText, params);
// 新密码输入框
final EditText newPasswordEditText = new EditText(this);
newPasswordEditText.setHint(R.string.hint_enter_password);
newPasswordEditText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD);
layout.addView(newPasswordEditText, params);
// 新密码提示输入框
final EditText newHintEditText = new EditText(this);
newHintEditText.setHint(R.string.hint_enter_password_hint);
layout.addView(newHintEditText);
new AlertDialog.Builder(this)
.setTitle(R.string.menu_change_password)
.setView(layout)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String oldPassword = oldPasswordEditText.getText().toString();
String newPassword = newPasswordEditText.getText().toString();
String newHint = newHintEditText.getText().toString();
if (!TextUtils.isEmpty(oldPassword) && !TextUtils.isEmpty(newPassword)) {
changePassword(oldPassword, newPassword, newHint);
}
}
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
/**
*
* <p>
*
* </p>
* @param oldPassword
* @param newPassword
* @param newHint
*/
private void changePassword(String oldPassword, String newPassword, String newHint) {
// 使用ContentResolver直接查询数据库获取加密密码
String[] projection = {NoteColumns.LOCK_PASSWORD};
String selection = NoteColumns.ID + "=?";
String[] selectionArgs = {String.valueOf(mWorkingNote.getNoteId())};
Cursor cursor = getContentResolver().query(Notes.CONTENT_NOTE_URI, projection, selection, selectionArgs, null);
String encryptedPassword = null;
if (cursor != null && cursor.moveToFirst()) {
encryptedPassword = cursor.getString(0);
cursor.close();
}
// 验证旧密码是否正确
if (encryptedPassword != null && encryptedPassword.equals(encryptPassword(oldPassword))) {
// 旧密码正确,更新新密码和密码提示
mWorkingNote.setNoteValue(NoteColumns.LOCK_PASSWORD, encryptPassword(newPassword));
mWorkingNote.setNoteValue(NoteColumns.LOCK_HINT, newHint);
// 保存笔记
saveNote();
// 显示提示信息
Toast.makeText(this, getString(R.string.message_password_changed), Toast.LENGTH_SHORT).show();
} else {
// 旧密码错误,显示错误信息
Toast.makeText(this, getString(R.string.error_wrong_password), Toast.LENGTH_SHORT).show();
}
}
/**
*
@ -1444,15 +1229,6 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} else {
mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE);
}
// 更新字符统计
updateCharCount();
}
/**
*
*/
public void onContentChange() {
updateCharCount();
}
/**
@ -1606,45 +1382,6 @@ public class NoteEditActivity extends Activity implements OnClickListener,
showToast(resId, Toast.LENGTH_SHORT);
}
/**
*
* @param text
* @return
*/
private int countValidCharacters(String text) {
if (TextUtils.isEmpty(text)) {
return 0;
}
// 去除所有空白字符后计算长度
return text.replaceAll("\\s", "").length();
}
/**
*
*/
private void updateCharCount() {
int charCount = 0;
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
// 列表模式:遍历所有列表项
for (int i = 0; i < mEditTextList.getChildCount(); i++) {
View view = mEditTextList.getChildAt(i);
NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
if (!TextUtils.isEmpty(edit.getText())) {
charCount += countValidCharacters(edit.getText().toString());
}
}
} else {
// 普通文本模式:直接计算编辑框内容
if (!TextUtils.isEmpty(mNoteEditor.getText())) {
charCount = countValidCharacters(mNoteEditor.getText().toString());
}
}
// 更新显示
if (mTvCharCount != null) {
mTvCharCount.setText(charCount + " 字符");
}
}
/**
*
* <p>
@ -1662,271 +1399,37 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
/**
*
*
* <p>
* TemplateSelectActivity
*
* </p>
* @param requestCode
* @param resultCode
* @param data Intent
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_CODE_TEMPLATE:
// 模板选择结果处理
if (data != null) {
String templateContent = data.getStringExtra(TemplateSelectActivity.EXTRA_TEMPLATE_CONTENT);
if (!TextUtils.isEmpty(templateContent)) {
// 保存模板内容到WorkingNote防止onResume时被覆盖
mWorkingNote.setWorkingText(templateContent);
// 更新笔记内容
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
switchToListMode(templateContent);
} else {
mNoteEditor.setText(Html.fromHtml(templateContent));
mNoteEditor.setSelection(mNoteEditor.getText().length());
}
Toast.makeText(this, R.string.notealert_enter, Toast.LENGTH_SHORT).show();
}
}
break;
case REQUEST_CODE_IMAGE_PICK:
// 从相册选择图片
if (data != null && data.getData() != null) {
handleImageSelection(data.getData());
}
break;
case REQUEST_CODE_CAMERA:
// 拍照结果
if (resultCode == RESULT_OK) {
if (data != null && data.getExtras() != null) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
if (bitmap != null) {
insertImageToNote(bitmap);
} else {
showToast(R.string.error_image_capture);
}
} else {
showToast(R.string.error_image_capture);
}
} else if (resultCode == RESULT_CANCELED) {
// 用户取消拍照,不显示错误
if (requestCode == REQUEST_CODE_TEMPLATE && resultCode == RESULT_OK) {
if (data != null) {
String templateContent = data.getStringExtra(TemplateSelectActivity.EXTRA_TEMPLATE_CONTENT);
if (!TextUtils.isEmpty(templateContent)) {
// 保存模板内容到WorkingNote防止onResume时被覆盖
mWorkingNote.setWorkingText(templateContent);
// 更新笔记内容
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
switchToListMode(templateContent);
} else {
showToast(R.string.error_image_capture);
mNoteEditor.setText(Html.fromHtml(templateContent));
mNoteEditor.setSelection(mNoteEditor.getText().length());
}
break;
}
}
}
/**
*
*/
private void showImageSourceDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.menu_insert_image);
builder.setItems(new CharSequence[] {
getString(R.string.menu_take_photo),
getString(R.string.menu_choose_from_gallery)
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
// 拍照
if (ContextCompat.checkSelfPermission(NoteEditActivity.this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 请求相机权限
ActivityCompat.requestPermissions(NoteEditActivity.this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION);
} else {
// 权限已授予,启动相机
launchCamera();
}
break;
case 1:
// 从相册选择
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setType("image/*");
startActivityForResult(galleryIntent, REQUEST_CODE_IMAGE_PICK);
break;
}
}
});
builder.show();
}
/**
*
*/
private void launchCamera() {
Log.d(TAG, "Attempting to launch camera");
// 检查相机权限状态
int permissionStatus = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
Log.d(TAG, "Camera permission status: " + permissionStatus);
// 尝试使用不同的相机 Intent 构造方式
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 检查是否有应用可以处理相机 Intent
PackageManager packageManager = getPackageManager();
if (packageManager != null) {
Log.d(TAG, "PackageManager obtained successfully");
// 方法1使用 resolveActivity
if (cameraIntent.resolveActivity(packageManager) != null) {
Log.d(TAG, "Camera intent resolved successfully using resolveActivity");
try {
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA);
return;
} catch (Exception e) {
Log.e(TAG, "Error starting camera: " + e.getMessage());
Toast.makeText(this, R.string.notealert_enter, Toast.LENGTH_SHORT).show();
}
} else {
Log.d(TAG, "Camera intent not resolved using resolveActivity");
}
// 方法2使用 queryIntentActivities
List<ResolveInfo> activities = packageManager.queryIntentActivities(cameraIntent, 0);
if (activities != null && !activities.isEmpty()) {
Log.d(TAG, "Camera intent resolved successfully using queryIntentActivities, found " + activities.size() + " activities");
try {
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA);
return;
} catch (Exception e) {
Log.e(TAG, "Error starting camera: " + e.getMessage());
}
} else {
Log.d(TAG, "Camera intent not resolved using queryIntentActivities");
}
} else {
Log.e(TAG, "Failed to obtain PackageManager");
}
// 尝试使用更具体的相机 Intent
Intent explicitCameraIntent = new Intent();
explicitCameraIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
explicitCameraIntent.addCategory(Intent.CATEGORY_DEFAULT);
try {
Log.d(TAG, "Attempting to start camera with explicit intent");
startActivityForResult(explicitCameraIntent, REQUEST_CODE_CAMERA);
return;
} catch (Exception e) {
Log.e(TAG, "Error starting camera with explicit intent: " + e.getMessage());
}
// 所有方法都失败,显示错误提示
Log.e(TAG, "All attempts to launch camera failed");
showToast(R.string.error_image_selection);
}
/**
*
*/
private void handleImageSelection(Uri uri) {
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
if (bitmap != null) {
insertImageToNote(bitmap);
}
} catch (IOException e) {
Log.e(TAG, "Error loading image: " + e.getMessage());
showToast(R.string.error_image_selection);
}
}
/**
*
*/
private void insertImageToNote(Bitmap bitmap) {
try {
// 压缩图片
Bitmap compressedBitmap = compressBitmap(bitmap, 800, 600, 80);
// 转换为Base64
String base64Image = bitmapToBase64(compressedBitmap);
// 创建HTML图片标签
String imageTag = "<img src=\"data:image/jpeg;base64," + base64Image + "\" style=\"max-width:100%;height:auto;\" />";
// 获取当前光标位置
int cursorPosition = mNoteEditor.getSelectionStart();
// 获取当前文本
String currentText = mNoteEditor.getText().toString();
// 插入图片标签
String newText = currentText.substring(0, cursorPosition) + imageTag + currentText.substring(cursorPosition);
// 更新编辑器内容
mNoteEditor.setText(Html.fromHtml(newText, new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
// 处理data:image格式的图片
if (source.startsWith("data:image/")) {
try {
// 提取Base64部分
String base64 = source.substring(source.indexOf(",") + 1);
// 解码Base64
byte[] data = Base64.decode(base64, Base64.DEFAULT);
// 创建Bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
if (bitmap != null) {
// 创建Drawable
BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
// 设置Drawable的边界
drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
return drawable;
}
} catch (Exception e) {
Log.e(TAG, "Error loading image from data URL: " + e.getMessage());
}
}
return null;
}
}, null));
// 设置光标位置到图片后面
mNoteEditor.setSelection(mNoteEditor.getText().length());
// 保存笔记
saveNote();
} catch (Exception e) {
Log.e(TAG, "Error inserting image: " + e.getMessage());
showToast(R.string.error_image_insertion);
}
}
/**
*
*/
private Bitmap compressBitmap(Bitmap bitmap, int maxWidth, int maxHeight, int quality) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
// 计算缩放比例
float scaleWidth = ((float) maxWidth) / width;
float scaleHeight = ((float) maxHeight) / height;
float scale = Math.min(scaleWidth, scaleHeight);
// 如果不需要缩放,直接返回原图片
if (scale >= 1) {
return bitmap;
}
// 计算新尺寸
int newWidth = Math.round(width * scale);
int newHeight = Math.round(height * scale);
// 创建压缩后的图片
return Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
}
/**
* BitmapBase64
*/
private String bitmapToBase64(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos);
byte[] byteArray = baos.toByteArray();
return Base64.encodeToString(byteArray, Base64.DEFAULT);
}
/**
* Toast
@ -1939,21 +1442,4 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private void showToast(int resId, int duration) {
Toast.makeText(this, resId, duration).show();
}
/**
*
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限授予成功,启动相机
launchCamera();
} else {
// 权限被拒绝,显示错误提示
showToast(R.string.error_camera_permission);
}
}
}
}

@ -23,7 +23,6 @@ import android.text.Selection;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.Editable;
import android.text.TextUtils;
import android.text.style.StyleSpan;
import android.text.style.URLSpan;
@ -38,8 +37,6 @@ import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent;
import android.widget.EditText;
import android.text.TextWatcher;
import android.text.style.ImageSpan;
import net.micode.notes.R;
@ -115,11 +112,6 @@ public class NoteEditText extends EditText {
*
*/
void onTextChange(int index, boolean hasText);
/**
*
*/
void onContentChange();
}
/**
@ -159,8 +151,6 @@ public class NoteEditText extends EditText {
*/
public NoteEditText(Context context, AttributeSet attrs) {
super(context, attrs, android.R.attr.editTextStyle);
mIndex = 0;
initTextWatcher();
}
/**
@ -171,37 +161,13 @@ public class NoteEditText extends EditText {
*/
public NoteEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mIndex = 0;
initTextWatcher();
}
/**
*
*/
private void initTextWatcher() {
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(android.text.Editable s) {
if (mOnTextViewChangeListener != null) {
mOnTextViewChangeListener.onContentChange();
}
}
});
// TODO Auto-generated constructor stub
}
/**
*
* <p>
*
*
* </p>
* @param event
* @return
@ -221,34 +187,12 @@ public class NoteEditText extends EditText {
Layout layout = getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
// 检查是否点击了图片
if (isClickOnImage(off)) {
// 显示上下文菜单
this.showContextMenu();
return true;
}
Selection.setSelection(getText(), off);
break;
}
return super.onTouchEvent(event);
}
/**
*
* @param offset
* @return
*/
private boolean isClickOnImage(int offset) {
if (getText() instanceof Spannable) {
Spannable spannable = (Spannable) getText();
ImageSpan[] imageSpans = spannable.getSpans(offset, offset, ImageSpan.class);
return imageSpans.length > 0;
}
return false;
}
/**
*
@ -263,9 +207,7 @@ public class NoteEditText extends EditText {
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_ENTER:
// 只有在列表模式下mIndex > 0才阻止默认行为
// 普通文本模式下让系统默认处理回车键
if (mOnTextViewChangeListener != null && mIndex > 0) {
if (mOnTextViewChangeListener != null) {
return false;
}
break;
@ -302,14 +244,10 @@ public class NoteEditText extends EditText {
break;
case KeyEvent.KEYCODE_ENTER:
if (mOnTextViewChangeListener != null) {
// 只有在列表模式下mIndex > 0才执行特殊处理
// 普通文本模式下,让系统默认处理回车键
if (mIndex > 0) {
int selectionStart = getSelectionStart();
String text = getText().subSequence(selectionStart, length()).toString();
setText(getText().subSequence(0, selectionStart));
mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text);
}
int selectionStart = getSelectionStart();
String text = getText().subSequence(selectionStart, length()).toString();
setText(getText().subSequence(0, selectionStart));
mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text);
} else {
Log.d(TAG, "OnTextViewChangeListener was not seted");
}
@ -346,7 +284,6 @@ public class NoteEditText extends EditText {
*
* <p>
*
*
* </p>
* @param menu
*/
@ -359,21 +296,6 @@ public class NoteEditText extends EditText {
int min = Math.min(selStart, selEnd);
int max = Math.max(selStart, selEnd);
// 检查是否有图片
final ImageSpan[] imageSpans = ((Spanned) getText()).getSpans(min, max, ImageSpan.class);
if (imageSpans.length > 0) {
menu.add(0, 1, 0, R.string.menu_delete_image).setOnMenuItemClickListener(
new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
// 删除图片
deleteImage(imageSpans[0]);
return true;
}
});
return;
}
// 检查是否有链接
final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class);
if (urls.length == 1) {
int defaultResId = 0;
@ -400,26 +322,6 @@ public class NoteEditText extends EditText {
}
super.onCreateContextMenu(menu);
}
/**
*
* @param imageSpan span
*/
private void deleteImage(ImageSpan imageSpan) {
if (getText() instanceof Spannable && getText() instanceof Editable) {
Editable editable = (Editable) getText();
int start = editable.getSpanStart(imageSpan);
int end = editable.getSpanEnd(imageSpan);
if (start >= 0 && end >= 0) {
// 删除图片
editable.delete(start, end);
// 通知内容变化
if (mOnTextViewChangeListener != null) {
mOnTextViewChangeListener.onContentChange();
}
}
}
}
/**
*

@ -57,7 +57,6 @@ public class NoteItemData {
NoteColumns.IS_LOCKED,
NoteColumns.LOCK_PASSWORD,
NoteColumns.LOCK_TYPE,
NoteColumns.LOCK_HINT,
NoteColumns.DELETED_DATE,
};
@ -141,15 +140,10 @@ public class NoteItemData {
*/
private static final int LOCK_TYPE_COLUMN = 15;
/**
*
*/
private static final int LOCK_HINT_COLUMN = 16;
/**
*
*/
private static final int DELETED_DATE_COLUMN = 17;
private static final int DELETED_DATE_COLUMN = 16;
/**
* ID
@ -176,11 +170,6 @@ public class NoteItemData {
*/
private int mLockType;
/**
*
*/
private String mLockHint;
/**
*
*/
@ -301,7 +290,6 @@ public class NoteItemData {
mIsLocked = (cursor.getInt(IS_LOCKED_COLUMN) > 0) ? true : false;
mLockPassword = cursor.getString(LOCK_PASSWORD_COLUMN);
mLockType = cursor.getInt(LOCK_TYPE_COLUMN);
mLockHint = cursor.getString(LOCK_HINT_COLUMN);
mDeletedDate = cursor.getLong(DELETED_DATE_COLUMN);
mPhoneNumber = "";
@ -577,22 +565,6 @@ public class NoteItemData {
return mLockType;
}
/**
*
* @return
*/
public String getLockHint() {
return mLockHint;
}
/**
*
* @param hint
*/
public void setLockHint(String hint) {
mLockHint = hint;
}
/**
*
* @param type 01

@ -57,10 +57,8 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.util.TypedValue;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
@ -126,37 +124,19 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
* </p>
*/
private void showPasswordDialog() {
// 创建布局并添加输入框
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(60, 40, 60, 40);
// 创建布局参数,用于设置子视图间距
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 0, 20); // 底部外边距作为间距
final EditText passwordEditText = new EditText(this);
passwordEditText.setHint(R.string.hint_enter_password);
passwordEditText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD);
layout.addView(passwordEditText, params);
// 添加密码提示输入框
final EditText hintEditText = new EditText(this);
hintEditText.setHint(R.string.hint_enter_password_hint);
layout.addView(hintEditText);
new AlertDialog.Builder(this)
.setTitle(R.string.dialog_enter_password)
.setView(layout)
.setView(passwordEditText)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String password = passwordEditText.getText().toString();
String hint = hintEditText.getText().toString();
if (!TextUtils.isEmpty(password)) {
toggleLockedStatus(password, hint);
toggleLockedStatus(password);
}
}
})
@ -170,9 +150,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
* 使
* </p>
* @param password
* @param hint
*/
private void toggleLockedStatus(final String password, final String hint) {
private void toggleLockedStatus(final String password) {
final HashSet<Long> selectedIds = mNotesListAdapter.getSelectedItemIds();
final int selectedCount = mNotesListAdapter.getSelectedCount();
@ -180,61 +159,45 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
protected Integer doInBackground(Void... unused) {
int finalLockedStatus = -1; // 默认为-1表示未处理
for (Long noteId : selectedIds) {
// 查询当前便签的锁定状态和密码
// 查询当前便签的锁定状态
Cursor cursor = mContentResolver.query(Notes.CONTENT_NOTE_URI,
new String[]{NoteColumns.IS_LOCKED, NoteColumns.LOCK_PASSWORD},
new String[]{NoteColumns.IS_LOCKED},
NoteColumns.ID + "=?",
new String[]{String.valueOf(noteId)},
null);
if (cursor != null && cursor.moveToFirst()) {
int currentLocked = cursor.getInt(0);
String encryptedPassword = cursor.getString(1);
int newLocked = currentLocked;
if (currentLocked == 1) {
// 如果当前是锁定状态,需要验证密码才能解锁
if (encryptedPassword != null && encryptedPassword.equals(encryptPassword(password))) {
// 密码正确,解锁
newLocked = 0;
finalLockedStatus = newLocked;
// 切换锁定状态
int newLocked = currentLocked == 1 ? 0 : 1;
finalLockedStatus = newLocked; // 保存最终锁定状态
ContentValues values = new ContentValues();
values.put(NoteColumns.IS_LOCKED, newLocked);
if (newLocked == 1) {
// 如果是锁定操作,设置密码和锁定类型
values.put(NoteColumns.LOCK_PASSWORD, encryptPassword(password));
// 判断是笔记还是文件夹
Cursor typeCursor = mContentResolver.query(Notes.CONTENT_NOTE_URI,
new String[]{NoteColumns.TYPE},
NoteColumns.ID + "=?",
new String[]{String.valueOf(noteId)},
null);
if (typeCursor != null && typeCursor.moveToFirst()) {
int type = typeCursor.getInt(0);
values.put(NoteColumns.LOCK_TYPE, type == Notes.TYPE_FOLDER ? Notes.LOCK_TYPE_FOLDER : Notes.LOCK_TYPE_NOTE);
typeCursor.close();
}
} else {
// 如果当前是未锁定状态,直接锁定
newLocked = 1;
finalLockedStatus = newLocked;
// 如果是解锁操作,清空密码
values.put(NoteColumns.LOCK_PASSWORD, "");
}
if (newLocked != currentLocked) {
ContentValues values = new ContentValues();
values.put(NoteColumns.IS_LOCKED, newLocked);
if (newLocked == 1) {
// 如果是锁定操作,设置密码、密码提示和锁定类型
values.put(NoteColumns.LOCK_PASSWORD, encryptPassword(password));
values.put(NoteColumns.LOCK_HINT, hint);
// 判断是笔记还是文件夹
Cursor typeCursor = mContentResolver.query(Notes.CONTENT_NOTE_URI,
new String[]{NoteColumns.TYPE},
NoteColumns.ID + "=?",
new String[]{String.valueOf(noteId)},
null);
if (typeCursor != null && typeCursor.moveToFirst()) {
int type = typeCursor.getInt(0);
values.put(NoteColumns.LOCK_TYPE, type == Notes.TYPE_FOLDER ? Notes.LOCK_TYPE_FOLDER : Notes.LOCK_TYPE_NOTE);
typeCursor.close();
}
} else {
// 如果是解锁操作,清空密码和密码提示
values.put(NoteColumns.LOCK_PASSWORD, "");
values.put(NoteColumns.LOCK_HINT, "");
}
mContentResolver.update(Notes.CONTENT_NOTE_URI,
values,
NoteColumns.ID + "=?",
new String[]{String.valueOf(noteId)});
}
mContentResolver.update(Notes.CONTENT_NOTE_URI,
values,
NoteColumns.ID + "=?",
new String[]{String.valueOf(noteId)});
cursor.close();
}
@ -244,17 +207,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
protected void onPostExecute(Integer finalLockedStatus) {
if (finalLockedStatus == -1) {
// 密码错误,显示错误信息
Toast.makeText(NotesListActivity.this, getString(R.string.error_wrong_password), Toast.LENGTH_SHORT).show();
} else {
// 操作成功,显示结果
String message = finalLockedStatus == 1 ? getString(R.string.message_note_locked) : getString(R.string.message_note_unlocked);
Toast.makeText(NotesListActivity.this, message, Toast.LENGTH_SHORT).show();
// 重新查询数据,更新列表
startAsyncNotesListQuery();
mModeCallBack.finishActionMode();
}
String message = finalLockedStatus == 1 ? getString(R.string.message_note_locked) : getString(R.string.message_note_unlocked);
Toast.makeText(NotesListActivity.this, message, Toast.LENGTH_SHORT).show();
// 重新查询数据,更新列表
startAsyncNotesListQuery();
mModeCallBack.finishActionMode();
}
}.execute();
}
@ -1236,35 +1193,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void openNode(final NoteItemData data) {
// 检查笔记是否被锁定
if (data.isLocked()) {
// 创建布局并添加密码输入框
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(60, 40, 60, 40);
// 创建布局参数,用于设置子视图间距
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 0, 20); // 底部外边距作为间距
final EditText passwordEditText = new EditText(this);
passwordEditText.setHint(R.string.hint_enter_password);
passwordEditText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD);
layout.addView(passwordEditText, params);
// 获取密码提示并显示
String lockHint = data.getLockHint();
if (!TextUtils.isEmpty(lockHint)) {
TextView hintTextView = new TextView(this);
hintTextView.setText(getString(R.string.password_hint_prefix) + lockHint);
hintTextView.setTextColor(getResources().getColor(R.color.secondary_text_dark));
hintTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
layout.addView(hintTextView);
}
new AlertDialog.Builder(this)
.setTitle(R.string.dialog_enter_password)
.setView(layout)
.setView(passwordEditText)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

@ -99,34 +99,20 @@ public class NotesListItem extends LinearLayout {
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
mTitle.setText(context.getString(R.string.call_record_folder_name)
+ context.getString(R.string.format_folder_files_count, data.getNotesCount()));
// 检查是否被锁定
if (data.isLocked()) {
mAlert.setImageResource(android.R.drawable.ic_lock_lock);
} else {
mAlert.setImageResource(R.drawable.call_record);
}
mAlert.setImageResource(R.drawable.call_record);
} else if (data.getId() == Notes.ID_TRASH_FOLER) {
mCallName.setVisibility(View.GONE);
mAlert.setVisibility(View.VISIBLE);
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
mTitle.setText("回收站"
+ context.getString(R.string.format_folder_files_count, data.getNotesCount()));
// 检查是否被锁定
if (data.isLocked()) {
mAlert.setImageResource(android.R.drawable.ic_lock_lock);
} else {
mAlert.setImageResource(R.drawable.delete);
}
mAlert.setImageResource(R.drawable.delete);
} else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) {
mCallName.setVisibility(View.VISIBLE);
mCallName.setText(data.getCallName());
mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem);
mTitle.setText(Html.fromHtml(DataUtils.getFormattedSnippet(data.getSnippet())));
// 检查是否被锁定
if (data.isLocked()) {
mAlert.setImageResource(android.R.drawable.ic_lock_lock);
mAlert.setVisibility(View.VISIBLE);
} else if (data.hasAlert()) {
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {
@ -140,20 +126,10 @@ public class NotesListItem extends LinearLayout {
mTitle.setText(data.getSnippet()
+ context.getString(R.string.format_folder_files_count,
data.getNotesCount()));
// 检查文件夹是否被锁定
if (data.isLocked()) {
mAlert.setImageResource(android.R.drawable.ic_lock_lock);
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
mAlert.setVisibility(View.GONE);
} else {
mTitle.setText(Html.fromHtml(DataUtils.getFormattedSnippet(data.getSnippet())));
// 检查笔记是否被锁定
if (data.isLocked()) {
mAlert.setImageResource(android.R.drawable.ic_lock_lock);
mAlert.setVisibility(View.VISIBLE);
} else if (data.hasAlert()) {
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {

@ -181,17 +181,6 @@
</LinearLayout>
</ScrollView>
<TextView
android:id="@+id/tv_char_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|bottom"
android:layout_marginLeft="16dp"
android:layout_marginBottom="8dp"
android:textSize="12sp"
android:textColor="@color/secondary_text_dark"
android:text="0 字符" />
<ImageView
android:layout_width="fill_parent"
android:layout_height="7dip"

@ -57,16 +57,8 @@
<item
android:id="@+id/menu_unlock"
android:title="@string/menu_unlock" />
<item
android:id="@+id/menu_change_password"
android:title="@string/menu_change_password" />
<item
android:id="@+id/menu_note_template"
android:title="@string/menu_note_template" />
<item
android:id="@+id/menu_insert_image"
android:title="@string/menu_insert_image" />
</menu>

@ -52,17 +52,11 @@
<string name="menu_unpin">Unpin</string>
<string name="menu_lock">Lock</string>
<string name="menu_unlock">Unlock</string>
<string name="menu_change_password">Change Password</string>
<string name="dialog_enter_password">Enter Password</string>
<string name="dialog_enter_old_password">Enter Old Password</string>
<string name="dialog_enter_new_password">Enter New Password</string>
<string name="hint_enter_password">Please enter password</string>
<string name="hint_enter_password_hint">Please enter password hint</string>
<string name="password_hint_prefix">Hint: </string>
<string name="error_wrong_password">Incorrect password</string>
<string name="message_note_locked">Note locked successfully</string>
<string name="message_note_unlocked">Note unlocked successfully</string>
<string name="message_password_changed">Password changed successfully</string>
<string name="menu_select_title">%d selected</string>
<string name="menu_select_none">Nothing selected, the operation is invalid</string>
<string name="menu_select_all">Select all</string>
@ -164,15 +158,5 @@
<string name="message_template_deleted">Template deleted successfully</string>
<string name="alert_message_delete_template">Are you sure you want to delete this template?</string>
<string name="menu_note_template">Note Template</string>
<!-- Image related strings -->
<string name="menu_insert_image">Insert Image</string>
<string name="menu_take_photo">Take Photo</string>
<string name="menu_choose_from_gallery">Choose from Gallery</string>
<string name="menu_delete_image">Delete Image</string>
<string name="error_image_selection">Failed to select image</string>
<string name="error_image_insertion">Failed to insert image</string>
<string name="error_image_capture">Failed to capture image</string>
<string name="error_camera_permission">Camera permission is required to take photos</string>
</resources>

Loading…
Cancel
Save