My Archive; 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.
- 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
**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.
Medya rafına tıklanınca goster.java (liste ekranı) açılır; diğer raflara tıklanınca ShelfBrowseActivity açılır.
diğer raflar için ShelfEntryActivity.java.
Her ikisi de activity_main.xml layout'unu paylaşır.
**Listeleme (getItems):**
**Güncelleme (guncelle):**
Silme (tumunuSil):
**Veri Modeli (bizimdb.Item):**
<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>
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'
}
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();
}
}
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();
}
}
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);
}
}
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;
}
}
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;
}
}
}
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))];
}
}
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(); }
}
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; }
}
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);
}
}
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;
}
}
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);
}
}
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;
}
}
}
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;
}
}
}
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);
}
}
}
<?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>
<?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>
<?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>
<?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>
<?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="@color/arka_plan"
android:padding="20dp">
<TextView
android:id="@+id/textViewHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:text="@string/title_collection"
android:textColor="@color/ana_renk"
android:textSize="26sp"
app:layout_constraintEnd_toStartOf="@id/btnSettings"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnSettings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/action_settings"
android:textAllCaps="false"
android:backgroundTint="@color/surface_muted"
android:textColor="@color/text_secondary"
app:cornerRadius="14dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:layout_marginTop="2dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<LinearLayout
android:id="@+id/linearLayoutNav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal"
app:layout_constraintTop_toBottomOf="@id/textViewHeader"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<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"
android:backgroundTint="@color/accent_color"
android:textColor="@color/white"
android:layout_marginStart="10dp"
app:cornerRadius="14dp" />
</LinearLayout>
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardList"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
app:cardBackgroundColor="@color/kart_rengi"
app:cardCornerRadius="16dp"
app:cardElevation="3dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayoutButtons"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/linearLayoutNav">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerEntries"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:padding="12dp"
android:scrollbars="vertical" />
<TextView
android:id="@+id/textEmpty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="24dp"
android:text="@string/empty_collection"
android:textColor="@color/text_secondary"
android:textSize="16sp"
android:visibility="gone" />
</FrameLayout>
</com.google.android.material.card.MaterialCardView>
<LinearLayout
android:id="@+id/linearLayoutButtons"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnYeni"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="0dp"
android:layout_height="56dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:text="@string/action_add_new"
android:textAllCaps="false" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnTemizle"
android:layout_width="0dp"
android:layout_height="56dp"
android:layout_weight="1"
android:backgroundTint="@color/accent_wishlist"
android:text="@string/action_clear_archive"
android:textAllCaps="false"
android:textColor="@color/white" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView 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_marginBottom="10dp"
app:cardBackgroundColor="@color/arka_plan"
app:cardCornerRadius="14dp"
app:cardElevation="0dp"
app:strokeColor="@color/surface_muted"
app:strokeWidth="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="14dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/textEmoji"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="????"
android:textSize="22sp" />
<TextView
android:id="@+id/textTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/ana_renk"
android:textSize="17sp"
android:textStyle="bold" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnEdit"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="40dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:text="@string/action_edit"
android:textAllCaps="false"
android:textSize="13sp" />
</LinearLayout>
<TextView
android:id="@+id/textMeta"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:textColor="@color/text_secondary"
android:textSize="13sp" />
<TextView
android:id="@+id/textNotes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:ellipsize="end"
android:maxLines="3"
android:textColor="@color/ana_renk"
android:textSize="14sp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="arka_plan">#F4F7F6</color>
<color name="kart_rengi">#FFFFFF</color>
<color name="ana_renk">#2D3436</color>
<color name="accent_color">#0984E3</color>
<color name="accent_reading">#6C5CE7</color>
<color name="accent_wishlist">#E17055</color>
<color name="accent_travel">#00B894</color>
<color name="text_secondary">#636E72</color>
<color name="surface_muted">#ECEFF1</color>
</resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.MyApplication6" parent="Theme.Material3.Light.NoActionBar">
<item name="colorPrimary">@color/accent_color</item>
<item name="colorOnPrimary">@color/white</item>
<item name="colorPrimaryContainer">@color/surface_muted</item>
<item name="colorSurface">@color/arka_plan</item>
<item name="android:statusBarColor">@color/ana_renk</item>
<item name="android:navigationBarColor">@color/arka_plan</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
</style>
</resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.MyApplication6" parent="Theme.Material3.Dark.NoActionBar">
<item name="colorPrimary">@color/accent_color</item>
<item name="colorOnPrimary">@color/white</item>
<item name="colorSurface">#1E1E1E</item>
<item name="android:statusBarColor">#121212</item>
<item name="android:navigationBarColor">#121212</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
</style>
</resources>
<resources>
<string-array name="content_type_keys" translatable="false">
<item>game</item>
<item>website</item>
<item>youtube</item>
</string-array>
<string-array name="reading_type_keys" translatable="false">
<item>book</item>
<item>article</item>
<item>audiobook</item>
<item>magazine</item>
</string-array>
<string-array name="wishlist_type_keys" translatable="false">
<item>product</item>
<item>gift</item>
<item>experience</item>
<item>subscription</item>
</string-array>
<string-array name="travel_type_keys" translatable="false">
<item>city</item>
<item>restaurant</item>
<item>hotel</item>
<item>activity</item>
</string-array>
</resources>
<resources>
<string name="app_name">My Archive</string>
<string name="title_new_entry">New entry</string>
<string name="hint_title">Title</string>
<string name="hint_score">Score (1–10)</string>
<string name="hint_comment">Your notes…</string>
<string name="action_add_to_collection">Add to collection</string>
<string name="action_update_entry">Save changes</string>
<string name="action_edit">Update</string>
<string name="title_edit_entry">Edit entry</string>
<string name="toast_updated">Entry updated.</string>
<string name="entry_meta_line">%1$s · ⭐ %2$s/10 · %3$s</string>
<string name="error_entry_not_found">Could not load that entry.</string>
<string name="title_collection">My collection</string>
<string name="empty_collection">Nothing saved yet.</string>
<string name="action_add_new">Add new</string>
<string name="action_clear_archive">Clear archive</string>
<string name="toast_added">Saved to your collection.</string>
<string name="toast_cleared">Archive cleared.</string>
<string name="dashboard_headline">Collections</string>
<string name="dashboard_subtitle">Pick a shelf to add or review items.</string>
<string name="dashboard_media_title">Media</string>
<string name="dashboard_media_desc">Games, sites, and channels.</string>
<string name="dashboard_reading_title">Reading</string>
<string name="dashboard_reading_desc">Books and long reads you track.</string>
<string name="dashboard_wishlist_title">Wishlist</string>
<string name="dashboard_wishlist_desc">Things you plan to get or try.</string>
<string name="dashboard_travel_title">Travel</string>
<string name="dashboard_travel_desc">Places, trips, and food spots.</string>
<string name="shelf_title_reading">Reading log</string>
<string name="shelf_title_wishlist">Wishlist</string>
<string name="shelf_title_travel">Travel log</string>
<string name="shelf_list_reading">Reading shelf</string>
<string name="shelf_list_wishlist">Wishlist shelf</string>
<string name="shelf_list_travel">Travel shelf</string>
<string name="type_game">Game</string>
<string name="type_website">Website</string>
<string name="type_youtube">YouTube</string>
<string name="type_book">Book</string>
<string name="type_article">Article</string>
<string name="type_audiobook">Audiobook</string>
<string name="type_magazine">Magazine</string>
<string name="type_product">Product</string>
<string name="type_gift">Gift idea</string>
<string name="type_experience">Experience</string>
<string name="type_subscription">Subscription</string>
<string name="type_city">City / region</string>
<string name="type_restaurant">Restaurant / café</string>
<string name="type_hotel">Hotel / stay</string>
<string name="type_activity">Activity / tour</string>
<string name="type_other">Other</string>
<string name="label_date">Date</string>
<string name="label_score">Score</string>
<string name="label_comment">Notes</string>
<string name="label_type">Type</string>
<string name="label_category_media">Media type</string>
<string name="label_category_reading">Reading format</string>
<string name="label_category_wishlist">Wishlist category</string>
<string name="label_category_travel">Travel category</string>
<string name="form_caption_media">Games, sites, and channels you care about.</string>
<string name="form_caption_reading">Books, articles, and long reads in one place.</string>
<string name="form_caption_wishlist">Ideas and items you plan to pick up later.</string>
<string name="form_caption_travel">Cities, trips, and memorable spots.</string>
<string-array name="content_type_labels">
<item>@string/type_game</item>
<item>@string/type_website</item>
<item>@string/type_youtube</item>
</string-array>
<string-array name="reading_type_labels">
<item>@string/type_book</item>
<item>@string/type_article</item>
<item>@string/type_audiobook</item>
<item>@string/type_magazine</item>
</string-array>
<string-array name="wishlist_type_labels">
<item>@string/type_product</item>
<item>@string/type_gift</item>
<item>@string/type_experience</item>
<item>@string/type_subscription</item>
</string-array>
<string-array name="travel_type_labels">
<item>@string/type_city</item>
<item>@string/type_restaurant</item>
<item>@string/type_hotel</item>
<item>@string/type_activity</item>
</string-array>
<string name="action_settings">Settings</string>
<string name="settings_title">Settings</string>
<string name="settings_language_title">Language</string>
<string name="settings_language_english">English</string>
<string name="settings_language_turkish">Turkish</string>
<string name="settings_login_title">Login</string>
<string name="action_apply">Apply</string>
<string name="action_login">Login</string>
<string name="action_logout">Logout</string>
<string name="toast_logged_out">Logged out.</string>
<string name="login_status_logged_out">Not logged in</string>
<string name="login_status_logged_in">Logged in as %1$s</string>
<string name="login_title">Sign in</string>
<string name="hint_username">Username</string>
<string name="hint_password">Password</string>
<string name="btn_sign_in">Sign in</string>
<string name="btn_create_account">Create account</string>
<string name="toast_account_created">Account created.</string>
<string name="error_missing_credentials">Enter username and password.</string>
<string name="error_invalid_credentials">Invalid username or password.</string>
<string name="error_user_already_exists">User already exists.</string>
<string name="action_back">Back</string>
<string name="action_next">Next</string>
</resources>
<resources>
<string name="app_name">Arşivim</string>
<string name="title_new_entry">Yeni kayıt</string>
<string name="hint_title">Başlık</string>
<string name="hint_score">Puan (1–10)</string>
<string name="hint_comment">Yorumunuz…</string>
<string name="action_add_to_collection">Koleksiyona ekle</string>
<string name="action_update_entry">Değişiklikleri kaydet</string>
<string name="action_edit">Güncelle</string>
<string name="title_edit_entry">Kaydı düzenle</string>
<string name="toast_updated">Kayıt güncellendi.</string>
<string name="entry_meta_line">%1$s · ⭐ %2$s/10 · %3$s</string>
<string name="error_entry_not_found">Bu kayıt açılamadı.</string>
<string name="title_collection">Koleksiyonum</string>
<string name="empty_collection">Henüz kayıt yok.</string>
<string name="action_add_new">Yeni ekle</string>
<string name="action_clear_archive">Arşivi temizle</string>
<string name="toast_added">Koleksiyona eklendi.</string>
<string name="toast_cleared">Arşiv temizlendi.</string>
<string name="dashboard_headline">Raflar</string>
<string name="dashboard_subtitle">Eklemek veya göz atmak için bir raf seçin.</string>
<string name="dashboard_media_title">Medya</string>
<string name="dashboard_media_desc">Oyunlar, siteler ve kanallar.</string>
<string name="dashboard_reading_title">Okuma</string>
<string name="dashboard_reading_desc">Takip ettiğin kitaplar ve uzun metinler.</string>
<string name="dashboard_wishlist_title">İstek listesi</string>
<string name="dashboard_wishlist_desc">Almayı veya denemeyi planladıkların.</string>
<string name="dashboard_travel_title">Seyahat</string>
<string name="dashboard_travel_desc">Şehirler, geziler ve mekanlar.</string>
<string name="shelf_title_reading">Okuma günlüğü</string>
<string name="shelf_title_wishlist">İstek listesi</string>
<string name="shelf_title_travel">Seyahat günlüğü</string>
<string name="shelf_list_reading">Okuma rafı</string>
<string name="shelf_list_wishlist">İstek listesi rafı</string>
<string name="shelf_list_travel">Seyahat rafı</string>
<string name="type_game">Oyun</string>
<string name="type_website">Websitesi</string>
<string name="type_youtube">YouTube</string>
<string name="type_book">Kitap</string>
<string name="type_article">Makale</string>
<string name="type_audiobook">Sesli kitap</string>
<string name="type_magazine">Dergi</string>
<string name="type_product">Ürün</string>
<string name="type_gift">Hediye fikri</string>
<string name="type_experience">Deneyim</string>
<string name="type_subscription">Abonelik</string>
<string name="type_city">Şehir / bölge</string>
<string name="type_restaurant">Restoran / kafe</string>
<string name="type_hotel">Otel / konaklama</string>
<string name="type_activity">Aktivite / tur</string>
<string name="type_other">Diğer</string>
<string name="label_date">Tarih</string>
<string name="label_score">Puan</string>
<string name="label_comment">Not</string>
<string name="label_type">Tür</string>
<string name="label_category_media">Medya türü</string>
<string name="label_category_reading">Okuma biçimi</string>
<string name="label_category_wishlist">İstek listesi kategorisi</string>
<string name="label_category_travel">Seyahat kategorisi</string>
<string name="form_caption_media">Önem verdiğin oyunlar, siteler ve kanallar.</string>
<string name="form_caption_reading">Kitaplar, makaleler ve uzun metinler tek yerde.</string>
<string name="form_caption_wishlist">Sonra almayı veya denemeyi planladığın fikirler.</string>
<string name="form_caption_travel">Şehirler, geziler ve unutulmaz mekanlar.</string>
<string name="action_settings">Ayarlar</string>
<string name="settings_title">Ayarlar</string>
<string name="settings_language_title">Dil</string>
<string name="settings_language_english">İngilizce</string>
<string name="settings_language_turkish">Türkçe</string>
<string name="settings_login_title">Oturum</string>
<string name="action_apply">Uygula</string>
<string name="action_login">Giriş Yap</string>
<string name="action_logout">Çıkış Yap</string>
<string name="toast_logged_out">Oturum kapatıldı.</string>
<string name="login_status_logged_out">Giriş yapılmadı</string>
<string name="login_status_logged_in">Kullanıcı: %1$s</string>
<string name="login_title">Giriş Yap</string>
<string name="hint_username">Kullanıcı adı</string>
<string name="hint_password">Şifre</string>
<string name="btn_sign_in">Giriş Yap</string>
<string name="btn_create_account">Hesap oluştur</string>
<string name="toast_account_created">Hesap oluşturuldu.</string>
<string name="error_missing_credentials">Kullanıcı adı ve şifre girin.</string>
<string name="error_invalid_credentials">Kullanıcı adı veya şifre hatalı.</string>
<string name="error_user_already_exists">Kullanıcı zaten var.</string>
<string name="action_back">Geri</string>
<string name="action_next">İleri</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/kart_rengi" />
<corners android:radius="12dp" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/kart_rengi" />
<corners android:radius="16dp" />
</shape>
Rıdvan Tunç
atp 10 a
Lütfen yorumlarınızda saygılı, yapıcı ve anlaşılır bir dil kullanın.
Küfür, hakaret ya da spam içerikler onaylanmaz.