diff --git a/src/main/java/net/micode/notes/data/Notes.java b/src/main/java/net/micode/notes/data/Notes.java index 4b82197..11b031a 100644 --- a/src/main/java/net/micode/notes/data/Notes.java +++ b/src/main/java/net/micode/notes/data/Notes.java @@ -99,6 +99,16 @@ public class Notes { * 组件类型:4x4大小的便签组件 */ public static final int TYPE_WIDGET_4X = 1; + + /** + * 锁类型:便签锁 + */ + public static final int LOCK_TYPE_NOTE = 0; + + /** + * 锁类型:文件夹锁 + */ + public static final int LOCK_TYPE_FOLDER = 1; /** * 数据类型常量类,定义了不同类型便签的数据项类型 @@ -234,6 +244,26 @@ public class Notes { *

0表示未置顶,1表示置顶

*/ public static final String PINNED = "pinned"; + + /** + * 是否上锁 + *

类型: INTEGER

+ *

0表示未上锁,1表示上锁

+ */ + public static final String IS_LOCKED = "is_locked"; + + /** + * 加密后的密码 + *

类型: TEXT

+ */ + public static final String LOCK_PASSWORD = "lock_password"; + + /** + * 锁类型 + *

类型: INTEGER

+ *

0表示便签锁,1表示文件夹锁

+ */ + public static final String LOCK_TYPE = "lock_type"; } public interface DataColumns { diff --git a/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java index 5eccfec..ce29b9f 100644 --- a/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java @@ -35,7 +35,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { // 数据库文件名 private static final String DB_NAME = "note.db"; // 数据库版本号,用于升级控制 - private static final int DB_VERSION = 5; + private static final int DB_VERSION = 6; /** * 数据库表名常量定义 @@ -75,7 +75,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.PINNED + " INTEGER NOT NULL DEFAULT 0" + + NoteColumns.PINNED + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.IS_LOCKED + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.LOCK_PASSWORD + " TEXT NOT NULL DEFAULT ''," + + NoteColumns.LOCK_TYPE + " INTEGER NOT NULL DEFAULT 0" + ")"; /** @@ -385,6 +388,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { oldVersion++; } + // 版本5升级到版本6:添加锁相关字段 + if (oldVersion == 5) { + upgradeToV6(db); + oldVersion++; + } + // 如果需要,重新创建触发器 if (reCreateTriggers) { reCreateNoteTableTriggers(db); @@ -445,4 +454,17 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.PINNED + " INTEGER NOT NULL DEFAULT 0"); } + + /** + * 升级到版本6:添加锁相关字段,用于便签和文件夹上锁功能 + * @param db 数据库实例 + */ + private void upgradeToV6(SQLiteDatabase db) { + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.IS_LOCKED + + " INTEGER NOT NULL DEFAULT 0"); + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.LOCK_PASSWORD + + " TEXT NOT NULL DEFAULT ''"); + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.LOCK_TYPE + + " INTEGER NOT NULL DEFAULT 0"); + } } \ No newline at end of file diff --git a/src/main/java/net/micode/notes/model/WorkingNote.java b/src/main/java/net/micode/notes/model/WorkingNote.java index 36003cc..e20c6fe 100644 --- a/src/main/java/net/micode/notes/model/WorkingNote.java +++ b/src/main/java/net/micode/notes/model/WorkingNote.java @@ -504,6 +504,19 @@ public class WorkingNote { } } + /** + * 设置笔记的基本属性值 + *

+ * 直接调用内部Note对象的setNoteValue方法,用于更新笔记的基本属性。 + *

+ * + * @param key 属性键名,对应NoteColumns中的字段名 + * @param value 属性值 + */ + public void setNoteValue(String key, String value) { + mNote.setNoteValue(key, value); + } + /** * 设置笔记内容 *

diff --git a/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/main/java/net/micode/notes/ui/NoteEditActivity.java index 088dac7..a5ca2c3 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -48,6 +48,10 @@ import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.ImageView; +import android.database.Cursor; +import android.content.ContentResolver; +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; @@ -671,6 +675,12 @@ public class NoteEditActivity extends Activity implements OnClickListener, case R.id.menu_delete_remind: mWorkingNote.setAlertDate(0, false); break; + case R.id.menu_lock: + showPasswordDialogForLock(); + break; + case R.id.menu_unlock: + showPasswordDialogForUnlock(); + break; default: break; } @@ -709,6 +719,139 @@ public class NoteEditActivity extends Activity implements OnClickListener, context.startActivity(intent); } + /** + * 显示密码输入对话框用于锁定笔记 + *

+ * 该方法用于显示一个密码输入对话框,让用户输入密码来锁定当前编辑的笔记 + *

+ */ + private void showPasswordDialogForLock() { + 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); + + new AlertDialog.Builder(this) + .setTitle(R.string.dialog_enter_password) + .setView(passwordEditText) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String password = passwordEditText.getText().toString(); + if (!TextUtils.isEmpty(password)) { + lockCurrentNote(password); + } + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + /** + * 显示密码输入对话框用于解锁笔记 + *

+ * 该方法用于显示一个密码输入对话框,让用户输入密码来解锁当前编辑的笔记 + *

+ */ + private void showPasswordDialogForUnlock() { + 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); + + new AlertDialog.Builder(this) + .setTitle(R.string.dialog_enter_password) + .setView(passwordEditText) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String password = passwordEditText.getText().toString(); + if (!TextUtils.isEmpty(password)) { + unlockCurrentNote(password); + } + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + /** + * 锁定当前笔记 + *

+ * 该方法用于锁定当前编辑的笔记,更新其锁定状态、密码和锁定类型 + *

+ * @param password 用于锁定的密码 + */ + 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)); + // 保存笔记 + saveNote(); + // 显示提示信息 + Toast.makeText(this, getString(R.string.message_note_locked), Toast.LENGTH_SHORT).show(); + } + + /** + * 解锁当前笔记 + *

+ * 该方法用于解锁当前编辑的笔记,更新其锁定状态和密码 + *

+ * @param password 用于解锁的密码 + */ + private void unlockCurrentNote(String password) { + // 使用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(password))) { + // 密码正确,设置锁定状态为0(未锁定) + mWorkingNote.setNoteValue(NoteColumns.IS_LOCKED, "0"); + // 清空密码 + mWorkingNote.setNoteValue(NoteColumns.LOCK_PASSWORD, ""); + // 保存笔记 + saveNote(); + // 显示提示信息 + Toast.makeText(this, getString(R.string.message_note_unlocked), Toast.LENGTH_SHORT).show(); + } else { + // 密码错误,显示错误信息 + Toast.makeText(this, getString(R.string.error_wrong_password), Toast.LENGTH_SHORT).show(); + } + } + + /** + * 加密密码 + *

+ * 该方法使用Base64和ANDROID_ID对密码进行加密 + *

+ * @param password 原始密码 + * @return 加密后的密码 + */ + private String encryptPassword(String password) { + try { + // 获取设备的ANDROID_ID作为加密密钥 + String androidId = android.provider.Settings.Secure.getString(getContentResolver(), + android.provider.Settings.Secure.ANDROID_ID); + // 使用简单的加密算法:将密码与ANDROID_ID拼接后进行Base64编码 + String combined = password + androidId; + return android.util.Base64.encodeToString(combined.getBytes(), android.util.Base64.DEFAULT); + } catch (Exception e) { + Log.e(TAG, "Password encryption failed", e); + return password; // 加密失败时返回原始密码 + } + } + /** * 创建新笔记 *

diff --git a/src/main/java/net/micode/notes/ui/NoteItemData.java b/src/main/java/net/micode/notes/ui/NoteItemData.java index 44825ee..de815f8 100644 --- a/src/main/java/net/micode/notes/ui/NoteItemData.java +++ b/src/main/java/net/micode/notes/ui/NoteItemData.java @@ -54,6 +54,9 @@ public class NoteItemData { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.PINNED, + NoteColumns.IS_LOCKED, + NoteColumns.LOCK_PASSWORD, + NoteColumns.LOCK_TYPE, }; /** @@ -120,6 +123,21 @@ public class NoteItemData { * 查询结果中置顶状态列的索引 */ private static final int PINNED_COLUMN = 12; + + /** + * 查询结果中锁定状态列的索引 + */ + private static final int IS_LOCKED_COLUMN = 13; + + /** + * 查询结果中锁定密码列的索引 + */ + private static final int LOCK_PASSWORD_COLUMN = 14; + + /** + * 查询结果中锁定类型列的索引 + */ + private static final int LOCK_TYPE_COLUMN = 15; /** * 笔记ID @@ -131,6 +149,21 @@ public class NoteItemData { */ private boolean mPinned; + /** + * 锁定状态 + */ + private boolean mIsLocked; + + /** + * 锁定密码 + */ + private String mLockPassword; + + /** + * 锁定类型 + */ + private int mLockType; + /** * 提醒日期 */ @@ -242,6 +275,9 @@ public class NoteItemData { mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); mPinned = (cursor.getInt(PINNED_COLUMN) > 0) ? true : false; + mIsLocked = (cursor.getInt(IS_LOCKED_COLUMN) > 0) ? true : false; + mLockPassword = cursor.getString(LOCK_PASSWORD_COLUMN); + mLockType = cursor.getInt(LOCK_TYPE_COLUMN); mPhoneNumber = ""; if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { @@ -475,6 +511,54 @@ public class NoteItemData { public void setPinned(boolean pinned) { mPinned = pinned; } + + /** + * 获取锁定状态 + * @return 锁定状态,true表示已锁定,false表示未锁定 + */ + public boolean isLocked() { + return mIsLocked; + } + + /** + * 设置锁定状态 + * @param locked 锁定状态,true表示锁定,false表示解锁 + */ + public void setLocked(boolean locked) { + mIsLocked = locked; + } + + /** + * 获取锁定密码 + * @return 锁定密码 + */ + public String getLockPassword() { + return mLockPassword; + } + + /** + * 设置锁定密码 + * @param password 锁定密码 + */ + public void setLockPassword(String password) { + mLockPassword = password; + } + + /** + * 获取锁定类型 + * @return 锁定类型,0表示笔记,1表示文件夹 + */ + public int getLockType() { + return mLockType; + } + + /** + * 设置锁定类型 + * @param type 锁定类型,0表示笔记,1表示文件夹 + */ + public void setLockType(int type) { + mLockType = type; + } /** * 获取笔记类型(静态方法) diff --git a/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java index 66ae5b7..74b08ea 100644 --- a/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -115,6 +115,127 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt */ private enum ListEditState { NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER + } + + /** + * 显示密码输入对话框 + *

+ * 该方法用于显示一个密码输入对话框,让用户输入密码来锁定选中的笔记或文件夹 + *

+ */ + private void showPasswordDialog() { + 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); + + new AlertDialog.Builder(this) + .setTitle(R.string.dialog_enter_password) + .setView(passwordEditText) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String password = passwordEditText.getText().toString(); + if (!TextUtils.isEmpty(password)) { + toggleLockedStatus(password); + } + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + /** + * 切换锁定状态 + *

+ * 该方法用于切换选中笔记或文件夹的锁定状态,使用异步任务处理数据库操作 + *

+ * @param password 用于锁定的密码 + */ + private void toggleLockedStatus(final String password) { + final HashSet selectedIds = mNotesListAdapter.getSelectedItemIds(); + final int selectedCount = mNotesListAdapter.getSelectedCount(); + + new AsyncTask() { + 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.ID + "=?", + new String[]{String.valueOf(noteId)}, + null); + + if (cursor != null && cursor.moveToFirst()) { + int currentLocked = cursor.getInt(0); + // 切换锁定状态 + 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 { + // 如果是解锁操作,清空密码 + values.put(NoteColumns.LOCK_PASSWORD, ""); + } + + mContentResolver.update(Notes.CONTENT_NOTE_URI, + values, + NoteColumns.ID + "=?", + new String[]{String.valueOf(noteId)}); + + cursor.close(); + } + } + return finalLockedStatus; + } + + @Override + protected void onPostExecute(Integer finalLockedStatus) { + 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(); + } + + /** + * 加密密码 + *

+ * 该方法使用Base64和ANDROID_ID对密码进行加密 + *

+ * @param password 原始密码 + * @return 加密后的密码 + */ + private String encryptPassword(String password) { + try { + // 获取设备的ANDROID_ID作为加密密钥 + String androidId = android.provider.Settings.Secure.getString(getContentResolver(), + android.provider.Settings.Secure.ANDROID_ID); + // 使用简单的加密算法:将密码与ANDROID_ID拼接后进行Base64编码 + String combined = password + androidId; + return android.util.Base64.encodeToString(combined.getBytes(), android.util.Base64.DEFAULT); + } catch (Exception e) { + Log.e(TAG, "Password encryption failed", e); + return password; // 加密失败时返回原始密码 + } }; /** 当前列表编辑状态 */ @@ -201,6 +322,19 @@ 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( + android.window.OnBackInvokedDispatcher.PRIORITY_DEFAULT, + new android.window.OnBackInvokedCallback() { + @Override + public void onBackInvoked() { + handleBackPress(); + } + } + ); + } } /** @@ -366,6 +500,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt if (pinMenu != null) { pinMenu.setOnMenuItemClickListener(this); } + // 添加锁定菜单初始化 + MenuItem lockMenu = menu.findItem(R.id.lock); + if (lockMenu != null) { + lockMenu.setOnMenuItemClickListener(this); + } mActionMode = mode; mNotesListAdapter.setChoiceMode(true); mNotesListView.setLongClickable(false); @@ -528,6 +667,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt case R.id.pin: togglePinnedStatus(); break; + case R.id.lock: + showPasswordDialog(); + break; default: return false; } @@ -862,11 +1004,72 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt *

* @param data 要打开的笔记数据项 */ - private void openNode(NoteItemData data) { - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, data.getId()); - this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); + private void openNode(final NoteItemData data) { + // 检查笔记是否被锁定 + if (data.isLocked()) { + 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); + + new AlertDialog.Builder(this) + .setTitle(R.string.dialog_enter_password) + .setView(passwordEditText) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String password = passwordEditText.getText().toString(); + if (!TextUtils.isEmpty(password)) { + verifyPasswordAndOpenNote(data.getId(), password); + } + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } else { + // 未锁定,直接打开笔记 + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, data.getId()); + startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); + } + } + + /** + * 验证密码并打开笔记 + *

+ * 该方法完成以下工作: + * 1. 查询笔记的加密密码 + * 2. 验证密码是否正确 + * 3. 如果正确,打开笔记;否则显示错误信息 + *

+ * @param noteId 笔记ID + * @param password 用户输入的密码 + */ + private void verifyPasswordAndOpenNote(final long noteId, String password) { + // 查询笔记的加密密码 + String[] projection = {NoteColumns.LOCK_PASSWORD}; + String selection = NoteColumns.ID + "=?"; + String[] selectionArgs = {String.valueOf(noteId)}; + + 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(password))) { + // 密码正确,打开笔记 + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, noteId); + startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); + } else { + // 密码错误,显示错误信息 + Toast.makeText(this, getString(R.string.error_wrong_password), Toast.LENGTH_SHORT).show(); + } } /** @@ -1052,8 +1255,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt * 3. 如果在根文件夹中,调用默认的返回处理 *

*/ - @Override - public void onBackPressed() { + private void handleBackPress() { switch (mState) { case SUB_FOLDER: mCurrentFolderId = Notes.ID_ROOT_FOLDER; @@ -1076,6 +1278,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } } + @Override + public void onBackPressed() { + handleBackPress(); + } + /** * 更新部件 *

diff --git a/src/main/res/menu/note_edit.xml b/src/main/res/menu/note_edit.xml index 35cacd1..caee172 100644 --- a/src/main/res/menu/note_edit.xml +++ b/src/main/res/menu/note_edit.xml @@ -49,4 +49,12 @@ + + + + \ No newline at end of file diff --git a/src/main/res/menu/note_list_options.xml b/src/main/res/menu/note_list_options.xml index 749aa3e..165c7d2 100644 --- a/src/main/res/menu/note_list_options.xml +++ b/src/main/res/menu/note_list_options.xml @@ -33,4 +33,9 @@ android:id="@+id/pin" android:title="@string/menu_pin" android:showAsAction="always|withText" /> + + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 02d3841..ed89ef7 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -50,6 +50,13 @@ Move to folder Pin Unpin + Lock + Unlock + Enter Password + Please enter password + Incorrect password + Note locked successfully + Note unlocked successfully %d selected Nothing selected, the operation is invalid Select all