From e26fc7fe1ca387e4df8e69211677ca8a3e696ca9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 13 Jan 2026 04:13:34 +0000
Subject: [PATCH 1/3] Initial plan
From b3400338d73a3cafca26f3f095acd1b7ddd64561 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 13 Jan 2026 04:18:06 +0000
Subject: [PATCH 2/3] Implement complete Android note-taking app with all core
features
Co-authored-by: Jeffcheung205 <173689379+Jeffcheung205@users.noreply.github.com>
---
.gitignore | 23 ++++
README.md | 73 ++++++++++-
app/build.gradle | 37 ++++++
app/proguard-rules.pro | 1 +
app/src/main/AndroidManifest.xml | 25 ++++
.../java/com/notetaking/app/MainActivity.java | 74 +++++++++++
.../main/java/com/notetaking/app/Note.java | 61 +++++++++
.../notetaking/app/NoteEditorActivity.java | 117 ++++++++++++++++++
.../java/com/notetaking/app/NotesAdapter.java | 73 +++++++++++
.../java/com/notetaking/app/NotesManager.java | 63 ++++++++++
app/src/main/res/layout/activity_main.xml | 40 ++++++
.../main/res/layout/activity_note_editor.xml | 28 +++++
app/src/main/res/layout/item_note.xml | 44 +++++++
app/src/main/res/menu/menu_editor.xml | 17 +++
app/src/main/res/values/colors.xml | 11 ++
app/src/main/res/values/strings.xml | 14 +++
app/src/main/res/values/themes.xml | 11 ++
build.gradle | 21 ++++
gradle.properties | 4 +
gradle/wrapper/gradle-wrapper.properties | 5 +
settings.gradle | 2 +
21 files changed, 743 insertions(+), 1 deletion(-)
create mode 100644 .gitignore
create mode 100644 app/build.gradle
create mode 100644 app/proguard-rules.pro
create mode 100644 app/src/main/AndroidManifest.xml
create mode 100644 app/src/main/java/com/notetaking/app/MainActivity.java
create mode 100644 app/src/main/java/com/notetaking/app/Note.java
create mode 100644 app/src/main/java/com/notetaking/app/NoteEditorActivity.java
create mode 100644 app/src/main/java/com/notetaking/app/NotesAdapter.java
create mode 100644 app/src/main/java/com/notetaking/app/NotesManager.java
create mode 100644 app/src/main/res/layout/activity_main.xml
create mode 100644 app/src/main/res/layout/activity_note_editor.xml
create mode 100644 app/src/main/res/layout/item_note.xml
create mode 100644 app/src/main/res/menu/menu_editor.xml
create mode 100644 app/src/main/res/values/colors.xml
create mode 100644 app/src/main/res/values/strings.xml
create mode 100644 app/src/main/res/values/themes.xml
create mode 100644 build.gradle
create mode 100644 gradle.properties
create mode 100644 gradle/wrapper/gradle-wrapper.properties
create mode 100644 settings.gradle
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7e6addd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,23 @@
+*.iml
+.gradle
+/local.properties
+/.idea/
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+*.apk
+*.ap_
+*.aab
+*.dex
+*.class
+bin/
+gen/
+out/
+.gradletasknamecache
+app/build/
+*/build/
+gradle-app.setting
+!gradle-wrapper.jar
+!gradle-wrapper.properties
diff --git a/README.md b/README.md
index 77cec85..06a1ee6 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,72 @@
-# Android_Note-taking
\ No newline at end of file
+# Android Note-Taking App
+
+A simple and functional note-taking application for Android that allows users to create, edit, view, and delete notes.
+
+## Features
+
+- **Create Notes**: Add new notes with titles and content
+- **View Notes**: Browse all your notes in a clean list view
+- **Edit Notes**: Modify existing notes anytime
+- **Delete Notes**: Remove notes you no longer need
+- **Persistent Storage**: Notes are saved locally using SharedPreferences with Gson serialization
+- **Modern UI**: Material Design components with CardView and FloatingActionButton
+
+## Technical Details
+
+- **Minimum SDK**: Android 5.0 (API 21)
+- **Target SDK**: Android 13 (API 33)
+- **Language**: Java
+- **Architecture**: Simple MVC pattern
+- **Data Persistence**: SharedPreferences with Gson
+
+## Project Structure
+
+```
+app/
+├── src/main/
+│ ├── java/com/notetaking/app/
+│ │ ├── MainActivity.java # Main screen showing list of notes
+│ │ ├── NoteEditorActivity.java # Screen for creating/editing notes
+│ │ ├── Note.java # Note data model
+│ │ ├── NotesAdapter.java # RecyclerView adapter for notes list
+│ │ └── NotesManager.java # Handles data persistence
+│ ├── res/
+│ │ ├── layout/ # XML layouts
+│ │ ├── values/ # Strings, colors, themes
+│ │ └── menu/ # Menu resources
+│ └── AndroidManifest.xml
+└── build.gradle
+```
+
+## Building the Project
+
+1. Clone the repository:
+ ```bash
+ git clone https://github.com/Jeffcheung205/Android_Note-taking.git
+ ```
+
+2. Open the project in Android Studio
+
+3. Sync Gradle files
+
+4. Run on an emulator or physical device
+
+## Usage
+
+1. **Add a Note**: Tap the floating action button (+) on the main screen
+2. **Edit a Note**: Tap on any note in the list to open and edit it
+3. **Save a Note**: Tap the save icon in the editor toolbar
+4. **Delete a Note**: Open a note and tap the delete icon in the toolbar
+
+## Dependencies
+
+- AndroidX AppCompat
+- Material Components
+- RecyclerView
+- CardView
+- ConstraintLayout
+- Gson (for JSON serialization)
+
+## License
+
+This project is open source and available for educational purposes.
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..f59c907
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,37 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ namespace 'com.notetaking.app'
+ compileSdk 33
+
+ defaultConfig {
+ applicationId "com.notetaking.app"
+ minSdk 21
+ targetSdk 33
+ versionCode 1
+ versionName "1.0"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'com.google.android.material:material:1.9.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ implementation 'androidx.recyclerview:recyclerview:1.3.0'
+ implementation 'androidx.cardview:cardview:1.0.0'
+ implementation 'com.google.code.gson:gson:2.10.1'
+}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..fb164d6
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1 @@
+# Add project specific ProGuard rules here.
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..96c8820
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/com/notetaking/app/MainActivity.java b/app/src/main/java/com/notetaking/app/MainActivity.java
new file mode 100644
index 0000000..f259dde
--- /dev/null
+++ b/app/src/main/java/com/notetaking/app/MainActivity.java
@@ -0,0 +1,74 @@
+package com.notetaking.app;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+import java.util.List;
+
+public class MainActivity extends AppCompatActivity implements NotesAdapter.OnNoteClickListener {
+ private RecyclerView recyclerView;
+ private TextView emptyTextView;
+ private NotesAdapter adapter;
+ private NotesManager notesManager;
+ private static final int REQUEST_CODE_ADD = 1;
+ private static final int REQUEST_CODE_EDIT = 2;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ notesManager = new NotesManager(this);
+
+ recyclerView = findViewById(R.id.recyclerView);
+ emptyTextView = findViewById(R.id.emptyTextView);
+ FloatingActionButton fab = findViewById(R.id.fab);
+
+ recyclerView.setLayoutManager(new LinearLayoutManager(this));
+
+ List notes = notesManager.loadNotes();
+ adapter = new NotesAdapter(notes, this);
+ recyclerView.setAdapter(adapter);
+
+ updateEmptyView();
+
+ fab.setOnClickListener(v -> {
+ Intent intent = new Intent(MainActivity.this, NoteEditorActivity.class);
+ startActivityForResult(intent, REQUEST_CODE_ADD);
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ refreshNotes();
+ }
+
+ private void refreshNotes() {
+ List notes = notesManager.loadNotes();
+ adapter.updateNotes(notes);
+ updateEmptyView();
+ }
+
+ private void updateEmptyView() {
+ if (adapter.getItemCount() == 0) {
+ recyclerView.setVisibility(View.GONE);
+ emptyTextView.setVisibility(View.VISIBLE);
+ } else {
+ recyclerView.setVisibility(View.VISIBLE);
+ emptyTextView.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onNoteClick(Note note) {
+ Intent intent = new Intent(this, NoteEditorActivity.class);
+ intent.putExtra("note", note);
+ startActivityForResult(intent, REQUEST_CODE_EDIT);
+ }
+}
diff --git a/app/src/main/java/com/notetaking/app/Note.java b/app/src/main/java/com/notetaking/app/Note.java
new file mode 100644
index 0000000..654b8ee
--- /dev/null
+++ b/app/src/main/java/com/notetaking/app/Note.java
@@ -0,0 +1,61 @@
+package com.notetaking.app;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+public class Note implements Serializable {
+ private long id;
+ private String title;
+ private String content;
+ private long timestamp;
+
+ public Note() {
+ this.id = System.currentTimeMillis();
+ this.timestamp = System.currentTimeMillis();
+ }
+
+ public Note(String title, String content) {
+ this();
+ this.title = title;
+ this.content = content;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public String getFormattedDate() {
+ SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy HH:mm", Locale.getDefault());
+ return sdf.format(new Date(timestamp));
+ }
+}
diff --git a/app/src/main/java/com/notetaking/app/NoteEditorActivity.java b/app/src/main/java/com/notetaking/app/NoteEditorActivity.java
new file mode 100644
index 0000000..4d045b4
--- /dev/null
+++ b/app/src/main/java/com/notetaking/app/NoteEditorActivity.java
@@ -0,0 +1,117 @@
+package com.notetaking.app;
+
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.EditText;
+import android.widget.Toast;
+import androidx.appcompat.app.AppCompatActivity;
+
+public class NoteEditorActivity extends AppCompatActivity {
+ private EditText titleEditText;
+ private EditText contentEditText;
+ private NotesManager notesManager;
+ private Note currentNote;
+ private boolean isEditMode = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_note_editor);
+
+ notesManager = new NotesManager(this);
+
+ titleEditText = findViewById(R.id.titleEditText);
+ contentEditText = findViewById(R.id.contentEditText);
+
+ // Check if we're editing an existing note
+ if (getIntent().hasExtra("note")) {
+ currentNote = (Note) getIntent().getSerializableExtra("note");
+ if (currentNote != null) {
+ isEditMode = true;
+ titleEditText.setText(currentNote.getTitle());
+ contentEditText.setText(currentNote.getContent());
+ setTitle(R.string.edit_note);
+ }
+ } else {
+ currentNote = new Note();
+ setTitle(R.string.add_note);
+ }
+
+ // Enable back button
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.menu_editor, menu);
+ // Hide delete button if it's a new note
+ if (!isEditMode) {
+ menu.findItem(R.id.action_delete).setVisible(false);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+
+ if (id == R.id.action_save) {
+ saveNote();
+ return true;
+ } else if (id == R.id.action_delete) {
+ deleteNote();
+ return true;
+ } else if (id == android.R.id.home) {
+ finish();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void saveNote() {
+ String title = titleEditText.getText().toString().trim();
+ String content = contentEditText.getText().toString().trim();
+
+ if (TextUtils.isEmpty(title) && TextUtils.isEmpty(content)) {
+ Toast.makeText(this, R.string.empty_note, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ // Use "Untitled" if no title is provided
+ if (TextUtils.isEmpty(title)) {
+ title = "Untitled";
+ }
+
+ currentNote.setTitle(title);
+ currentNote.setContent(content);
+ currentNote.setTimestamp(System.currentTimeMillis());
+
+ if (isEditMode) {
+ notesManager.updateNote(currentNote);
+ } else {
+ notesManager.addNote(currentNote);
+ }
+
+ Toast.makeText(this, R.string.note_saved, Toast.LENGTH_SHORT).show();
+ finish();
+ }
+
+ private void deleteNote() {
+ if (isEditMode && currentNote != null) {
+ notesManager.deleteNote(currentNote.getId());
+ Toast.makeText(this, R.string.note_deleted, Toast.LENGTH_SHORT).show();
+ finish();
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ super.onBackPressed();
+ finish();
+ }
+}
diff --git a/app/src/main/java/com/notetaking/app/NotesAdapter.java b/app/src/main/java/com/notetaking/app/NotesAdapter.java
new file mode 100644
index 0000000..4ecf955
--- /dev/null
+++ b/app/src/main/java/com/notetaking/app/NotesAdapter.java
@@ -0,0 +1,73 @@
+package com.notetaking.app;
+
+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 java.util.List;
+
+public class NotesAdapter extends RecyclerView.Adapter {
+ private List notes;
+ private OnNoteClickListener listener;
+
+ public interface OnNoteClickListener {
+ void onNoteClick(Note note);
+ }
+
+ public NotesAdapter(List notes, OnNoteClickListener listener) {
+ this.notes = notes;
+ this.listener = listener;
+ }
+
+ @NonNull
+ @Override
+ public NoteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_note, parent, false);
+ return new NoteViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull NoteViewHolder holder, int position) {
+ Note note = notes.get(position);
+ holder.bind(note);
+ }
+
+ @Override
+ public int getItemCount() {
+ return notes.size();
+ }
+
+ public void updateNotes(List newNotes) {
+ this.notes = newNotes;
+ notifyDataSetChanged();
+ }
+
+ class NoteViewHolder extends RecyclerView.ViewHolder {
+ private TextView titleTextView;
+ private TextView contentTextView;
+ private TextView dateTextView;
+
+ public NoteViewHolder(@NonNull View itemView) {
+ super(itemView);
+ titleTextView = itemView.findViewById(R.id.noteTitle);
+ contentTextView = itemView.findViewById(R.id.noteContent);
+ dateTextView = itemView.findViewById(R.id.noteDate);
+
+ itemView.setOnClickListener(v -> {
+ int position = getAdapterPosition();
+ if (position != RecyclerView.NO_POSITION && listener != null) {
+ listener.onNoteClick(notes.get(position));
+ }
+ });
+ }
+
+ public void bind(Note note) {
+ titleTextView.setText(note.getTitle());
+ contentTextView.setText(note.getContent());
+ dateTextView.setText(note.getFormattedDate());
+ }
+ }
+}
diff --git a/app/src/main/java/com/notetaking/app/NotesManager.java b/app/src/main/java/com/notetaking/app/NotesManager.java
new file mode 100644
index 0000000..d467bce
--- /dev/null
+++ b/app/src/main/java/com/notetaking/app/NotesManager.java
@@ -0,0 +1,63 @@
+package com.notetaking.app;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+public class NotesManager {
+ private static final String PREFS_NAME = "NotesPrefs";
+ private static final String NOTES_KEY = "notes";
+ private SharedPreferences sharedPreferences;
+ private Gson gson;
+
+ public NotesManager(Context context) {
+ sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
+ gson = new Gson();
+ }
+
+ public List loadNotes() {
+ String json = sharedPreferences.getString(NOTES_KEY, null);
+ if (json == null) {
+ return new ArrayList<>();
+ }
+ Type type = new TypeToken>() {}.getType();
+ return gson.fromJson(json, type);
+ }
+
+ public void saveNotes(List notes) {
+ String json = gson.toJson(notes);
+ sharedPreferences.edit().putString(NOTES_KEY, json).apply();
+ }
+
+ public void addNote(Note note) {
+ List notes = loadNotes();
+ notes.add(0, note); // Add at the beginning
+ saveNotes(notes);
+ }
+
+ public void updateNote(Note updatedNote) {
+ List notes = loadNotes();
+ for (int i = 0; i < notes.size(); i++) {
+ if (notes.get(i).getId() == updatedNote.getId()) {
+ notes.set(i, updatedNote);
+ break;
+ }
+ }
+ saveNotes(notes);
+ }
+
+ public void deleteNote(long noteId) {
+ List notes = loadNotes();
+ for (int i = 0; i < notes.size(); i++) {
+ if (notes.get(i).getId() == noteId) {
+ notes.remove(i);
+ break;
+ }
+ }
+ saveNotes(notes);
+ }
+}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..2f6ca41
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_note_editor.xml b/app/src/main/res/layout/activity_note_editor.xml
new file mode 100644
index 0000000..01ba7d2
--- /dev/null
+++ b/app/src/main/res/layout/activity_note_editor.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_note.xml b/app/src/main/res/layout/item_note.xml
new file mode 100644
index 0000000..3d98467
--- /dev/null
+++ b/app/src/main/res/layout/item_note.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/menu_editor.xml b/app/src/main/res/menu/menu_editor.xml
new file mode 100644
index 0000000..1a61fca
--- /dev/null
+++ b/app/src/main/res/menu/menu_editor.xml
@@ -0,0 +1,17 @@
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..72906e8
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,11 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #FFEEEEEE
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..742cd09
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,14 @@
+
+
+ Note Taking
+ Add Note
+ Edit Note
+ Save
+ Delete
+ Title
+ Enter your note here...
+ No notes yet. Tap + to create one!
+ Note saved
+ Note deleted
+ Cannot save empty note
+
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..93ebf95
--- /dev/null
+++ b/app/src/main/res/values/themes.xml
@@ -0,0 +1,11 @@
+
+
+
+
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..4c9167c
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,21 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:7.4.2'
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..5ae443b
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,4 @@
+# Project-wide Gradle settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..8049c68
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..949279f
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "NoteTaking"
+include ':app'
From 1f5a0a504437b0c96ace54467c40fdaf97be86ea Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 13 Jan 2026 04:21:04 +0000
Subject: [PATCH 3/3] Fix deprecated APIs and improve ID generation with UUID
Co-authored-by: Jeffcheung205 <173689379+Jeffcheung205@users.noreply.github.com>
---
.../java/com/notetaking/app/MainActivity.java | 15 +++++++++++----
app/src/main/java/com/notetaking/app/Note.java | 9 +++++----
.../com/notetaking/app/NoteEditorActivity.java | 15 +++++++++------
.../java/com/notetaking/app/NotesManager.java | 6 +++---
4 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/app/src/main/java/com/notetaking/app/MainActivity.java b/app/src/main/java/com/notetaking/app/MainActivity.java
index f259dde..632101a 100644
--- a/app/src/main/java/com/notetaking/app/MainActivity.java
+++ b/app/src/main/java/com/notetaking/app/MainActivity.java
@@ -4,6 +4,8 @@
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -15,8 +17,7 @@ public class MainActivity extends AppCompatActivity implements NotesAdapter.OnNo
private TextView emptyTextView;
private NotesAdapter adapter;
private NotesManager notesManager;
- private static final int REQUEST_CODE_ADD = 1;
- private static final int REQUEST_CODE_EDIT = 2;
+ private ActivityResultLauncher noteEditorLauncher;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -37,9 +38,15 @@ protected void onCreate(Bundle savedInstanceState) {
updateEmptyView();
+ // Register activity result launcher
+ noteEditorLauncher = registerForActivityResult(
+ new ActivityResultContracts.StartActivityForResult(),
+ result -> refreshNotes()
+ );
+
fab.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, NoteEditorActivity.class);
- startActivityForResult(intent, REQUEST_CODE_ADD);
+ noteEditorLauncher.launch(intent);
});
}
@@ -69,6 +76,6 @@ private void updateEmptyView() {
public void onNoteClick(Note note) {
Intent intent = new Intent(this, NoteEditorActivity.class);
intent.putExtra("note", note);
- startActivityForResult(intent, REQUEST_CODE_EDIT);
+ noteEditorLauncher.launch(intent);
}
}
diff --git a/app/src/main/java/com/notetaking/app/Note.java b/app/src/main/java/com/notetaking/app/Note.java
index 654b8ee..cb7af8a 100644
--- a/app/src/main/java/com/notetaking/app/Note.java
+++ b/app/src/main/java/com/notetaking/app/Note.java
@@ -4,15 +4,16 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
+import java.util.UUID;
public class Note implements Serializable {
- private long id;
+ private String id;
private String title;
private String content;
private long timestamp;
public Note() {
- this.id = System.currentTimeMillis();
+ this.id = UUID.randomUUID().toString();
this.timestamp = System.currentTimeMillis();
}
@@ -22,11 +23,11 @@ public Note(String title, String content) {
this.content = content;
}
- public long getId() {
+ public String getId() {
return id;
}
- public void setId(long id) {
+ public void setId(String id) {
this.id = id;
}
diff --git a/app/src/main/java/com/notetaking/app/NoteEditorActivity.java b/app/src/main/java/com/notetaking/app/NoteEditorActivity.java
index 4d045b4..764323b 100644
--- a/app/src/main/java/com/notetaking/app/NoteEditorActivity.java
+++ b/app/src/main/java/com/notetaking/app/NoteEditorActivity.java
@@ -6,6 +6,7 @@
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;
+import androidx.activity.OnBackPressedCallback;
import androidx.appcompat.app.AppCompatActivity;
public class NoteEditorActivity extends AppCompatActivity {
@@ -43,6 +44,14 @@ protected void onCreate(Bundle savedInstanceState) {
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
+
+ // Handle back press using OnBackPressedCallback
+ getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+ @Override
+ public void handleOnBackPressed() {
+ finish();
+ }
+ });
}
@Override
@@ -108,10 +117,4 @@ private void deleteNote() {
finish();
}
}
-
- @Override
- public void onBackPressed() {
- super.onBackPressed();
- finish();
- }
}
diff --git a/app/src/main/java/com/notetaking/app/NotesManager.java b/app/src/main/java/com/notetaking/app/NotesManager.java
index d467bce..3151918 100644
--- a/app/src/main/java/com/notetaking/app/NotesManager.java
+++ b/app/src/main/java/com/notetaking/app/NotesManager.java
@@ -42,7 +42,7 @@ public void addNote(Note note) {
public void updateNote(Note updatedNote) {
List notes = loadNotes();
for (int i = 0; i < notes.size(); i++) {
- if (notes.get(i).getId() == updatedNote.getId()) {
+ if (notes.get(i).getId().equals(updatedNote.getId())) {
notes.set(i, updatedNote);
break;
}
@@ -50,10 +50,10 @@ public void updateNote(Note updatedNote) {
saveNotes(notes);
}
- public void deleteNote(long noteId) {
+ public void deleteNote(String noteId) {
List notes = loadNotes();
for (int i = 0; i < notes.size(); i++) {
- if (notes.get(i).getId() == noteId) {
+ if (notes.get(i).getId().equals(noteId)) {
notes.remove(i);
break;
}