From 378a7eb409920028598f50ad3f9985daa7b8cd4c Mon Sep 17 00:00:00 2001 From: eazzy <1044745821@qq.com> Date: Sun, 7 Jan 2024 20:08:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E7=BB=B4=E6=8A=A4?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=8A=A5=E5=91=8A=E7=9A=84=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...泛读、标注和维护报告文档.docx | Bin 0 -> 162 bytes doc/~$便签质量分析报告.docx | Bin 0 -> 162 bytes doc/~WRL2503.tmp | Bin 0 -> 24020 bytes doc/小米便签的代码标注.docx | Bin 18556 -> 0 bytes .../java/net/micode/notes/data/Contact.java | 57 ++++--- .../net/micode/notes/ui/NoteEditActivity.java | 73 ++++++++- .../net/micode/notes/ui/NoteItemData.java | 1 + .../micode/notes/ui/NotesListActivity.java | 151 +++++++++++++++++- .../net/micode/notes/ui/NotesListItem.java | 2 +- src/main/res/layout/note_edit.xml | 16 +- src/main/res/layout/note_list.xml | 3 +- src/main/res/menu/note_list.xml | 20 +++ src/main/res/menu/sub_folder.xml | 16 ++ src/main/res/values-zh-rCN/strings.xml | 8 + src/main/res/values-zh-rTW/strings.xml | 8 + src/main/res/values/colors.xml | 5 + src/main/res/values/strings.xml | 21 ++- src/main/res/values/styles.xml | 15 +- 18 files changed, 348 insertions(+), 48 deletions(-) create mode 100644 doc/~$便签泛读、标注和维护报告文档.docx create mode 100644 doc/~$便签质量分析报告.docx create mode 100644 doc/~WRL2503.tmp delete mode 100644 doc/小米便签的代码标注.docx diff --git a/doc/~$便签泛读、标注和维护报告文档.docx b/doc/~$便签泛读、标注和维护报告文档.docx new file mode 100644 index 0000000000000000000000000000000000000000..7306b7049027ff73471b4ddbc82cf74ae26d52fb GIT binary patch literal 162 zcmZQ|O{}V_WFQf+GPp7%GE@N}MC*bFoOdTNGB8|;MKy>C%7uwP3{3EecD%)y)-Lo> dHj{yYx#)Qah!4}nC;eyr|9S=nS(pHj1^|L^74HB5 literal 0 HcmV?d00001 diff --git a/doc/~$便签质量分析报告.docx b/doc/~$便签质量分析报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..7115a73810df3b2d0517798eba2eae015075a5e4 GIT binary patch literal 162 zcmZQ|O{}V_WFQf+GPp7%GE@N}MC*c%*AFK#GBC{4l|wO!3Ce?sU-WrlA!U1uF|A$b hqiiMvgZd4f8?lbJfI1<7Px{aL|Md(ES}*}14FH-o7GD4W literal 0 HcmV?d00001 diff --git a/doc/~WRL2503.tmp b/doc/~WRL2503.tmp new file mode 100644 index 0000000000000000000000000000000000000000..2e90554255c64ae7acb962ae2dec48333e840873 GIT binary patch literal 24020 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 diff --git a/src/main/java/net/micode/notes/data/Contact.java b/src/main/java/net/micode/notes/data/Contact.java index d65c239..95d8bce 100644 --- a/src/main/java/net/micode/notes/data/Contact.java +++ b/src/main/java/net/micode/notes/data/Contact.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package net.micode.notes.data;//属于data这个包 +package net.micode.notes.data; import android.content.Context; import android.database.Cursor; @@ -25,64 +25,63 @@ import android.util.Log; import java.util.HashMap; /** - * @Package: net.micode.notes.data - * @ClassName: Contact - * @Description: - * Contact类用于查询联系人信息并进行缓存。 - * 该类包含一个静态的HashMap作为缓存,存储电话号码和对应的联系人名字。 - * 通过调用getContact方法可以根据给定的电话号码查询联系人名字。 - * 如果缓存中已经存在该电话号码对应的联系人名字,则直接返回缓存中的结果,否则通过查询数据库获取联系人名字并更新缓存。 - * 该类还定义了一个私有的SQL筛选语句用于查询联系人信息。 - * 注意:该类是线程不安全的,如果需要在多线程环境下使用,请做好同步控制 - * @Author: YangYizhe - * @CreateDate: 12/17/2023 10:10 AM - * @Version: 1.0 + * @Package: net.micode.notes.data + * @ClassName: Contact + * @Description: + * @Author: WUSHUXIAN + * @CreateDate: 2023/12/20 23:26 + * @Version: 1.0 */ public class Contact { - /** - * 作为缓存,存储电话号码和对应的联系人名字 - */ private static HashMap sContactCache; - private static final String TAG = "Contact";//设置日志TAG标签 + private static final String TAG = "Contact"; - //查询联系人的SQL筛选语句 private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + " AND " + Data.RAW_CONTACT_ID + " IN " + "(SELECT raw_contact_id " + " FROM phone_lookup" + " WHERE min_match = '+')"; - //获取联系人 + /** + * @method getContact + * @description: + * @date: 2023/12/21 19:18 + * @author: WuShuxian + * @param: context + * @param: phoneNumber + * @return: String + */ public static String getContact(Context context, String phoneNumber) { - if(sContactCache == null) {/*如果缓存为空,就新建一个*/ + // + if(sContactCache == null) { sContactCache = new HashMap(); } - if(sContactCache.containsKey(phoneNumber)) {/*如果缓存中已经有该电话号码对应的联系人名字,就直接返回*/ + if(sContactCache.containsKey(phoneNumber)) { return sContactCache.get(phoneNumber); } String selection = CALLER_ID_SELECTION.replace("+", - PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));//将电话号码转换为最小匹配模式,用于筛选 + PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); Cursor cursor = context.getContentResolver().query( Data.CONTENT_URI, new String [] { Phone.DISPLAY_NAME }, - selection,//使用筛选条件 + selection, new String[] { phoneNumber }, null); - if (cursor != null && cursor.moveToFirst()) {//如果找到了符合条件的联系人 + if (cursor != null && cursor.moveToFirst()) { try { - String name = cursor.getString(0);//获取联系人名字 - sContactCache.put(phoneNumber, name);//将电话号码和联系人名字添加到缓存中 - return name;//返回联系人名字 + String name = cursor.getString(0); + sContactCache.put(phoneNumber, name); + return name; } catch (IndexOutOfBoundsException e) { Log.e(TAG, " Cursor get string error " + e.toString()); return null; } finally { - cursor.close();//关闭游标 + cursor.close(); } - } else {/*没找到*/ + } else { Log.d(TAG, "No contact matched with number:" + phoneNumber); return null; } diff --git a/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/main/java/net/micode/notes/ui/NoteEditActivity.java index 18cafd6..0ad5f86 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -19,6 +19,8 @@ import android.text.SpannableString; import android.text.TextUtils; import android.text.format.DateUtils; import android.text.style.BackgroundColorSpan; +import android.text.Editable;// 引入textwatcher和Editable +import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -75,6 +77,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, public TextView tvAlertDate; public ImageView ibSetBgColor; + + public TextView textNum; } private static final Map sBgSelectorBtnsMap = new HashMap(); static { @@ -132,6 +136,70 @@ public class NoteEditActivity extends Activity implements OnClickListener, private String mUserQuery; private Pattern mPattern; + + /** + * @method Textchange + * @description 对原始文本进行处理,去除图片字符、换行符和空格字符 + * @date: 1/3/2024 8:48 AM + * @author: YangYizhe + * @param oriText + * @return 处理后的文本 + */ + private String Textchange(String oriText){ + StringBuffer stringBuffer = new StringBuffer(oriText); + int Flag1 = -1; + int Flag2 = -1; + do {//不计入表示图片的字符 + Flag1 = stringBuffer.indexOf(""); + if (Flag1 != -1 && Flag2 != -1) { + stringBuffer = stringBuffer.replace(Flag1, Flag2+1, ""); + } + } while (Flag1 != -1 && Flag2 != -1); + + do {//不计入换行字符 + Flag1 = stringBuffer.indexOf("\n"); + + if (Flag1 != -1){ + stringBuffer = stringBuffer.replace(Flag1, Flag1+1, ""); + } + } while (Flag1 != -1); + do {//不计入空格字符 + Flag1 = stringBuffer.indexOf(" "); + + if (Flag1 != -1) { + stringBuffer = stringBuffer.replace(Flag1, Flag1+1, ""); + } + } while (Flag1 != -1); + return stringBuffer.toString(); + } + + /** + * @method count + * @description 监听编辑框文本变化并更新字符数 + * @date: 1/3/2024 9:09 AM + * @author: YangYizhe + */ + private void count() { + mNoteEditor.addTextChangedListener(new TextWatcher() { + int currentLength = 0; + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + mNoteHeaderHolder.textNum.setText("字数:" + currentLength); + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + currentLength = Textchange(mNoteEditor.getText().toString()).length(); + } + + @Override + public void afterTextChanged(Editable s) { + mNoteHeaderHolder.textNum.setText("字数:" + currentLength); + } + }); + } + /** *在 Activity 创建时进行一些初始化工作,包括设置布局、初始化状态和资源等操作 */ @@ -144,6 +212,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, return; } initResources(); + count(); } /** @@ -375,6 +444,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, 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.textNum = (TextView) findViewById(R.id.text_num); mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); mNoteEditor = (EditText) findViewById(R.id.note_edit_view); mNoteEditorPanel = findViewById(R.id.sv_note_edit); @@ -538,8 +608,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, int itemId = item.getItemId(); if (itemId == R.id.menu_new_note) { createNewNote(); - } - else if (itemId == R.id.menu_delete) { + } else if (itemId == 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); diff --git a/src/main/java/net/micode/notes/ui/NoteItemData.java b/src/main/java/net/micode/notes/ui/NoteItemData.java index 832cbe9..ca9bcbe 100644 --- a/src/main/java/net/micode/notes/ui/NoteItemData.java +++ b/src/main/java/net/micode/notes/ui/NoteItemData.java @@ -34,6 +34,7 @@ import net.micode.notes.tool.DataUtils; * @Version: 1.0 */ public class NoteItemData { + // 用于定义查询操作中要返回的列 static final String [] PROJECTION = new String [] { NoteColumns.ID, NoteColumns.ALERTED_DATE, diff --git a/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java index 2b0e901..5eea908 100644 --- a/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -85,6 +85,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; + /**三个状态,主页面,文件夹,通话记录文件夹*/ private enum ListEditState { NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER }; @@ -100,6 +101,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt private Button mAddNewNote; private boolean mDispatch; + // 控制背景颜色,初始为亮 + private int mBackgroundColor = 1; private int mOriginY; @@ -117,6 +120,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt public static final int NOTES_LISTVIEW_SCROLL_RATE = 30; + /** 私密模式,初始为 0 开启为 1*/ + public static int mSecretMode = 0; + private NoteItemData mFocusNoteDataItem; private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?"; @@ -140,6 +146,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 调用父类的onCreate函数 setContentView(R.layout.note_list); + getWindow().setBackgroundDrawableResource(R.drawable.bg_light); initResources(); setAppInfoFromRawRes(); } @@ -463,10 +470,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt * @return */ private void startAsyncNotesListQuery() { - String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION : NORMAL_SELECTION; + String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION + : NORMAL_SELECTION; mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, - Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] {String.valueOf(mCurrentFolderId)}, - NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); + Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[]{ + String.valueOf(mCurrentFolderId) + }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); } /** * @Package: net.micode.notes.ui @@ -530,6 +539,98 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt }); builder.show(); } + + /** + * @method switchBackground + * @description 用以切换背景颜色 + * @date: 1/3/2024 3:41 PM + * @author: YangYizhe + */ + private void switchBackground(){ + mBackgroundColor = (mBackgroundColor + 1) % 2; + View frameLayout = findViewById(R.id.frame_layout_id); + if (mBackgroundColor == 1){ + frameLayout.setBackgroundResource(R.drawable.bg_light); + } else{ + frameLayout.setBackgroundResource(R.drawable.bg_dark); + } + + } + + private boolean isSecretMode(){ + if(mSecretMode == 1){ + return true; + }else { + return false; + } + } + + /** + * @method enterSecertMode + * @description 实现进入隐私模式的功能 + * @date: 1/2/2024 8:18 PM + * @author: YangYizhe + */ + private void enterSecretMode(){ + AlertDialog.Builder dialog = new AlertDialog.Builder(NotesListActivity.this); + dialog.setTitle("重要提醒"); + dialog.setMessage("您确认进入隐私模式吗?"); + dialog.setCancelable(false); + dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mSecretMode = 1; + startAsyncNotesListQuery(); + Toast.makeText(NotesListActivity.this,"您已进入隐私模式",Toast.LENGTH_SHORT).show(); + } + }); + dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which){} + }); + dialog.show(); + } + + /** + * @method quitSecretMode + * @description 实现退出隐私模式的功能 + * @date: 1/2/2024 8:20 PM + * @author: YangYizhe + */ + private void quitSecretMode(){ + AlertDialog.Builder dialog = new AlertDialog.Builder(NotesListActivity.this); + dialog.setTitle("重要提醒"); + dialog.setMessage("您确认退出隐私模式吗?"); + dialog.setCancelable(false); + dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mSecretMode = 0; + startAsyncNotesListQuery(); + Toast.makeText(NotesListActivity.this,"您已退出隐私模式",Toast.LENGTH_SHORT).show(); + } + }); + dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which){} + }); + dialog.show(); + } + + /** + * @method restoreDeletedNodes + * @description 进入回收站 + * @date: 1/3/2024 8:11 PM + * @author: YangYizhe + */ + private void restoreDeletedNodes(){ + mState = ListEditState.SUB_FOLDER; + mCurrentFolderId = Notes.ID_TRASH_FOLER; + startAsyncNotesListQuery(); + mTitleBar.setText("回收站"); + mTitleBar.setVisibility(View.VISIBLE); + } + /** * @method createNewNote * @description 创建便签 @@ -544,6 +645,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); } + /** * @method batchDelete * @description: @@ -558,15 +660,15 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt new AsyncTask>() { protected HashSet doInBackground(Void... unused) { HashSet widgets = mNotesListAdapter.getSelectedWidget(); - //如果没有同步,直接删除 - if (!isSyncMode()) { + // 如果是回收站中的,直接删除 + if (mCurrentFolderId == Notes.ID_TRASH_FOLER) { if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter .getSelectedItemIds())) { } else { Log.e(TAG, "Delete notes error, should not happens"); } } - //已同步,将删除的便签移到垃圾桶 + // 将删除的便签移到回收站 else { if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) { @@ -891,6 +993,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } @Override + /** + * @method onPrepareOptionsMenu + * @description 准备菜单选项的回调方法,menu是Android自带的对象 + * @date: 1/2/2024 7:40 PM + * @author: YangYizhe + * @param [menu] 菜单对象 + * @return boolean 返回值指示是否处理了菜单创建事件 + */ public boolean onPrepareOptionsMenu(Menu menu) { menu.clear(); if (mState == ListEditState.NOTE_LIST) { @@ -905,10 +1015,29 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } else { Log.e(TAG, "Wrong state:" + mState); } + // 若在隐私模式之中,则不显示进入隐私模式的选项,不在隐私模式之中,则不显示退出隐私模式选项 + if(isSecretMode()){ + menu.findItem(R.id.menu_secret).setVisible(false); + } else { + menu.findItem(R.id.menu_quit_secret).setVisible(false); + } + if(mBackgroundColor==1) { + menu.findItem(R.id.menu_light_mode).setVisible(false); + } else { + menu.findItem(R.id.menu_dark_mode).setVisible(false); + } return true; } @Override + /** + * @method onOptionsItemSelected + * @description 处理菜单选项的选择事件。根据被选择的菜单项不同,该方法会触发不同的操作。 + * @date: 1/2/2024 7:41 PM + * @author: YangYizhe + * @param [item] 被选择的菜单项 + * @return boolean 返回值指示是否处理了菜单选择事件 + */ public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.menu_new_folder) { @@ -931,6 +1060,16 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt createNewNote(); } else if (itemId == R.id.menu_search) { onSearchRequested(); + } else if (itemId == R.id.menu_secret) { + enterSecretMode(); + } else if (itemId == R.id.menu_quit_secret){ + quitSecretMode(); + } else if(itemId == R.id.menu_light_mode) { + switchBackground(); + } else if(itemId == R.id.menu_dark_mode) { + switchBackground(); + } else if (itemId == R.id.menu_restore) { + restoreDeletedNodes(); } return true; } diff --git a/src/main/java/net/micode/notes/ui/NotesListItem.java b/src/main/java/net/micode/notes/ui/NotesListItem.java index d32a37b..5cf4b20 100644 --- a/src/main/java/net/micode/notes/ui/NotesListItem.java +++ b/src/main/java/net/micode/notes/ui/NotesListItem.java @@ -26,7 +26,7 @@ public class NotesListItem extends LinearLayout { private ImageView mAlert;//闹钟图片 private TextView mTitle; //标题 private TextView mTime; //时间 - private TextView mCallName; // + private TextView mCallName; private NoteItemData mItemData; //标签数据 private CheckBox mCheckBox; //打钩框 diff --git a/src/main/res/layout/note_edit.xml b/src/main/res/layout/note_edit.xml index 10b2aa7..59415d7 100644 --- a/src/main/res/layout/note_edit.xml +++ b/src/main/res/layout/note_edit.xml @@ -30,6 +30,7 @@ android:id="@+id/note_title" android:layout_width="fill_parent" android:layout_height="wrap_content"> + + + + android:textAppearance="@style/TextAppearancePrimaryItem" /> + android:background="@drawable/bg_light"> + + + + + + + + + + diff --git a/src/main/res/menu/sub_folder.xml b/src/main/res/menu/sub_folder.xml index b00de26..d81e568 100644 --- a/src/main/res/menu/sub_folder.xml +++ b/src/main/res/menu/sub_folder.xml @@ -21,4 +21,20 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 09f75ed..dacfe89 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -119,6 +119,14 @@ 便签 设置 取消 + 亮背景 + 暗背景 + 私密模式 + 退出私密模式 + 字符数 + 恢复 + 欢迎页面 + EAZZY\nNOTE %1$s 条符合“%2$s”的搜索结果 diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml index e29b79b..1bfa120 100644 --- a/src/main/res/values-zh-rTW/strings.xml +++ b/src/main/res/values-zh-rTW/strings.xml @@ -120,6 +120,14 @@ 便籤 設置 取消 + 亮背景 + 暗背景 + 私密模式 + 退出私密模式 + 字符数 + 恢复 + 欢迎页面 + EAZZY\nNOTE %1$s 條符合”%2$s“的搜尋結果 diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml index 123ffbf..2496c0c 100644 --- a/src/main/res/values/colors.xml +++ b/src/main/res/values/colors.xml @@ -17,4 +17,9 @@ #335b5b5b + #FF039BE5 + #FF01579B + #FF40C4FF + #FF00B0FF + #66000000 diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 55df868..469b04c 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -15,8 +15,7 @@ limitations under the License. --> - + Notes Notes 2x2 Notes 4x4 @@ -126,10 +125,24 @@ Notes set cancel + + light mode + dark mode + + secret mode + quit secret mode + + length + restore + + SplashActivity + EAZZY\nNOTE + - %1$s result for \"%2$s\" + %1$s result for \"%2$s\" - %1$s results for \"%2$s\" + %1$s results for \"%2$s\" + diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index ad0d90d..db56d26 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -16,18 +16,22 @@ --> + + + + @@ -66,4 +70,13 @@ visible + + + + \ No newline at end of file