diff --git a/README.md b/README.md
index 0b0a565..5fe9026 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
-#小米便签项目
\ No newline at end of file
+#小米便签项目
+11
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 845436e..384548c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -25,8 +25,8 @@ android {
defaultConfig {
applicationId "net.micode.notes"
- minSdkVersion 14
- targetSdkVersion 14
+ minSdkVersion 30
+ targetSdkVersion 30
}
buildTypes {
diff --git a/doc/01_宋经纬_泛读报告.docx b/doc/01_宋经纬_泛读报告.docx
new file mode 100644
index 0000000..00dd1d1
Binary files /dev/null and b/doc/01_宋经纬_泛读报告.docx differ
diff --git a/doc/02_宋经纬_质量分析报告.docx b/doc/02_宋经纬_质量分析报告.docx
new file mode 100644
index 0000000..cf435c8
Binary files /dev/null and b/doc/02_宋经纬_质量分析报告.docx differ
diff --git a/doc/03_宋经纬_维护需求与设计方案.docx b/doc/03_宋经纬_维护需求与设计方案.docx
new file mode 100644
index 0000000..437475f
Binary files /dev/null and b/doc/03_宋经纬_维护需求与设计方案.docx differ
diff --git a/doc/04_宋经纬_软件工程汇报PPT.pptx b/doc/04_宋经纬_软件工程汇报PPT.pptx
new file mode 100644
index 0000000..4533237
Binary files /dev/null and b/doc/04_宋经纬_软件工程汇报PPT.pptx differ
diff --git a/doc/05_宋经纬_贡献度.xlsx b/doc/05_宋经纬_贡献度.xlsx
new file mode 100644
index 0000000..358e36f
Binary files /dev/null and b/doc/05_宋经纬_贡献度.xlsx differ
diff --git a/doc/06_孙瑛峻_小米便签代码标注.docx b/doc/06_孙瑛峻_小米便签代码标注.docx
new file mode 100644
index 0000000..7c1cc4d
Binary files /dev/null and b/doc/06_孙瑛峻_小米便签代码标注.docx differ
diff --git a/doc/06_宋经纬_小米便签代码标注.docx b/doc/06_宋经纬_小米便签代码标注.docx
new file mode 100644
index 0000000..14dc588
Binary files /dev/null and b/doc/06_宋经纬_小米便签代码标注.docx differ
diff --git a/doc/06_朱睿民_小米便签代码标注.docx b/doc/06_朱睿民_小米便签代码标注.docx
new file mode 100644
index 0000000..37fa903
Binary files /dev/null and b/doc/06_朱睿民_小米便签代码标注.docx differ
diff --git a/doc/06_田浩_小米便签代码标注.docx b/doc/06_田浩_小米便签代码标注.docx
new file mode 100644
index 0000000..4652fa7
Binary files /dev/null and b/doc/06_田浩_小米便签代码标注.docx differ
diff --git a/doc/06_申博昊_小米便签代码标注.docx b/doc/06_申博昊_小米便签代码标注.docx
new file mode 100644
index 0000000..c33a5d5
Binary files /dev/null and b/doc/06_申博昊_小米便签代码标注.docx differ
diff --git a/doc/07_210340026申博昊-实践总结报告.docx b/doc/07_210340026申博昊-实践总结报告.docx
new file mode 100644
index 0000000..5e100bb
Binary files /dev/null and b/doc/07_210340026申博昊-实践总结报告.docx differ
diff --git a/doc/07_210340027宋经纬-实践总结报告.docx b/doc/07_210340027宋经纬-实践总结报告.docx
new file mode 100644
index 0000000..86387a7
Binary files /dev/null and b/doc/07_210340027宋经纬-实践总结报告.docx differ
diff --git a/doc/07_210340028孙瑛峻-实践总结报告.docx b/doc/07_210340028孙瑛峻-实践总结报告.docx
new file mode 100644
index 0000000..244328d
Binary files /dev/null and b/doc/07_210340028孙瑛峻-实践总结报告.docx differ
diff --git a/doc/07_210340029田浩-实践总结报告.docx b/doc/07_210340029田浩-实践总结报告.docx
new file mode 100644
index 0000000..b03e34e
Binary files /dev/null and b/doc/07_210340029田浩-实践总结报告.docx differ
diff --git a/doc/07_210340043朱睿民-实践总结报告.docx b/doc/07_210340043朱睿民-实践总结报告.docx
new file mode 100644
index 0000000..c699e13
Binary files /dev/null and b/doc/07_210340043朱睿民-实践总结报告.docx differ
diff --git a/doc/08_宋经纬_演示录屏.mp4 b/doc/08_宋经纬_演示录屏.mp4
new file mode 100644
index 0000000..77b9c6e
Binary files /dev/null and b/doc/08_宋经纬_演示录屏.mp4 differ
diff --git a/model/UML模型.docx b/model/UML模型.docx
new file mode 100644
index 0000000..c1130b5
Binary files /dev/null and b/model/UML模型.docx differ
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index e5c7d47..2a9e919 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -1,26 +1,10 @@
-
-
-
-
-
+ android:versionName="0.1"
+ android:exported="true" >
@@ -31,10 +15,27 @@
+
+ android:label="@string/app_name"
+ android:theme="@style/Theme.Material3.DynamicColors.Dark"
+ android:exported="true" >
+
+
+
+
-
+ android:windowSoftInputMode="adjustPan"
+ android:exported="true" >
+
-
-
-
+ android:theme="@style/NoteTheme"
+ android:exported="true" >
+
-
+
+
-
+
@@ -87,7 +90,8 @@
+ android:label="@string/app_widget2x2"
+ android:exported="true" >
@@ -100,8 +104,8 @@
-
+ android:label="@string/app_widget4x4"
+ android:exported="true" >
@@ -112,39 +116,34 @@
android:name="android.appwidget.provider"
android:resource="@xml/widget_4x_info" />
-
-
+
-
-
+ android:name=".ui.AlarmReceiver"
+ android:process=":remote" />
-
-
+ android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" />
-
+ android:theme="@android:style/Theme.Holo.Light" />
-
+ android:exported="false" />
-
+
+
\ No newline at end of file
diff --git a/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java b/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
index c1fc748..c67dfdf 100644
--- a/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
+++ b/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
@@ -120,7 +120,7 @@ public class GTaskClient {
// need to re-login after account switch
if (mLoggedin
&& !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity
- .getSyncAccountName(activity))) {
+ .getSyncAccountName(activity))) {
mLoggedin = false;
}
@@ -582,4 +582,4 @@ public class GTaskClient {
public void resetUpdateArray() {
mUpdateArray = null;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/net/micode/notes/tool/BackupUtils.java b/src/main/java/net/micode/notes/tool/BackupUtils.java
index 39f6ec4..9b349de 100644
--- a/src/main/java/net/micode/notes/tool/BackupUtils.java
+++ b/src/main/java/net/micode/notes/tool/BackupUtils.java
@@ -219,10 +219,6 @@ public class BackupUtils {
* Note will be exported as text which is user readable
*/
public int exportToText() {
- if (!externalStorageAvailable()) {
- Log.d(TAG, "Media was not mounted");
- return STATE_SD_CARD_UNMOUONTED;
- }
PrintStream ps = getExportToTextPrintStream();
if (ps == null) {
diff --git a/src/main/java/net/micode/notes/ui/AddActivity.java b/src/main/java/net/micode/notes/ui/AddActivity.java
new file mode 100644
index 0000000..764e27e
--- /dev/null
+++ b/src/main/java/net/micode/notes/ui/AddActivity.java
@@ -0,0 +1,59 @@
+package net.micode.notes.ui;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.EditText;
+
+
+import net.micode.notes.R;
+import net.micode.notes.ui.bean.Note;
+import net.micode.notes.util.ToastUtil;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class AddActivity extends Activity {
+
+ private EditText etContent;
+
+ private NoteDbOpenHelper mNoteDbOpenHelper;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_add);
+
+ etContent = findViewById(R.id.sf_et_1);
+
+ mNoteDbOpenHelper = new NoteDbOpenHelper(this);
+
+ }
+
+ public void add(View view) {
+ String content = etContent.getText().toString();
+
+ Note note = new Note();
+ note.setContent(content);
+ note.setCreatedTime(getCurrentTimeFormat());
+
+ long row = mNoteDbOpenHelper.insertData(note);
+ if(row != -1){
+ ToastUtil.toastShort(this,"Add Success");
+ this.finish();
+ }else{
+ ToastUtil.toastShort(this,"Add Fail");
+ }
+
+
+ }
+
+ private String getCurrentTimeFormat() {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM月dd HH:mm:ss");
+ Date date = new Date();
+ return simpleDateFormat.format(date);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/micode/notes/ui/EditActivity.java b/src/main/java/net/micode/notes/ui/EditActivity.java
new file mode 100644
index 0000000..4d4522a
--- /dev/null
+++ b/src/main/java/net/micode/notes/ui/EditActivity.java
@@ -0,0 +1,72 @@
+package net.micode.notes.ui;
+
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.EditText;
+
+import net.micode.notes.R;
+import net.micode.notes.ui.bean.Note;
+import net.micode.notes.util.ToastUtil;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class EditActivity extends Activity {
+
+ private Note note;
+ private EditText etContent;
+
+ private NoteDbOpenHelper mNoteDbOpenHelper;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_edit);
+
+ etContent = findViewById(R.id.sf_et_2);
+
+ initData();
+
+
+
+ }
+
+ private void initData() {
+ Intent intent = getIntent();
+ note = (Note) intent.getSerializableExtra("note");
+ if(note!=null){
+ etContent.setText(note.getContent());
+ }
+
+ mNoteDbOpenHelper = new NoteDbOpenHelper(this);
+
+ }
+
+ public void save(View view) {
+ String content = etContent.getText().toString();
+
+ note.setContent(content);
+ note.setCreatedTime(getCurrentTimeFormat());
+
+ long row = mNoteDbOpenHelper.updateData(note);
+
+ if(row != -1 && row != 0){
+ ToastUtil.toastShort(this,"Edit Success");
+ this.finish();
+ }else{
+ ToastUtil.toastShort(this,"Edit Fail");
+ }
+ }
+ private String getCurrentTimeFormat() {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM月dd HH:mm:ss");
+
+ TimeZone time = TimeZone.getTimeZone("Etc/GMT-8"); //转换为中国时区
+ TimeZone.setDefault(time);
+ Date date = new Date();
+
+ return simpleDateFormat.format(date);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/micode/notes/ui/NoteDbOpenHelper.java b/src/main/java/net/micode/notes/ui/NoteDbOpenHelper.java
new file mode 100644
index 0000000..b2853f1
--- /dev/null
+++ b/src/main/java/net/micode/notes/ui/NoteDbOpenHelper.java
@@ -0,0 +1,128 @@
+package net.micode.notes.ui;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.text.TextUtils;
+
+import net.micode.notes.ui.bean.Note;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NoteDbOpenHelper extends SQLiteOpenHelper {
+
+ private static final String DB_NAME="noteSQLite.db";
+ private static final String TABLE_NAME_NOTE = "note";
+ private static final String CREATE_TABLE_SQL = "create table " + TABLE_NAME_NOTE + " (id integer primary key autoincrement, content text, create_time text)";
+
+
+ public NoteDbOpenHelper(Context context){
+ super(context,DB_NAME,null,1);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+
+ db.execSQL(CREATE_TABLE_SQL);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+
+ }
+
+ public long insertData(Note note){
+ SQLiteDatabase db = getWritableDatabase();
+
+ ContentValues values = new ContentValues();
+ values.put("content",note.getContent());
+ values.put("create_time",note.getCreatedTime());
+
+ return db.insert(TABLE_NAME_NOTE,null,values);
+
+ }
+
+ public int deleteFromDbById(String id){
+ SQLiteDatabase db = getWritableDatabase();
+ return db.delete(TABLE_NAME_NOTE,"id like ?", new String[]{id});
+ }
+
+
+ public int updateData(Note note) {
+
+ SQLiteDatabase db = getWritableDatabase();
+
+ ContentValues values = new ContentValues();
+
+ values.put("content", note.getContent());
+ values.put("create_time", note.getCreatedTime());
+
+ return db.update(TABLE_NAME_NOTE, values, "id like ?", new String[]{note.getId()});
+ }
+
+
+
+ public List queryAllFromDb(){
+ SQLiteDatabase db = getWritableDatabase();
+ List notelist = new ArrayList<>();
+
+ Cursor cursor = db.query(TABLE_NAME_NOTE,null,null,null,null,null,null);
+ if (cursor != null){
+
+ while (cursor.moveToNext()){
+ String id = cursor.getString(cursor.getColumnIndex("id"));
+ String content = cursor.getString(cursor.getColumnIndex("content"));
+ String createTime = cursor.getString(cursor.getColumnIndex("create_time"));
+
+ Note note = new Note();
+ note.setId(id);
+ note.setContent(content);
+ note.setCreatedTime(createTime);
+
+ notelist.add(note);
+
+ }
+
+ cursor.close();
+ }
+ return notelist;
+
+
+ }
+
+ public List queryFromDbByContent(String content){
+ if (TextUtils.isEmpty(content)){
+ return queryAllFromDb();
+ }
+ SQLiteDatabase db = getWritableDatabase();
+ List noteList = new ArrayList<>();
+
+ Cursor cursor = db.query(TABLE_NAME_NOTE,null,"content like ?",new String[]{"%"+content+"%"},null,null,null);
+
+ if (cursor != null){
+ while (cursor.moveToNext()){
+
+ String id = cursor.getString(cursor.getColumnIndex("id"));
+ String content1 = cursor.getString(cursor.getColumnIndex("content"));
+ String createTime = cursor.getString(cursor.getColumnIndex("create_time"));
+
+ Note note = new Note();
+ note.setId(id);
+ note.setContent(content1);
+ note.setCreatedTime(createTime);
+ noteList.add(note);
+
+ }
+ cursor.close();
+
+ }
+ return noteList;
+
+ }
+
+
+
+}
diff --git a/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/main/java/net/micode/notes/ui/NoteEditActivity.java
index 96a9ff8..1133c29 100644
--- a/src/main/java/net/micode/notes/ui/NoteEditActivity.java
+++ b/src/main/java/net/micode/notes/ui/NoteEditActivity.java
@@ -51,6 +51,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
+import android.widget.Button;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
@@ -149,11 +150,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private String mUserQuery;
private Pattern mPattern;
+ private Button menuButton;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.note_edit);
-
+ menuButton = (Button) findViewById(R.id.btn_show_menu);
+ menuButton.setOnClickListener(new NoteEditActivity.MenuBtnOnClickListener());
if (savedInstanceState == null && !initActivityState(getIntent())) {
finish();
return;
@@ -870,4 +874,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private void showToast(int resId, int duration) {
Toast.makeText(this, resId, duration).show();
}
+
+ private class MenuBtnOnClickListener implements OnClickListener{
+ @Override
+ public void onClick(View v) {
+ openOptionsMenu();
+ }
+ }
+
}
diff --git a/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/main/java/net/micode/notes/ui/NoteEditText.java
index 2afe2a8..8f88208 100644
--- a/src/main/java/net/micode/notes/ui/NoteEditText.java
+++ b/src/main/java/net/micode/notes/ui/NoteEditText.java
@@ -37,7 +37,7 @@ import net.micode.notes.R;
import java.util.HashMap;
import java.util.Map;
-public class NoteEditText extends EditText {
+public class NoteEditText extends androidx.appcompat.widget.AppCompatEditText {
private static final String TAG = "NoteEditText";
private int mIndex;
private int mSelectionStartBeforeDelete;
diff --git a/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java
index e843aec..c4f5c1d 100644
--- a/src/main/java/net/micode/notes/ui/NotesListActivity.java
+++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java
@@ -72,11 +72,21 @@ import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute;
import net.micode.notes.widget.NoteWidgetProvider_2x;
import net.micode.notes.widget.NoteWidgetProvider_4x;
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.FormBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener {
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
@@ -105,6 +115,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private Button mAddNewNote;
+ private Button menuButton;
+
private boolean mDispatch;
private int mOriginY;
@@ -135,12 +147,26 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private final static int REQUEST_CODE_OPEN_NODE = 102;
private final static int REQUEST_CODE_NEW_NODE = 103;
+ public Button mBtnsf;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_list);
initResources();
+ mBtnsf = findViewById(R.id.btn_sf);
+ mBtnsf.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent=null;
+ intent = new Intent(NotesListActivity.this,pwdActivity.class);
+ startActivity(intent);
+
+ }
+ });
+
+
/**
* Insert an introduction when user firstly use this application
*/
@@ -223,6 +249,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mAddNewNote = (Button) findViewById(R.id.btn_new_note);
mAddNewNote.setOnClickListener(this);
mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener());
+ menuButton = (Button) findViewById(R.id.btn_show_menu);
+ menuButton.setOnClickListener(new MenuBtnOnClickListener());
mDispatch = false;
mDispatchY = 0;
mOriginY = 0;
@@ -346,6 +374,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
+
+ private class MenuBtnOnClickListener implements OnClickListener{
+ @Override
+ public void onClick(View v) {
+ openOptionsMenu();
+ }
+ }
+
private class NewNoteOnTouchListener implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
@@ -786,7 +822,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
break;
}
case R.id.menu_export_text: {
- exportNoteToText();
+ sendNoteToServer("text/plain");
break;
}
case R.id.menu_sync: {
@@ -824,46 +860,72 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
return true;
}
- private void exportNoteToText() {
- final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this);
- new AsyncTask() {
+ private void sendNoteToServer(String noteContent) {
+ // 创建一个OkHttpClient实例
+ OkHttpClient client = new OkHttpClient();
+
+ // 创建一个RequestBody对象,包含要发送的数据
+ RequestBody requestBody = new FormBody.Builder()
+ .add("note_content", noteContent)
+ .build();
+ // 创建一个Request对象,包含请求的URL和请求方式
+ Request request = new Request.Builder()
+ .url("http://dustin-z.com/notes")
+ .post(requestBody)
+ .build();
+
+ // 发送请求并处理响应
+ client.newCall(request).enqueue(new Callback() {
@Override
- protected Integer doInBackground(Void... unused) {
- return backup.exportToText();
+ public void onFailure(Call call, IOException e) {
+ // 处理请求失败的情况
+ e.printStackTrace();
+ // 在UI线程中显示失败提示
+ runOnUiThread(() -> {
+ Toast.makeText(NotesListActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
+ });
}
@Override
- protected void onPostExecute(Integer result) {
+ public void onResponse(Call call, Response response) throws IOException {
+ // 处理响应数据
+ String responseData = response.body().string();
+ // 在UI线程中显示响应内容
+ runOnUiThread(() -> {
+ Toast.makeText(NotesListActivity.this, responseData, Toast.LENGTH_SHORT).show();
+ });
+ }
+ });
+ }
+
+ private void exportNoteToText() {
+ final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this);
+ Executor executor = Executors.newSingleThreadExecutor();
+ executor.execute(() -> {
+ int result = backup.exportToText();
+ runOnUiThread(() -> {
if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(NotesListActivity.this
- .getString(R.string.failed_sdcard_export));
- builder.setMessage(NotesListActivity.this
- .getString(R.string.error_sdcard_unmounted));
+ builder.setTitle(NotesListActivity.this.getString(R.string.failed_sdcard_export));
+ builder.setMessage(NotesListActivity.this.getString(R.string.error_sdcard_unmounted));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
} else if (result == BackupUtils.STATE_SUCCESS) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(NotesListActivity.this
- .getString(R.string.success_sdcard_export));
- builder.setMessage(NotesListActivity.this.getString(
- R.string.format_exported_file_location, backup
- .getExportedTextFileName(), backup.getExportedTextFileDir()));
+ builder.setTitle(NotesListActivity.this.getString(R.string.success_sdcard_export));
+ builder.setMessage(NotesListActivity.this.getString(R.string.format_exported_file_location, backup.getExportedTextFileName(), backup.getExportedTextFileDir()));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
} else if (result == BackupUtils.STATE_SYSTEM_ERROR) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(NotesListActivity.this
- .getString(R.string.failed_sdcard_export));
- builder.setMessage(NotesListActivity.this
- .getString(R.string.error_sdcard_export));
+ builder.setTitle(NotesListActivity.this.getString(R.string.failed_sdcard_export));
+ builder.setMessage(NotesListActivity.this.getString(R.string.error_sdcard_export));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
}
- }
-
- }.execute();
+ });
+ });
}
private boolean isSyncMode() {
diff --git a/src/main/java/net/micode/notes/ui/NotesListItem.java b/src/main/java/net/micode/notes/ui/NotesListItem.java
index 1221e80..3292314 100644
--- a/src/main/java/net/micode/notes/ui/NotesListItem.java
+++ b/src/main/java/net/micode/notes/ui/NotesListItem.java
@@ -94,7 +94,8 @@ public class NotesListItem extends LinearLayout {
}
}
}
- mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
+ //mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
+ mTime.setText(DateUtils.formatDateTime(getContext(),data.getModifiedDate(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL));
setBackground(data);
}
diff --git a/src/main/java/net/micode/notes/ui/SafeFolderActivity.java b/src/main/java/net/micode/notes/ui/SafeFolderActivity.java
new file mode 100644
index 0000000..c572a3f
--- /dev/null
+++ b/src/main/java/net/micode/notes/ui/SafeFolderActivity.java
@@ -0,0 +1,168 @@
+package net.micode.notes.ui;
+
+import android.app.Activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.Button;
+
+
+
+import androidx.annotation.NonNull;
+
+
+import androidx.appcompat.widget.SearchView;
+import androidx.core.view.MenuItemCompat;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import net.micode.notes.R;
+import net.micode.notes.ui.adapter.MyAdapter;
+import net.micode.notes.ui.bean.Note;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+public class SafeFolderActivity extends Activity {
+
+ private RecyclerView mRecyclerView;
+ private Button mBtnNew;
+ private List mNotes;
+ private MyAdapter mMyAdapter;
+
+ private NoteDbOpenHelper mNoteDbOpenHelper;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_safe_folder);
+
+ initView();
+ initData();
+ initEvent();
+
+
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ refreshDataFromDb();
+
+ }
+
+ private void refreshDataFromDb() {
+ mNotes = getDataFromDB();
+ mMyAdapter.refreshData(mNotes);
+ }
+
+ private void initEvent() {
+ mMyAdapter = new MyAdapter(this,mNotes);
+ mRecyclerView.setAdapter(mMyAdapter);
+
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
+ mRecyclerView.setLayoutManager(linearLayoutManager);
+ }
+
+ private void initData() {
+ mNotes = new ArrayList<>();
+ mNoteDbOpenHelper = new NoteDbOpenHelper(this);
+
+ }
+
+ private List getDataFromDB() {
+ return mNoteDbOpenHelper.queryAllFromDb();
+ }
+
+ private String getCurrentTimeFormat(){
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM月dd HH:mm:ss");
+ Date date = new Date();
+ return simpleDateFormat.format(date);
+ }
+
+
+ private void initView(){
+
+ mRecyclerView = findViewById(R.id.sf_list);
+ }
+
+ public void NewNotes(View view) {
+ Intent intent = new Intent(SafeFolderActivity.this,AddActivity.class);
+ startActivity(intent);
+ }
+
+// @Override
+// public boolean onCreateOptionsMenu(Menu menu) {
+//
+// getMenuInflater().inflate(R.menu.menu_main, menu);
+// SearchView searchView = (SearchView) menu.findItem(R.id.sf_menu_search).getActionView();
+//
+//
+// searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
+// @Override
+// public boolean onQueryTextSubmit(String query) {
+// return false;
+// }
+//
+// @Override
+// public boolean onQueryTextChange(String newText) {
+// mNotes = mNoteDbOpenHelper.queryFromDbByContent(newText);
+// mMyAdapter.refreshData(mNotes);
+// return true;
+// }
+// });
+// return super.onCreateOptionsMenu(menu);
+// }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.safe, menu);
+ MenuItem x = menu.findItem(R.id.sf_menu_search);
+ if (x.getActionView() != null) {
+ Log.i("-------------","okk");
+ }else{
+ Log.i("-------------","false");
+ }
+ SearchView searchView = (SearchView) menu.findItem(R.id.sf_menu_search).getActionView();
+
+
+ if (searchView != null) {
+ Log.i("=====================","okk");
+
+ searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
+ @Override
+ public boolean onQueryTextSubmit(String s) {
+ return false;
+ }
+
+ @Override
+ public boolean onQueryTextChange(String s) {
+ mNotes = mNoteDbOpenHelper.queryFromDbByContent(s);
+ mMyAdapter.refreshData(mNotes);
+ return true;
+ }
+ });
+ }else{
+ Log.i("=====================","false");
+ }
+ return super.onCreateOptionsMenu(menu);
+ }
+
+
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ return super.onOptionsItemSelected(item);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/micode/notes/ui/adapter/MyAdapter.java b/src/main/java/net/micode/notes/ui/adapter/MyAdapter.java
new file mode 100644
index 0000000..6263053
--- /dev/null
+++ b/src/main/java/net/micode/notes/ui/adapter/MyAdapter.java
@@ -0,0 +1,134 @@
+package net.micode.notes.ui.adapter;
+
+import android.annotation.SuppressLint;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.Intent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import net.micode.notes.R;
+import net.micode.notes.ui.EditActivity;
+import net.micode.notes.ui.NoteDbOpenHelper;
+import net.micode.notes.ui.NoteEditActivity;
+import net.micode.notes.ui.bean.Note;
+import net.micode.notes.util.ToastUtil;
+
+import java.util.List;
+
+public class MyAdapter extends RecyclerView.Adapter {
+
+ private List mBeanList;
+ private LayoutInflater mLayoutInflater;
+ private Context mContext;
+ private NoteDbOpenHelper mNoteDbOpenHelper;
+
+ public MyAdapter(Context context,List mBeanList){
+ this.mBeanList = mBeanList;
+ this.mContext = context;
+ mLayoutInflater = LayoutInflater.from(mContext);
+ mNoteDbOpenHelper = new NoteDbOpenHelper(mContext);
+
+ }
+
+ @NonNull
+ @Override
+ public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = mLayoutInflater.inflate(R.layout.list_item_layout,parent,false);
+
+ MyViewHolder myViewHolder= new MyViewHolder(view);
+ return myViewHolder;
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull MyViewHolder holder, @SuppressLint("RecyclerView") int position) {
+
+ Note note = mBeanList.get(position);
+ holder.mTvContent.setText(note.getContent());
+ holder.mTvTime.setText(note.getCreatedTime());
+ holder.rlContainer.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ Intent intent = new Intent(mContext, EditActivity.class);
+ intent.putExtra("note",note);
+ mContext.startActivity(intent);
+
+ }
+ });
+
+ holder.rlContainer.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ //长按
+ Dialog dialog = new Dialog(mContext,android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth);
+ View view = mLayoutInflater.inflate(R.layout.list_item_dialog_layout, null);
+
+ TextView tvDelete = view.findViewById(R.id.tv_delete);
+
+
+ tvDelete.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ int row = mNoteDbOpenHelper.deleteFromDbById(note.getId());
+ if (row > 0){
+ removeData(position);
+
+ ToastUtil.toastShort(mContext,"Delete Success");
+ }else{
+ ToastUtil.toastShort(mContext,"Delete Fail");
+ }
+ dialog.dismiss();
+ }
+ });
+
+ dialog.setContentView(view);
+
+ dialog.show();
+
+ return false;
+ }
+ });
+
+ }
+
+ @Override
+ public int getItemCount() {
+
+ return mBeanList.size();
+ }
+
+ public void refreshData(List notes){
+ this.mBeanList = notes;
+ notifyDataSetChanged();
+ }
+
+ public void removeData(int pos){
+ mBeanList.remove(pos);
+ notifyItemRemoved(pos);
+ }
+
+
+ class MyViewHolder extends RecyclerView.ViewHolder{
+
+ TextView mTvContent;
+ TextView mTvTime;
+ ViewGroup rlContainer;
+
+ public MyViewHolder(@NonNull View itemView) {
+ super(itemView);
+
+ this.mTvContent = itemView.findViewById(R.id.tv_content);
+ this.mTvTime = itemView.findViewById(R.id.tv_time);
+ this.rlContainer = itemView.findViewById(R.id.rl_item_container);
+
+
+ }
+ }
+
+}
diff --git a/src/main/java/net/micode/notes/ui/bean/Note.java b/src/main/java/net/micode/notes/ui/bean/Note.java
new file mode 100644
index 0000000..f5bf39d
--- /dev/null
+++ b/src/main/java/net/micode/notes/ui/bean/Note.java
@@ -0,0 +1,43 @@
+package net.micode.notes.ui.bean;
+
+import java.io.Serializable;
+
+public class Note implements Serializable {
+
+ private String content;
+ private String createdTime;
+ private String id;
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getCreatedTime() {
+ return createdTime;
+ }
+
+ public void setCreatedTime(String createdTime) {
+ this.createdTime = createdTime;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public String toString() {
+ return "Note{" +
+ "content='" + content + '\'' +
+ ", createdTime='" + createdTime + '\'' +
+ ", id='" + id + '\'' +
+ '}';
+ }
+}
diff --git a/src/main/java/net/micode/notes/ui/pwdActivity.java b/src/main/java/net/micode/notes/ui/pwdActivity.java
new file mode 100644
index 0000000..07d33c9
--- /dev/null
+++ b/src/main/java/net/micode/notes/ui/pwdActivity.java
@@ -0,0 +1,98 @@
+package net.micode.notes.ui;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.biometric.BiometricPrompt;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.FragmentActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import net.micode.notes.R;
+import net.micode.notes.util.ToastUtil;
+
+import java.util.concurrent.Executor;
+
+public class pwdActivity extends FragmentActivity {
+
+ //private Executor executor;
+
+
+ public Button mBtnpwd;
+ public EditText mEtpwd;
+ public Button mFingerBtn;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_pwd);
+
+ mBtnpwd = findViewById(R.id.btn_pwd);
+ mEtpwd = findViewById(R.id.et_1);
+ mFingerBtn = findViewById(R.id.btn_fingerprint);
+
+ mBtnpwd.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ String pwd = mEtpwd.getText().toString();
+ Intent intent=null;
+ if(pwd.equals("123456")){
+ intent = new Intent(pwdActivity.this,SafeFolderActivity.class);
+ startActivity(intent);
+ }else{
+ ToastUtil.toastShort(pwdActivity.this,String.valueOf(getResources().getString(R.string.pwdwrong)));
+ }
+
+ }
+ });
+
+
+ mFingerBtn.setOnClickListener(
+ view->{
+ BiometricPrompt biometricPrompt;
+ BiometricPrompt.PromptInfo promptInfo;
+ Executor executor;
+ executor = ContextCompat.getMainExecutor(this);
+
+ biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
+ @Override
+ public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
+ super.onAuthenticationError(errorCode, errString);
+ Toast.makeText(getApplicationContext(), String.valueOf(getResources().getString(R.string.AuthenticationFailed)) + errString, Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
+ super.onAuthenticationSucceeded(result);
+ Toast.makeText(getApplicationContext(), String.valueOf(getResources().getString(R.string.AuthenticationSuccess)), Toast.LENGTH_SHORT).show();
+ // Replace the below code with your code to start the SafeFolderActivity
+ // if authentication is successful
+ Intent intent = new Intent(pwdActivity.this, SafeFolderActivity.class);
+ startActivity(intent);
+ }
+
+ @Override
+ public void onAuthenticationFailed() {
+ super.onAuthenticationFailed();
+ Toast.makeText(getApplicationContext(), String.valueOf(getResources().getString(R.string.AuthenticationFailed)), Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ promptInfo = new BiometricPrompt.PromptInfo.Builder()
+ .setTitle(String.valueOf(getResources().getString(R.string.BioAuth)))
+ .setSubtitle(String.valueOf(getResources().getString(R.string.LogUseBio)))
+ .setNegativeButtonText(String.valueOf(getResources().getString(R.string.datetime_dialog_cancel)))
+ .build();
+
+
+ biometricPrompt.authenticate(promptInfo);
+ }
+ );
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/micode/notes/util/SpfUtil.java b/src/main/java/net/micode/notes/util/SpfUtil.java
new file mode 100644
index 0000000..153381e
--- /dev/null
+++ b/src/main/java/net/micode/notes/util/SpfUtil.java
@@ -0,0 +1,38 @@
+package net.micode.notes.util;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+public class SpfUtil {
+
+ private static String SPF_NAME = "noteSpf";
+
+ public static void saveString(Context context, String key, String value) {
+ SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE);
+ SharedPreferences.Editor edit = spf.edit();
+ edit.putString(key, value);
+ edit.apply();
+ }
+
+ public static String getString(Context context, String key) {
+ SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE);
+ return spf.getString(key, "");
+ }
+
+ public static void saveInt(Context context, String key, int value) {
+ SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE);
+ SharedPreferences.Editor edit = spf.edit();
+ edit.putInt(key, value);
+ edit.apply();
+ }
+
+ public static int getInt(Context context, String key) {
+ SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE);
+ return spf.getInt(key, -1);
+ }
+
+ public static int getIntWithDefault(Context context, String key, int defValue) {
+ SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE);
+ return spf.getInt(key, defValue);
+ }
+}
diff --git a/src/main/java/net/micode/notes/util/ToastUtil.java b/src/main/java/net/micode/notes/util/ToastUtil.java
new file mode 100644
index 0000000..b1894f7
--- /dev/null
+++ b/src/main/java/net/micode/notes/util/ToastUtil.java
@@ -0,0 +1,15 @@
+package net.micode.notes.util;
+
+import android.content.Context;
+import android.widget.Toast;
+
+public class ToastUtil {
+
+ public static void toastShort(Context context, String msg) {
+ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
+ }
+
+ public static void toastLong(Context context, String msg) {
+ Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
+ }
+}
diff --git a/src/main/res/drawable/ic_baseline_search_24.xml b/src/main/res/drawable/ic_baseline_search_24.xml
new file mode 100644
index 0000000..a5687c6
--- /dev/null
+++ b/src/main/res/drawable/ic_baseline_search_24.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/src/main/res/layout/activity_add.xml b/src/main/res/layout/activity_add.xml
new file mode 100644
index 0000000..07bbb1a
--- /dev/null
+++ b/src/main/res/layout/activity_add.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_edit.xml b/src/main/res/layout/activity_edit.xml
new file mode 100644
index 0000000..6025b35
--- /dev/null
+++ b/src/main/res/layout/activity_edit.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_pwd.xml b/src/main/res/layout/activity_pwd.xml
new file mode 100644
index 0000000..120aefd
--- /dev/null
+++ b/src/main/res/layout/activity_pwd.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_safe_folder.xml b/src/main/res/layout/activity_safe_folder.xml
new file mode 100644
index 0000000..a633020
--- /dev/null
+++ b/src/main/res/layout/activity_safe_folder.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/list_item_dialog_layout.xml b/src/main/res/layout/list_item_dialog_layout.xml
new file mode 100644
index 0000000..0649dfd
--- /dev/null
+++ b/src/main/res/layout/list_item_dialog_layout.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/list_item_layout.xml b/src/main/res/layout/list_item_layout.xml
new file mode 100644
index 0000000..9f4e656
--- /dev/null
+++ b/src/main/res/layout/list_item_layout.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/note_list.xml b/src/main/res/layout/note_list.xml
index 6b25d38..f5b01fa 100644
--- a/src/main/res/layout/note_list.xml
+++ b/src/main/res/layout/note_list.xml
@@ -26,6 +26,8 @@
android:layout_height="fill_parent"
android:orientation="vertical">
+
+
+
+
+
+
+
diff --git a/src/main/res/menu/call_record_folder.xml b/src/main/res/menu/call_record_folder.xml
index c664346..a54dc4a 100644
--- a/src/main/res/menu/call_record_folder.xml
+++ b/src/main/res/menu/call_record_folder.xml
@@ -19,5 +19,6 @@
xmlns:android="http://schemas.android.com/apk/res/android">
+ android:title="@string/menu_search"
+ />
diff --git a/src/main/res/menu/safe.xml b/src/main/res/menu/safe.xml
new file mode 100644
index 0000000..bab0adc
--- /dev/null
+++ b/src/main/res/menu/safe.xml
@@ -0,0 +1,13 @@
+
+
\ 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..e473318 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -119,6 +119,15 @@
便签
设置
取消
+ 保险文件夹
+ 确定
+ 请输入密码
+ 使用指纹打开
+ 认证失败
+ 认证成功
+ 密码错误
+ 使用生物信息认证
+ 生物认证
- %1$s 条符合“%2$s”的搜索结果
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 55df868..d136191 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,19 @@
Notes
set
cancel
+ Safe Folder
+ Open
+ Input Password
+ Use Biometric
+ Authentication Failed
+ Authentication Success
+ Password Wrong
+ Login using your biometric credential
+ Biometric Authentication
- - %1$s result for \"%2$s\"
+ - %1$s result for \"%2$s\"
- - %1$s results for \"%2$s\"
+ - %1$s results for \"%2$s\"