diff --git a/doc/实践考评-阅读维护小米便签的汇报.pptx b/doc/实践考评-阅读维护小米便签的汇报.pptx new file mode 100644 index 0000000..108d559 Binary files /dev/null and b/doc/实践考评-阅读维护小米便签的汇报.pptx differ diff --git a/doc/实践资源-小米便签开源代码的泛读报告最新.docx b/doc/实践资源-小米便签开源代码的泛读报告最新.docx deleted file mode 100644 index 38e0c32..0000000 Binary files a/doc/实践资源-小米便签开源代码的泛读报告最新.docx and /dev/null differ diff --git a/doc/实践资源-小米便签开源代码的泛读,标注,维护报告.docx b/doc/实践资源-小米便签开源代码的泛读,标注,维护报告.docx new file mode 100644 index 0000000..ecc41bf Binary files /dev/null and b/doc/实践资源-小米便签开源代码的泛读,标注,维护报告.docx differ diff --git a/doc/小米便签分析和维护软件实践.xlsx b/doc/小米便签分析和维护软件实践.xlsx new file mode 100644 index 0000000..3c0678d Binary files /dev/null and b/doc/小米便签分析和维护软件实践.xlsx differ diff --git a/doc/小米便签的代码标注.docx b/doc/小米便签的代码标注.docx deleted file mode 100644 index 5a275c1..0000000 Binary files a/doc/小米便签的代码标注.docx and /dev/null differ diff --git a/src/app/src/main/java/net/micode/notes/ui/LoginActivity.java b/src/app/src/main/java/net/micode/notes/ui/LoginActivity.java index 34e7f04..8c5fea6 100644 --- a/src/app/src/main/java/net/micode/notes/ui/LoginActivity.java +++ b/src/app/src/main/java/net/micode/notes/ui/LoginActivity.java @@ -12,63 +12,91 @@ import android.widget.Toast; import net.micode.notes.R; public class LoginActivity extends Activity { + // 声明账号输入框 private EditText accountEdit; + // 声明密码输入框 private EditText passwordEdit; + // 声明登录按钮 private Button login; + // 声明取消按钮 private Button cancel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + // 设置当前活动的布局文件 setContentView(R.layout.activity_login); + // 初始化账号输入框 accountEdit = (EditText) findViewById(R.id.account); + // 初始化密码输入框 passwordEdit = (EditText) findViewById(R.id.password); + // 初始化登录按钮 login = (Button) findViewById(R.id.login); + // 初始化取消按钮 cancel = (Button) findViewById(R.id.cancel); + // 为取消按钮设置点击事件监听器 cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + // 弹出提示信息,告知用户应用即将退出 Toast.makeText(LoginActivity.this, R.string.app_already_quit, Toast.LENGTH_LONG).show(); + // 结束当前活动 finish(); } }); + // 为登录按钮设置点击事件监听器 login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + // 获取账号输入框中的内容 String account = accountEdit.getText().toString(); + // 获取密码输入框中的内容 String password = passwordEdit.getText().toString(); + // 判断账号和密码是否都为空 if (account.equals("") && password.equals("")) { + // 创建一个进度对话框 ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this); + // 设置进度对话框的标题 progressDialog.setTitle(R.string.Loading); + // 设置进度对话框的提示信息 progressDialog.setMessage("Loading..."); + // 设置进度对话框可以被取消 progressDialog.setCancelable(true); + // 显示进度对话框 progressDialog.show(); + // 创建一个新线程来模拟登录过程 new Thread(new Runnable() { @Override public void run() { - // 模拟登录过程,您可以在这里添加实际的登录逻辑 + // 模拟网络延迟,让线程休眠2秒 try { - Thread.sleep(2000); // 模拟网络延迟 + Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } + // 在主线程中执行以下操作 runOnUiThread(new Runnable() { @Override public void run() { + // 关闭进度对话框 progressDialog.dismiss(); + // 创建一个意图,用于跳转到笔记列表活动 Intent intent = new Intent(LoginActivity.this, NotesListActivity.class); + // 启动笔记列表活动 startActivity(intent); + // 结束当前活动 finish(); } }); } }).start(); } else { + // 如果账号或密码不为空,则弹出提示信息,告知用户输入无效 Toast.makeText(LoginActivity.this, R.string.invalid, Toast.LENGTH_SHORT).show(); } } diff --git a/src/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java index 990f8f1..4437441 100644 --- a/src/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -101,7 +101,8 @@ import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class NoteEditActivity extends Activity implements OnClickListener, - NoteSettingChangedListener, OnTextViewChangeListener {// 类成员变量和方法,封装了便签编辑的相关功能 + NoteSettingChangedListener, OnTextViewChangeListener {// 类成员变量和方法,封装了便签编辑的相关功能 + /** * 头部视图的ViewHolder类,用于存储头部视图中的UI组件引用。 */ @@ -199,6 +200,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, private Button mTranslateButton; private String restore_translate; private EditText editable; // 定义为类的成员变量 + //@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -244,8 +246,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, } }); } - private final int PHOTO_REQUEST = 1; + private final int PHOTO_REQUEST = 1; /** @@ -410,7 +412,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, showAlertHeader(); convertToImage(); String mPassword = mWorkingNote.getmPassword();//读取数据库中的密码 - if (mPassword!=null) { + if (mPassword != null) { //创建dialog,插入edittext,用户输入密码并做出检验。 final AlertDialog.Builder builder = new AlertDialog.Builder(this); View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); @@ -428,13 +430,13 @@ public class NoteEditActivity extends Activity implements OnClickListener, Log.d("password: ", password); //判断密码正确性 if (!password.equals(mPassword)) { - Log.d("密码不正确,正确密码是:",mPassword); + Log.d("密码不正确,正确密码是:", mPassword); dialog.dismiss(); onBackPressed(); } } }); - builder.setNegativeButton("cancel", new DialogInterface.OnClickListener(){ + builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); @@ -668,11 +670,12 @@ public class NoteEditActivity extends Activity implements OnClickListener, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); } mFontSizeSelector.setVisibility(View.GONE); // 隐藏字体大小选择器 - } if (id==R.id.move){ + } + if (id == R.id.move) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); - final View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text,null); + final View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); //编辑Text - final EditText etName = (EditText)view.findViewById(R.id.et_foler_name); + final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); etName.setText(""); etName.setHint("请输入密码"); builder.setTitle("为便签设置新密码"); @@ -688,7 +691,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, //关闭软键盘 InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(etName.getWindowToken(),0); + inputMethodManager.hideSoftInputFromWindow(etName.getWindowToken(), 0); //关闭dialog dialog.dismiss(); } @@ -699,7 +702,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, //关闭软键盘 InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(etName.getWindowToken(),0); + inputMethodManager.hideSoftInputFromWindow(etName.getWindowToken(), 0); } }); final Dialog dialog = builder.setView(view).show(); @@ -1279,12 +1282,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } - - - - - - /** * 根据笔记内容生成快捷方式的标题。移除内容中的已选和未选标签,并确保标题长度不超过上限。 * @@ -1322,10 +1319,12 @@ public class NoteEditActivity extends Activity implements OnClickListener, * 修改部分如下 */ //获取文件的real path + /** * 根据Uri获取文件的真实路径 + * * @param context 上下文 - * @param uri 文件Uri + * @param uri 文件Uri * @return 文件真实路径 */ public String getPath(final Context context, final Uri uri) { @@ -1390,9 +1389,10 @@ public class NoteEditActivity extends Activity implements OnClickListener, /** * 获取数据列,用于获取Uri对应文件的路径 - * @param context 上下文 - * @param uri 文件Uri - * @param selection 查询条件 + * + * @param context 上下文 + * @param uri 文件Uri + * @param selection 查询条件 * @param selectionArgs 查询条件参数 * @return 文件路径 */ @@ -1421,7 +1421,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } - //是否为外部存储文件 // public boolean isExternalStorageDocument(Uri uri) { // return "com.android.externalstorage.documents".equals(uri.getAuthority()); @@ -1589,116 +1588,168 @@ public class NoteEditActivity extends Activity implements OnClickListener, /** * 翻译功能 */ + // 显示翻译对话框的方法 private void showTranslationDialog() { + // 创建三个按钮,分别用于选择不同的翻译模式 Button trans1 = new Button(this); Button trans2 = new Button(this); Button trans3 = new Button(this); + // 设置按钮的文本 trans1.setText("中文翻译为英文"); trans2.setText("英文翻译为中文"); trans3.setText("还原"); + // 创建一个垂直方向的线性布局 LinearLayout linear = new LinearLayout(this); linear.setOrientation(LinearLayout.VERTICAL); + // 将按钮添加到线性布局中 linear.addView(trans1); linear.addView(trans2); linear.addView(trans3); + // 创建一个对话框构建器 AlertDialog.Builder builder = new AlertDialog.Builder(this); + // 将线性布局设置为对话框的内容视图 builder.setView(linear); + // 设置对话框的标题 builder.setTitle("请选择翻译模式"); + // 创建并显示对话框 AlertDialog choose_trans = builder.create(); choose_trans.show(); + // 为“中文翻译为英文”按钮设置点击事件监听器 trans1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { + // 调用中文翻译为英文的方法 translate_z2u(); + // 弹出提示信息,告知用户正在进行中文翻译为英文的操作 Toast.makeText(NoteEditActivity.this, "中文翻译为英文", Toast.LENGTH_SHORT).show(); } }); + // 为“英文翻译为中文”按钮设置点击事件监听器 trans2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { + // 调用英文翻译为中文的方法 translate_u2z(); + // 弹出提示信息,告知用户正在进行英文翻译为中文的操作 Toast.makeText(NoteEditActivity.this, "英文翻译为中文", Toast.LENGTH_SHORT).show(); } }); + // 为“还原”按钮设置点击事件监听器 trans3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { + // 判断是否有可还原的内容 if (restore_translate == null || restore_translate.equals(mNoteEditor.getText().toString())) { + // 如果无可还原内容,则弹出提示信息 Toast.makeText(NoteEditActivity.this, "无可还原内容", Toast.LENGTH_SHORT).show(); } else { + // 将编辑器的文本还原为之前保存的内容 mNoteEditor.setText(restore_translate); + // 弹出提示信息,告知用户已还原 Toast.makeText(NoteEditActivity.this, "已还原", Toast.LENGTH_SHORT).show(); } } }); } + // 中文翻译为英文的方法 private void translate_z2u() { + // 获取编辑器中的文本 String word = mNoteEditor.getText().toString(); + // 将文本中的换行符替换为“//”,以便符合百度翻译API的要求 word = word.replaceAll("\\n", "//"); + // 百度翻译API的appid和密钥 String appid = "20250109002249097"; String secretKey = "D_r9pemb6FKW6bYIXxRU"; + // 设置翻译的源语言和目标语言 String from = "zh"; String to = "en"; + // 生成一个随机数作为salt参数 String salt = String.valueOf(new Random().nextInt(32768) + 65536); + // 根据appid、文本、salt和密钥生成签名 String sign = Notes.getSign(appid, word, salt, secretKey); + // 创建Retrofit实例,用于发起网络请求 Retrofit retrofitBaidu = new Retrofit.Builder() .baseUrl("https://fanyi-api.baidu.com/api/trans/vip/") .addConverterFactory(GsonConverterFactory.create()) .build(); + // 创建百度翻译服务的接口实例 BaiduTranslateService baiduTranslateService = retrofitBaidu.create(BaiduTranslateService.class); + // 调用接口的translate方法,发起翻译请求 Call call = baiduTranslateService.translate(word, from, to, appid, salt, sign); + // 将请求加入到队列中,等待响应 call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { + // 判断请求是否成功且响应体不为空 if (response.isSuccessful() && response.body() != null) { + // 获取响应体中的翻译结果 RespondBean respondBean = response.body(); String result = respondBean.getTrans_result().get(0).getDst(); + // 将翻译结果显示在编辑器中 mNoteEditor.setText(result); } else { + // 如果请求失败或响应体为空,则弹出提示信息 Toast.makeText(NoteEditActivity.this, "Translation failed", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call call, Throwable t) { + // 如果请求过程中出现异常,则弹出提示信息 Toast.makeText(NoteEditActivity.this, "Translation failed: " + t.getMessage(), Toast.LENGTH_SHORT).show(); } }); } + // 英文翻译为中文的方法 private void translate_u2z() { + // 获取编辑器中的文本 String word = mNoteEditor.getText().toString(); + // 将文本中的换行符替换为“//”,以便符合百度翻译API的要求 word = word.replaceAll("\\n", "//"); + // 百度翻译API的appid和密钥 String appid = "20250109002249097"; String secretKey = "D_r9pemb6FKW6bYIXxRU"; + // 设置翻译的源语言和目标语言 String from = "en"; String to = "zh"; + // 生成一个随机数作为salt参数 String salt = String.valueOf(new Random().nextInt(32768) + 65536); + // 根据appid、文本、salt和密钥生成签名 String sign = Notes.getSign(appid, word, salt, secretKey); + // 创建Retrofit实例,用于发起网络请求 Retrofit retrofitBaidu = new Retrofit.Builder() .baseUrl("https://fanyi-api.baidu.com/api/trans/vip/") .addConverterFactory(GsonConverterFactory.create()) .build(); + // 创建百度翻译服务的接口实例 BaiduTranslateService baiduTranslateService = retrofitBaidu.create(BaiduTranslateService.class); + // 调用接口的translate方法,发起翻译请求 Call call = baiduTranslateService.translate(word, from, to, appid, salt, sign); + // 将请求加入到队列中,等待响应 call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { + // 判断请求是否成功且响应体不为空 if (response.isSuccessful() && response.body() != null) { + // 获取响应体中的翻译结果列表 RespondBean respondBean = response.body(); List transResult = respondBean.getTrans_result(); + // 判断翻译结果列表是否为空 if (transResult != null && !transResult.isEmpty()) { + // 获取第一个翻译结果 String result = transResult.get(0).getDst(); + // 在主线程中将翻译结果显示在编辑器中 runOnUiThread(new Runnable() { @Override public void run() { @@ -1706,28 +1757,33 @@ public class NoteEditActivity extends Activity implements OnClickListener, } }); } else { + // 如果翻译结果列表为空,则在主线程中弹出提示信息 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(NoteEditActivity.this, "Translation failed: No translation result", Toast.LENGTH_SHORT).show(); } }); + // 记录错误日志 Log.e("TranslationError", "Translation failed: No translation result"); Log.e("TranslationError", "Response: " + response.body().toString()); } } else { + // 如果请求失败或响应体为空,则在主线程中弹出提示信息 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(NoteEditActivity.this, "Translation failed: " + response.code(), Toast.LENGTH_SHORT).show(); } }); + // 记录错误日志 Log.e("TranslationError", "Translation failed: " + response.code() + " " + response.message()); } } @Override public void onFailure(Call call, Throwable t) { + // 如果请求过程中出现异常,则弹出提示信息 Toast.makeText(NoteEditActivity.this, "Translation failed: " + t.getMessage(), Toast.LENGTH_SHORT).show(); } });