# My Archive — Android Uygulaması Dokümantasyonu

---

## Ön Giriş

Bu belge, Android Studio ortamında Java ile geliştirilmiş "My Archive" (Arşivim) adlı mobil uygulamanın teknik dokümantasyonudur. Uygulama; kullanıcıların medya, okuma, istek listesi ve seyahat gibi farklı kategorilerde kişisel koleksiyonlarını yönetmelerine olanak tanır. Veriler cihaz üzerinde SQLite veritabanında saklanır. Uygulama çok dilli (Türkçe/İngilizce) ve gece/gündüz tema desteğine sahiptir.

---

## İçindekiler

1. Uygulama Özellikleri
2. Kullanılan Temel Kavramlar
3. Proje Mantığı
4. Oturum Açma (Login)
5. Ayarlar: Dil ve Tema
6. Ekleme, Silme, Güncelleme ve Listeleme İşlevleri
7. Tüm Kodlar

---

## 1. Uygulama Özellikleri

- Kullanıcı kaydı ve oturum açma (SHA-256 ile şifrelenmiş, cihaz yerel)
- 4 farklı raf: Medya, Okuma, İstek Listesi, Seyahat
- Her rafa özel kategori türleri (oyun, kitap, ürün, şehir vb.)
- 1–10 arası puan verme (SeekBar ile)
- Not/yorum ekleme
- Kayıt güncelleme ve silme
- RecyclerView ile liste görünümü
- Türkçe / İngilizce dil desteği (çalışma anında değiştirilebilir)
- Gece / Gündüz tema desteği (Material3)
- Tüm veriler cihazda SQLite ile saklanır, internet bağlantısı gerekmez

---

## 2. Kullanılan Temel Kavramlar

**SQLiteOpenHelper:** Android'de yerel veritabanı oluşturmak ve yönetmek için kullanılan temel sınıf. onCreate ile tablo oluşturulur, onUpgrade ile şema güncellenir.

**SharedPreferences:** Küçük anahtar-değer çiftlerini kalıcı olarak saklamak için kullanılır. Bu uygulamada oturum durumu ve dil tercihi burada tutulur.

**Activity:** Android'de her ekran bir Activity'dir. Uygulama; Dashboard, Login, Settings, Main (form), Goster (liste), ShelfBrowse ve ShelfEntry olmak üzere 7 Activity içerir.

**Intent:** Activity'ler arası geçiş ve veri taşıma için kullanılır. putExtra ile veri gönderilir, getStringExtra / getLongExtra ile alınır.

**RecyclerView + Adapter:** Büyük listeleri verimli şekilde göstermek için kullanılır. EntryListAdapter, her koleksiyon kaydını bir kart olarak render eder.

**BaseActivity:** Tüm ekranların miras aldığı ortak sınıf. Dil uygulama (attachBaseContext) ve oturum kontrolü (requiresLogin) burada merkezi olarak yönetilir.

**MaterialCardView / MaterialButton:** Google'ın Material Design 3 bileşenleri. Modern görünüm için kullanılır.

**SHA-256 Hash + Salt:** Şifreleri düz metin olarak saklamak yerine, rastgele bir salt ile birleştirip SHA-256 ile hash'leyerek güvenli biçimde saklamak için kullanılır.

**Locale / Configuration:** Uygulama dilini çalışma anında değiştirmek için Configuration nesnesi yeniden oluşturulur ve createConfigurationContext ile uygulanır.

---

## 3. Proje Mantığı

Uygulama açıldığında DashboardActivity başlar. BaseActivity.onCreate içinde oturum kontrolü yapılır; kullanıcı giriş yapmamışsa LoginActivity'ye yönlendirilir.

Dashboard'da 4 raf kartı bulunur. Medya rafına tıklanınca goster.java (liste ekranı) açılır; diğer raflara tıklanınca ShelfBrowseActivity açılır. Her iki liste ekranı da aynı activity_goster.xml layout'unu kullanır.

Yeni kayıt eklemek için form ekranı açılır: Medya rafı için MainActivity.java, diğer raflar için ShelfEntryActivity.java. Her ikisi de activity_main.xml layout'unu paylaşır.

Form doldurulup kaydedilince veriler bizimdb.java üzerinden SQLite'a yazılır. Liste ekranı onResume'da her seferinde veritabanından taze veri çeker.

Dil değişikliği LocaleHelper üzerinden SharedPreferences'a kaydedilir. BaseActivity.attachBaseContext her Activity başlarken bu tercihi okuyarak doğru dili uygular.

---

## 4. Oturum Açma

LoginActivity, kullanıcı adı ve şifre alır. "Giriş Yap" butonuna basılınca AuthDb.verifyUser çağrılır: veritabanından kullanıcının salt ve hash değeri okunur, girilen şifre aynı yöntemle hash'lenerek karşılaştırılır. Eşleşirse AuthManager.setLoggedIn ile oturum SharedPreferences'a kaydedilir ve DashboardActivity'ye geçilir.

"Hesap Oluştur" butonuna basılınca AuthDb.createUser çağrılır: rastgele 16 byte salt üretilir, salt:şifre birleşimi SHA-256 ile hash'lenir ve veritabanına yazılır.

BaseActivity.requiresLogin() varsayılan olarak true döner. LoginActivity ve SettingsActivity bu metodu false döndürecek şekilde override eder, böylece bu ekranlara giriş yapılmadan erişilebilir.

---

## 5. Ayarlar: Dil ve Tema

SettingsActivity iki bölüm içerir:

Dil: RadioGroup ile İngilizce veya Türkçe seçilir. "Uygula" butonuna basılınca LocaleHelper.setPreferredLanguage ile tercih kaydedilir ve DashboardActivity FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK flag'leriyle yeniden başlatılır. Böylece tüm Activity stack temizlenir ve yeni dil tüm ekranlara uygulanır.

LocaleHelper.wrap(context) metodu BaseActivity.attachBaseContext'ten çağrılır. Her Activity oluşturulurken kaydedilmiş dil tercihi okunur, Locale ve Configuration nesneleri güncellenerek createConfigurationContext ile yeni bir context döndürülür.

Tema: Gece/gündüz teması Android sisteminin karanlık mod ayarına göre otomatik uygulanır. values/themes.xml gündüz, values-night/themes.xml gece temasını tanımlar.

Oturum: Ayarlar ekranında oturum durumu gösterilir. Giriş yapılmışsa "Çıkış Yap", yapılmamışsa "Giriş Yap" butonu görünür.

---

## 6. Ekleme, Silme, Güncelleme ve Listeleme İşlevleri

**Ekleme (ekle):** Form ekranında başlık, tür, puan ve yorum girilir. Kaydet butonuna basılınca veriler Intent ile liste ekranına taşınır. Liste ekranı onCreate'de bu Intent verilerini okuyarak bizimdb.ekle() metodunu çağırır. Bu metot ContentValues ile SQLite'a INSERT yapar ve tarihi otomatik olarak dd/MM/yyyy formatında ekler.

**Listeleme (getItems):** bizimdb.getItems(shelf) metodu, belirtilen rafa ait tüm kayıtları ORDER BY id DESC (en yeni önce) sırasıyla çeker ve List<bizimdb.Item> döndürür. EntryListAdapter.setItems() bu listeyi alarak RecyclerView'ı günceller. Liste ekranı her onResume'da refreshList() çağırarak veriyi tazeler.

**Güncelleme (guncelle):** Liste ekranındaki "Güncelle" butonuna basılınca kayıt ID'si Intent ile form ekranına gönderilir. Form ekranı getItem(id) ile mevcut veriyi okur ve alanları doldurur. Kullanıcı değişiklik yapıp kaydettiğinde bizimdb.guncelle() metodu UPDATE SQL komutu çalıştırır.

**Silme (tumunuSil):** Liste ekranındaki "Arşivi Temizle" butonu bizimdb.tumunuSil(shelf) metodunu çağırır. Bu metot ilgili rafa ait tüm kayıtları DELETE ile siler. Silme işlemi raf bazında toplu yapılır.

**Veri Modeli (bizimdb.Item):** Her kayıt şu alanları içerir: id (long), shelf (raf adı), baslik (başlık), tur (tür anahtarı), puan (1-10), yorum (not), tarih (ekleme tarihi).

---

## 7. Tüm Kodlar

---

### AndroidManifest.xml

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.MyApplication6">
        <activity android:name=".DashboardActivity" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity" />
        <activity android:name=".LoginActivity" android:exported="false" />
        <activity android:name=".SettingsActivity" android:exported="false" />
        <activity android:name=".goster" />
        <activity android:name=".ShelfEntryActivity" />
        <activity android:name=".ShelfBrowseActivity" />
    </application>
</manifest>
```

---

### app/build.gradle

```groovy
plugins {
    id 'com.android.application'
}

android {
    namespace 'com.example.myapplication6'
    compileSdk 34

    defaultConfig {
        applicationId "com.example.myapplication6"
        minSdk 26
        targetSdk 34
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.11.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.recyclerview:recyclerview:1.3.2'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
```

---

### AuthDb.java

```java
package com.example.myapplication6;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.SecureRandom;

public class AuthDb extends SQLiteOpenHelper {

    private static final String DB_NAME    = "AuthDB";
    private static final int    DB_VERSION = 1;
    private static final String TABLE_USERS = "users";

    public AuthDb(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_USERS + " (" +
                "username TEXT PRIMARY KEY, " +
                "salt TEXT NOT NULL, " +
                "password_hash TEXT NOT NULL)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}

    public boolean createUser(String username, String password) {
        String u = normalize(username);
        if (u == null) return false;
        if (password == null || password.isEmpty()) return false;

        byte[] saltBytes = new byte[16];
        new SecureRandom().nextBytes(saltBytes);
        String saltHex = toHex(saltBytes);
        String hashHex = sha256Hex(saltHex + ":" + password);

        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("username", u);
        values.put("salt", saltHex);
        values.put("password_hash", hashHex);
        try {
            db.insertOrThrow(TABLE_USERS, null, values);
            return true;
        } catch (Exception e) {
            return false;
        } finally {
            db.close();
        }
    }

    public boolean verifyUser(String username, String password) {
        String u = normalize(username);
        if (u == null) return false;
        if (password == null) return false;

        SQLiteDatabase db = getReadableDatabase();
        Cursor c = null;
        try {
            c = db.query(TABLE_USERS, new String[]{"salt", "password_hash"},
                    "username=?", new String[]{u}, null, null, null);
            if (!c.moveToFirst()) return false;
            String saltHex    = c.getString(0);
            String storedHash = c.getString(1);
            String computed   = sha256Hex(saltHex + ":" + password);
            return computed.equalsIgnoreCase(storedHash);
        } finally {
            if (c != null) c.close();
            db.close();
        }
    }

    private static String normalize(String username) {
        if (username == null) return null;
        String u = username.trim();
        if (u.isEmpty() || u.length() < 3) return null;
        return u;
    }

    private static String sha256Hex(String input) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] bytes = digest.digest(input.getBytes(StandardCharsets.UTF_8));
            return toHex(bytes);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static String toHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) sb.append(String.format("%02x", b));
        return sb.toString();
    }
}
```

---

### AuthManager.java

```java
package com.example.myapplication6;

import android.content.Context;
import android.content.SharedPreferences;

public final class AuthManager {

    private static final String PREFS_NAME    = "auth_session";
    private static final String KEY_LOGGED_IN = "logged_in";
    private static final String KEY_USERNAME  = "username";

    private AuthManager() {}

    public static boolean isLoggedIn(Context context) {
        return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .getBoolean(KEY_LOGGED_IN, false);
    }

    public static String getUsername(Context context) {
        return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
                .getString(KEY_USERNAME, null);
    }

    public static void setLoggedIn(Context context, String username) {
        context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit()
                .putBoolean(KEY_LOGGED_IN, true)
                .putString(KEY_USERNAME, username)
                .apply();
    }

    public static void signOut(Context context) {
        context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit()
                .putBoolean(KEY_LOGGED_IN, false)
                .putString(KEY_USERNAME, null)
                .apply();
    }
}
```

---

### LocaleHelper.java

```java
package com.example.myapplication6;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import java.util.Locale;

public final class LocaleHelper {

    private static final String PREFS_NAME   = "app_prefs";
    private static final String KEY_LANGUAGE = "language";

    private LocaleHelper() {}

    public static String getPreferredLanguage(Context context) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        String lang = prefs.getString(KEY_LANGUAGE, null);
        if (lang == null || lang.trim().isEmpty()) {
            return "tr".equalsIgnoreCase(Locale.getDefault().getLanguage()) ? "tr" : "en";
        }
        return "tr".equalsIgnoreCase(lang) ? "tr" : "en";
    }

    public static void setPreferredLanguage(Context context, String lang) {
        String normalized = "tr".equalsIgnoreCase(lang) ? "tr" : "en";
        context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit()
                .putString(KEY_LANGUAGE, normalized).apply();
    }

    public static Context wrap(Context context) {
        String lang   = getPreferredLanguage(context);
        Locale locale = new Locale(lang);
        Locale.setDefault(locale);
        Configuration config = new Configuration(context.getResources().getConfiguration());
        config.setLocale(locale);
        config.setLayoutDirection(locale);
        return context.createConfigurationContext(config);
    }
}
```

---

### BaseActivity.java

```java
package com.example.myapplication6;

import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void attachBaseContext(android.content.Context newBase) {
        super.attachBaseContext(LocaleHelper.wrap(newBase));
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (requiresLogin() && !AuthManager.isLoggedIn(this)) {
            Intent intent = new Intent(this, LoginActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
            finish();
        }
    }

    protected boolean requiresLogin() {
        return true;
    }
}
```

---

### bizimdb.java

```java
package com.example.myapplication6;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class bizimdb extends SQLiteOpenHelper {

    public static final String SHELF_MEDIA    = "media";
    public static final String SHELF_READING  = "reading";
    public static final String SHELF_WISHLIST = "wishlist";
    public static final String SHELF_TRAVEL   = "travel";

    public bizimdb(Context context) {
        super(context, "KoleksiyonDB", null, 3);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE koleksiyon (id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "shelf TEXT NOT NULL DEFAULT '" + SHELF_MEDIA + "', " +
                "baslik TEXT, tur TEXT, puan TEXT, yorum TEXT, tarih TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < 3) {
            try {
                db.execSQL("ALTER TABLE koleksiyon ADD COLUMN shelf TEXT DEFAULT '" + SHELF_MEDIA + "'");
            } catch (Exception ignored) {
                db.execSQL("DROP TABLE IF EXISTS koleksiyon");
                onCreate(db);
            }
        }
    }

    public void ekle(String shelf, String baslik, String typeKey, String puan, String yorum) {
        SQLiteDatabase db = this.getWritableDatabase();
        String tarih = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).format(new Date());
        ContentValues cv = new ContentValues();
        cv.put("shelf",  shelf != null ? shelf : SHELF_MEDIA);
        cv.put("baslik", baslik);
        cv.put("tur",    typeKey);
        cv.put("puan",   puan);
        cv.put("yorum",  yorum != null ? yorum : "");
        cv.put("tarih",  tarih);
        db.insert("koleksiyon", null, cv);
        db.close();
    }

    public void guncelle(long id, String baslik, String typeKey, String puan, String yorum) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("baslik", baslik);
        cv.put("tur",    typeKey);
        cv.put("puan",   puan);
        cv.put("yorum",  yorum != null ? yorum : "");
        db.update("koleksiyon", cv, "id = ?", new String[]{String.valueOf(id)});
        db.close();
    }

    public Item getItem(long id) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.rawQuery("SELECT * FROM koleksiyon WHERE id = ?", new String[]{String.valueOf(id)});
        Item out = null;
        if (c.moveToFirst()) out = rowFromCursor(c);
        c.close();
        return out;
    }

    public List<Item> getItems(String shelf) {
        SQLiteDatabase db = this.getReadableDatabase();
        String target = shelf != null ? shelf : SHELF_MEDIA;
        Cursor c = db.rawQuery(
                "SELECT * FROM koleksiyon WHERE IFNULL(shelf, ?) = ? ORDER BY id DESC",
                new String[]{SHELF_MEDIA, target});
        List<Item> list = new ArrayList<>();
        while (c.moveToNext()) list.add(rowFromCursor(c));
        c.close();
        return list;
    }

    private static Item rowFromCursor(Cursor c) {
        long   id    = c.getLong(c.getColumnIndexOrThrow("id"));
        int    si    = c.getColumnIndex("shelf");
        String shelf = si >= 0 ? c.getString(si) : SHELF_MEDIA;
        if (shelf == null || shelf.isEmpty()) shelf = SHELF_MEDIA;
        return new Item(id, shelf,
                c.getString(c.getColumnIndexOrThrow("baslik")),
                c.getString(c.getColumnIndexOrThrow("tur")),
                c.getString(c.getColumnIndexOrThrow("puan")),
                c.getString(c.getColumnIndexOrThrow("yorum")),
                c.getString(c.getColumnIndexOrThrow("tarih")));
    }

    public String verileriListele(Context context, String shelf) {
        SQLiteDatabase db = this.getReadableDatabase();
        String target = shelf != null ? shelf : SHELF_MEDIA;
        Cursor c = db.rawQuery(
                "SELECT * FROM koleksiyon WHERE IFNULL(shelf, ?) = ? ORDER BY id DESC",
                new String[]{SHELF_MEDIA, target});
        StringBuilder sb = new StringBuilder();
        while (c.moveToNext()) {
            String b   = c.getString(c.getColumnIndexOrThrow("baslik"));
            String t   = normalizeStoredType(c.getString(c.getColumnIndexOrThrow("tur")));
            String p   = c.getString(c.getColumnIndexOrThrow("puan"));
            String y   = c.getString(c.getColumnIndexOrThrow("yorum"));
            String trh = c.getString(c.getColumnIndexOrThrow("tarih"));
            sb.append(entryEmoji(t)).append(" ")
              .append(b != null ? b.toUpperCase(Locale.getDefault()) : "").append("\n")
              .append("📅 ").append(trh).append(" | ⭐ ").append(p).append("/10\n")
              .append(context.getString(R.string.label_type)).append(": ")
              .append(entryTypeLabel(context, t)).append("\n")
              .append("💬 ").append(y != null ? y : "").append("\n")
              .append("────────────────────\n\n");
        }
        c.close();
        return sb.toString();
    }

    public static String normalizeStoredType(String raw) {
        if (raw == null || raw.isEmpty()) return "website";
        String r = raw.trim();
        if (isCanonicalKey(r)) return r;
        if (r.equalsIgnoreCase("Oyun") || r.equalsIgnoreCase("Game") || r.equalsIgnoreCase("Spiel")) return "game";
        if (r.equalsIgnoreCase("Websitesi") || r.equalsIgnoreCase("Website")) return "website";
        if (r.equalsIgnoreCase("YouTube")) return "youtube";
        return r;
    }

    private static boolean isCanonicalKey(String r) {
        switch (r) {
            case "game": case "website": case "youtube": case "book": case "article":
            case "audiobook": case "magazine": case "product": case "gift":
            case "experience": case "subscription": case "city": case "restaurant":
            case "hotel": case "activity": return true;
            default: return false;
        }
    }

    public static String entryEmoji(String rawTur) {
        switch (normalizeStoredType(rawTur)) {
            case "game":         return "🎮";
            case "youtube":      return "📺";
            case "book":         return "📖";
            case "article":      return "📄";
            case "audiobook":    return "🎧";
            case "magazine":     return "📰";
            case "product":      return "🛍️";
            case "gift":         return "🎁";
            case "experience":   return "✨";
            case "subscription": return "💳";
            case "city":         return "🏙️";
            case "restaurant":   return "🍽️";
            case "hotel":        return "🏨";
            case "activity":     return "🧭";
            default:             return "🌐";
        }
    }

    public static String entryTypeLabel(Context context, String rawTur) {
        switch (normalizeStoredType(rawTur)) {
            case "game":         return context.getString(R.string.type_game);
            case "youtube":      return context.getString(R.string.type_youtube);
            case "website":      return context.getString(R.string.type_website);
            case "book":         return context.getString(R.string.type_book);
            case "article":      return context.getString(R.string.type_article);
            case "audiobook":    return context.getString(R.string.type_audiobook);
            case "magazine":     return context.getString(R.string.type_magazine);
            case "product":      return context.getString(R.string.type_product);
            case "gift":         return context.getString(R.string.type_gift);
            case "experience":   return context.getString(R.string.type_experience);
            case "subscription": return context.getString(R.string.type_subscription);
            case "city":         return context.getString(R.string.type_city);
            case "restaurant":   return context.getString(R.string.type_restaurant);
            case "hotel":        return context.getString(R.string.type_hotel);
            case "activity":     return context.getString(R.string.type_activity);
            default:             return context.getString(R.string.type_other);
        }
    }

    public void tumunuSil(String shelf) {
        SQLiteDatabase db = this.getWritableDatabase();
        String target = shelf != null ? shelf : SHELF_MEDIA;
        db.delete("koleksiyon", "IFNULL(shelf, ?) = ?", new String[]{SHELF_MEDIA, target});
        db.close();
    }

    public static final class Item {
        public final long   id;
        public final String shelf, baslik, tur, puan, yorum, tarih;

        public Item(long id, String shelf, String baslik, String tur,
                    String puan, String yorum, String tarih) {
            this.id = id; this.shelf = shelf; this.baslik = baslik;
            this.tur = tur; this.puan = puan; this.yorum = yorum; this.tarih = tarih;
        }
    }
}
```

---

### CollectionTypeHelper.java

```java
package com.example.myapplication6;

import android.content.Context;
import androidx.annotation.ArrayRes;
import androidx.annotation.StringRes;

public final class CollectionTypeHelper {

    private CollectionTypeHelper() {}

    @ArrayRes
    public static int labelsArrayForShelf(String shelf) {
        if (bizimdb.SHELF_READING.equals(shelf))  return R.array.reading_type_labels;
        if (bizimdb.SHELF_WISHLIST.equals(shelf)) return R.array.wishlist_type_labels;
        if (bizimdb.SHELF_TRAVEL.equals(shelf))   return R.array.travel_type_labels;
        return R.array.content_type_labels;
    }

    @ArrayRes
    public static int keysArrayForShelf(String shelf) {
        if (bizimdb.SHELF_READING.equals(shelf))  return R.array.reading_type_keys;
        if (bizimdb.SHELF_WISHLIST.equals(shelf)) return R.array.wishlist_type_keys;
        if (bizimdb.SHELF_TRAVEL.equals(shelf))   return R.array.travel_type_keys;
        return R.array.content_type_keys;
    }

    @StringRes
    public static int categoryLabelForShelf(String shelf) {
        if (bizimdb.SHELF_READING.equals(shelf))  return R.string.label_category_reading;
        if (bizimdb.SHELF_WISHLIST.equals(shelf)) return R.string.label_category_wishlist;
        if (bizimdb.SHELF_TRAVEL.equals(shelf))   return R.string.label_category_travel;
        return R.string.label_category_media;
    }

    public static void bindSpinnerForShelf(Context context, android.widget.Spinner spinner, String shelf) {
        android.widget.ArrayAdapter<CharSequence> adapter =
                android.widget.ArrayAdapter.createFromResource(
                        context, labelsArrayForShelf(shelf), android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    }

    public static int indexForStoredTypeKey(Context context, String shelf, String storedRaw) {
        String[] keys = context.getResources().getStringArray(keysArrayForShelf(shelf));
        String norm = bizimdb.normalizeStoredType(storedRaw);
        for (int i = 0; i < keys.length; i++) {
            if (keys[i].equals(norm)) return i;
        }
        return 0;
    }

    public static String typeKeyAtPosition(Context context, String shelf, int position) {
        String[] keys = context.getResources().getStringArray(keysArrayForShelf(shelf));
        if (keys.length == 0) return "website";
        return keys[Math.max(0, Math.min(position, keys.length - 1))];
    }
}
```

---

### LoginActivity.java

```java
package com.example.myapplication6;

import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.google.android.material.button.MaterialButton;

public class LoginActivity extends BaseActivity {

    public static final String EXTRA_REDIRECT    = "redirect";
    public static final String REDIRECT_SETTINGS = "settings";

    private EditText editUsername;
    private EditText editPassword;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        editUsername = findViewById(R.id.editUsername);
        editPassword = findViewById(R.id.editPassword);
        MaterialButton btnSignIn        = findViewById(R.id.btnSignIn);
        MaterialButton btnCreateAccount = findViewById(R.id.btnCreateAccount);
        Button btnBackToSettings        = findViewById(R.id.btnBackToSettings);

        editPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        btnSignIn.setOnClickListener(v -> doSignIn());
        btnCreateAccount.setOnClickListener(v -> doCreateAccount());
        btnBackToSettings.setOnClickListener(v -> {
            startActivity(new Intent(this, SettingsActivity.class));
            finish();
        });
    }

    @Override
    protected boolean requiresLogin() { return false; }

    private void doSignIn() {
        String username = safeTrim(editUsername.getText().toString());
        String password = safeTrim(editPassword.getText().toString());
        if (username.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, R.string.error_missing_credentials, Toast.LENGTH_SHORT).show();
            return;
        }
        if (!new AuthDb(this).verifyUser(username, password)) {
            Toast.makeText(this, R.string.error_invalid_credentials, Toast.LENGTH_SHORT).show();
            return;
        }
        AuthManager.setLoggedIn(this, username);
        goAfterLogin();
    }

    private void doCreateAccount() {
        String username = safeTrim(editUsername.getText().toString());
        String password = safeTrim(editPassword.getText().toString());
        if (username.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, R.string.error_missing_credentials, Toast.LENGTH_SHORT).show();
            return;
        }
        if (!new AuthDb(this).createUser(username, password)) {
            Toast.makeText(this, R.string.error_user_already_exists, Toast.LENGTH_SHORT).show();
            return;
        }
        Toast.makeText(this, R.string.toast_account_created, Toast.LENGTH_SHORT).show();
        AuthManager.setLoggedIn(this, username);
        goAfterLogin();
    }

    private void goAfterLogin() {
        String redirect = getIntent().getStringExtra(EXTRA_REDIRECT);
        Intent i = REDIRECT_SETTINGS.equals(redirect)
                ? new Intent(this, SettingsActivity.class)
                : new Intent(this, DashboardActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(i);
        finish();
    }

    private static String safeTrim(String s) { return s == null ? "" : s.trim(); }
}
```

---

### SettingsActivity.java

```java
package com.example.myapplication6;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.google.android.material.button.MaterialButton;

public class SettingsActivity extends BaseActivity {

    private RadioGroup     rgLanguage;
    private RadioButton    rbEnglish, rbTurkish;
    private TextView       textLoginStatus;
    private MaterialButton btnLoginOrLogout;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        rgLanguage       = findViewById(R.id.rgLanguage);
        rbEnglish        = findViewById(R.id.rbEnglish);
        rbTurkish        = findViewById(R.id.rbTurkish);
        MaterialButton btnApplyLanguage = findViewById(R.id.btnApplyLanguage);
        textLoginStatus  = findViewById(R.id.textLoginStatus);
        btnLoginOrLogout = findViewById(R.id.btnLoginOrLogout);
        Button btnBack   = findViewById(R.id.btnBack);

        if ("tr".equalsIgnoreCase(LocaleHelper.getPreferredLanguage(this))) rbTurkish.setChecked(true);
        else rbEnglish.setChecked(true);

        refreshLoginUI();

        btnApplyLanguage.setOnClickListener(v -> {
            String selected = (rgLanguage.getCheckedRadioButtonId() == rbTurkish.getId()) ? "tr" : "en";
            LocaleHelper.setPreferredLanguage(this, selected);
            Intent i = new Intent(this, DashboardActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(i);
            finish();
        });

        btnLoginOrLogout.setOnClickListener(v -> {
            if (AuthManager.isLoggedIn(this)) {
                AuthManager.signOut(this);
                Toast.makeText(this, R.string.toast_logged_out, Toast.LENGTH_SHORT).show();
                refreshLoginUI();
            } else {
                Intent i = new Intent(this, LoginActivity.class);
                i.putExtra(LoginActivity.EXTRA_REDIRECT, LoginActivity.REDIRECT_SETTINGS);
                startActivity(i);
            }
        });

        btnBack.setOnClickListener(v -> {
            startActivity(new Intent(this, DashboardActivity.class));
            finish();
        });
    }

    private void refreshLoginUI() {
        if (AuthManager.isLoggedIn(this)) {
            textLoginStatus.setText(getString(R.string.login_status_logged_in, AuthManager.getUsername(this)));
            btnLoginOrLogout.setText(R.string.action_logout);
        } else {
            textLoginStatus.setText(R.string.login_status_logged_out);
            btnLoginOrLogout.setText(R.string.action_login);
        }
    }

    @Override
    protected boolean requiresLogin() { return false; }
}
```

---

### DashboardActivity.java

```java
package com.example.myapplication6;

import android.content.Intent;
import android.os.Bundle;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.button.MaterialButton;

public class DashboardActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);

        MaterialButton btnSettings = findViewById(R.id.btnSettings);
        if (btnSettings != null)
            btnSettings.setOnClickListener(v -> startActivity(new Intent(this, SettingsActivity.class)));

        MaterialCardView cardMedia    = findViewById(R.id.cardMedia);
        MaterialCardView cardReading  = findViewById(R.id.cardReading);
        MaterialCardView cardWishlist = findViewById(R.id.cardWishlist);
        MaterialCardView cardTravel   = findViewById(R.id.cardTravel);

        cardMedia.setOnClickListener(v -> {
            Intent i = new Intent(this, goster.class);
            i.putExtra(MainActivity.EXTRA_SHELF, bizimdb.SHELF_MEDIA);
            startActivity(i);
        });
        cardReading.setOnClickListener(v  -> openShelf(bizimdb.SHELF_READING));
        cardWishlist.setOnClickListener(v -> openShelf(bizimdb.SHELF_WISHLIST));
        cardTravel.setOnClickListener(v   -> openShelf(bizimdb.SHELF_TRAVEL));
    }

    private void openShelf(String shelf) {
        Intent i = new Intent(this, ShelfBrowseActivity.class);
        i.putExtra(MainActivity.EXTRA_SHELF, shelf);
        startActivity(i);
    }
}
```

---

### MainActivity.java

```java
package com.example.myapplication6;

import android.content.Intent;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.core.content.ContextCompat;
import com.google.android.material.button.MaterialButton;

public class MainActivity extends BaseActivity {

    public static final String EXTRA_SHELF    = "shelf";
    public static final String EXTRA_ENTRY_ID = "entry_id";

    private EditText       editBaslik, editYorum;
    private Spinner        spinnerTur;
    private MaterialButton btnKaydet;
    private SeekBar        seekPuan;
    private TextView       textScoreValue;
    private long           editingId = -1L;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MaterialButton btnSettings = findViewById(R.id.btnSettings);
        if (btnSettings != null)
            btnSettings.setOnClickListener(v -> startActivity(new Intent(this, SettingsActivity.class)));

        TextView title     = findViewById(R.id.textFormTitle);
        TextView subtitle  = findViewById(R.id.textFormSubtitle);
        TextView typeLabel = findViewById(R.id.textTypeLabel);
        editBaslik     = findViewById(R.id.editBaslik);
        seekPuan       = findViewById(R.id.seekPuan);
        editYorum      = findViewById(R.id.editYorum);
        spinnerTur     = findViewById(R.id.spinnerTur);
        btnKaydet      = findViewById(R.id.btnKaydet);
        textScoreValue = findViewById(R.id.textScoreValue);
        MaterialButton btnBack = findViewById(R.id.btnBack);
        MaterialButton btnNext = findViewById(R.id.btnNext);

        typeLabel.setText(getString(CollectionTypeHelper.categoryLabelForShelf(bizimdb.SHELF_MEDIA)));
        CollectionTypeHelper.bindSpinnerForShelf(this, spinnerTur, bizimdb.SHELF_MEDIA);
        btnKaydet.setBackgroundTintList(
                ColorStateList.valueOf(ContextCompat.getColor(this, R.color.accent_color)));

        if (seekPuan != null) {
            seekPuan.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override public void onProgressChanged(SeekBar s, int p, boolean f) { updateScoreText(); }
                @Override public void onStartTrackingTouch(SeekBar s) {}
                @Override public void onStopTrackingTouch(SeekBar s) {}
            });
            updateScoreText();
        }

        editingId = getIntent().getLongExtra(EXTRA_ENTRY_ID, -1L);
        if (editingId >= 0) {
            bizimdb.Item row = new bizimdb(this).getItem(editingId);
            if (row == null || !bizimdb.SHELF_MEDIA.equals(row.shelf)) {
                Toast.makeText(this, R.string.error_entry_not_found, Toast.LENGTH_SHORT).show();
                finish(); return;
            }
            title.setText(R.string.title_edit_entry);
            subtitle.setText(R.string.form_caption_media);
            editBaslik.setText(row.baslik);
            editYorum.setText(row.yorum);
            if (seekPuan != null) { seekPuan.setProgress(parseScore(row.puan) - 1); updateScoreText(); }
            spinnerTur.setSelection(CollectionTypeHelper.indexForStoredTypeKey(this, bizimdb.SHELF_MEDIA, row.tur));
            btnKaydet.setText(R.string.action_update_entry);
        } else {
            title.setText(R.string.title_new_entry);
            subtitle.setText(R.string.form_caption_media);
            btnKaydet.setText(R.string.action_add_to_collection);
        }

        btnKaydet.setOnClickListener(v -> {
            String typeKey = CollectionTypeHelper.typeKeyAtPosition(this, bizimdb.SHELF_MEDIA, spinnerTur.getSelectedItemPosition());
            String baslik  = editBaslik.getText().toString();
            String puan    = String.valueOf(getSelectedScore());
            String yorum   = editYorum.getText().toString();
            if (editingId >= 0) {
                new bizimdb(this).guncelle(editingId, baslik, typeKey, puan, yorum);
                Toast.makeText(this, R.string.toast_updated, Toast.LENGTH_SHORT).show();
                Intent i = new Intent(this, goster.class);
                i.putExtra(EXTRA_SHELF, bizimdb.SHELF_MEDIA);
                startActivity(i); finish(); return;
            }
            Intent i = new Intent(this, goster.class);
            i.putExtra(EXTRA_SHELF, bizimdb.SHELF_MEDIA);
            i.putExtra("baslik", baslik); i.putExtra("tur", typeKey);
            i.putExtra("puan", puan);     i.putExtra("yorum", yorum);
            startActivity(i); finish();
        });

        if (btnBack != null)
            btnBack.setOnClickListener(v -> {
                Intent i = new Intent(this, goster.class);
                i.putExtra(EXTRA_SHELF, bizimdb.SHELF_MEDIA);
                startActivity(i); finish();
            });
        if (btnNext != null)
            btnNext.setOnClickListener(v -> btnKaydet.performClick());
    }

    private int getSelectedScore() {
        if (seekPuan == null) return 1;
        return clampScore(seekPuan.getProgress() + 1);
    }

    private void updateScoreText() {
        if (textScoreValue == null || seekPuan == null) return;
        textScoreValue.setText(String.valueOf(getSelectedScore()));
    }

    private static int parseScore(String raw) {
        try { return clampScore(Integer.parseInt(raw)); } catch (Exception e) { return 1; }
    }

    private static int clampScore(int v) {
        if (v < 1) return 1; if (v > 10) return 10; return v;
    }
}
```

---

### goster.java

```java
package com.example.myapplication6;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.button.MaterialButton;

public class goster extends BaseActivity {

    private RecyclerView     recyclerEntries;
    private TextView         textEmpty;
    private bizimdb          db;
    private String           shelf;
    private EntryListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_goster);

        MaterialButton btnSettings = findViewById(R.id.btnSettings);
        if (btnSettings != null)
            btnSettings.setOnClickListener(v -> startActivity(new Intent(this, SettingsActivity.class)));

        MaterialButton btnBack = findViewById(R.id.btnBack);
        MaterialButton btnNext = findViewById(R.id.btnNext);
        if (btnBack != null)
            btnBack.setOnClickListener(v -> { startActivity(new Intent(this, DashboardActivity.class)); finish(); });
        if (btnNext != null)
            btnNext.setOnClickListener(v -> openAddNew());

        db = new bizimdb(this);
        recyclerEntries = findViewById(R.id.recyclerEntries);
        textEmpty       = findViewById(R.id.textEmpty);
        TextView header = findViewById(R.id.textViewHeader);
        header.setText(R.string.title_collection);

        Intent i = getIntent();
        shelf = i.getStringExtra(MainActivity.EXTRA_SHELF);
        if (shelf == null || shelf.isEmpty()) shelf = bizimdb.SHELF_MEDIA;

        recyclerEntries.setLayoutManager(new LinearLayoutManager(this));
        adapter = new EntryListAdapter(id -> {
            Intent ed = new Intent(this, MainActivity.class);
            ed.putExtra(MainActivity.EXTRA_ENTRY_ID, id);
            startActivity(ed);
        });
        recyclerEntries.setAdapter(adapter);

        findViewById(R.id.btnYeni).setOnClickListener(v -> openAddNew());
        findViewById(R.id.btnTemizle).setOnClickListener(v -> clearShelf());

        String b = i.getStringExtra("baslik");
        if (b != null && !b.trim().isEmpty()) {
            db.ekle(shelf, b, i.getStringExtra("tur"), i.getStringExtra("puan"), i.getStringExtra("yorum"));
            Toast.makeText(this, R.string.toast_added, Toast.LENGTH_SHORT).show();
        }
        refreshList();
    }

    @Override
    protected void onResume() { super.onResume(); refreshList(); }

    private void openAddNew() { startActivity(new Intent(this, MainActivity.class)); }

    private void clearShelf() {
        db.tumunuSil(shelf); refreshList();
        Toast.makeText(this, R.string.toast_cleared, Toast.LENGTH_SHORT).show();
    }

    private void refreshList() {
        var list = db.getItems(shelf);
        adapter.setItems(list);
        boolean empty = list.isEmpty();
        textEmpty.setVisibility(empty ? View.VISIBLE : View.GONE);
        recyclerEntries.setVisibility(empty ? View.GONE : View.VISIBLE);
    }
}
```

---

### ShelfBrowseActivity.java

```java
package com.example.myapplication6;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.button.MaterialButton;

public class ShelfBrowseActivity extends BaseActivity {

    private RecyclerView     recyclerEntries;
    private TextView         textEmpty;
    private bizimdb          db;
    private String           shelf;
    private EntryListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_goster);

        MaterialButton btnSettings = findViewById(R.id.btnSettings);
        if (btnSettings != null)
            btnSettings.setOnClickListener(v -> startActivity(new Intent(this, SettingsActivity.class)));

        Intent i = getIntent();
        shelf = i.getStringExtra(MainActivity.EXTRA_SHELF);
        if (shelf == null || shelf.isEmpty()) shelf = bizimdb.SHELF_READING;

        MaterialButton btnBack = findViewById(R.id.btnBack);
        MaterialButton btnNext = findViewById(R.id.btnNext);
        if (btnBack != null)
            btnBack.setOnClickListener(v -> { startActivity(new Intent(this, DashboardActivity.class)); finish(); });
        if (btnNext != null)
            btnNext.setOnClickListener(v -> {
                Intent next = new Intent(this, ShelfEntryActivity.class);
                next.putExtra(MainActivity.EXTRA_SHELF, shelf);
                startActivity(next);
            });

        db = new bizimdb(this);
        recyclerEntries = findViewById(R.id.recyclerEntries);
        textEmpty       = findViewById(R.id.textEmpty);
        TextView header = findViewById(R.id.textViewHeader);
        header.setText(listTitleForShelf(shelf));

        recyclerEntries.setLayoutManager(new LinearLayoutManager(this));
        adapter = new EntryListAdapter(id -> {
            Intent ed = new Intent(this, ShelfEntryActivity.class);
            ed.putExtra(MainActivity.EXTRA_SHELF, shelf);
            ed.putExtra(MainActivity.EXTRA_ENTRY_ID, id);
            startActivity(ed);
        });
        recyclerEntries.setAdapter(adapter);

        findViewById(R.id.btnYeni).setOnClickListener(v -> {
            Intent next = new Intent(this, ShelfEntryActivity.class);
            next.putExtra(MainActivity.EXTRA_SHELF, shelf);
            startActivity(next);
        });
        findViewById(R.id.btnTemizle).setOnClickListener(v -> clearShelf());

        String b = i.getStringExtra("baslik");
        if (b != null && !b.trim().isEmpty()) {
            db.ekle(shelf, b, i.getStringExtra("tur"), i.getStringExtra("puan"), i.getStringExtra("yorum"));
            Toast.makeText(this, R.string.toast_added, Toast.LENGTH_SHORT).show();
        }
        refreshList();
    }

    @Override
    protected void onResume() { super.onResume(); refreshList(); }

    private void clearShelf() {
        db.tumunuSil(shelf); refreshList();
        Toast.makeText(this, R.string.toast_cleared, Toast.LENGTH_SHORT).show();
    }

    private void refreshList() {
        var list = db.getItems(shelf);
        adapter.setItems(list);
        boolean empty = list.isEmpty();
        textEmpty.setVisibility(empty ? View.VISIBLE : View.GONE);
        recyclerEntries.setVisibility(empty ? View.GONE : View.VISIBLE);
    }

    private int listTitleForShelf(String shelf) {
        switch (shelf) {
            case bizimdb.SHELF_WISHLIST: return R.string.shelf_list_wishlist;
            case bizimdb.SHELF_TRAVEL:  return R.string.shelf_list_travel;
            default:                    return R.string.shelf_list_reading;
        }
    }
}
```

---

### ShelfEntryActivity.java

```java
package com.example.myapplication6;

import android.content.Intent;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.core.content.ContextCompat;
import com.google.android.material.button.MaterialButton;

public class ShelfEntryActivity extends BaseActivity {

    private long     editingId = -1L;
    private String   shelf;
    private SeekBar  seekPuan;
    private TextView textScoreValue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MaterialButton btnSettings = findViewById(R.id.btnSettings);
        if (btnSettings != null)
            btnSettings.setOnClickListener(v -> startActivity(new Intent(this, SettingsActivity.class)));

        shelf = getIntent().getStringExtra(MainActivity.EXTRA_SHELF);
        if (shelf == null || shelf.isEmpty()) shelf = bizimdb.SHELF_READING;

        TextView       title      = findViewById(R.id.textFormTitle);
        TextView       subtitle   = findViewById(R.id.textFormSubtitle);
        TextView       typeLabel  = findViewById(R.id.textTypeLabel);
        EditText       editBaslik = findViewById(R.id.editBaslik);
        EditText       editYorum  = findViewById(R.id.editYorum);
        Spinner        spinnerTur = findViewById(R.id.spinnerTur);
        MaterialButton btnKaydet  = findViewById(R.id.btnKaydet);
        seekPuan       = findViewById(R.id.seekPuan);
        textScoreValue = findViewById(R.id.textScoreValue);

        typeLabel.setText(getString(CollectionTypeHelper.categoryLabelForShelf(shelf)));
        CollectionTypeHelper.bindSpinnerForShelf(this, spinnerTur, shelf);
        btnKaydet.setBackgroundTintList(
                ColorStateList.valueOf(ContextCompat.getColor(this, accentForShelf(shelf))));

        if (seekPuan != null) {
            seekPuan.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override public void onProgressChanged(SeekBar s, int p, boolean f) { updateScoreText(); }
                @Override public void onStartTrackingTouch(SeekBar s) {}
                @Override public void onStopTrackingTouch(SeekBar s) {}
            });
            updateScoreText();
        }

        editingId = getIntent().getLongExtra(MainActivity.EXTRA_ENTRY_ID, -1L);
        if (editingId >= 0) {
            bizimdb.Item row = new bizimdb(this).getItem(editingId);
            if (row == null || !shelf.equals(row.shelf)) {
                Toast.makeText(this, R.string.error_entry_not_found, Toast.LENGTH_SHORT).show();
                finish(); return;
            }
            title.setText(R.string.title_edit_entry);
            subtitle.setText(getString(captionForShelf(shelf)));
            editBaslik.setText(row.baslik);
            editYorum.setText(row.yorum);
            if (seekPuan != null) { seekPuan.setProgress(parseScore(row.puan) - 1); updateScoreText(); }
            spinnerTur.setSelection(CollectionTypeHelper.indexForStoredTypeKey(this, shelf, row.tur));
            btnKaydet.setText(R.string.action_update_entry);
        } else {
            title.setText(titleForShelf(shelf));
            subtitle.setText(getString(captionForShelf(shelf)));
            btnKaydet.setText(R.string.action_add_to_collection);
        }

        final String shelfFinal = shelf;
        MaterialButton btnBack = findViewById(R.id.btnBack);
        MaterialButton btnNext = findViewById(R.id.btnNext);
        if (btnBack != null)
            btnBack.setOnClickListener(v -> {
                Intent i = new Intent(this, ShelfBrowseActivity.class);
                i.putExtra(MainActivity.EXTRA_SHELF, shelfFinal);
                startActivity(i); finish();
            });
        if (btnNext != null)
            btnNext.setOnClickListener(v -> btnKaydet.performClick());

        btnKaydet.setOnClickListener(v -> {
            String typeKey = CollectionTypeHelper.typeKeyAtPosition(this, shelfFinal, spinnerTur.getSelectedItemPosition());
            String baslik  = editBaslik.getText().toString();
            String puan    = String.valueOf(getSelectedScore());
            String yorum   = editYorum.getText().toString();
            if (editingId >= 0) {
                new bizimdb(this).guncelle(editingId, baslik, typeKey, puan, yorum);
                Toast.makeText(this, R.string.toast_updated, Toast.LENGTH_SHORT).show();
                Intent i = new Intent(this, ShelfBrowseActivity.class);
                i.putExtra(MainActivity.EXTRA_SHELF, shelfFinal);
                startActivity(i); finish(); return;
            }
            Intent i = new Intent(this, ShelfBrowseActivity.class);
            i.putExtra(MainActivity.EXTRA_SHELF, shelfFinal);
            i.putExtra("baslik", baslik); i.putExtra("tur", typeKey);
            i.putExtra("puan", puan);     i.putExtra("yorum", yorum);
            startActivity(i); finish();
        });
    }

    private int getSelectedScore() {
        if (seekPuan == null) return 1;
        return clampScore(seekPuan.getProgress() + 1);
    }

    private void updateScoreText() {
        if (textScoreValue == null || seekPuan == null) return;
        textScoreValue.setText(String.valueOf(getSelectedScore()));
    }

    private static int parseScore(String raw) {
        try { return clampScore(Integer.parseInt(raw)); } catch (Exception e) { return 1; }
    }

    private static int clampScore(int v) { if (v < 1) return 1; if (v > 10) return 10; return v; }

    private static int accentForShelf(String shelf) {
        switch (shelf) {
            case bizimdb.SHELF_WISHLIST: return R.color.accent_wishlist;
            case bizimdb.SHELF_TRAVEL:  return R.color.accent_travel;
            default:                    return R.color.accent_reading;
        }
    }

    private static int titleForShelf(String shelf) {
        switch (shelf) {
            case bizimdb.SHELF_WISHLIST: return R.string.shelf_title_wishlist;
            case bizimdb.SHELF_TRAVEL:  return R.string.shelf_title_travel;
            default:                    return R.string.shelf_title_reading;
        }
    }

    private static int captionForShelf(String shelf) {
        switch (shelf) {
            case bizimdb.SHELF_WISHLIST: return R.string.form_caption_wishlist;
            case bizimdb.SHELF_TRAVEL:  return R.string.form_caption_travel;
            default:                    return R.string.form_caption_reading;
        }
    }
}
```

---

### EntryListAdapter.java

```java
package com.example.myapplication6;

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 com.google.android.material.button.MaterialButton;
import java.util.ArrayList;
import java.util.List;

public class EntryListAdapter extends RecyclerView.Adapter<EntryListAdapter.Holder> {

    public interface OnEditListener { void onEdit(long entryId); }

    private final List<bizimdb.Item> items = new ArrayList<>();
    private final OnEditListener     editListener;

    public EntryListAdapter(OnEditListener editListener) { this.editListener = editListener; }

    public void setItems(List<bizimdb.Item> next) {
        items.clear();
        if (next != null) items.addAll(next);
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_collection_entry, parent, false);
        return new Holder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull Holder h, int position) {
        bizimdb.Item it = items.get(position);
        h.emoji.setText(bizimdb.entryEmoji(it.tur));
        h.title.setText(it.baslik != null ? it.baslik : "");
        h.meta.setText(h.itemView.getContext().getString(R.string.entry_meta_line,
                it.tarih != null ? it.tarih : "",
                it.puan  != null ? it.puan  : "",
                bizimdb.entryTypeLabel(h.itemView.getContext(), it.tur)));
        String notes = it.yorum != null ? it.yorum : "";
        h.notes.setVisibility(notes.isEmpty() ? View.GONE : View.VISIBLE);
        if (!notes.isEmpty()) h.notes.setText(notes);
        h.btnEdit.setOnClickListener(v -> editListener.onEdit(it.id));
    }

    @Override
    public int getItemCount() { return items.size(); }

    static final class Holder extends RecyclerView.ViewHolder {
        final TextView     emoji, title, meta, notes;
        final MaterialButton btnEdit;

        Holder(@NonNull View itemView) {
            super(itemView);
            emoji   = itemView.findViewById(R.id.textEmoji);
            title   = itemView.findViewById(R.id.textTitle);
            meta    = itemView.findViewById(R.id.textMeta);
            notes   = itemView.findViewById(R.id.textNotes);
            btnEdit = itemView.findViewById(R.id.btnEdit);
        }
    }
}
```

---

### res/layout/activity_dashboard.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="@color/arka_plan"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="24dp">

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnSettings"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:text="@string/action_settings"
            android:textAllCaps="false"
            app:cornerRadius="14dp"
            android:backgroundTint="@color/surface_muted"
            android:textColor="@color/text_secondary"
            android:paddingStart="16dp"
            android:paddingEnd="16dp"
            android:layout_marginBottom="10dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="sans-serif-medium"
            android:text="@string/dashboard_headline"
            android:textColor="@color/ana_renk"
            android:textSize="32sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:layout_marginBottom="20dp"
            android:text="@string/dashboard_subtitle"
            android:textColor="@color/text_secondary"
            android:textSize="15sp" />

        <com.google.android.material.card.MaterialCardView
            android:id="@+id/cardMedia"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="12dp"
            android:clickable="true"
            android:focusable="true"
            app:cardBackgroundColor="@color/kart_rengi"
            app:cardCornerRadius="18dp"
            app:cardElevation="2dp"
            app:rippleColor="@color/surface_muted">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:padding="18dp">
                <TextView android:layout_width="40dp" android:layout_height="40dp"
                    android:gravity="center" android:text="🎬" android:textSize="22sp" />
                <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content"
                    android:layout_marginStart="14dp" android:layout_weight="1" android:orientation="vertical">
                    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:text="@string/dashboard_media_title" android:textColor="@color/ana_renk"
                        android:textSize="18sp" android:textStyle="bold" />
                    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:layout_marginTop="4dp" android:text="@string/dashboard_media_desc"
                        android:textColor="@color/text_secondary" android:textSize="13sp" />
                </LinearLayout>
                <ImageView android:layout_width="24dp" android:layout_height="24dp"
                    android:contentDescription="@string/dashboard_media_title"
                    android:src="@android:drawable/ic_media_play" app:tint="@color/accent_color" />
            </LinearLayout>
        </com.google.android.material.card.MaterialCardView>

        <com.google.android.material.card.MaterialCardView
            android:id="@+id/cardReading"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="12dp"
            android:clickable="true"
            android:focusable="true"
            app:cardBackgroundColor="@color/kart_rengi"
            app:cardCornerRadius="18dp"
            app:cardElevation="2dp">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:padding="18dp">
                <TextView android:layout_width="40dp" android:layout_height="40dp"
                    android:gravity="center" android:text="📚" android:textSize="22sp" />
                <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content"
                    android:layout_marginStart="14dp" android:layout_weight="1" android:orientation="vertical">
                    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:text="@string/dashboard_reading_title" android:textColor="@color/ana_renk"
                        android:textSize="18sp" android:textStyle="bold" />
                    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:layout_marginTop="4dp" android:text="@string/dashboard_reading_desc"
                        android:textColor="@color/text_secondary" android:textSize="13sp" />
                </LinearLayout>
                <ImageView android:layout_width="24dp" android:layout_height="24dp"
                    android:contentDescription="@string/dashboard_reading_title"
                    android:src="@android:drawable/ic_menu_agenda" app:tint="@color/accent_reading" />
            </LinearLayout>
        </com.google.android.material.card.MaterialCardView>

        <com.google.android.material.card.MaterialCardView
            android:id="@+id/cardWishlist"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="12dp"
            android:clickable="true"
            android:focusable="true"
            app:cardBackgroundColor="@color/kart_rengi"
            app:cardCornerRadius="18dp"
            app:cardElevation="2dp">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:padding="18dp">
                <TextView android:layout_width="40dp" android:layout_height="40dp"
                    android:gravity="center" android:text="🎁" android:textSize="22sp" />
                <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content"
                    android:layout_marginStart="14dp" android:layout_weight="1" android:orientation="vertical">
                    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:text="@string/dashboard_wishlist_title" android:textColor="@color/ana_renk"
                        android:textSize="18sp" android:textStyle="bold" />
                    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:layout_marginTop="4dp" android:text="@string/dashboard_wishlist_desc"
                        android:textColor="@color/text_secondary" android:textSize="13sp" />
                </LinearLayout>
                <ImageView android:layout_width="24dp" android:layout_height="24dp"
                    android:contentDescription="@string/dashboard_wishlist_title"
                    android:src="@android:drawable/btn_star_big_on" app:tint="@color/accent_wishlist" />
            </LinearLayout>
        </com.google.android.material.card.MaterialCardView>

        <com.google.android.material.card.MaterialCardView
            android:id="@+id/cardTravel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:focusable="true"
            app:cardBackgroundColor="@color/kart_rengi"
            app:cardCornerRadius="18dp"
            app:cardElevation="2dp">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:padding="18dp">
                <TextView android:layout_width="40dp" android:layout_height="40dp"
                    android:gravity="center" android:text="✈️" android:textSize="22sp" />
                <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content"
                    android:layout_marginStart="14dp" android:layout_weight="1" android:orientation="vertical">
                    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:text="@string/dashboard_travel_title" android:textColor="@color/ana_renk"
                        android:textSize="18sp" android:textStyle="bold" />
                    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                        android:layout_marginTop="4dp" android:text="@string/dashboard_travel_desc"
                        android:textColor="@color/text_secondary" android:textSize="13sp" />
                </LinearLayout>
                <ImageView android:layout_width="24dp" android:layout_height="24dp"
                    android:contentDescription="@string/dashboard_travel_title"
                    android:src="@android:drawable/ic_dialog_map" app:tint="@color/accent_travel" />
            </LinearLayout>
        </com.google.android.material.card.MaterialCardView>

    </LinearLayout>
</ScrollView>
```

---

### res/layout/activity_login.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="@color/arka_plan"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="24dp">

        <TextView
            android:id="@+id/textLoginTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/login_title"
            android:textColor="@color/ana_renk"
            android:textSize="26sp"
            android:fontFamily="sans-serif-medium"
            android:layout_marginBottom="20dp" />

        <EditText
            android:id="@+id/editUsername"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/bg_field"
            android:hint="@string/hint_username"
            android:inputType="text"
            android:padding="14dp" />

        <EditText
            android:id="@+id/editPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            android:background="@drawable/bg_field"
            android:hint="@string/hint_password"
            android:inputType="textPassword"
            android:padding="14dp" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnSignIn"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_marginTop="18dp"
            android:text="@string/btn_sign_in"
            android:textAllCaps="false"
            app:cornerRadius="14dp" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnCreateAccount"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_marginTop="12dp"
            android:text="@string/btn_create_account"
            android:textAllCaps="false"
            app:cornerRadius="14dp"
            android:backgroundTint="@color/accent_wishlist"
            android:textColor="@color/white" />

        <Button
            android:id="@+id/btnBackToSettings"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="14dp"
            android:text="@string/action_back" />

    </LinearLayout>
</ScrollView>
```

---

### res/layout/activity_settings.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="@color/arka_plan"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="24dp">

        <TextView
            android:id="@+id/textSettingsTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/settings_title"
            android:textColor="@color/ana_renk"
            android:textSize="26sp"
            android:fontFamily="sans-serif-medium"
            android:layout_marginBottom="20dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/settings_language_title"
            android:textColor="@color/text_secondary"
            android:textSize="14sp"
            android:layout_marginBottom="10dp" />

        <RadioGroup
            android:id="@+id/rgLanguage"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <RadioButton
                android:id="@+id/rbEnglish"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/settings_language_english"
                android:textColor="@color/text_secondary" />
            <RadioButton
                android:id="@+id/rbTurkish"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/settings_language_turkish"
                android:textColor="@color/text_secondary" />
        </RadioGroup>

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnApplyLanguage"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_marginTop="14dp"
            android:text="@string/action_apply"
            android:textAllCaps="false"
            app:cornerRadius="14dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/settings_login_title"
            android:textColor="@color/text_secondary"
            android:textSize="14sp"
            android:layout_marginTop="22dp"
            android:layout_marginBottom="10dp" />

        <TextView
            android:id="@+id/textLoginStatus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/login_status_logged_out"
            android:textColor="@color/text_secondary"
            android:textSize="14sp"
            android:layout_marginBottom="12dp" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnLoginOrLogout"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:text="@string/action_login"
            android:textAllCaps="false"
            app:cornerRadius="14dp" />

        <Button
            android:id="@+id/btnBack"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="14dp"
            android:text="@string/action_back" />

    </LinearLayout>
</ScrollView>
```

---

### res/layout/activity_main.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="@color/arka_plan"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="24dp">

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnSettings"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:text="@string/action_settings"
            android:textAllCaps="false"
            app:cornerRadius="14dp"
            android:backgroundTint="@color/surface_muted"
            android:textColor="@color/text_secondary"
            android:paddingStart="16dp"
            android:paddingEnd="16dp"
            android:layout_marginBottom="18dp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="6dp"
            android:layout_marginBottom="10dp">
            <com.google.android.material.button.MaterialButton
                android:id="@+id/btnBack"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/action_back"
                android:textAllCaps="false"
                app:cornerRadius="14dp"
                android:backgroundTint="@color/surface_muted"
                android:textColor="@color/text_secondary" />
            <com.google.android.material.button.MaterialButton
                android:id="@+id/btnNext"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/action_next"
                android:textAllCaps="false"
                app:cornerRadius="14dp"
                android:backgroundTint="@color/accent_color"
                android:textColor="@color/white"
                android:layout_marginStart="10dp" />
        </LinearLayout>

        <TextView
            android:id="@+id/textFormTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:fontFamily="sans-serif-medium"
            android:text="@string/title_new_entry"
            android:textColor="@color/ana_renk"
            android:textSize="28sp" />

        <TextView
            android:id="@+id/textFormSubtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:text="@string/form_caption_media"
            android:textColor="@color/text_secondary"
            android:textSize="14sp" />

        <com.google.android.material.card.MaterialCardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            app:cardBackgroundColor="@color/kart_rengi"
            app:cardCornerRadius="16dp"
            app:cardElevation="2dp">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="16dp">

                <EditText
                    android:id="@+id/editBaslik"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/bg_field"
                    android:hint="@string/hint_title"
                    android:textColor="@color/ana_renk"
                    android:textColorHint="@color/ana_renk"
                    android:inputType="textCapSentences"
                    android:padding="14dp" />

                <TextView
                    android:id="@+id/textTypeLabel"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="12dp"
                    android:layout_marginBottom="6dp"
                    android:text="@string/label_category_media"
                    android:textColor="@color/text_secondary"
                    android:textSize="12sp" />

                <Spinner
                    android:id="@+id/spinnerTur"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/bg_field"
                    android:padding="10dp" />

                <TextView
                    android:id="@+id/textScoreLabel"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="12dp"
                    android:layout_marginBottom="6dp"
                    android:text="@string/hint_score"
                    android:textColor="@color/text_secondary"
                    android:textSize="12sp" />

                <SeekBar
                    android:id="@+id/seekPuan"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:max="9"
                    android:progress="4" />

                <TextView
                    android:id="@+id/textScoreValue"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="end"
                    android:text="5"
                    android:textColor="@color/ana_renk"
                    android:textStyle="bold"
                    android:textSize="16sp"
                    android:layout_marginTop="6dp" />

                <EditText
                    android:id="@+id/editYorum"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="12dp"
                    android:background="@drawable/bg_field"
                    android:gravity="top"
                    android:hint="@string/hint_comment"
                    android:textColor="@color/ana_renk"
                    android:textColorHint="@color/ana_renk"
                    android:inputType="textMultiLine|textCapSentences"
                    android:lines="3"
                    android:padding="14dp" />
            </LinearLayout>
        </com.google.android.material.card.MaterialCardView>

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnKaydet"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:text="@string/action_add_to_collection"
            android:textAllCaps="false"
            android:textSize="16sp"
            app:cornerRadius="14dp" />

    </LinearLayout>
</ScrollView>
```
