From 8cf957b1c3ab7bbaee7fdab7424b65b60e1f5f13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8C=85=E5=B0=94=E4=BF=8A?= Date: Mon, 19 Jan 2026 22:45:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BE=A7=E8=BE=B9=E6=A0=8F?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E7=9B=AE=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/micode/notes/MainActivity.java | 71 ++++++- .../micode/notes/ui/NotesListActivity.java | 1 - .../net/micode/notes/ui/SidebarFragment.java | 197 ++++++++++++------ .../notes/viewmodel/FolderListViewModel.java | 51 ++++- .../src/main/res/values-zh-rCN/strings.xml | 12 +- .../app/src/main/res/values/strings.xml | 28 +-- src/Notesmaster/gradle.properties | 13 +- 7 files changed, 276 insertions(+), 97 deletions(-) diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/MainActivity.java b/src/Notesmaster/app/src/main/java/net/micode/notes/MainActivity.java index df300de..930f6fe 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/MainActivity.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/MainActivity.java @@ -1,24 +1,33 @@ package net.micode.notes; +import android.content.Intent; import android.os.Bundle; +import android.util.Log; +import android.view.Gravity; +import android.view.View; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.drawerlayout.widget.DrawerLayout; +import net.micode.notes.data.Notes; import net.micode.notes.ui.SidebarFragment; /** * 主活动类 *

- * 应用的主入口,负责初始化主界面并处理窗口边距。 + * 应用的主入口,负责启动笔记列表界面 * 支持边到边显示模式,自动适配系统栏的边距。 *

*/ public class MainActivity extends AppCompatActivity implements SidebarFragment.OnSidebarItemSelectedListener { + private static final String TAG = "MainActivity"; + private DrawerLayout drawerLayout; + /** * 创建活动 *

@@ -33,6 +42,37 @@ public class MainActivity extends AppCompatActivity implements SidebarFragment.O // 启用边到边显示模式 EdgeToEdge.enable(this); setContentView(R.layout.activity_main); + + // 初始化DrawerLayout + drawerLayout = findViewById(R.id.drawer_layout); + if (drawerLayout != null) { + // 设置侧栏在左侧 + drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.LEFT); + + // 设置监听器:侧栏关闭时更新状态 + drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + // 侧栏滑动时 + } + + @Override + public void onDrawerOpened(View drawerView) { + // 侧栏打开时 + } + + @Override + public void onDrawerClosed(View drawerView) { + // 侧栏关闭时 + } + + @Override + public void onDrawerStateChanged(int newState) { + // 侧栏状态改变时 + } + }); + } + // 设置窗口边距监听器,自动适配系统栏 ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main_content), (v, insets) -> { // 获取系统栏边距 @@ -41,19 +81,26 @@ public class MainActivity extends AppCompatActivity implements SidebarFragment.O v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + // 启动NotesListActivity作为主界面 + Intent intent = new Intent(this, net.micode.notes.ui.NotesListActivity.class); + startActivity(intent); } // ==================== SidebarFragment.OnSidebarItemSelectedListener 实现 ==================== @Override public void onFolderSelected(long folderId) { - // TODO: 实现跳转到指定文件夹 - // 关闭侧栏 + Log.d(TAG, "Folder selected: " + folderId); + // 打开侧栏中的文件夹:不关闭侧栏,直接切换视图 + // 这个回调通常用于侧栏中的文件夹项双击 + // 实际跳转逻辑应该在NotesListActivity中处理 closeSidebar(); } @Override public void onTrashSelected() { + Log.d(TAG, "Trash selected"); // TODO: 实现跳转到回收站 // 关闭侧栏 closeSidebar(); @@ -61,27 +108,37 @@ public class MainActivity extends AppCompatActivity implements SidebarFragment.O @Override public void onSyncSelected() { + Log.d(TAG, "Sync selected"); // TODO: 实现同步功能 } @Override public void onLoginSelected() { + Log.d(TAG, "Login selected"); // TODO: 实现登录功能 } @Override public void onExportSelected() { + Log.d(TAG, "Export selected"); // TODO: 实现导出功能 } @Override public void onSettingsSelected() { - // TODO: 实现设置功能 + Log.d(TAG, "Settings selected"); + // 打开设置界面 + Intent intent = new Intent(this, net.micode.notes.ui.NotesPreferenceActivity.class); + startActivity(intent); + // 关闭侧栏 + closeSidebar(); } @Override public void onCreateFolder() { - // TODO: 实现创建文件夹功能 + Log.d(TAG, "Create folder"); + // 创建文件夹功能由SidebarFragment内部处理 + // 这里不需要做任何事情 } @Override @@ -95,6 +152,8 @@ public class MainActivity extends AppCompatActivity implements SidebarFragment.O * 关闭侧栏 */ private void closeSidebar() { - // TODO: 实现侧栏关闭功能 + if (drawerLayout != null) { + drawerLayout.closeDrawer(Gravity.LEFT); + } } } \ No newline at end of file diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java index c237a90..b2e1115 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -807,7 +807,6 @@ public class NotesListActivity extends AppCompatActivity /** * 返回键按下事件处理 - * *

* 多选模式:退出多选模式 * 子文件夹:返回上一级文件夹 diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/SidebarFragment.java b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/SidebarFragment.java index 2eec39b..041f68b 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/SidebarFragment.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/SidebarFragment.java @@ -183,6 +183,7 @@ public class SidebarFragment extends Fragment { // 设置RecyclerView rvFolderTree.setLayoutManager(new LinearLayoutManager(requireContext())); adapter = new FolderTreeAdapter(new ArrayList<>(), viewModel); + adapter.setOnFolderItemClickListener(this::handleFolderItemClick); rvFolderTree.setAdapter(adapter); } @@ -243,22 +244,27 @@ public class SidebarFragment extends Fragment { */ private void setupFolderClickListener(View view, long folderId) { view.setOnClickListener(v -> { + android.util.Log.d(TAG, "setupFolderClickListener: folderId=" + folderId); long currentTime = System.currentTimeMillis(); if (lastClickedView == view && (currentTime - lastClickTime) < DOUBLE_CLICK_INTERVAL) { + android.util.Log.d(TAG, "Double click on root folder, jumping to: " + folderId); // 这是双击,执行跳转 - if (listener != null && folderId != Notes.ID_ROOT_FOLDER) { + if (listener != null) { + // 根文件夹也可以跳转(回到根) listener.onFolderSelected(folderId); } // 重置双击状态 lastClickTime = 0; lastClickedView = null; } else { + android.util.Log.d(TAG, "Single click on root folder, will toggle expand in " + DOUBLE_CLICK_INTERVAL + "ms"); // 可能是单击,延迟处理 lastClickTime = currentTime; lastClickedView = view; view.postDelayed(() -> { // 如果在延迟期间没有发生双击,则执行单击操作(展开/收起) if (System.currentTimeMillis() - lastClickTime >= DOUBLE_CLICK_INTERVAL) { + android.util.Log.d(TAG, "Toggling root folder expand"); toggleFolderExpand(folderId); } }, DOUBLE_CLICK_INTERVAL); @@ -284,9 +290,44 @@ public class SidebarFragment extends Fragment { * 切换文件夹展开/收起状态 */ private void toggleFolderExpand(long folderId) { + android.util.Log.d(TAG, "toggleFolderExpand: folderId=" + folderId); viewModel.toggleFolderExpand(folderId); } + /** + * 处理文件夹项点击(单击/双击) + */ + private void handleFolderItemClick(long folderId) { + android.util.Log.d(TAG, "handleFolderItemClick: folderId=" + folderId); + long currentTime = System.currentTimeMillis(); + if (lastClickedFolderId == folderId && (currentTime - lastFolderClickTime) < DOUBLE_CLICK_INTERVAL) { + android.util.Log.d(TAG, "Double click detected, jumping to folder: " + folderId); + // 这是双击,执行跳转 + if (listener != null) { + listener.onFolderSelected(folderId); + } + // 重置双击状态 + lastFolderClickTime = 0; + lastClickedFolderId = -1; + } else { + android.util.Log.d(TAG, "Single click, will toggle expand in " + DOUBLE_CLICK_INTERVAL + "ms"); + // 可能是单击,延迟处理 + lastFolderClickTime = currentTime; + lastClickedFolderId = folderId; + new android.os.Handler().postDelayed(() -> { + // 如果在延迟期间没有发生双击,则执行单击操作(展开/收起) + if (System.currentTimeMillis() - lastFolderClickTime >= DOUBLE_CLICK_INTERVAL) { + android.util.Log.d(TAG, "Toggling folder expand: " + folderId); + toggleFolderExpand(folderId); + } + }, DOUBLE_CLICK_INTERVAL); + } + } + + // 双击检测专用变量(针对文件夹列表项) + private long lastFolderClickTime = 0; + private long lastClickedFolderId = -1; + /** * 显示创建文件夹对话框 */ @@ -323,7 +364,7 @@ public class SidebarFragment extends Fragment { public void onSuccess(Long folderId) { if (getActivity() != null) { getActivity().runOnUiThread(() -> { - Toast.makeText(requireContext(), "创建文件夹成功", Toast.LENGTH_SHORT).show(); + Toast.makeText(requireContext(), R.string.create_folder_success, Toast.LENGTH_SHORT).show(); // 刷新文件夹列表 viewModel.loadFolderTree(); }); @@ -334,7 +375,9 @@ public class SidebarFragment extends Fragment { public void onError(Exception error) { if (getActivity() != null) { getActivity().runOnUiThread(() -> { - Toast.makeText(requireContext(), "创建文件夹失败: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + Toast.makeText(requireContext(), + getString(R.string.error_folder_name_too_long) + ": " + error.getMessage(), + Toast.LENGTH_SHORT).show(); }); } } @@ -345,82 +388,106 @@ public class SidebarFragment extends Fragment { builder.show(); } - /** - * FolderTreeAdapter - * 文件夹树适配器,支持层级显示和展开/收起 - */ - private static class FolderTreeAdapter extends RecyclerView.Adapter { + /** + * FolderTreeAdapter + * 文件夹树适配器,支持层级显示和展开/收起 + */ + private static class FolderTreeAdapter extends RecyclerView.Adapter { - private List folderItems; - private FolderListViewModel viewModel; + private List folderItems; + private FolderListViewModel viewModel; + private OnFolderItemClickListener folderItemClickListener; - public FolderTreeAdapter(List folderItems, FolderListViewModel viewModel) { - this.folderItems = folderItems; - this.viewModel = viewModel; - } + public FolderTreeAdapter(List folderItems, FolderListViewModel viewModel) { + this.folderItems = folderItems; + this.viewModel = viewModel; + } - public void setData(List folderItems) { - this.folderItems = folderItems; - } + public void setData(List folderItems) { + this.folderItems = folderItems; + } - @NonNull - @Override - public FolderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.sidebar_folder_item, parent, false); - return new FolderViewHolder(view); - } + public void setOnFolderItemClickListener(OnFolderItemClickListener listener) { + this.folderItemClickListener = listener; + } - @Override - public void onBindViewHolder(@NonNull FolderViewHolder holder, int position) { - FolderTreeItem item = folderItems.get(position); - boolean isExpanded = viewModel != null && viewModel.isFolderExpanded(item.folderId); - holder.bind(item, isExpanded); - } + @NonNull + @Override + public FolderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.sidebar_folder_item, parent, false); + return new FolderViewHolder(view, folderItemClickListener); + } - @Override - public int getItemCount() { - return folderItems.size(); - } + @Override + public void onBindViewHolder(@NonNull FolderViewHolder holder, int position) { + FolderTreeItem item = folderItems.get(position); + boolean isExpanded = viewModel != null && viewModel.isFolderExpanded(item.folderId); + holder.bind(item, isExpanded); + } - static class FolderViewHolder extends RecyclerView.ViewHolder { - private View indentView; - private ImageView ivExpandIcon; - private ImageView ivFolderIcon; - private TextView tvFolderName; - private TextView tvNoteCount; - - public FolderViewHolder(@NonNull View itemView) { - super(itemView); - indentView = itemView.findViewById(R.id.indent_view); - ivExpandIcon = itemView.findViewById(R.id.iv_expand_icon); - ivFolderIcon = itemView.findViewById(R.id.iv_folder_icon); - tvFolderName = itemView.findViewById(R.id.tv_folder_name); - tvNoteCount = itemView.findViewById(R.id.tv_note_count); + @Override + public int getItemCount() { + return folderItems.size(); } - public void bind(FolderTreeItem item, boolean isExpanded) { - // 设置缩进 - int indent = item.level * 32; - indentView.setLayoutParams(new LinearLayout.LayoutParams(indent, LinearLayout.LayoutParams.MATCH_PARENT)); - - // 设置展开/收起图标 - if (item.hasChildren) { - ivExpandIcon.setVisibility(View.VISIBLE); - ivExpandIcon.setRotation(isExpanded ? 90 : 0); - } else { - ivExpandIcon.setVisibility(View.INVISIBLE); + static class FolderViewHolder extends RecyclerView.ViewHolder { + private View indentView; + private ImageView ivExpandIcon; + private ImageView ivFolderIcon; + private TextView tvFolderName; + private TextView tvNoteCount; + private FolderTreeItem currentItem; + private final OnFolderItemClickListener folderItemClickListener; + + public FolderViewHolder(@NonNull View itemView, OnFolderItemClickListener listener) { + super(itemView); + this.folderItemClickListener = listener; + indentView = itemView.findViewById(R.id.indent_view); + ivExpandIcon = itemView.findViewById(R.id.iv_expand_icon); + ivFolderIcon = itemView.findViewById(R.id.iv_folder_icon); + tvFolderName = itemView.findViewById(R.id.tv_folder_name); + tvNoteCount = itemView.findViewById(R.id.tv_note_count); } - // 设置文件夹名称 - tvFolderName.setText(item.name); + public void bind(FolderTreeItem item, boolean isExpanded) { + this.currentItem = item; + + // 设置缩进 + int indent = item.level * 32; + indentView.setLayoutParams(new LinearLayout.LayoutParams(indent, LinearLayout.LayoutParams.MATCH_PARENT)); + + // 设置展开/收起图标 + if (item.hasChildren) { + ivExpandIcon.setVisibility(View.VISIBLE); + ivExpandIcon.setRotation(isExpanded ? 90 : 0); + } else { + ivExpandIcon.setVisibility(View.INVISIBLE); + } + + // 设置文件夹名称 + tvFolderName.setText(item.name); + + // 设置便签数量 + tvNoteCount.setText(String.format(itemView.getContext() + .getString(R.string.folder_note_count), item.noteCount)); - // 设置便签数量 - tvNoteCount.setText(String.format(itemView.getContext() - .getString(R.string.folder_note_count), item.noteCount)); + // 设置点击监听器 + itemView.setOnClickListener(v -> { + if (folderItemClickListener != null) { + folderItemClickListener.onFolderClick(item.folderId); + } + }); + } } } - } + + /** + * 文件夹项点击监听器接口 + */ + public interface OnFolderItemClickListener { + void onFolderClick(long folderId); + } /** * FolderTreeItem diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/viewmodel/FolderListViewModel.java b/src/Notesmaster/app/src/main/java/net/micode/notes/viewmodel/FolderListViewModel.java index 683a128..fc98f66 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/viewmodel/FolderListViewModel.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/viewmodel/FolderListViewModel.java @@ -80,11 +80,19 @@ public class FolderListViewModel extends AndroidViewModel { * @param folderId 文件夹ID */ public void toggleFolderExpand(long folderId) { + android.util.Log.d(TAG, "toggleFolderExpand: folderId=" + folderId); + android.util.Log.d(TAG, "Before toggle, expandedFolders: " + expandedFolderIds); + if (expandedFolderIds.contains(folderId)) { expandedFolderIds.remove(folderId); + android.util.Log.d(TAG, "Collapsed folder: " + folderId); } else { expandedFolderIds.add(folderId); + android.util.Log.d(TAG, "Expanded folder: " + folderId); } + + android.util.Log.d(TAG, "After toggle, expandedFolders: " + expandedFolderIds); + // 重新加载文件夹树 loadFolderTree(); } @@ -126,6 +134,8 @@ public class FolderListViewModel extends AndroidViewModel { // 查询所有文件夹(不包括系统文件夹) List> folders = queryAllFolders(); + android.util.Log.d("FolderListViewModel", "QueryAllFolders returned " + folders.size() + " folders"); + // 构建文件夹映射表(方便查找父文件夹) Map folderMap = new HashMap<>(); List rootFolders = new ArrayList<>(); @@ -137,15 +147,20 @@ public class FolderListViewModel extends AndroidViewModel { long parentId = (Long) folder.get(NoteColumns.PARENT_ID); int noteCount = ((Number) folder.get(NoteColumns.NOTES_COUNT)).intValue(); + android.util.Log.d("FolderListViewModel", "Folder: id=" + id + ", name=" + name + ", parentId=" + parentId); + FolderNode node = new FolderNode(id, name, parentId, noteCount); folderMap.put(id, node); // 如果是顶级文件夹(父文件夹为根),添加到根列表 if (parentId == Notes.ID_ROOT_FOLDER) { rootFolders.add(node); + android.util.Log.d("FolderListViewModel", "Added root folder: " + name); } } + android.util.Log.d("FolderListViewModel", "Root folders count: " + rootFolders.size()); + // 构建父子关系 for (FolderNode node : folderMap.values()) { if (node.parentId != Notes.ID_ROOT_FOLDER) { @@ -160,15 +175,18 @@ public class FolderListViewModel extends AndroidViewModel { List folderTree = new ArrayList<>(); // 检查根文件夹是否展开 boolean rootExpanded = expandedFolderIds.contains(Notes.ID_ROOT_FOLDER); + android.util.Log.d("FolderListViewModel", "Root expanded: " + rootExpanded); buildFolderTreeList(rootFolders, folderTree, 0, rootExpanded); + android.util.Log.d("FolderListViewModel", "Final folder tree size: " + folderTree.size()); + return folderTree; } /** * 递归构建文件夹树列表 * 只显示已展开文件夹的子文件夹 - * 顶层文件夹(level=0)默认收起,需要点击"我的便签"后展开 + * 顶层文件夹始终显示,无论根文件夹是否展开 * @param nodes 文件夹节点列表 * @param folderTree 文件夹树列表(输出) * @param level 当前层级 @@ -176,11 +194,8 @@ public class FolderListViewModel extends AndroidViewModel { */ private void buildFolderTreeList(List nodes, List folderTree, int level, boolean forceExpandChildren) { for (FolderNode node : nodes) { - // 对于顶层文件夹,需要"我的便签"展开后才显示 - if (level == 0 && !expandedFolderIds.contains(Notes.ID_ROOT_FOLDER) && !forceExpandChildren) { - continue; // 跳过顶层文件夹,因为根未展开 - } - + // 顶级文件夹始终显示(level=0) + // 移除了之前的条件判断,让所有顶级文件夹都能显示 folderTree.add(new FolderTreeItem( node.id, node.name, @@ -190,6 +205,7 @@ public class FolderListViewModel extends AndroidViewModel { )); // 只有当父文件夹在 expandedFolderIds 中时,才递归处理子文件夹 + // 有子节点(!node.children.isEmpty())才检查展开状态 if (!node.children.isEmpty() && expandedFolderIds.contains(node.id)) { buildFolderTreeList(node.children, folderTree, level + 1, false); } @@ -221,13 +237,31 @@ public class FolderListViewModel extends AndroidViewModel { NoteColumns.MODIFIED_DATE + " DESC" ); + android.util.Log.d("FolderListViewModel", "Query executed, cursor: " + (cursor != null ? cursor.getCount() : "null")); + if (cursor != null) { + android.util.Log.d("FolderListViewModel", "Column names: " + java.util.Arrays.toString(cursor.getColumnNames())); + while (cursor.moveToNext()) { Map folder = new HashMap<>(); long id = cursor.getLong(cursor.getColumnIndexOrThrow(NoteColumns.ID)); String name = cursor.getString(cursor.getColumnIndexOrThrow(NoteColumns.SNIPPET)); - long parentId = cursor.getLong(cursor.getColumnIndexOrThrow(NoteColumns.PARENT_ID)); - int noteCount = cursor.getInt(cursor.getColumnIndexOrThrow(NoteColumns.NOTES_COUNT)); + + // 尝试获取parent_id,可能列名不对 + int parentIdIndex = cursor.getColumnIndex(NoteColumns.PARENT_ID); + long parentId = -1; + if (parentIdIndex != -1) { + parentId = cursor.getLong(parentIdIndex); + } + + // 尝试获取notes_count + int notesCountIndex = cursor.getColumnIndex(NoteColumns.NOTES_COUNT); + int noteCount = 0; + if (notesCountIndex != -1) { + noteCount = cursor.getInt(notesCountIndex); + } + + android.util.Log.d("FolderListViewModel", "Folder data: id=" + id + ", name=" + name + ", parentId=" + parentId + ", noteCount=" + noteCount); folder.put(NoteColumns.ID, id); folder.put(NoteColumns.SNIPPET, name); @@ -238,6 +272,7 @@ public class FolderListViewModel extends AndroidViewModel { } } } catch (Exception e) { + android.util.Log.e("FolderListViewModel", "Error querying folders", e); e.printStackTrace(); } finally { if (cursor != null) { diff --git a/src/Notesmaster/app/src/main/res/values-zh-rCN/strings.xml b/src/Notesmaster/app/src/main/res/values-zh-rCN/strings.xml index 09f75ed..61b9801 100644 --- a/src/Notesmaster/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/Notesmaster/app/src/main/res/values-zh-rCN/strings.xml @@ -120,7 +120,17 @@ 设置 取消 - %1$s 条符合“%2$s”的搜索结果 + %1$s 条符合"%2$s"的搜索结果 + + 我的便签 + %d 个便签 + 创建文件夹 + 文件夹名称 + 文件夹名称不能为空 + 文件夹名称过长(最多50个字符) + 回收站 + 创建文件夹成功 + diff --git a/src/Notesmaster/app/src/main/res/values/strings.xml b/src/Notesmaster/app/src/main/res/values/strings.xml index 3300972..b34890c 100644 --- a/src/Notesmaster/app/src/main/res/values/strings.xml +++ b/src/Notesmaster/app/src/main/res/values/strings.xml @@ -138,18 +138,18 @@ 空便签图标 Edit note - 我的便签 - 关闭侧栏 - 创建文件夹 - 登录 - 导出 - 设置 - 回收站 - %1$d个便签 - 创建文件夹 - 请输入文件夹名称 - 文件夹名称不能为空 - 文件夹名称不能超过50个字符 - 该文件夹已存在 - 创建文件夹成功 + Login + Export + Settings + Trash + My Notes + Close sidebar + Create folder + %d notes + Create folder + Folder name + Folder name cannot be empty + Folder name too long (max 50 characters) + Folder already exists + Folder created successfully diff --git a/src/Notesmaster/gradle.properties b/src/Notesmaster/gradle.properties index fd5ffa1..547122f 100644 --- a/src/Notesmaster/gradle.properties +++ b/src/Notesmaster/gradle.properties @@ -2,21 +2,30 @@ # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. + # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html + # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED + # When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. For more details, visit +# This option should only be used with decoupled projects. +# For more details, visit # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects # org.gradle.parallel=true + # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true + # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true android.nonFinalResIds=false + +# 测试配置 +android.testOptions.unitTests.isReturnDefaultValues=true