Akıllı Not Defteri Proje Dokümantasyonu
Uygulama Özellikleri
Akıllı Not Defteri, günlük yaşamın hızında kişilerin planlarını ve görevlerini haftalık olarak kolayca takip edebilmesi için geliştirilmiş yerel (native) bir Android uygulamasıdır. Başlıca özellikleri şunlardır:
- Kişiselleştirilmiş Kullanıcı Oturumu: Her kullanıcı kendi hesabı ile kayıt olup giriş yapabilir. `SharedPreferences` altyapısı sayesinde bir kez giriş yapıldığında oturum açık kalır.
- Haftalık Planlama Modeli: Klasik not defterlerinden farklı olarak notları haftanın günlerine böler.
- Yerel Güvenli Veritabanı: Kullanıcı bilgileri ve alınan notlar cihazın içerisinde oluşturulan SQLite veritabanında şifreli/güvenli şekilde saklanır. İnternet olmadan çalışır.
- Dinamik Not Kontrolü: O güne ait daha önceden yazılmış bir not olup olmadığına dair durum bildirimleri canlı olarak yansır.
Proje Adımları
Bu projenin geliştirilmesi aşamasında baştan uca mobil uygulama süreçleri takip edilmiştir.
Altyapı ve Veritabanı Kurulumu
İlk aşamada veri yapısı modellendi. Tablolar entegre edilerek `DatabaseHelper` sınıfı ile SQLite yapısı oluşturuldu:
java
// DatabaseHelper.java (Temel Veritabanı Bağlantıları ve Metotlar)
package com.example.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "MyNotesApp.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_USERS = "users";
private static final String COLUMN_USERNAME = "username";
private static final String COLUMN_PASSWORD = "password";
private static final String TABLE_NOTES = "notes";
private static final String COLUMN_NOTE_USER = "username";
private static final String COLUMN_NOTE_DAY = "day";
private static final String COLUMN_NOTE_CONTENT = "content";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_USERS + "(" + COLUMN_USERNAME + " TEXT PRIMARY KEY," + COLUMN_PASSWORD + " TEXT)");
db.execSQL("CREATE TABLE " + TABLE_NOTES + "(id INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_NOTE_USER + " TEXT," + COLUMN_NOTE_DAY + " TEXT," + COLUMN_NOTE_CONTENT + " TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTES);
onCreate(db);
}
// Ekleme, Okuma, Silme (CRUD) fonskiyonları burada çalışır...
}
Kullanıcı Doğrulama (Auth) İşlemleri
`LoginActivity` ve `RegisterActivity` kullanılarak güvenli bir giriş kapısı oluşturuldu.
Listeleme, Adaptasyon ve Yaşam Döngüsü
Uygulamanın kalbi olan ana ekranda performanslı bir liste oluşturmak adına `RecyclerView` eklendi. `onResume()` ile anlık liste güncellemeleri sağlandı:
java
// MainActivity.java (Liste Ekranı Yönetimi)
package com.example.myapplication;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerViewDays;
private DayAdapter adapter;
private List<Day> dayList;
private DatabaseHelper dbHelper;
private String username;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new DatabaseHelper(this);
recyclerViewDays = findViewById(R.id.recyclerViewDays);
username = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE).getString("username", "Kullanıcı");
recyclerViewDays.setLayoutManager(new LinearLayoutManager(this));
dayList = new ArrayList<>();
List<String> daysOfWeek = Arrays.asList("Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar");
for (String dayName : daysOfWeek) {
boolean hasNote = dbHelper.hasNoteForDay(username, dayName);
dayList.add(new Day(dayName, hasNote));
}
adapter = new DayAdapter(dayList, day -> {
Intent intent = new Intent(MainActivity.this, NoteActivity.class);
intent.putExtra("dayName", day.getName());
intent.putExtra("username", username);
startActivity(intent);
});
recyclerViewDays.setAdapter(adapter);
}
@Override
protected void onResume() {
super.onResume();
if (adapter != null && dayList != null) {
for (Day d : dayList) {
d.setHasNote(dbHelper.hasNoteForDay(username, d.getName()));
}
adapter.notifyDataSetChanged();
}
}
}
CRUD İşlemleri (Not Yönetimi)
Tıklanan günler için çalışan `NoteActivity` sayfası yapıldı.
Projenin Tasarımı
Projenin görsel tasarımında basitlik, kullanım kolaylığı ve hız (UI/UX) ön planda tutulmuştur. Renk kontrastları ile metinlerin okunaklı olmasına özen gösterilmiştir. Ana ekran hiyerarşik bir düzene sahip olup karmaşık menülerden kaçınılmıştır. Kullanıcı arayüzünde modern Android materyal bileşenleri (Material Design) tercih edilmiş ve tasarımlar yapılmıştır.
XML Dosyaları
Görsel tasarımlar tamamen Android'in XML altyapısı kullanılarak inşa edilmiştir.
activity_main.xml (Ana Ekran Görünümü)
Kullanıcıya haftanın günlerini sunan ana ekrandır. İçerisinde `RecyclerView` tanımlaması mevcuttur.
xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F8F9FA">
<!-- Header Section -->
<LinearLayout
android:id="@+id/headerLayout"
android:layout_width="match_parent"
android:layout_height="180dp"
android:background="@drawable/bg_header"
android:orientation="vertical"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:paddingTop="36dp"
app:layout_constraintTop_toTopOf="parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvUsername"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kullanıcı"
android:textColor="#FFFFFF"
android:textSize="32sp" />
</RelativeLayout>
</LinearLayout>
<!-- Haftanın Günleri Listesi -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewDays"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/headerLayout"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
item_day.xml (Tekil Liste Öğesi)
`RecyclerView` içerisindeki haftanın her bir gününün tekil görünümünü (CardView) temsil eden kalıptır. Gün ismini ve o gün içerisinde not bulunup bulunmadığını belirtir.
xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:layout_marginVertical="8dp"
app:cardCornerRadius="20dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp">
<TextView
android:id="@+id/tvDayName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pazartesi"
android:textSize="22sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvNoteStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Not Yok"
android:textColor="#888888"
android:layout_marginTop="6dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvDayName" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
activity_note.xml (Not Alma Ekranı Görünümü)
Kullanıcı bir güne tıkladığında açılan not alma ekranının arayüzüdür.
xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/etNoteContent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="top|start"
android:hint="Buraya notunu yaz..."
android:padding="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/buttonsLayout" />
<LinearLayout
android:id="@+id/buttonsLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnSave"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_weight="1"
android:text="Kaydet" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnDelete"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_weight="1"
android:text="Sil" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
(Not: Sayfayı boğmamak adına `activity_login` ve `activity_register` gibi yardımcı XML dosyaları çıkarılmış, en kritik dosyalar olan ana sayfa listeleri ve not akış ekranları dokümanlanmıştır.)
Açıklama
Akıllı Not Defteri, saf Java ve XML dilleriyle Android Studio ortamında sıfırdan geliştirilmiş, sağlam bir mimariye sahip mobil uygulamadır. Gerek arka planda barındırdığı SQLite ve SharedPreferences gibi yerel veri yönetim sistemleri gerekse de ön yüzde sunduğu akıcı RecyclerView mimarisi ile güncel Android mobil standartlarına tam uyum sağlamaktadır. Bu proje, bir kullanıcının kişisel verilerini internet olmaksızın hızlı ve stabil bir biçimde yönetecek altyapıları başarıyla sunmaktadır.