Rename app identity to JamShalat

This commit is contained in:
Dwindi Ramadhana
2026-03-18 00:45:24 +07:00
parent 2d09b5b356
commit e34dd6cf06
37 changed files with 456 additions and 47 deletions

8
PRD.md
View File

@@ -1,5 +1,5 @@
# Product Requirements Document # Product Requirements Document
## Jamshalat Diary — Islamic Worship Companion App ## JamShalat — Islamic Worship Companion App
**Version:** 1.0 **Version:** 1.0
**Date:** March 2026 **Date:** March 2026
@@ -35,7 +35,7 @@
## 1. Overview ## 1. Overview
**Jamshalat Diary** is an offline-first Muslim daily worship companion app built in Flutter. It helps Muslim users track their daily prayers, worship habits, and spiritual growth with a clean, modern UI that supports both light and dark themes. **JamShalat** is an offline-first Muslim daily worship companion app built in Flutter. It helps Muslim users track their daily prayers, worship habits, and spiritual growth with a clean, modern UI that supports both light and dark themes.
**Core value proposition:** **Core value proposition:**
- Never miss a prayer — real-time prayer time countdowns with Adhan/Iqamah notifications - Never miss a prayer — real-time prayer time countdowns with Adhan/Iqamah notifications
@@ -683,7 +683,7 @@ Rows:
Label: "ABOUT" Label: "ABOUT"
Rows: Rows:
- App Version: "Jamshalat Diary v1.0.0" - App Version: "JamShalat v1.0.0"
- Privacy Policy (launches in-app browser) - Privacy Policy (launches in-app browser)
- Rate the App (links to store) - Rate the App (links to store)
- Contact / Feedback - Contact / Feedback
@@ -881,4 +881,4 @@ The following features are **explicitly excluded** from v1.0 to keep scope focus
--- ---
*PRD v1.0 — Jamshalat Diary — March 2026* *PRD v1.0 — JamShalat — March 2026*

View File

@@ -1,4 +1,4 @@
# jamshalat_diary # JamShalat
A new Flutter project. A new Flutter project.

View File

@@ -1,6 +1,6 @@
# Jamshalat Diary — Phase-Based Implementation Tasklist # JamShalat — Phase-Based Implementation Tasklist
**Project:** Jamshalat Diary Flutter App **Project:** JamShalat Flutter App
**PRD Reference:** `PRD.md` **PRD Reference:** `PRD.md`
**Design Reference:** `stitch/` folder (18 screens) **Design Reference:** `stitch/` folder (18 screens)
**Last Updated:** March 2026 **Last Updated:** March 2026
@@ -302,8 +302,8 @@
- [ ] **7.3.1** Create app icon (1024×1024px): mosque/compass motif with `#70df20` primary color - [ ] **7.3.1** Create app icon (1024×1024px): mosque/compass motif with `#70df20` primary color
- [ ] **7.3.2** Apply app icon via `flutter_launcher_icons` package (all densities, adaptive icon for Android) - [ ] **7.3.2** Apply app icon via `flutter_launcher_icons` package (all densities, adaptive icon for Android)
- [ ] **7.3.3** Create splash screen via `flutter_native_splash` package (white/dark bg, centered logo) - [ ] **7.3.3** Create splash screen via `flutter_native_splash` package (white/dark bg, centered logo)
- [ ] **7.3.4** Set app name: "Jamshalat Diary" in `AndroidManifest.xml` and `Info.plist` - [ ] **7.3.4** Set app name: "JamShalat" in `AndroidManifest.xml` and `Info.plist`
- [ ] **7.3.5** Set bundle ID: `com.jamshalat.diary` on both platforms - [ ] **7.3.5** Set bundle ID: `com.jamshalat.app` on both platforms
- [ ] **7.3.6** Configure release signing (Android keystore, iOS certificates) — document in private README - [ ] **7.3.6** Configure release signing (Android keystore, iOS certificates) — document in private README
- [ ] **7.3.7** Build release APK: `flutter build apk --release` — verify no build errors - [ ] **7.3.7** Build release APK: `flutter build apk --release` — verify no build errors
- [ ] **7.3.8** Build iOS release: `flutter build ipa --release` — verify no build errors - [ ] **7.3.8** Build iOS release: `flutter build ipa --release` — verify no build errors
@@ -338,4 +338,4 @@
--- ---
*TASKLIST v1.0 — Jamshalat Diary — March 2026* *TASKLIST v1.0 — JamShalat — March 2026*

View File

@@ -24,7 +24,7 @@ val hasReleaseKeystore = listOf(
} }
android { android {
namespace = "com.jamshalat.diary" namespace = "com.jamshalat.app"
compileSdk = flutter.compileSdkVersion compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion ndkVersion = flutter.ndkVersion
@@ -52,7 +52,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.jamshalat.diary" applicationId = "com.jamshalat.app"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config. // For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion minSdk = flutter.minSdkVersion

View File

@@ -8,7 +8,7 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>
<application <application
android:label="Jamshalat Diary" android:label="JamShalat"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher">
<activity <activity

View File

@@ -1,4 +1,4 @@
package com.jamshalat.diary package com.jamshalat.app
import android.hardware.GeomagneticField import android.hardware.GeomagneticField
import com.ryanheise.audioservice.AudioServiceActivity import com.ryanheise.audioservice.AudioServiceActivity
@@ -8,7 +8,7 @@ import io.flutter.plugin.common.MethodChannel
class MainActivity : AudioServiceActivity() { class MainActivity : AudioServiceActivity() {
companion object { companion object {
private const val GEOMAGNETIC_CHANNEL = "com.jamshalat.diary/geomagnetic" private const val GEOMAGNETIC_CHANNEL = "com.jamshalat.app/geomagnetic"
private const val DECLINATION_METHOD = "getDeclination" private const val DECLINATION_METHOD = "getDeclination"
} }

View File

@@ -1,5 +0,0 @@
package com.jamshalat.jamshalat_diary
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity()

View File

@@ -0,0 +1,412 @@
# JamShalat: App Feature Overview
## What this app does
JamShalat is a Muslim daily worship companion. It combines prayer schedule utilities, Qur'an reading, dzikir, Islamic reference content, worship tracking, reminders, and personal settings in one app.
The app is designed to help users:
- know the current and upcoming prayer times
- keep worship routines more consistent
- continue Qur'an reading from the last ayat
- access daily dzikir, doa, hadits, and Qur'an study tools
- receive adzan, iqamah, and habit reminders
- review weekly, monthly, and yearly worship progress
## Main navigation modes
The app supports 2 navigation modes:
### 1. Mode lengkap
Bottom navigation:
- Beranda
- Jadwal
- Checklist
- Laporan
- Alat Islami
This mode is focused on full habit tracking and reporting.
### 2. Mode simpel
Bottom navigation:
- Beranda
- Jadwal
- Al-Qur'an
- Dzikir
- Lainnya
This mode is focused on faster access to the most-used spiritual features with less UI complexity.
## Core screens and features
## Beranda
Beranda is the main daily dashboard.
Features:
- main hero card with the next prayer time
- live countdown to the next prayer
- city/location label
- quick access button to Arah Kiblat
- sound toggle for adzan reminders
- horizontal prayer schedule cards for today or tomorrow
- automatic highlight for the next relevant prayer card
- `Lanjutkan Tilawah` card when the user has a last-read Qur'an bookmark
- `Poin Ibadah Hari Ini` summary card
- weekly points progress chart
- `Ayat Hari Ini` card
`Ayat Hari Ini` supports:
- deterministic daily ayat
- randomize to another ayat
- restore back to the daily ayat
- share as text
- copy text
- share as generated image card
## Kalender Sholat / Jadwal
This screen is the prayer calendar and city-based schedule browser.
Features:
- current city prayer schedule
- date-aware prayer timing
- support for changing city/kabupaten
- schedule browsing for upcoming days
- layout optimized for simple mode and full mode
## Checklist Ibadah
This feature is available in mode lengkap.
It acts as the daily worship tracker.
Tracked areas:
- 5 daily sholat fardhu
- rawatib prayers
- tilawah target progress
- dzikir pagi and petang
- puasa sunnah
Features:
- daily completion progress
- configurable rawatib level
- configurable tilawah target
- optional additional worship tracking
- automatic recalculation of total points and completion percentage
- integration with tilawah and dzikir flows
## Laporan / Riwayat Ibadah
This screen summarizes worship quality and history.
Mode lengkap:
- weekly tab
- monthly tab
- yearly tab
- weekly average summary
- daily point bars
- per-day point labels
- insights for strongest and weakest worship consistency
Mode simpel:
- simplified worship history presentation
## Al-Qur'an
This module contains the Qur'an reading experience.
Features:
- list of all surah
- surah metadata
- configurable display:
- Arabic only
- Arabic + Latin
- Arabic + translation
- adaptive Arabic font size support
- direct access to bookmarks
- direct access to enrichment tools
## Qur'an reading screen
This is the detailed surah reading screen.
Features:
- verse-by-verse reading
- Bismillah shown as part of scroll flow instead of fixed header
- accurate jump to a target ayat
- jump support for:
- last read
- favorites
- continue reading
- per-ayat actions:
- play verse audio
- mark as last read
- add to favorites
- open tafsir drawer
- display settings drawer
- quick Arabic font size adjustment
- optional Latin and translation display
- tilawah session tracking
- sync to checklist in mode lengkap
## Qur'an bookmarks
This screen stores reading continuity and personal saved ayat.
Features:
- `Terakhir Dibaca`
- `Ayat Favorit`
- open exact surah and ayat
- cached ayat content refresh when needed
- continue reading CTA
## Qur'an Murattal
This is the full-surah audio recitation player.
Features:
- play murattal by surah
- qari selection
- autoplay support
- previous/next/shuffle controls
- gold-decorated main play button
- blurred themed player panel
- background artwork
- shortcut back to the same surah in reading mode
- background playback through shared app-wide audio player
## Qur'an Enrichment
This screen provides deeper study tools.
Tabs:
- Cari
- Tafsir
- Juz
- Halaman
- Tema
- Asmaul Husna
Features:
- search ayat
- tafsir per surah
- word-by-word expansion
- browse by juz
- browse by page
- browse by topic/theme
- Asmaul Husna reference
- Arabic font-size settings in screen
## Dzikir Harian
This screen organizes daily dzikir routines.
Tabs:
- Sesudah Sholat
- Pagi
- Petang
- Harian
Features:
- card mode and focus/slide mode
- pembuka slide support for pagi and petang
- per-item recitation counter
- source structure aligned to Rumaysho reference
- daily dzikir separated from morning/evening flow where appropriate
- automatic sync between linked dzikir counters
- prayer-window reset for `Sesudah Sholat`
- day-based reset for `Pagi`, `Petang`, and `Harian`
- configurable Arabic font size in-screen
- dedicated simple-mode behavior
## Arah Kiblat
This is the compass-based qibla finder.
Features:
- live compass tracking
- location-based qibla direction calculation
- device support checks
- permission/state handling
- themed background with subtle Unsplash imagery
- Kaaba-centered compass UI
- visual indication when the device is aligned correctly to the qibla direction
## Kumpulan Doa
Reference screen for Islamic prayers.
Features:
- searchable list of doa
- Arabic text
- translation and supporting text
- refresh action
- Arabic font size setting in-screen
## Hadits Arba'in
Reference screen for the 40 hadith collection.
Features:
- searchable hadith list
- Arabic text
- translation/explanation text
- refresh action
- Arabic font size setting in-screen
## Alat Islami / Lainnya
This acts as the tool hub.
Contains shortcuts to:
- Al-Qur'an Terjemahan
- Qur'an Murattal
- Arah Kiblat
- Dzikir Harian
- Kumpulan Doa
- Hadits Arba'in
- Pendalaman Al-Qur'an
It also contains:
- `Ayat Hari Ini`
- share actions for the ayat
- randomize another ayat
## Notifications
The app has a dedicated notification center.
Tabs:
- Alarm
- Pesan
Alarm tab features:
- list of scheduled adzan notifications
- list of scheduled iqamah reminders
- `Akan Datang` filter
- `Sudah Lewat` filter
- refresh action
Pesan tab features:
- inbox-style message list
- read/unread state
- mark all as read
- system and non-prayer message support
## Adzan and reminders
The app schedules local notifications based on the selected city and prayer times.
Supported reminders:
- adzan
- iqamah
- checklist reminder
- other non-prayer habit/system reminders
Implementation highlights:
- local timezone-aware scheduling
- exact alarm support on Android where available
- permission handling for notification and exact alarm access
- per-prayer enable/disable behavior
## Settings and personalization
The app includes a broad settings screen.
Sections include:
- Preferensi
- Pemberitahuan
- Checklist Ibadah
- Tampilan Dzikir
- Waktu Sholat
- Tampilan
- Tentang
Key settings:
- mode lengkap / mode simpel
- light mode / dark mode
- city selection
- prayer calculation method
- iqamah offset per prayer
- adzan notification toggle
- global alert toggle
- inbox/message toggle
- quiet hours
- maximum non-prayer pushes per day
- checklist reminder time
- rawatib level
- tilawah target
- dzikir and puasa tracking toggles
- Arabic font size
- profile editing
- data reset
## Visual and UX features
The app also includes a number of presentation-focused improvements:
- custom bottom navigation with premium gold active state
- hidden theme toggle revealed by sliding the bottom bar
- HugeIcons-based icon system
- dark and light mode support
- adaptive Arabic typography
- reusable share card generation for ayat
- route-aware bottom bar visibility in focus-heavy screens
## Data and persistence
The app stores user state locally for continuity.
Persisted examples:
- settings
- worship logs
- dzikir progress
- tilawah progress
- Qur'an last read
- Qur'an favorites
- notification inbox state
## In short
JamShalat is not only a prayer-time app. It is a daily Islamic companion that combines:
- prayer schedule
- adzan and iqamah reminders
- qibla finder
- Qur'an reading and murattal
- dzikir, doa, and hadith references
- worship checklist and reporting
- personal spiritual continuity through bookmarks, reminders, and progress tracking

View File

@@ -2,7 +2,7 @@
Last updated: 2026-03-16 Last updated: 2026-03-16
Owner: Product + Mobile Owner: Product + Mobile
Scope: `jamshalat_diary` (Flutter) Scope: `JamShalat` (Flutter)
## Implementation Status (2026-03-17) ## Implementation Status (2026-03-17)
- Phase 1: Implemented. - Phase 1: Implemented.

View File

@@ -1,4 +1,4 @@
# Jamshalat Diary — Handoff Document # JamShalat — Handoff Document
> Last updated: 2026-03-15 > Last updated: 2026-03-15

View File

@@ -372,7 +372,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -388,7 +388,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -405,7 +405,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -420,7 +420,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -551,7 +551,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -573,7 +573,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

After

Width:  |  Height:  |  Size: 949 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -7,7 +7,7 @@
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Jamshalat Diary</string> <string>JamShalat</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@@ -15,7 +15,7 @@
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>jamshalat_diary</string> <string>JamShalat</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>

View File

@@ -78,7 +78,7 @@ class _AppState extends ConsumerState<App> with WidgetsBindingObserver {
final themeMode = ref.watch(themeProvider); final themeMode = ref.watch(themeProvider);
return MaterialApp.router( return MaterialApp.router(
title: 'Jamshalat Diary', title: 'JamShalat',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: AppTheme.light, theme: AppTheme.light,
darkTheme: AppTheme.dark, darkTheme: AppTheme.dark,

View File

@@ -24,7 +24,7 @@ String buildAyatShareText(Map<String, dynamic> ayat) {
if (arabic.isNotEmpty) arabic, if (arabic.isNotEmpty) arabic,
if (translation.isNotEmpty) '"$translation"', if (translation.isNotEmpty) '"$translation"',
reference, reference,
'Dibagikan dari Jam Shalat Diary', 'Dibagikan dari JamShalat',
]; ];
return parts.join('\n\n'); return parts.join('\n\n');
@@ -447,7 +447,7 @@ class _AyatShareCard extends StatelessWidget {
borderRadius: BorderRadius.circular(999), borderRadius: BorderRadius.circular(999),
), ),
child: const Text( child: const Text(
'Jam Shalat Diary', 'JamShalat',
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,

View File

@@ -20,7 +20,7 @@ class QiblaScreen extends ConsumerStatefulWidget {
class _QiblaScreenState extends ConsumerState<QiblaScreen> { class _QiblaScreenState extends ConsumerState<QiblaScreen> {
static const _geomagneticChannel = static const _geomagneticChannel =
MethodChannel('com.jamshalat.diary/geomagnetic'); MethodChannel('com.jamshalat.app/geomagnetic');
static const double _alignmentThreshold = 3.0; static const double _alignmentThreshold = 3.0;
// Fallback simulated data for environments without compass hardware (like macOS emulator) // Fallback simulated data for environments without compass hardware (like macOS emulator)

View File

@@ -919,7 +919,7 @@ class _QuranMurattalScreenState extends ConsumerState<QuranMurattalScreen>
final url = _unsplashPhoto!['photographerUrl']; final url = _unsplashPhoto!['photographerUrl'];
if (url != null && url.isNotEmpty) { if (url != null && url.isNotEmpty) {
launchUrl(Uri.parse( launchUrl(Uri.parse(
'$url?utm_source=jamshalat_diary&utm_medium=referral')); '$url?utm_source=jamshalat&utm_medium=referral'));
} }
}, },
child: Text( child: Text(

View File

@@ -47,7 +47,7 @@ void main() async {
)); ));
await JustAudioBackground.init( await JustAudioBackground.init(
androidNotificationChannelId: 'com.jamshalat.diary.audio', androidNotificationChannelId: 'com.jamshalat.app.audio',
androidNotificationChannelName: 'Murattal Playback', androidNotificationChannelName: 'Murattal Playback',
androidNotificationOngoing: true, androidNotificationOngoing: true,
); );

View File

@@ -479,7 +479,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/jamshalat_diary.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/jamshalat_diary"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/jamshalat_diary.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/jamshalat_diary";
@@ -494,7 +494,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/jamshalat_diary.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/jamshalat_diary"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/jamshalat_diary.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/jamshalat_diary";
@@ -509,7 +509,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/jamshalat_diary.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/jamshalat_diary"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/jamshalat_diary.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/jamshalat_diary";

View File

@@ -8,7 +8,7 @@
PRODUCT_NAME = jamshalat_diary PRODUCT_NAME = jamshalat_diary
// The application's bundle identifier // The application's bundle identifier
PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.jamshalatDiary PRODUCT_BUNDLE_IDENTIFIER = com.jamshalat.app
// The copyright displayed in application information // The copyright displayed in application information
PRODUCT_COPYRIGHT = Copyright © 2026 com.jamshalat. All rights reserved. PRODUCT_COPYRIGHT = Copyright © 2026 com.jamshalat. All rights reserved.

View File

@@ -6,6 +6,8 @@
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleDisplayName</key>
<string>JamShalat</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string></string> <string></string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@@ -13,7 +15,7 @@
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string> <string>JamShalat</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>

View File

@@ -18,18 +18,18 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta content="IE=Edge" http-equiv="X-UA-Compatible">
<meta name="description" content="A new Flutter project."> <meta name="description" content="JamShalat Muslim daily worship companion.">
<!-- iOS meta tags & icons --> <!-- iOS meta tags & icons -->
<meta name="mobile-web-app-capable" content="yes"> <meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="jamshalat_diary"> <meta name="apple-mobile-web-app-title" content="JamShalat">
<link rel="apple-touch-icon" href="icons/Icon-192.png"> <link rel="apple-touch-icon" href="icons/Icon-192.png">
<!-- Favicon --> <!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png"/> <link rel="icon" type="image/png" href="favicon.png"/>
<title>jamshalat_diary</title> <title>JamShalat</title>
<link rel="manifest" href="manifest.json"> <link rel="manifest" href="manifest.json">
</head> </head>
<body> <body>

View File

@@ -1,11 +1,11 @@
{ {
"name": "jamshalat_diary", "name": "JamShalat",
"short_name": "jamshalat_diary", "short_name": "JamShalat",
"start_url": ".", "start_url": ".",
"display": "standalone", "display": "standalone",
"background_color": "#0175C2", "background_color": "#0175C2",
"theme_color": "#0175C2", "theme_color": "#0175C2",
"description": "A new Flutter project.", "description": "JamShalat Muslim daily worship companion.",
"orientation": "portrait-primary", "orientation": "portrait-primary",
"prefer_related_applications": false, "prefer_related_applications": false,
"icons": [ "icons": [