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 @@ + + + + + +