Skip to content

Commit 2120399

Browse files
authored
Version 0.0.8 (#247)
1 parent 8978232 commit 2120399

77 files changed

Lines changed: 4908 additions & 759 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
</a>
2323
</h1>
2424

25-
**Read this in other languages:** [Русский](README_RU.md), [한국어](README_KOR.md), [اُردو](README_UR.md), [Español](README_ES.md)
25+
**Read this in other languages:** [Русский](README_RU.md), [Türkçe](README_TR.md), [한국어](README_KOR.md), [اُردو](README_UR.md), [Español](README_ES.md)
2626

2727

2828
---

README_ES.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
</h1>
2424

2525
**Si deseas leer este documento en otro lenguaje:** [Русский](README_RU.md),
26-
[한국어](README_KOR.md), [اُردو](README_UR.md), [English](README.md)
26+
[Türkçe](README_TR.md), [한국어](README_KOR.md), [اُردو](README_UR.md), [English](README.md)
2727

2828
---
2929

README_KOR.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
</a>
2323
</h1>
2424

25-
**다른 언어로 읽기:** [English](README.md), [Русский](README_RU.md), [Español](README_ES.md)
25+
**다른 언어로 읽기:** [English](README.md), [Русский](README_RU.md), [Türkçe](README_TR.md), [Español](README_ES.md)
2626

2727
---
2828

README_RU.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
</a>
2323
</h1>
2424

25-
**Читать на других языках:** [English](README.md), [한국어](README_KOR.md), [اُردو](README_UR.md),
25+
**Читать на других языках:** [English](README.md), [Türkçe](README_TR.md), [한국어](README_KOR.md), [اُردو](README_UR.md),
2626
[Español](README_ES.md)
2727

2828
---

README_TR.md

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
<h1 align="center">
2+
<br>
3+
<a href="https://github.com/monogram-android/monogram"><img width="130" height="130" alt="MonoGram" src="./documents/monogram.png" />
4+
</a>
5+
<br>
6+
<b>MonoGram</b>
7+
<br>
8+
</h1>
9+
10+
<h1 align="center">
11+
<a href="https://github.com/monogram-android/monogram/blob/develop/LICENSE">
12+
<img src="https://img.shields.io/badge/Lisans-GPLv3-blue.svg" width="120">
13+
</a>
14+
<a href="https://github.com/monogram-android/monogram/stargazers">
15+
<img src="https://img.shields.io/github/stars/monogram-android/monogram" width="120">
16+
</a>
17+
<img src="https://img.shields.io/badge/Kotlin-2.0+-blue.svg?logo=kotlin" width="130">
18+
<img src="https://img.shields.io/badge/TDLib-1.8.63-blue" width="120">
19+
<img src="https://img.shields.io/badge/Durum-Aktif_Geliştirme-orange" width="170">
20+
<a href="https://boosty.to/monogram">
21+
<img src="https://img.shields.io/badge/Boosty-Projeyi_Destekle-ff6f61?logo=boosty&logoColor=white" width="200">
22+
</a>
23+
</h1>
24+
25+
**Bu dokümanı diğer dillerde okuyun:** [English](README.md), [Русский](README_RU.md), [Türkçe](README_TR.md), [한국어](README_KOR.md), [اُردو](README_UR.md), [Español](README_ES.md)
26+
27+
---
28+
29+
**MonoGram**, Android için modern, yıldırım hızında ve zarif bir resmi olmayan Telegram istemcisidir. **Jetpack Compose** ve **Material Design 3** ile sıfırdan inşa edilen uygulama, resmi **TDLib** altyapısıyla desteklenen yerleşik (native) ve akıcı bir deneyim sunar.
30+
31+
> [!IMPORTANT]
32+
> MonoGram şu an **aktif geliştirme** aşamasındadır. Sık güncellemeler, mimari değişiklikler ve nadiren de olsa hatalar (bug) bekleyebilirsiniz.
33+
34+
Projeyi [**Boosty**](https://boosty.to/monogram) üzerinden destekleyebilirsiniz.
35+
36+
---
37+
38+
## Ekran Görüntüleri
39+
40+
<div align="center">
41+
42+
| | | | |
43+
|:---:|:---:|:---:|:---:|
44+
| <img src="./documents/1.png" width="180" alt="Ekran Görüntüsü 1" /> | <img src="./documents/2.png" width="180" alt="Ekran Görüntüsü 2" /> | <img src="./documents/3.png" width="180" alt="Ekran Görüntüsü 3" /> | <img src="./documents/4.png" width="180" alt="Ekran Görüntüsü 4" /> |
45+
46+
</div>
47+
48+
---
49+
50+
## Öne Çıkan Özellikler
51+
52+
- **Bağımsız İstemci** — Android için Telegram'ın bir çatalı (fork) değildir. MonoGram, tamamen sıfırdan bağımsız bir proje olarak inşa edilmiştir.
53+
- **Material Design 3** — Telefonlar, tabletler ve katlanabilir cihazlarda harika görünen, estetik ve uyarlanabilir kullanıcı arayüzü.
54+
- **Güvenli** — Yerleşik biyometrik kilitleme ve şifrelenmiş yerel depolama.
55+
- **Zengin Medya Deneyimi** — ExoPlayer ve Coil 3 ile yüksek performanslı medya oynatma.
56+
- **Hızlı ve Verimli** — Kotlin Coroutines ile desteklenen, performans için optimize edilmiş yapı.
57+
- **Temiz Mimari (Clean Architecture)** — Domain, Data ve Presentation katmanları ile sorumlulukların net bir şekilde ayrılması.
58+
- **MVI Deseni** — MVIKotlin kullanılarak sağlanan öngörülebilir durum yönetimi.
59+
- **NFT veya Kripto Yok** — MonoGram; Telegram tarafından dayatılan ve bir mesajlaşma uygulamasının kapsamı dışında gördüğümüz NFT tanıtımları, hediyeleri veya benzeri özellikleri asla içermeyecektir.
60+
61+
---
62+
63+
## Başlangıç
64+
65+
Projeyi yerel ortamınızda kurmak için bu adımları izleyin.
66+
67+
### Ön Koşullar
68+
69+
- **Android Studio**: Ladybug veya daha yeni bir sürüm (önerilir).
70+
- **JDK**: Java 17 veya daha yeni bir sürüm.
71+
72+
### 1. Depoyu Klonlayın
73+
74+
```bash
75+
git clone --recurse-submodules https://github.com/monogram-android/monogram.git
76+
cd monogram
77+
```
78+
### 2. Telegram API Anahtarlarını Yapılandırın
79+
80+
Telegram sunucularına bağlanmak için kendi API kimlik bilgilerinize ihtiyacınız vardır.
81+
82+
1. [my.telegram.org](https://my.telegram.org/) adresinde oturum açın.
83+
2. **API development tools (API geliştirme araçları)** bölümüne gidin.
84+
3. `App api_id` ve `App api_hash` değerlerinizi almak için yeni bir uygulama oluşturun.
85+
4. Projenin kök dizininde (eğer yoksa) `local.properties` adlı bir dosya oluşturun.
86+
5. Aşağıdaki satırları dosyaya ekleyin:
87+
88+
```properties
89+
API_ID=12345678
90+
API_HASH=your_api_hash_here
91+
```
92+
### 3. Anlık Bildirimleri (Push Notifications) Yapılandırın
93+
94+
1. [Firebase konsolunda](https://console.firebase.google.com) oturum açın.
95+
2. Yeni bir proje oluşturun.
96+
3. İhtiyacınız olan `applicationId` değerine sahip yeni bir uygulama ekleyin. Farklı ID'lere sahip birden fazla uygulamanız varsa, birden fazla Firebase uygulaması oluşturun. **Varsayılan olarak, hata ayıklama (debug) ve yayınlama (release) sürümlerinin `applicationId` değerleri farklıdır.**
97+
4. `google-services.json` dosyasını indirin ve **app** modülünün kök dizinine kopyalayın (`monogram/app/google-services.json`). Birden fazla uygulama oluşturduysanız, yalnızca en güncel yapılandırmayı kopyalayın.
98+
5. **Cloud Messaging** bölümüne gidin.
99+
6. **Manage service accounts** (Hizmet hesaplarını yönet) seçeneğine tıklayın.
100+
7. Açılan pencerenin üst kısmındaki **Keys** (Anahtarlar) sekmesini seçin.
101+
8. **Add key** (Anahtar ekle) seçeneğine tıklayın ve **JSON** opsiyonunu seçin. Dosyanın indirilmesini bekleyin.
102+
9. Uygulama ID'nizi aldığınız Telegram API sayfasına geri dönün.
103+
10. FCM kimlik bilgileri (FCM credentials) bölümünün yanındaki **Update** (Güncelle) butonuna tıklayın.
104+
11. Açılan sayfada hizmet hesabı (service account) JSON dosyasını yükleyin.
105+
106+
### 4. İlk Kurulum: libvpx Derlemesi
107+
108+
Animasyonların çalışması için libvpx'in derlenmiş olması gerekir. Bu işlem, Gradle derlemesini başlatmadan önce yapılmalıdır; aksi takdirde derleme hatalarıyla karşılaşırsınız.
109+
110+
1. Çalışma dizininizi `presentation/src/main/cpp` olarak değiştirin.
111+
2. `build.sh` dosyası içerisine kendi `ANDROID_NDK_HOME` yolunuzu ekleyin.
112+
3. `build.sh` dosyasını çalıştırın ve işlemin tamamlanmasını bekleyin.
113+
114+
### 5. Derleyin ve Çalıştırın
115+
116+
1. Projeyi **Android Studio** ile açın.
117+
2. `TdApi.java` (TDLib sarmalayıcısı) dosyasının doğru şekilde indekslenebilmesi için IDE indeksleme limitlerini artırın. **Android Studio** veya **IntelliJ IDEA** içerisinde, **Help (Yardım) → Edit Custom Properties...** (Özel Özellikleri Düzenle) yolunu izleyin, aşağıdaki satırları yapıştırın ve istenirse IDE'yi yeniden başlatın:
118+
119+
```properties
120+
# Kb cinsinden boyut
121+
idea.max.intellisense.filesize=20480
122+
# Kb cinsinden boyut
123+
idea.max.content.load.filesize=20480
124+
```
125+
126+
3. Gradle senkronizasyonunu (Sync) yapın.
127+
4. `app` çalıştırma yapılandırmasını (run configuration) seçin.
128+
5. Bir cihaz bağlayın veya bir emülatör başlatın.
129+
6. **Run** (Çalıştır) butonuna tıklayın.
130+
131+
---
132+
133+
## TDLib Derlemesi
134+
135+
Eğer TDLib'i kaynaktan derlemeniz gerekirse, öncelikle gerekli bağımlılıkları kurun. Debian/Ubuntu tabanlı dağıtımlar için:
136+
137+
```bash
138+
sudo apt-get update
139+
sudo apt-get install build-essential git curl wget php perl gperf unzip zip default-jdk cmake
140+
```
141+
142+
Ardından projenin kök dizininden derleme betiğini (script) çalıştırın:
143+
144+
```bash
145+
./build-tdlib.sh
146+
```
147+
148+
---
149+
150+
## Katkıda Bulunma
151+
152+
Katkılarınızı memnuniyetle karşılıyoruz! İster hataları gidermek, ister dokümantasyonu iyileştirmek veya yeni özellikler önermek olsun, her türlü katkıya açığız.
153+
154+
1. **Sorunları (Issues) Kontrol Edin** — Açık sorunlara göz atın veya fikirlerinizi tartışmak için yeni bir sorun kaydı oluşturun.
155+
2. **`develop` Dalında Çalışın** — Kendi dalınızı (branch) `develop` üzerinden oluşturun ve çalışmalarınızı bu dalı temel alarak sürdürün.
156+
3. **Fork & Branch** — Depoyu (repo) çatallayın (fork) ve bir özellik dalı (feature branch) oluşturun.
157+
4. **Kod Stili** — Mevcut Kotlin kod yazım stiline ve Temiz Mimari (Clean Architecture) yönergelerine uyun.
158+
5. **PR Gönderin** — Değişikliklerinizin net bir açıklamasını içeren bir Çekme İsteğini (Pull Request) `develop` dalına açın.
159+
160+
> [!IMPORTANT]
161+
> - [Telegram API Hizmet Şartlarına](https://core.telegram.org/api/terms) uyun.
162+
> - Kodunuzun tüm kontrollerden ve testlerden geçtiğinden emin olun.
163+
164+
### Hata Bildirme ve Özellik Önerileri
165+
166+
- **Hatalar (Bugs)** — Bir sorun kaydı (issue) açın ve başlıkta `[Bug]` etiketini kullanın (Örn: `[Bug] Uygulama başlangıçta çöküyor`). Ayrıca, bilinen tüm hatalara [**Hata Takipçisi**](https://github.com/orgs/monogram-android/projects/3/views/1) üzerinden göz atabilirsiniz.
167+
- **Özellik İstekleri**`[Feature]` etiketini içeren bir sorun kaydı açın (Örn: `[Feature] Planlanmış mesaj desteği`). Mevcut özellik isteklerini [**Özellik Panosu**](https://github.com/orgs/monogram-android/projects/5/views/1) üzerinden inceleyebilirsiniz.
168+
169+
---
170+
171+
## Çeviriler
172+
173+
MonoGram topluluk tarafından yapılan çevirileri memnuniyetle karşılar! Kendi dilinizle katkıda bulunmak için metin kaynak (strings resource) dosyasını düzenleyebilirsiniz.
174+
175+
Kaynak metinler [`presentation/src/main/res/values/string.xml`](https://github.com/monogram-android/monogram/blob/develop/presentation/src/main/res/values/string.xml) adresinde yer almaktadır. Yeni bir dil eklemek için, ilgili dile ait bir `values-<yerel-kod>/string.xml` dosyası oluşturun (örneğin Almanca için `values-de/string.xml`) ve metinleri orada çevirin. Çevirinizi içeren bir Çekme İsteği (PR) açın, biz de onu projeye dahil edelim.
176+
177+
---
178+
179+
## Teknoloji Yığını
180+
181+
MonoGram, en güncel Android geliştirme araçlarından ve kütüphanelerinden yararlanır:
182+
183+
| Kategori | Kütüphaneler |
184+
|:---|:---|
185+
| **Dil** | [Kotlin](https://kotlinlang.org/) |
186+
| **Kullanıcı Arayüzü (UI)** | [Jetpack Compose](https://developer.android.com/jetpack/compose) (Material 3) |
187+
| **Mimari** | [Decompose](https://github.com/arkivanov/Decompose) (Navigasyon), [MVIKotlin](https://github.com/arkivanov/MVIKotlin) |
188+
| **Bağımlılık Enjeksiyonu (DI)** | [Koin](https://insert-koin.io/) |
189+
| **Asenkron İşlemler** | Coroutines & Flow |
190+
| **Telegram Çekirdeği** | [TDLib](https://core.telegram.org/tdlib) (Telegram Database Library) |
191+
| **Görsel Yükleme** | [Coil 3](https://coil-kt.github.io/coil/) |
192+
| **Medya** | Media3 (ExoPlayer) |
193+
| **Haritalar** | [MapLibre](https://maplibre.org/) |
194+
| **Yerel Veritabanı** | Room |
195+
196+
---
197+
198+
## Proje Yapısı
199+
200+
Proje, sorumlulukların ayrılmasını ve ölçeklenebilirliği sağlamak amacıyla çok modüllü (multi-module) bir yapı izlemektedir:
201+
202+
| Modül | Açıklama |
203+
|:---|:---|
204+
| **:app** | Ana Android uygulama modülü. |
205+
| **:domain** | İş mantığı (business logic), kullanım durumları (use cases) ve depo (repository) arayüzlerini içeren saf Kotlin modülü. |
206+
| **:data** | Depo (repository) uygulamaları, veri kaynakları ve TDLib entegrasyonu. |
207+
| **:presentation** | Kullanıcı arayüzü (UI) bileşenleri, ekranlar ve görünüm modelleri (MVI Store'ları). |
208+
| **:core** | Modüller genelinde kullanılan ortak yardımcı sınıflar ve uzantılar (extensions). |
209+
| **:baselineprofile** | Uygulama başlangıcı ve performans optimizasyonu için Baseline Profilleri. |
210+
211+
---
212+
213+
## Lisans
214+
215+
Bu proje [**GNU General Public License v3.0**](LICENSE) (GNU Genel Kamu Lisansı v3.0) kapsamında lisanslanmıştır.

README_UR.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
</a>
2323
</h1>
2424

25-
**اسے دوسری زبانوں میں پڑھیں:** [English](README.md), [Русский](README_RU.md)، [한국어](README_KOR.md),
25+
**اسے دوسری زبانوں میں پڑھیں:** [English](README.md), [Русский](README_RU.md)، [Türkçe](README_TR.md), [한국어](README_KOR.md),
2626
[Español](README_ES.md)
2727

2828
---

app/build.gradle.kts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ android {
2020
applicationId = "org.monogram"
2121
minSdk = 25
2222
targetSdk = 36
23-
versionCode = 7
24-
versionName = "0.0.7"
23+
versionCode = 8
24+
versionName = "0.0.8"
2525
}
2626

2727
splits {
@@ -110,6 +110,16 @@ androidComponents {
110110
}
111111
}
112112

113+
configurations.configureEach {
114+
val tink = "com.google.crypto.tink:tink-android:1.21.0"
115+
resolutionStrategy {
116+
force(tink)
117+
dependencySubstitution {
118+
substitute(module("com.google.crypto.tink:tink")).using(module(tink))
119+
}
120+
}
121+
}
122+
113123
dependencies {
114124
implementation(platform(libs.androidx.compose.bom))
115125
implementation(libs.bundles.androidx.compose)
@@ -126,6 +136,7 @@ dependencies {
126136

127137
implementation(platform(libs.firebase.bom))
128138
implementation(libs.firebase.messaging)
139+
implementation(libs.unifiedpush.connector)
129140

130141
implementation(libs.maplibre.compose)
131142

app/proguard-rules.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
-keepnames class org.monogram.**
66
-keepnames class org.drinkless.tdlib.**
7+
-keepclassmembernames class org.monogram.** { *; }
8+
-keepclassmembernames class org.drinkless.tdlib.** { *; }
79

810
-assumenosideeffects class android.util.Log {
911
public static *** v(...);

app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
android:name="android.permission.READ_EXTERNAL_STORAGE"
2424
android:maxSdkVersion="32" />
2525

26+
<queries>
27+
<intent>
28+
<action android:name="org.unifiedpush.android.connector.REGISTER" />
29+
</intent>
30+
</queries>
31+
2632
<application
2733
android:allowBackup="true"
2834
android:dataExtractionRules="@xml/data_extraction_rules"

app/src/main/java/org/monogram/app/App.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import org.monogram.presentation.di.AppContainer
2020
import org.monogram.presentation.di.KoinAppContainer
2121
import java.io.PrintWriter
2222
import java.io.StringWriter
23-
import kotlin.jvm.java
2423
import kotlin.system.exitProcess
2524

2625
class App : Application(), SingletonImageLoader.Factory {
@@ -84,12 +83,29 @@ class App : Application(), SingletonImageLoader.Factory {
8483

8584
private fun checkPushAvailability() {
8685
val distrManager = get<DistrManager>()
87-
val isGmsAvailable = distrManager.isGmsAvailable()
88-
val isFcmAvailable = distrManager.isFcmAvailable()
89-
9086
val prefs = get<AppPreferencesProvider>()
91-
if (!(isGmsAvailable && isFcmAvailable) && prefs.pushProvider.value == PushProvider.FCM) {
92-
prefs.setPushProvider(PushProvider.GMS_LESS)
87+
val currentProvider = prefs.pushProvider.value
88+
val bestAvailable = resolveBestAvailablePushProvider(distrManager)
89+
90+
val shouldFallback = when (currentProvider) {
91+
PushProvider.FCM -> bestAvailable != PushProvider.FCM
92+
PushProvider.UNIFIED_PUSH -> !distrManager.isUnifiedPushDistributorAvailable()
93+
PushProvider.GMS_LESS -> false
94+
}
95+
96+
if (shouldFallback && currentProvider != bestAvailable) {
97+
prefs.setPushProvider(bestAvailable)
98+
}
99+
}
100+
101+
private fun resolveBestAvailablePushProvider(distrManager: DistrManager): PushProvider {
102+
val fcmAvailable = distrManager.isGmsAvailable() && distrManager.isFcmAvailable()
103+
val unifiedPushAvailable = distrManager.isUnifiedPushDistributorAvailable()
104+
105+
return when {
106+
fcmAvailable -> PushProvider.FCM
107+
unifiedPushAvailable -> PushProvider.UNIFIED_PUSH
108+
else -> PushProvider.GMS_LESS
93109
}
94110
}
95111

0 commit comments

Comments
 (0)