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; }