Skip to content
alid67-gitPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

DayAtlas

Hafif günlük iz defteri — Android. Amaç: nereye ve ne kadar gidildiğinin seyrek, pil dostu kaydı.

Paket: com.dayatlas.app · Dil: Türkçe / English / Deutsch · Sürüm: 0.7.7

Bu depo RideAtlas değildir. RideAtlas sık GPS, canlı harita ve zengin sürüş kaydıdır. DayAtlas ayrı bir ürün: seyrek örnekleme, özet iz, az pil. RideAtlas kodu kopyalanmaz; monorepo yoktur.

İki platform, iki ayrı native uygulama, aynı gün dosyası formatı:

  • Android (bu dosyanın geri kalanı) — app/, Kotlin.
  • iOS — ios/, Swift/SwiftUI. Kurulum, arka plan modeli ve reboot sonrası devam etme kısıtları için bkz. ios/README.md. Apple'ın platform kuralları yüzünden arka plan tetiklemesi Android'den farklıdır (sabit dakika yerine ~500 m hareket eşiği) — ayrıntı ios/README.md'de.
  • Web PWA (iPhone Safari / ana ekran) — web/. Native uygulama kurmadan tarayıcıdan çalışır; Ana Ekrana Ekle ile ikon gibi kullanılır. Aç: https://alid67-git.github.io/DayAtlas/web/ (arka plan GPS Safari’de yok — bkz. web/README.md).

Neden native Kotlin?

Flutter motoru (~4–8 MB) ve Google Play Services yığını yok. AlarmManager, konum, boot ve pil muafiyeti doğrudan platform API’si. v1 hedefi küçük APK ve kolay bakım. Rota ekranındaki OpenStreetMap haritası (osmdroid) bunun tek istisnası — o da Play Services/API key gerektirmez, bkz. aşağı.

Ne yapar (v1)

  • Opsiyonel günlük mod (Ayarlar): açıkken uygulama veya telefon açılınca onay sormadan bugünün kaydına başlar / devam eder.
  • Seyrek GPS: varsayılan 1 dakika (30 sn / 1 / 3 / 5 dk ayarlanabilir). Sürekli location stream yok.
  • Gün dosyası: her cihaz yerel takvim günü (yyyy-MM-dd) ayrı kayıt. Gece yarısında yeni dosya. UTC ile gün bölünmez.
  • İçerik: zaman damgalı az nokta + mesafe özeti. files/days/yyyy-MM-dd.json ve .gpx.
  • UI: bugün kayıtta mı, mesafe, son nokta saati, başlat/durdur (günlük mod kapalıyken).
  • Harita (ana ekranın altı): bugünün / seçilen günün noktaları OpenStreetMap üzerinde çizgi olarak (osmdroid — Play Services yok, API key yok). Oklarla önceki günlere gidilir. Karolar yalnızca uygulama ön plandayken indirilir/çizilir.
  • GPX dışa aktarma: araç çubuğundan tek gün veya tarih aralığı + dosya adı (.gpx otomatik eklenir); sistem paylaşım ekranı ile kaydet/gönder. Aralıkta her gün ayrı bir <trk> olur, noktaların gerçek UTC zamanı yazılır.
  • Google Drive / klasör yedek: Ayarlar’dan bir klasör seçin (Drive önerilir), günlük otomatik yedeği açın. Günde bir kez tüm days/* JSON+GPX o klasöre kopyalanır; Drive uygulaması buluta senkronlar. Uygulama kaldırıınca yerel veri silinir — yedek klasörü kalır.

Ne yapmaz

Analiz, foto, Android Auto, topo harita, canlı harita/canlı konum takibi, sık GPS. Harita geçmiş bir günün bitmiş rotasını gösterir — RideAtlas'taki gibi canlı, takip eden bir harita değildir.

Harita ve pil

Harita (osmdroid) ana ekranın altındaki bir ön plan görünüm bileşenidir: yalnızca MainActivity görünürken karo indirir/çizer (onResume/onPause ile bağlı). Uygulama arka plandayken harita kodu çalışmaz — sıfır pil, sıfır ağ (ana ekran açıkken karo indirmesi olabilir). DayAtlas'ın gerçek arka plan pil maliyeti tamamen SampleService'ten gelir. Canlı konum/ pusula takibi bilerek eklenmedi.

Harita gün istatistikleri

Haritanın üstündeki kartlarda mesafe, son nokta, nokta sayısı, maksimum hız, ortalama hız ve aktif sürüş süresi gösterilir (DayStatKind / SpeedStats). Kartlara uzun basıp sürükleyerek sırası değiştirilebilir; Ayarlar → Harita gün istatistikleri bölümünden hangilerinin görüneceği seçilir. Hız/süre, GPS sıçramalarını ve duraklamaları (>20 dk boşluk) dışarıda bırakacak şekilde hesaplanır.

Yardım ekranı

Daha fazla → Yardım — uygulama dilinde açılır; ekranda Türkçe / İngilizce / Almanca yardım metni arasında geçiş yapılabilir (HelpActivity, res/raw/help_*.txt). Arayüz dili Ayarlar → Dil.

GPX dışa aktarma

Her gün zaten files/days/yyyy-MM-dd.gpx olarak yazılır (uygulama içi depo). Rotalar sekmesinden tek gün veya Aralık GPX ile sistem paylaşım ekranına verilir (Dosyalar, Drive, e-posta vb.). Dosya adına .gpx otomatik eklenir; aralıkta her gün ayrı bir <trk> olur (içe aktaran uygulamaların tek güne yığmaması için), her noktada gerçek UTC zaman damgası vardır.

Google Drive günlük yedek

OAuth / Google Cloud kurulumu yok. Sistem klasör seçici (SAF) ile bir klasör seçilir — tercihen Drive’da oluşturduğunuz DayAtlas klasörü.

  1. Drive uygulamasında boş bir klasör açın.
  2. DayAtlas → Ayarlar → Yedek klasörü seç → Google Drive → o klasör.
  3. Günlük otomatik yedek anahtarını açın (ilk açılışta hemen bir yedek dener).
  4. İsterseniz Şimdi yedekle.

Sonrasında günde en fazla bir kez (uygulama açılışı veya GPS örneği sırasında) yalnızca yeni/değişen yyyy-MM-dd.json / .gpx dosyaları klasöre kopyalanır — zaten yedeklenmiş, değişmemiş dosyalar tekrar yüklenmez. İlk tam yedek tamamlandıktan sonra günlük otomatik yedek artık tüm geçmişi taramaz, yalnızca bugünün dosyasına bakar (eski günler zaten yukarıda ve kendiliğinden değişmez). Bir klasör yeniden seçildiğinde bu tam tarama bir kez daha yapılır. Drive istemcisi klasörü buluta senkronlar. Uygulamayı kaldırmak yerel kaydı siler; Drive’daki kopyalar kalır.

Geri yükleme (yeni telefon veya uygulamayı silip yeniden kurduktan sonra): Ayarlar → Yedek klasörü seç ile aynı klasörü seçin, sonra Yedekten geri yükle’ye dokunun. Klasördeki tüm .json gün kayıtları telefona kopyalanır (aynı isimli yerel dosyaların üzerine yazılır).

Nasıl çalışır (örnekleme)

  1. AlarmManager.setExactAndAllowWhileIdle bir sonraki örneği planlar (tam alarm yoksa setAndAllowWhileIdle).
  2. Alarm SampleReceiver → kısa ömürlü SampleService (foreground type location).
  3. Servis LocationManager.getCurrentLocation ile tek nokta alır (Play Services yok), gün dosyasına yazar, kendini kapatır.
  4. WorkManager kullanılmaz (minimum periyot 15 dk; 30 sn–5 dk için uygun değil).

Kısa FGS, sürekli yüksek frekanslı servis değildir. Doze altında kısa aralıklar (özellikle 30 sn / 1 dk) tam tutmayabilir; pil muafiyeti bunu iyileştirir.

İzinler (ilk açılış, bir kez)

İzin Neden
Konum (kesin / yaklaşık) Nokta almak
Her zaman izin ver (ACCESS_BACKGROUND_LOCATION) Ekran kapalıyken / arka planda örnek
Bildirimler (Android 13+) Kısa FGS bildirimi (zorunlu)
Pil optimizasyonu muafiyeti Alarm’ın uyku modunda çalışması
Tam alarm (SCHEDULE_EXACT_ALARM) 30 sn–5 dk aralığına yaklaşmak

Sistem izin pencereleri kaçınılmazdır. Günlük mod açıkken “kayıt başlasın mı?” diye sormayız.

OEM / reboot notları

BOOT_COMPLETED ile günlük mod açıksa kayıt sessizce yeniden planlanır. Birçok üretici bunu keser:

Üretici Tipik ayar
Xiaomi / HyperOS / MIUI Otomatik başlat, pil tasarrufu istisnası
Huawei / Honor Korumalı uygulamalar, “manuel olarak yönet”
Oppo / Realme / ColorOS Uygulama başlatma / arka plan dondurma
Samsung Uyku modu / kullanılmayan uygulamaları derin uyutma — DayAtlas’ı hariç tut
OnePlus Pille optimize etme, otomatik başlat

Pil bitip telefon açılınca: kilidi açın (dosyalar kullanıcı şifresine bağlı), uygulamayı bir kez açmanız gerekebilir. OEM “otomatik başlat” kapalıysa BootReceiver hiç çalışmaz — bu Android sınırıdır, uygulama aşamaz.

Ayarlar ekranında, cihaz üreticisi yukarıdaki listede tanınıyorsa bir “Otomatik başlatmayı aç” düğmesi belirir; bu düğme o üreticinin otomatik başlatma/korumalı uygulamalar ekranına doğrudan götürür (dokümante edilmemiş sistem ekranlarına best-effort deep link — bulunamazsa kullanıcıyı üretici ayarlarında elle aramaya yönlendirir). İzni açık hâle getirmek yine kullanıcının elinde; uygulama bunu zorlayamaz.

Görev değiştirici (son uygulamalar)

DayAtlas görev değiştiricide kart bırakmamaya çalışır. Yalnızca excludeFromRecents bazı OEM arayüzlerinde (Samsung One UI) yetmediği için, UI arka plana geçince görev de sonlandırılır (AppTask.finishAndRemoveTask). Bu, listede görünmeyen uygulamaların yaptığı şeyle aynı sınıftır: bayrak yetmezse görevi gerçekten kaldırmak.

  • Yeniden açmak için ana ekran simgesini kullanın (görev değiştiricide kart olmaz).
  • Günlük kayıt bundan etkilenmez — örnekleme AlarmManager + kısa SampleService ile activity'den bağımsız sürer.
  • Sistem izin / Ayarlar / OEM otomatik-başlat ekranlarına giderken görev bilinçli olarak tutulur; o ekranlardan Geri ile dönüş çalışır.
  • Bildirim, konum göstergesi, Ayarlar'daki uygulama kaydı gibi şeffaflık öğeleri bilerek değiştirilmez — yalnızca görev değiştirici kartı.

Güncelleme

RideAtlas/MediaAtlas ile aynı kurgu: CI (android.yml) her main push’unda DayAtlas.apk’yi tek bir rolling android-latest GitHub release’ine yüklüyor. Uygulama her gün yerel saat 12:00’te (UpdateCheckScheduler / UpdateCheckReceiver) bu release’i sessizce kontrol eder; daha yeni bir sürüm varsa indirmeye başlar. GPS kaydından bağımsızdır (kayıt kapalıyken de alarm çalışır). Öğleden sonra süreç açılırsa veya örnekleme tick’i gelirse, o gün henüz kontrol edilmediyse yedek catch-up yapılır (günde bir). Ayarlar’daki “Güncellemeleri kontrol et” her zaman elle çalışır.

release build tipi, repoya bilerek commit edilmiş sabit bir keystore ile imzalanıyor (app/dayatlas-debug.keystore) — Android'in kendiliğinden oluşturduğu varsayılan debug anahtarıyla değil. O varsayılan anahtar her CI runner'ında sıfırdan üretildiği için, onunla imzalarsak her CI derlemesi farklı bir anahtarla çıkar ve Android imzası eşleşmeyen bir APK'yı "güncelleme" olarak kabul etmez (indirme biter, kurulum sessizce başarısız olur). Sabit keystore bunu çözer; RideAtlas/MediaAtlas'ta da aynı kurgu var. Sideload-only bir anahtar (Play Store için değil), commit edilmesi bu yüzden sorun değil.

Kurulum anında Android’in kendi “bu uygulamayı yükle” ekranı yine de çıkar — bu işletim sistemi kısıtıdır, hiçbir normal (root olmayan) uygulama atlayamaz. Ayarlar’da elle kontrol için de bir düğme var; o akış bulduğunda indirmeden önce sorar. Debug-keystore ile imzalı sideload build’dir, Play Store’a yayın için değildir.

Derleme

JDK 17 + Android SDK (compile/target SDK 35).

./gradlew assembleDebug assembleRelease

Windows: gradlew.bat assembleDebug

APK:

  • Debug: app/build/outputs/apk/debug/
  • Release: app/build/outputs/apk/release/ (v0.1 debug keystore ile imzalı; üretim keystore sonra)

CI her push’ta aynı APK’ları artifact olarak yükler.

Play Store yayın derlemesi

playRelease (imzalı .aab, PAYWALL_ENABLED=true, self-update kapalı) yerelde keystore.properties gerektirir (bkz. keystore.properties.example) — bu dosya ve işaret ettiği .keystore asla commit edilmez (.gitignore).

Yerel Android SDK/Studio olmadan üretmek için .github/workflows/play-release.yml elle tetiklenen bir GitHub Actions iş akışıdır. Bir kerelik kurulum:

  1. Repo → Settings → Secrets and variables → Actions → New repository secret, dört secret ekleyin:
    • PLAY_KEYSTORE_BASE64 — .keystore dosyasının base64 hâli (base64 -i dayatlas-play-release.keystore | pbcopy macOS, base64 -w0 dayatlas-play-release.keystore Linux — çıktıyı secret'a yapıştırın)
    • PLAY_KEYSTORE_STORE_PASSWORD, PLAY_KEYSTORE_KEY_ALIAS, PLAY_KEYSTORE_KEY_PASSWORD — keystore.properties'teki değerlerin aynısı
  2. Actions sekmesi → Build Play Store release (.aab) → Run workflow.
  3. Tamamlanan run'ın Artifacts bölümünden DayAtlas-playRelease-aab'yi indirip içindeki .aab'yi Play Console'a yükleyin.

Keystore hiçbir zaman repoya veya commit geçmişine girmez — runner'da geçici olarak decode edilir, derlemede kullanılır, iş bitince silinir.

Nasıl test edilir

  1. Debug APK kur, uygulamayı aç.
  2. Konum: Her zaman izin ver. Pil: optimize etme. Gerekirse tam alarm izni.
  3. OEM ise “otomatik başlat”ı aç.
  4. Ayarlar → Günlük mod açık, aralık 1 dk (hızlı deneme için 30 sn).
  5. Ana ekranda “Günlük mod — otomatik kayıt”, mesafe/son nokta bir süre sonra dolmalı. Onay diyaloğu olmamalı.
  6. Dosyalar:
    adb shell run-as com.dayatlas.app ls files/days
    yyyy-MM-dd.json ve .gpx beklenir. JSON date alanı yerel gündür.
  7. Reboot: günlük mod açıkken yeniden başlat, kilidi aç, ~bir aralık bekle. Uygulama açılmadan nokta düşmeli (OEM izin veriyorsa). Düşmezse otomatik başlat/pil ayarını kontrol et; README’deki beklenti budur, garanti değil.
  8. Günlük modu kapat: kayıt durur. Manuel Başlat / Durdur görünür. Gece yarısı yine yerel güne göre yeni dosya.

Kayıt formatı

JSON özeti:

{
  "version": 1,
  "date": "2026-08-28",
  "title": "Günlük 28 Ağu 2026",
  "distanceMeters": 1234.5,
  "points": [{ "t": 1756512000000, "lat": 41.01, "lon": 29.02, "acc": 12.3 }]
}

t Unix milisaniye (anlık zaman). Gün anahtarı yerel takvim tarihidir.

Lisans

MIT — bakınız LICENSE.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages