├── linux ├── .gitignore ├── main.cc ├── flutter │ ├── generated_plugin_registrant.h │ ├── generated_plugin_registrant.cc │ ├── generated_plugins.cmake │ └── CMakeLists.txt └── my_application.h ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── FEATURE-REQUEST.yml │ └── BUG-REPORT.yml ├── FUNDING.yml ├── workflows │ ├── pr-lint.yml │ └── ci.yml ├── CODEOWNERS ├── dependabot.yml ├── SECURITY.md ├── pull_request_template.md ├── SUPPORT.md └── CODE_OF_CONDUCT.md ├── ios ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-38x38@2x.png │ │ │ ├── Icon-App-38x38@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-50x50@1x.png │ │ │ ├── Icon-App-50x50@2x.png │ │ │ ├── Icon-App-57x57@1x.png │ │ │ ├── Icon-App-57x57@2x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-64x64@2x.png │ │ │ ├── Icon-App-64x64@3x.png │ │ │ ├── Icon-App-68x68@2x.png │ │ │ ├── Icon-App-72x72@1x.png │ │ │ ├── Icon-App-72x72@2x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ ├── Icon-App-Dark-20x20@2x.png │ │ │ ├── Icon-App-Dark-20x20@3x.png │ │ │ ├── Icon-App-Dark-29x29@2x.png │ │ │ ├── Icon-App-Dark-29x29@3x.png │ │ │ ├── Icon-App-Dark-38x38@2x.png │ │ │ ├── Icon-App-Dark-38x38@3x.png │ │ │ ├── Icon-App-Dark-40x40@2x.png │ │ │ ├── Icon-App-Dark-40x40@3x.png │ │ │ ├── Icon-App-Dark-60x60@2x.png │ │ │ ├── Icon-App-Dark-60x60@3x.png │ │ │ ├── Icon-App-Dark-64x64@2x.png │ │ │ ├── Icon-App-Dark-64x64@3x.png │ │ │ ├── Icon-App-Dark-68x68@2x.png │ │ │ ├── Icon-App-Dark-76x76@2x.png │ │ │ ├── Icon-App-Tinted-20x20@2x.png │ │ │ ├── Icon-App-Tinted-20x20@3x.png │ │ │ ├── Icon-App-Tinted-29x29@2x.png │ │ │ ├── Icon-App-Tinted-29x29@3x.png │ │ │ ├── Icon-App-Tinted-38x38@2x.png │ │ │ ├── Icon-App-Tinted-38x38@3x.png │ │ │ ├── Icon-App-Tinted-40x40@2x.png │ │ │ ├── Icon-App-Tinted-40x40@3x.png │ │ │ ├── Icon-App-Tinted-60x60@2x.png │ │ │ ├── Icon-App-Tinted-60x60@3x.png │ │ │ ├── Icon-App-Tinted-64x64@2x.png │ │ │ ├── Icon-App-Tinted-64x64@3x.png │ │ │ ├── Icon-App-Tinted-68x68@2x.png │ │ │ ├── Icon-App-Tinted-76x76@2x.png │ │ │ ├── Icon-App-Dark-1024x1024@1x.png │ │ │ ├── Icon-App-Dark-83.5x83.5@2x.png │ │ │ ├── Icon-App-Tinted-1024x1024@1x.png │ │ │ └── Icon-App-Tinted-83.5x83.5@2x.png │ │ ├── BrandingImage.imageset │ │ │ ├── BrandingImage.png │ │ │ ├── BrandingImage@2x.png │ │ │ ├── BrandingImage@3x.png │ │ │ └── Contents.json │ │ └── LaunchBackground.imageset │ │ │ ├── background.png │ │ │ └── Contents.json │ ├── APIKey.plist.example │ ├── Runner.entitlements │ ├── KeyManager.swift │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Settings.bundle │ ├── en.lproj │ │ └── Root.strings │ └── Root.plist ├── Runner.xcodeproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── RunnerTests │ └── RunnerTests.swift ├── .gitignore └── Podfile ├── web ├── favicon.png ├── icons │ ├── Icon-192.png │ ├── Icon-512.png │ ├── Icon-maskable-192.png │ └── Icon-maskable-512.png ├── manifest.json └── index.html ├── android ├── gradle.properties ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── drawable-hdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── branding.png │ │ │ │ │ ├── android12splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-mdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── branding.png │ │ │ │ │ ├── android12splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── branding.png │ │ │ │ │ ├── android12splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable │ │ │ │ │ ├── background.png │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21 │ │ │ │ │ ├── background.png │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── branding.png │ │ │ │ │ ├── android12splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── branding.png │ │ │ │ │ ├── android12splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── values-ar │ │ │ │ │ └── Strings.xml │ │ │ │ ├── values-de │ │ │ │ │ └── Strings.xml │ │ │ │ ├── values-en │ │ │ │ │ └── Strings.xml │ │ │ │ ├── values-fr │ │ │ │ │ └── Strings.xml │ │ │ │ ├── values-id │ │ │ │ │ └── Strings.xml │ │ │ │ ├── values-ms │ │ │ │ │ └── Strings.xml │ │ │ │ ├── values-pt │ │ │ │ │ └── Strings.xml │ │ │ │ ├── values │ │ │ │ │ ├── Strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── values-pt-rBR │ │ │ │ │ └── Strings.xml │ │ │ │ ├── values-pt-rPT │ │ │ │ │ └── Strings.xml │ │ │ │ ├── drawable-hdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-mdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-night-hdpi │ │ │ │ │ └── android12splash.png │ │ │ │ ├── drawable-night-mdpi │ │ │ │ │ └── android12splash.png │ │ │ │ ├── drawable-night-xhdpi │ │ │ │ │ └── android12splash.png │ │ │ │ ├── drawable-xhdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-night-xxhdpi │ │ │ │ │ └── android12splash.png │ │ │ │ ├── drawable-night-xxxhdpi │ │ │ │ │ └── android12splash.png │ │ │ │ ├── drawable-xxhdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-xxxhdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-night-hdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-night-mdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-night-xhdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-night-xxhdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── drawable-night-xxxhdpi-v31 │ │ │ │ │ └── android12branding.png │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ └── ic_launcher.xml │ │ │ │ ├── values-night │ │ │ │ │ └── styles.xml │ │ │ │ ├── values-v31 │ │ │ │ │ └── styles.xml │ │ │ │ └── values-night-v31 │ │ │ │ │ └── styles.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── towardsikhlaas │ │ │ │ │ └── simplyqibla │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle ├── key.properties.example ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── build.gradle └── settings.gradle ├── assets ├── fonts │ ├── Inter-Bold.ttf │ ├── Inter-Black.ttf │ └── Inter-Regular.ttf ├── app-icon │ ├── app-icon.png │ ├── background.png │ ├── foreground.png │ ├── app-icon-ios.png │ ├── app-icon-ios-dark.png │ └── app-icon-ios-tinted.png ├── brand │ ├── branding-ti.png │ ├── splash-circle.png │ └── branding-ti-ios.png ├── repo │ └── multi-device.png └── illustrations │ ├── support-illustration.png │ ├── usage-illustration.png │ └── location-illustration.png ├── l10n.yaml ├── macos ├── Runner │ ├── Configs │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ ├── Warnings.xcconfig │ │ └── AppInfo.xcconfig │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ ├── app_icon_1024.png │ │ │ ├── app_icon_128.png │ │ │ ├── app_icon_16.png │ │ │ ├── app_icon_256.png │ │ │ ├── app_icon_32.png │ │ │ ├── app_icon_512.png │ │ │ ├── app_icon_64.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Release.entitlements │ ├── DebugProfile.entitlements │ ├── MainFlutterWindow.swift │ └── Info.plist ├── .gitignore ├── Flutter │ ├── Flutter-Debug.xcconfig │ ├── Flutter-Release.xcconfig │ └── GeneratedPluginRegistrant.swift ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── RunnerTests │ └── RunnerTests.swift └── Podfile ├── windows ├── runner │ ├── resources │ │ └── app_icon.ico │ ├── resource.h │ ├── utils.h │ ├── runner.exe.manifest │ ├── flutter_window.h │ ├── main.cpp │ ├── CMakeLists.txt │ ├── utils.cpp │ ├── flutter_window.cpp │ ├── Runner.rc │ └── win32_window.h ├── .gitignore └── flutter │ ├── generated_plugin_registrant.h │ ├── generated_plugin_registrant.cc │ └── generated_plugins.cmake ├── lib ├── globals │ └── globals.dart ├── helpers │ ├── url_launcher_helper.dart │ ├── shared_preferences_helper.dart │ └── maps_renderer_helper.dart ├── widgets │ ├── sq_app_bar_title.dart │ ├── link_icon_button.dart │ ├── sq_app_bar.dart │ ├── info_button.dart │ ├── coordinates_form_bar.dart │ ├── center_console.dart │ └── user_location_icon.dart ├── styles │ └── style.dart ├── pages │ └── map_page.dart ├── constants │ └── constants.dart ├── theme │ └── theme.dart ├── main.dart └── l10n │ ├── app_ar.arb │ ├── app_id.arb │ ├── app_ms.arb │ ├── app_pt.arb │ ├── app_pt_BR.arb │ ├── app_pt_PT.arb │ ├── app_de.arb │ ├── app_fr.arb │ ├── app_localizations_ar.dart │ ├── app_localizations_en.dart │ ├── app_localizations_id.dart │ └── app_localizations_ms.dart ├── flutter_launcher_icons.yaml ├── .gitignore ├── analysis_options.yaml ├── .metadata └── test └── map_page_test.dart /linux/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: TowardsIkhlaas 2 | ko_fi: TowardsIkhlaas 3 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/web/icons/Icon-512.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4G 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /assets/fonts/Inter-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/fonts/Inter-Bold.ttf -------------------------------------------------------------------------------- /l10n.yaml: -------------------------------------------------------------------------------- 1 | arb-dir: lib/l10n 2 | template-arb-file: app_en.arb 3 | output-localization-file: app_localizations.dart 4 | -------------------------------------------------------------------------------- /assets/app-icon/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/app-icon/app-icon.png -------------------------------------------------------------------------------- /assets/app-icon/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/app-icon/background.png -------------------------------------------------------------------------------- /assets/app-icon/foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/app-icon/foreground.png -------------------------------------------------------------------------------- /assets/brand/branding-ti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/brand/branding-ti.png -------------------------------------------------------------------------------- /assets/brand/splash-circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/brand/splash-circle.png -------------------------------------------------------------------------------- /assets/fonts/Inter-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/fonts/Inter-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/fonts/Inter-Regular.ttf -------------------------------------------------------------------------------- /assets/repo/multi-device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/repo/multi-device.png -------------------------------------------------------------------------------- /macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /assets/app-icon/app-icon-ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/app-icon/app-icon-ios.png -------------------------------------------------------------------------------- /assets/brand/branding-ti-ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/brand/branding-ti-ios.png -------------------------------------------------------------------------------- /macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/dgph 7 | **/xcuserdata/ 8 | -------------------------------------------------------------------------------- /assets/app-icon/app-icon-ios-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/app-icon/app-icon-ios-dark.png -------------------------------------------------------------------------------- /windows/runner/resources/app_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/windows/runner/resources/app_icon.ico -------------------------------------------------------------------------------- /assets/app-icon/app-icon-ios-tinted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/app-icon/app-icon-ios-tinted.png -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Settings.bundle/en.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Settings.bundle/en.lproj/Root.strings -------------------------------------------------------------------------------- /assets/illustrations/support-illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/illustrations/support-illustration.png -------------------------------------------------------------------------------- /assets/illustrations/usage-illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/illustrations/usage-illustration.png -------------------------------------------------------------------------------- /assets/illustrations/location-illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/assets/illustrations/location-illustration.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable/background.png -------------------------------------------------------------------------------- /android/key.properties.example: -------------------------------------------------------------------------------- 1 | # This is an example of how to define the key.properties file for this project. 2 | GOOGLE_MAPS_API_KEY_ANDROID="maps-api-key" 3 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-hdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-mdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-v21/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xhdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-ar/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | سمبلي قبلة 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-de/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-en/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-fr/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-id/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-ms/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-pt/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxhdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxxhdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-pt-rBR/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-pt-rPT/Strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SimplyQibla 4 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /lib/globals/globals.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | final GlobalKey snackbarKey = 4 | GlobalKey(); 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-hdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-mdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxxhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-hdpi-v31/android12branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-mdpi-v31/android12branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-hdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-hdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-mdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-mdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-xhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xhdpi-v31/android12branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xxhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-68x68@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-68x68@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-68x68@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-68x68@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-76x76@2x.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-68x68@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-68x68@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-83.5x83.5@2x.png -------------------------------------------------------------------------------- /linux/main.cc: -------------------------------------------------------------------------------- 1 | #include "my_application.h" 2 | 3 | int main(int argc, char** argv) { 4 | g_autoptr(MyApplication) app = my_application_new(); 5 | return g_application_run(G_APPLICATION(app), argc, argv); 6 | } 7 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TowardsIkhlaas/simply_qibla/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-83.5x83.5@2x.png -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/towardsikhlaas/simplyqibla/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.towardsikhlaas.simplyqibla 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() 6 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /lib/helpers/url_launcher_helper.dart: -------------------------------------------------------------------------------- 1 | import 'package:url_launcher/url_launcher.dart'; 2 | 3 | Future launchUrlHelper(Uri url) async { 4 | if (!await launchUrl(url)) { 5 | throw Exception('Could not launch $url'); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip 6 | -------------------------------------------------------------------------------- /macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @NSApplicationMain 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Settings.bundle/Root.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | StringsTable 6 | Root 7 | PreferenceSpecifiers 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /macos/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import FlutterMacOS 2 | import Cocoa 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | keys.properties 13 | **/*.keystore 14 | **/*.jks 15 | -------------------------------------------------------------------------------- /windows/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral/ 2 | 3 | # Visual Studio user-specific files. 4 | *.suo 5 | *.user 6 | *.userosscache 7 | *.sln.docstates 8 | 9 | # Visual Studio build-related files. 10 | x64/ 11 | x86/ 12 | 13 | # Visual Studio cache files 14 | # files ending in .cache can be ignored 15 | *.[Cc]ache 16 | # but keep track of directories ending in .cache 17 | !*.[Cc]ache/ 18 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner/APIKey.plist.example: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | GoogleMapsApiKeyiOS 8 | maps-api-key 9 | 10 | 11 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void fl_register_plugins(FlPluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /windows/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void RegisterPlugins(flutter::PluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | rootProject.buildDir = '../build' 9 | subprojects { 10 | project.buildDir = "${rootProject.buildDir}/${project.name}" 11 | } 12 | subprojects { 13 | project.evaluationDependsOn(':app') 14 | } 15 | 16 | tasks.register("clean", Delete) { 17 | delete rootProject.buildDir 18 | } 19 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.network.server 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner/Runner.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.user-fonts 8 | 9 | app-usage 10 | system-installation 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "background.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.github/workflows/pr-lint.yml: -------------------------------------------------------------------------------- 1 | name: "Lint PR" 2 | 3 | on: 4 | pull_request_target: 5 | types: 6 | - opened 7 | - edited 8 | - synchronize 9 | - reopened 10 | 11 | permissions: 12 | pull-requests: read 13 | 14 | jobs: 15 | main: 16 | name: Validate PR title 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: amannn/action-semantic-pull-request@v5 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | -------------------------------------------------------------------------------- /linux/my_application.h: -------------------------------------------------------------------------------- 1 | #ifndef FLUTTER_MY_APPLICATION_H_ 2 | #define FLUTTER_MY_APPLICATION_H_ 3 | 4 | #include 5 | 6 | G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, 7 | GtkApplication) 8 | 9 | /** 10 | * my_application_new: 11 | * 12 | * Creates a new Flutter-based application. 13 | * 14 | * Returns: a new #MyApplication. 15 | */ 16 | MyApplication* my_application_new(); 17 | 18 | #endif // FLUTTER_MY_APPLICATION_H_ 19 | -------------------------------------------------------------------------------- /macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | 11 | RegisterGeneratedPlugins(registry: flutterViewController) 12 | 13 | super.awakeFromNib() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # https://help.github.com/articles/about-codeowners/ 2 | 3 | # These owners will be the default owners for everything in 4 | # the repo. Unless a later match takes precedence, they will 5 | # be requested for review when someone opens a PR. 6 | * @ahmd-sh 7 | 8 | # Order is important; the last matching pattern takes the most 9 | # precedence. When someone opens a PR that only modifies 10 | # .yml files, only the following people and NOT the global 11 | # owner(s) will be requested for a review. -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /windows/runner/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by Runner.rc 4 | // 5 | #define IDI_APP_ICON 101 6 | 7 | // Next default values for new objects 8 | // 9 | #ifdef APSTUDIO_INVOKED 10 | #ifndef APSTUDIO_READONLY_SYMBOLS 11 | #define _APS_NEXT_RESOURCE_VALUE 102 12 | #define _APS_NEXT_COMMAND_VALUE 40001 13 | #define _APS_NEXT_CONTROL_VALUE 1001 14 | #define _APS_NEXT_SYMED_VALUE 101 15 | #endif 16 | #endif 17 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.cc: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #include "generated_plugin_registrant.h" 8 | 9 | #include 10 | 11 | void fl_register_plugins(FlPluginRegistry* registry) { 12 | g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = 13 | fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); 14 | url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); 15 | } 16 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "LaunchImage.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "LaunchImage@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "LaunchImage@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/BrandingImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "BrandingImage.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "BrandingImage@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "BrandingImage@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/KeyManager.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | struct KeyManager { 4 | private let keyFilePath = Bundle.main.path(forResource: "APIKey", ofType: "plist") 5 | func getKeys() -> NSDictionary? { 6 | guard let keyFilePath = keyFilePath else { 7 | return nil 8 | } 9 | return NSDictionary(contentsOfFile: keyFilePath) 10 | } 11 | 12 | func getValue(key: String) -> AnyObject? { 13 | guard let keys = getKeys() else { 14 | return nil 15 | } 16 | return keys[key]! as AnyObject 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "pub" 9 | directory: "/" 10 | target-branch: "develop" 11 | schedule: 12 | interval: "weekly" 13 | commit-message: 14 | prefix: "chore" 15 | include: "scope" 16 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | import GoogleMaps 4 | 5 | @main 6 | @objc class AppDelegate: FlutterAppDelegate { 7 | override func application( 8 | _ application: UIApplication, 9 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 10 | ) -> Bool { 11 | if let APIKEY = KeyManager().getValue(key: "GoogleMapsApiKeyiOS") as? String { 12 | GMSServices.provideAPIKey(APIKEY) 13 | } 14 | GeneratedPluginRegistrant.register(with: self) 15 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = simply_qibla 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = com.towardsikhlaas.simplyqibla 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. 15 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | branches: ["master", "develop"] 6 | 7 | jobs: 8 | flutter_test: 9 | name: Run flutter analyze and test 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v4 14 | 15 | - uses: actions/setup-java@v2 16 | with: 17 | java-version: "17" 18 | distribution: "adopt" 19 | 20 | - uses: subosito/flutter-action@v2 21 | with: 22 | channel: "stable" 23 | 24 | - name: Install dependencies 25 | run: flutter pub get 26 | 27 | - name: Analyze project source 28 | run: flutter analyze 29 | 30 | - name: Run tests 31 | run: flutter test 32 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | If you discover a security issue, please bring it to our attention right away! 4 | 5 | ## Reporting a Vulnerability 6 | 7 | Please **DO NOT** file a public issue to report a security vulberability, instead send your report privately to **towardsikhlaas+oss@gmail.com**. This will help ensure that any vulnerabilities that are found can be [disclosed responsibly](https://en.wikipedia.org/wiki/Responsible_disclosure) to any affected parties. 8 | 9 | ## Supported Versions 10 | 11 | Project versions that are currently being supported with security updates vary per project. 12 | Please see specific project repositories for details. 13 | If nothing is specified, only the latest major versions are supported. 14 | -------------------------------------------------------------------------------- /windows/runner/utils.h: -------------------------------------------------------------------------------- 1 | #ifndef RUNNER_UTILS_H_ 2 | #define RUNNER_UTILS_H_ 3 | 4 | #include 5 | #include 6 | 7 | // Creates a console for the process, and redirects stdout and stderr to 8 | // it for both the runner and the Flutter library. 9 | void CreateAndAttachConsole(); 10 | 11 | // Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string 12 | // encoded in UTF-8. Returns an empty std::string on failure. 13 | std::string Utf8FromUtf16(const wchar_t* utf16_string); 14 | 15 | // Gets the command line arguments passed in as a std::vector, 16 | // encoded in UTF-8. Returns an empty std::vector on failure. 17 | std::vector GetCommandLineArguments(); 18 | 19 | #endif // RUNNER_UTILS_H_ 20 | -------------------------------------------------------------------------------- /windows/flutter/generated_plugin_registrant.cc: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #include "generated_plugin_registrant.h" 8 | 9 | #include 10 | #include 11 | #include 12 | 13 | void RegisterPlugins(flutter::PluginRegistry* registry) { 14 | GeolocatorWindowsRegisterWithRegistrar( 15 | registry->GetRegistrarForPlugin("GeolocatorWindows")); 16 | SharePlusWindowsPluginCApiRegisterWithRegistrar( 17 | registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); 18 | UrlLauncherWindowsRegisterWithRegistrar( 19 | registry->GetRegistrarForPlugin("UrlLauncherWindows")); 20 | } 21 | -------------------------------------------------------------------------------- /flutter_launcher_icons.yaml: -------------------------------------------------------------------------------- 1 | flutter_launcher_icons: 2 | # dart run flutter_launcher_icons -f flutter_launcher_icons.yaml 3 | image_path: "assets/app-icon/app-icon.png" 4 | 5 | # Android specific config 6 | android: true 7 | min_sdk_android: 21 8 | image_path_android: "assets/app-icon/app-icon.png" 9 | adaptive_icon_background: "assets/app-icon/background.png" 10 | adaptive_icon_foreground: "assets/app-icon/foreground.png" 11 | 12 | # iOS specific config 13 | ios: true 14 | remove_alpha_ios: true 15 | image_path_ios: "assets/app-icon/app-icon-ios.png" 16 | # iOS 18 and above 17 | image_path_ios_dark_transparent: "assets/app-icon/app-icon-ios-dark.png" 18 | image_path_ios_tinted_grayscale: "assets/app-icon/app-icon-ios-tinted.png" 19 | desaturate_tinted_to_grayscale_ios: false 20 | -------------------------------------------------------------------------------- /lib/helpers/shared_preferences_helper.dart: -------------------------------------------------------------------------------- 1 | import 'package:shared_preferences/shared_preferences.dart'; 2 | 3 | Future getOnboardingStatus() async { 4 | final SharedPreferences prefs = await SharedPreferences.getInstance(); 5 | await prefs.reload(); 6 | return (prefs.getBool('hasSeenOnboarding') ?? false); 7 | } 8 | 9 | Future setOnboardingStatus(bool value) async { 10 | final SharedPreferences prefs = await SharedPreferences.getInstance(); 11 | await prefs.setBool('hasSeenOnboarding', value); 12 | } 13 | 14 | Future getLaunchCount() async { 15 | final SharedPreferences prefs = await SharedPreferences.getInstance(); 16 | await prefs.reload(); 17 | 18 | int launchCount = prefs.getInt('launchCount') ?? 0; 19 | launchCount++; 20 | prefs.setInt('launchCount', launchCount); 21 | 22 | return launchCount; 23 | } 24 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugins.cmake: -------------------------------------------------------------------------------- 1 | # 2 | # Generated file, do not edit. 3 | # 4 | 5 | list(APPEND FLUTTER_PLUGIN_LIST 6 | url_launcher_linux 7 | ) 8 | 9 | list(APPEND FLUTTER_FFI_PLUGIN_LIST 10 | ) 11 | 12 | set(PLUGIN_BUNDLED_LIBRARIES) 13 | 14 | foreach(plugin ${FLUTTER_PLUGIN_LIST}) 15 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) 16 | target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) 17 | list(APPEND PLUGIN_BUNDLED_LIBRARIES $) 18 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) 19 | endforeach(plugin) 20 | 21 | foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) 22 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) 23 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) 24 | endforeach(ffi_plugin) 25 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 14.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /lib/widgets/sq_app_bar_title.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_tabler_icons/flutter_tabler_icons.dart'; 3 | import 'package:simply_qibla/l10n/app_localizations.dart'; 4 | import 'package:simply_qibla/styles/style.dart'; 5 | 6 | class SQAppBarTitle extends StatelessWidget { 7 | const SQAppBarTitle({super.key}); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Row( 12 | children: [ 13 | const Icon( 14 | TablerIcons.location, 15 | size: AppDimensions.iconSizeLg, 16 | color: Colors.white, 17 | ), 18 | Text( 19 | AppLocalizations.of(context)!.appNamePascalCase, 20 | style: Theme.of(context).textTheme.titleLarge!.copyWith( 21 | color: Colors.white, 22 | ), 23 | ) 24 | ], 25 | ); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | # Checklist 2 | 3 | * [ ] Did you double check which branch your PR is merging changes to? 4 | * [ ] Have you followed the guidelines in our [CONTRIBUTING](../../blob/master/.github/CONTRIBUTING.md) document? 5 | * [ ] Have you checked to ensure there aren't other open [Pull Requests](../../pulls) for the same update/change? 6 | * [ ] Does your submission pass lint and tests? 7 | * [ ] Does your commit and commit message style matches our [requested structure](../../blob/master/.github/CONTRIBUTING.md#memo-writing-commit-messages)? 8 | 9 | # Description 10 | 11 | ## 🔥 What? 12 | 13 | 14 | ## 😲 How? 15 | 16 | 17 | ## 🤔 Why? 18 | 19 | 20 | ## 📸 Screenshots (if applicable) 21 | 22 | 23 | ## 💭 Anything Else? 24 | Nope. 25 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def flutterSdkPath = { 3 | def properties = new Properties() 4 | file("local.properties").withInputStream { properties.load(it) } 5 | def flutterSdkPath = properties.getProperty("flutter.sdk") 6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 7 | return flutterSdkPath 8 | } 9 | settings.ext.flutterSdkPath = flutterSdkPath() 10 | 11 | includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") 12 | 13 | repositories { 14 | google() 15 | mavenCentral() 16 | gradlePluginPortal() 17 | } 18 | } 19 | 20 | plugins { 21 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 22 | id "com.android.application" version '8.12.1' apply false 23 | id "org.jetbrains.kotlin.android" version "2.1.0" apply false 24 | } 25 | 26 | include ":app" 27 | -------------------------------------------------------------------------------- /lib/styles/style.dart: -------------------------------------------------------------------------------- 1 | class AppPadding { 2 | static const double standard = 20.0; 3 | static const double appBarTop = 30.0; 4 | static const double bottomNav = 45.0; 5 | static const double appBarActionRight = 12.0; 6 | } 7 | 8 | class AppDimensions { 9 | static const double appBarPreferredSize = 80.0; 10 | static const double pillBarSize = 50.0; 11 | static const double iconSizeSm = 18.0; 12 | static const double iconSizeMd = 26.0; 13 | static const double iconSizeLg = 32.0; 14 | static const double iconSizeXl = 50.0; 15 | static const double borderRadiusXs = 4.0; 16 | static const double borderRadiusSm = 8.0; 17 | static const double borderRadiusMd = 12.0; 18 | static const double borderRadiusLg = 16.0; 19 | static const double borderRadiusXl = 28.0; 20 | static const double suggestionsHeightMultiplier = 0.3; 21 | } 22 | 23 | class AppStyles { 24 | static const double shadowOpacity = 0.1; 25 | } 26 | -------------------------------------------------------------------------------- /lib/widgets/link_icon_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class LinkIconButton extends StatelessWidget { 4 | final VoidCallback onPressed; 5 | final String labelText; 6 | final Icon leadingIcon; 7 | final Color? buttonForegroundColor; 8 | final Color? buttonBackgroundColor; 9 | 10 | const LinkIconButton({ 11 | required this.onPressed, 12 | required this.labelText, 13 | required this.leadingIcon, 14 | this.buttonForegroundColor, 15 | this.buttonBackgroundColor, 16 | super.key, 17 | }); 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return ElevatedButton.icon( 22 | label: Text(labelText), 23 | onPressed: onPressed, 24 | icon: leadingIcon, 25 | style: ElevatedButton.styleFrom( 26 | foregroundColor: buttonForegroundColor, 27 | backgroundColor: buttonBackgroundColor, 28 | )); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /windows/flutter/generated_plugins.cmake: -------------------------------------------------------------------------------- 1 | # 2 | # Generated file, do not edit. 3 | # 4 | 5 | list(APPEND FLUTTER_PLUGIN_LIST 6 | geolocator_windows 7 | share_plus 8 | url_launcher_windows 9 | ) 10 | 11 | list(APPEND FLUTTER_FFI_PLUGIN_LIST 12 | ) 13 | 14 | set(PLUGIN_BUNDLED_LIBRARIES) 15 | 16 | foreach(plugin ${FLUTTER_PLUGIN_LIST}) 17 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) 18 | target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) 19 | list(APPEND PLUGIN_BUNDLED_LIBRARIES $) 20 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) 21 | endforeach(plugin) 22 | 23 | foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) 24 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) 25 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) 26 | endforeach(ffi_plugin) 27 | -------------------------------------------------------------------------------- /windows/runner/runner.exe.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PerMonitorV2 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .build/ 9 | .buildlog/ 10 | .history 11 | .svn/ 12 | .swiftpm/ 13 | migrate_working_dir/ 14 | .env 15 | .env.local 16 | android/keys.properties 17 | ios/Runner/APIKey.plist 18 | 19 | # IntelliJ related 20 | *.iml 21 | *.ipr 22 | *.iws 23 | .idea/ 24 | 25 | # The .vscode folder contains launch configuration and tasks you configure in 26 | # VS Code which you may wish to be included in version control, so this line 27 | # is commented out by default. 28 | #.vscode/ 29 | 30 | # Flutter/Dart/Pub related 31 | **/doc/api/ 32 | **/ios/Flutter/.last_build_id 33 | .dart_tool/ 34 | .flutter-plugins 35 | .flutter-plugins-dependencies 36 | .pub-cache/ 37 | .pub/ 38 | /build/ 39 | 40 | # Symbolication related 41 | app.*.symbols 42 | 43 | # Obfuscation related 44 | app.*.map.json 45 | 46 | # Android Studio will place build artifacts here 47 | /android/app/debug 48 | /android/app/profile 49 | /android/app/release 50 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simply_qibla", 3 | "short_name": "simply_qibla", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /lib/widgets/sq_app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:simply_qibla/styles/style.dart'; 3 | import 'package:simply_qibla/widgets/info_button.dart'; 4 | import 'package:simply_qibla/widgets/sq_app_bar_title.dart'; 5 | 6 | class SQAppBar extends StatelessWidget implements PreferredSizeWidget { 7 | const SQAppBar({super.key}); 8 | 9 | @override 10 | Size get preferredSize => const Size.fromHeight(AppDimensions.appBarPreferredSize); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return Padding( 15 | padding: const EdgeInsets.only(top: AppPadding.appBarTop), 16 | child: AppBar( 17 | backgroundColor: Colors.transparent, 18 | elevation: 0.0, 19 | title: const SQAppBarTitle(), 20 | titleSpacing: AppPadding.standard, 21 | actions: const [ 22 | Padding( 23 | padding: EdgeInsets.only(right: AppPadding.appBarActionRight), 24 | child: InfoButton(), 25 | ) 26 | ], 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /windows/runner/flutter_window.h: -------------------------------------------------------------------------------- 1 | #ifndef RUNNER_FLUTTER_WINDOW_H_ 2 | #define RUNNER_FLUTTER_WINDOW_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include 8 | 9 | #include "win32_window.h" 10 | 11 | // A window that does nothing but host a Flutter view. 12 | class FlutterWindow : public Win32Window { 13 | public: 14 | // Creates a new FlutterWindow hosting a Flutter view running |project|. 15 | explicit FlutterWindow(const flutter::DartProject& project); 16 | virtual ~FlutterWindow(); 17 | 18 | protected: 19 | // Win32Window: 20 | bool OnCreate() override; 21 | void OnDestroy() override; 22 | LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, 23 | LPARAM const lparam) noexcept override; 24 | 25 | private: 26 | // The project to run. 27 | flutter::DartProject project_; 28 | 29 | // The Flutter instance hosted by this window. 30 | std::unique_ptr flutter_controller_; 31 | }; 32 | 33 | #endif // RUNNER_FLUTTER_WINDOW_H_ 34 | -------------------------------------------------------------------------------- /macos/Flutter/GeneratedPluginRegistrant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | import FlutterMacOS 6 | import Foundation 7 | 8 | import geolocator_apple 9 | import in_app_review 10 | import package_info_plus 11 | import path_provider_foundation 12 | import share_plus 13 | import shared_preferences_foundation 14 | import url_launcher_macos 15 | 16 | func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 17 | GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) 18 | InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin")) 19 | FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) 20 | PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) 21 | SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) 22 | SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) 23 | UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) 24 | } 25 | -------------------------------------------------------------------------------- /macos/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | $(PRODUCT_COPYRIGHT) 27 | NSMainNibFile 28 | MainMenu 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /lib/pages/map_page.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer' as developer; 2 | import 'dart:math'; 3 | 4 | import 'package:flutter/foundation.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_compass/flutter_compass.dart'; 7 | import 'package:flutter_tabler_icons/flutter_tabler_icons.dart'; 8 | import 'package:geolocator/geolocator.dart'; 9 | import 'package:google_maps_flutter/google_maps_flutter.dart'; 10 | import 'package:in_app_review/in_app_review.dart'; 11 | import 'package:simply_qibla/constants/constants.dart'; 12 | import 'package:simply_qibla/globals/globals.dart'; 13 | import 'package:simply_qibla/helpers/shared_preferences_helper.dart'; 14 | import 'package:simply_qibla/l10n/app_localizations.dart'; 15 | import 'package:simply_qibla/styles/style.dart'; 16 | import 'package:simply_qibla/widgets/center_console.dart'; 17 | import 'package:simply_qibla/widgets/coordinates_form_bar.dart'; 18 | import 'package:simply_qibla/widgets/sq_app_bar.dart'; 19 | import 'package:simply_qibla/widgets/user_location_icon.dart'; 20 | 21 | part 'map_page_state.dart'; 22 | 23 | class MapPage extends StatefulWidget { 24 | const MapPage({super.key}); 25 | 26 | @override 27 | MapPageState createState() => MapPageState(); 28 | } 29 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /lib/helpers/maps_renderer_helper.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:google_maps_flutter_android/google_maps_flutter_android.dart'; 3 | import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; 4 | 5 | Completer? _initializedRendererCompleter; 6 | 7 | /// Initializes map renderer to the `latest` renderer type for Android platform. 8 | /// 9 | /// The renderer must be requested before creating GoogleMap instances, 10 | /// as the renderer can be initialized only once per application context. 11 | 12 | Future initializeMapRenderer() async { 13 | if (_initializedRendererCompleter != null) { 14 | return _initializedRendererCompleter!.future; 15 | } 16 | 17 | final Completer completer = 18 | Completer(); 19 | _initializedRendererCompleter = completer; 20 | 21 | final GoogleMapsFlutterPlatform mapsImplementation = 22 | GoogleMapsFlutterPlatform.instance; 23 | if (mapsImplementation is GoogleMapsFlutterAndroid) { 24 | unawaited(mapsImplementation 25 | .initializeWithRenderer(AndroidMapRenderer.latest) 26 | .then((AndroidMapRenderer initializedRenderer) => 27 | completer.complete(initializedRenderer))); 28 | } else { 29 | completer.complete(null); 30 | } 31 | 32 | return completer.future; 33 | } 34 | -------------------------------------------------------------------------------- /lib/widgets/info_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_tabler_icons/flutter_tabler_icons.dart'; 3 | import 'package:package_info_plus/package_info_plus.dart'; 4 | import 'package:simply_qibla/styles/style.dart'; 5 | import 'package:simply_qibla/widgets/info_modal.dart'; 6 | 7 | class InfoButton extends StatefulWidget { 8 | const InfoButton({super.key}); 9 | 10 | @override 11 | State createState() => _InfoButtonState(); 12 | } 13 | 14 | class _InfoButtonState extends State { 15 | late String _version; 16 | late String _buildNumber; 17 | 18 | @override 19 | void initState() { 20 | super.initState(); 21 | _getPackageInfo(); 22 | } 23 | 24 | void _getPackageInfo() async { 25 | PackageInfo packageInfo = await PackageInfo.fromPlatform(); 26 | 27 | setState(() { 28 | _version = packageInfo.version; 29 | _buildNumber = packageInfo.buildNumber; 30 | }); 31 | } 32 | 33 | @override 34 | Widget build(BuildContext context) { 35 | return IconButton( 36 | onPressed: () => showInfoModal(context, _version, _buildNumber), 37 | highlightColor: Colors.grey, 38 | icon: const Icon( 39 | TablerIcons.info_circle, 40 | size: AppDimensions.iconSizeMd, 41 | color: Colors.white, 42 | semanticLabel: 'Info Button', 43 | ), 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-v31/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night-v31/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /windows/runner/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "flutter_window.h" 6 | #include "utils.h" 7 | 8 | int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, 9 | _In_ wchar_t *command_line, _In_ int show_command) { 10 | // Attach to console when present (e.g., 'flutter run') or create a 11 | // new console when running with a debugger. 12 | if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { 13 | CreateAndAttachConsole(); 14 | } 15 | 16 | // Initialize COM, so that it is available for use in the library and/or 17 | // plugins. 18 | ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); 19 | 20 | flutter::DartProject project(L"data"); 21 | 22 | std::vector command_line_arguments = 23 | GetCommandLineArguments(); 24 | 25 | project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); 26 | 27 | FlutterWindow window(project); 28 | Win32Window::Point origin(10, 10); 29 | Win32Window::Size size(1280, 720); 30 | if (!window.Create(L"simply_qibla", origin, size)) { 31 | return EXIT_FAILURE; 32 | } 33 | window.SetQuitOnClose(true); 34 | 35 | ::MSG msg; 36 | while (::GetMessage(&msg, nullptr, 0, 0)) { 37 | ::TranslateMessage(&msg); 38 | ::DispatchMessage(&msg); 39 | } 40 | 41 | ::CoUninitialize(); 42 | return EXIT_SUCCESS; 43 | } 44 | -------------------------------------------------------------------------------- /macos/Podfile: -------------------------------------------------------------------------------- 1 | platform :osx, '10.14' 2 | 3 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 4 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 5 | 6 | project 'Runner', { 7 | 'Debug' => :debug, 8 | 'Profile' => :release, 9 | 'Release' => :release, 10 | } 11 | 12 | def flutter_root 13 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) 14 | unless File.exist?(generated_xcode_build_settings_path) 15 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" 16 | end 17 | 18 | File.foreach(generated_xcode_build_settings_path) do |line| 19 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 20 | return matches[1].strip if matches 21 | end 22 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" 23 | end 24 | 25 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 26 | 27 | flutter_macos_podfile_setup 28 | 29 | target 'Runner' do 30 | use_frameworks! 31 | use_modular_headers! 32 | 33 | flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) 34 | target 'RunnerTests' do 35 | inherit! :search_paths 36 | end 37 | end 38 | 39 | post_install do |installer| 40 | installer.pods_project.targets.each do |target| 41 | flutter_additional_macos_build_settings(target) 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "app_icon_16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "app_icon_32.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "app_icon_32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "app_icon_64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "app_icon_128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "app_icon_256.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "app_icon_256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "app_icon_512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "app_icon_512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "app_icon_1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Suggest an idea for SimplyQibla 3 | labels: [enhancement] 4 | body: 5 | - type: checkboxes 6 | id: checklist 7 | attributes: 8 | label: Checklist 9 | description: You should ensure the completion of the task before proceeding to check it off the checklist. Neglecting to do so may impede the efficiency of the issue resolution process. The developer has the right to delete the issue directly if you check the list blindly. 10 | options: 11 | - label: I've checked that there is no other issue about this feature request. 12 | required: true 13 | - label: This issue contains only one feature request. 14 | required: true 15 | - label: The title of this issue accurately describes the feature request. 16 | required: true 17 | 18 | - type: textarea 19 | id: feature-description 20 | attributes: 21 | label: Feature description 22 | description: What feature you want the app to have? Provide detailed description about what it should look like or where it should be added. 23 | validations: 24 | required: true 25 | 26 | - type: textarea 27 | id: why-is-the-feature-requested 28 | attributes: 29 | label: Why do you want this feature? 30 | description: Describe the problem or limitation that motivates you to want this feature to be added. 31 | validations: 32 | required: true 33 | 34 | - type: textarea 35 | id: additional-information 36 | attributes: 37 | label: Additional information 38 | description: Add any other context or screenshots about the feature request here. 39 | placeholder: | 40 | Additional details and attachments. 41 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at https://dart.dev/lints. 17 | # 18 | # Instead of disabling a lint rule for the entire project in the 19 | # section below, it can also be suppressed for a single line of code 20 | # or a specific dart file by using the `// ignore: name_of_lint` and 21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 22 | # producing the lint. 23 | rules: 24 | 25 | # Error rules 26 | avoid_print: true 27 | discarded_futures: true 28 | always_specify_types: true 29 | always_put_required_named_parameters_first: true 30 | avoid_types_as_parameter_names: true 31 | 32 | # Style rules 33 | 34 | prefer_single_quotes: true 35 | directives_ordering: true 36 | always_declare_return_types: true 37 | avoid_null_checks_in_equality_operators: true 38 | 39 | # Additional information about this file can be found at 40 | # https://dart.dev/guides/language/analysis-options 41 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '13.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | target 'RunnerTests' do 36 | inherit! :search_paths 37 | end 38 | end 39 | 40 | post_install do |installer| 41 | installer.pods_project.targets.each do |target| 42 | flutter_additional_ios_build_settings(target) 43 | if target.name == "geolocator_apple" 44 | target.build_configurations.each do |config| 45 | config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'BYPASS_PERMISSION_LOCATION_ALWAYS=1'] 46 | end 47 | end 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /lib/constants/constants.dart: -------------------------------------------------------------------------------- 1 | import 'package:google_maps_flutter/google_maps_flutter.dart'; 2 | 3 | class MapConstants { 4 | static const double zoomLevel = 19.0; 5 | static const int polylineWidth = 10; 6 | static const LatLng defaultPosition = LatLng( 7 | 21.41940349340265, 8 | 39.82562665088553, 9 | ); 10 | static const LatLng qiblaPosition = LatLng( 11 | 21.42253495661983, 12 | 39.82618860061329, 13 | ); 14 | } 15 | 16 | enum CenterConsoleState { 17 | centering, 18 | dragging, 19 | idle, 20 | } 21 | 22 | class AppStrings { 23 | // Links 24 | 25 | static const String githubUriPath = 26 | 'https://github.com/TowardsIkhlaas/simply_qibla/blob/master/.github/CONTRIBUTING.md'; 27 | static const String donateUriPath = 'https://ko-fi.com/TowardsIkhlaas'; 28 | static const String socialInstagramUriPath = 'https://www.instagram.com/towardsikhlaas'; 29 | static const String shareContentText = 30 | 'As salaam alaykum warahmatullahi wabarakatuh! Check out this beautiful and accurate Qibla app'; 31 | static const String landingPageLink = 'https://simplyqibla.towardsikhlaas.com'; 32 | static const String androidAppLink = 33 | 'https://play.google.com/store/apps/details?id=com.towardsikhlaas.simplyqibla'; 34 | static const String iosAppLink = 'https://apps.apple.com/app/id6504881956'; 35 | } 36 | 37 | class AppStatusCodes { 38 | static const int locationDisabled = 701; 39 | static const int locationDeniedInitial = 702; 40 | static const int locationDeniedPermanent = 704; 41 | } 42 | 43 | class InputValidation { 44 | static RegExp latitudeValidatorPattern = RegExp( 45 | r'^(\+|-)?(?:90(?:(?:\.0{1,15})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,15})?))$'); 46 | static RegExp longitudeValidatorPattern = RegExp( 47 | r'^(\+|-)?(?:180(?:(?:\.0{1,15})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,15})?))$'); 48 | } 49 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: "300451adae589accbece3490f4396f10bdf15e6e" 8 | channel: "stable" 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: 300451adae589accbece3490f4396f10bdf15e6e 17 | base_revision: 300451adae589accbece3490f4396f10bdf15e6e 18 | - platform: android 19 | create_revision: 300451adae589accbece3490f4396f10bdf15e6e 20 | base_revision: 300451adae589accbece3490f4396f10bdf15e6e 21 | - platform: ios 22 | create_revision: 300451adae589accbece3490f4396f10bdf15e6e 23 | base_revision: 300451adae589accbece3490f4396f10bdf15e6e 24 | - platform: linux 25 | create_revision: 300451adae589accbece3490f4396f10bdf15e6e 26 | base_revision: 300451adae589accbece3490f4396f10bdf15e6e 27 | - platform: macos 28 | create_revision: 300451adae589accbece3490f4396f10bdf15e6e 29 | base_revision: 300451adae589accbece3490f4396f10bdf15e6e 30 | - platform: web 31 | create_revision: 300451adae589accbece3490f4396f10bdf15e6e 32 | base_revision: 300451adae589accbece3490f4396f10bdf15e6e 33 | - platform: windows 34 | create_revision: 300451adae589accbece3490f4396f10bdf15e6e 35 | base_revision: 300451adae589accbece3490f4396f10bdf15e6e 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /windows/runner/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | project(runner LANGUAGES CXX) 3 | 4 | # Define the application target. To change its name, change BINARY_NAME in the 5 | # top-level CMakeLists.txt, not the value here, or `flutter run` will no longer 6 | # work. 7 | # 8 | # Any new source files that you add to the application should be added here. 9 | add_executable(${BINARY_NAME} WIN32 10 | "flutter_window.cpp" 11 | "main.cpp" 12 | "utils.cpp" 13 | "win32_window.cpp" 14 | "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" 15 | "Runner.rc" 16 | "runner.exe.manifest" 17 | ) 18 | 19 | # Apply the standard set of build settings. This can be removed for applications 20 | # that need different build settings. 21 | apply_standard_settings(${BINARY_NAME}) 22 | 23 | # Add preprocessor definitions for the build version. 24 | target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") 25 | target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") 26 | target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") 27 | target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") 28 | target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") 29 | 30 | # Disable Windows macros that collide with C++ standard library functions. 31 | target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") 32 | 33 | # Add dependency libraries and include directories. Add any application-specific 34 | # dependencies here. 35 | target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) 36 | target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") 37 | target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") 38 | 39 | # Run the Flutter tool portions of the build. This must not be removed. 40 | add_dependencies(${BINARY_NAME} flutter_assemble) 41 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CADisableMinimumFrameDurationOnPhone 6 | 7 | CFBundleDevelopmentRegion 8 | $(DEVELOPMENT_LANGUAGE) 9 | CFBundleDisplayName 10 | SimplyQibla 11 | CFBundleDocumentTypes 12 | 13 | CFBundleExecutable 14 | $(EXECUTABLE_NAME) 15 | CFBundleIdentifier 16 | $(PRODUCT_BUNDLE_IDENTIFIER) 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleLocalizations 20 | 21 | en 22 | ar 23 | 24 | CFBundleName 25 | simply_qibla 26 | CFBundlePackageType 27 | APPL 28 | CFBundleShortVersionString 29 | $(FLUTTER_BUILD_NAME) 30 | CFBundleSignature 31 | ???? 32 | CFBundleVersion 33 | $(FLUTTER_BUILD_NUMBER) 34 | LSRequiresIPhoneOS 35 | 36 | NSLocationWhenInUseUsageDescription 37 | Your location is used to center the map to your area and determine the Qibla direction. Alternatively, you can manually move the map or enter specific coordinates. 38 | UIApplicationSupportsIndirectInputEvents 39 | 40 | UILaunchStoryboardName 41 | LaunchScreen 42 | UIMainStoryboardFile 43 | Main 44 | UIRequiresFullScreen 45 | 46 | UIStatusBarHidden 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | 52 | UISupportedInterfaceOrientations~ipad 53 | 54 | UIInterfaceOrientationPortrait 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /windows/runner/utils.cpp: -------------------------------------------------------------------------------- 1 | #include "utils.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | 10 | void CreateAndAttachConsole() { 11 | if (::AllocConsole()) { 12 | FILE *unused; 13 | if (freopen_s(&unused, "CONOUT$", "w", stdout)) { 14 | _dup2(_fileno(stdout), 1); 15 | } 16 | if (freopen_s(&unused, "CONOUT$", "w", stderr)) { 17 | _dup2(_fileno(stdout), 2); 18 | } 19 | std::ios::sync_with_stdio(); 20 | FlutterDesktopResyncOutputStreams(); 21 | } 22 | } 23 | 24 | std::vector GetCommandLineArguments() { 25 | // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. 26 | int argc; 27 | wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); 28 | if (argv == nullptr) { 29 | return std::vector(); 30 | } 31 | 32 | std::vector command_line_arguments; 33 | 34 | // Skip the first argument as it's the binary name. 35 | for (int i = 1; i < argc; i++) { 36 | command_line_arguments.push_back(Utf8FromUtf16(argv[i])); 37 | } 38 | 39 | ::LocalFree(argv); 40 | 41 | return command_line_arguments; 42 | } 43 | 44 | std::string Utf8FromUtf16(const wchar_t* utf16_string) { 45 | if (utf16_string == nullptr) { 46 | return std::string(); 47 | } 48 | int target_length = ::WideCharToMultiByte( 49 | CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, 50 | -1, nullptr, 0, nullptr, nullptr) 51 | -1; // remove the trailing null character 52 | int input_length = (int)wcslen(utf16_string); 53 | std::string utf8_string; 54 | if (target_length <= 0 || target_length > utf8_string.max_size()) { 55 | return utf8_string; 56 | } 57 | utf8_string.resize(target_length); 58 | int converted_length = ::WideCharToMultiByte( 59 | CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, 60 | input_length, utf8_string.data(), target_length, nullptr, nullptr); 61 | if (converted_length == 0) { 62 | return std::string(); 63 | } 64 | return utf8_string; 65 | } 66 | -------------------------------------------------------------------------------- /lib/theme/theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AppThemes { 4 | static final ThemeData darkTheme = ThemeData( 5 | colorScheme: ColorScheme.fromSeed(seedColor: Colors.amberAccent), 6 | useMaterial3: true, 7 | scaffoldBackgroundColor: const Color.fromRGBO(21, 18, 19, 1.0), 8 | appBarTheme: const AppBarTheme( 9 | backgroundColor: Color.fromRGBO(21, 18, 19, 1.0), 10 | titleTextStyle: TextStyle( 11 | fontSize: 24.0, 12 | fontWeight: FontWeight.w700, 13 | color: Colors.white, 14 | letterSpacing: -1, 15 | ), 16 | iconTheme: IconThemeData( 17 | color: Colors.white, 18 | ), 19 | ), 20 | fontFamily: 'Inter', 21 | textTheme: const TextTheme( 22 | titleLarge: TextStyle( 23 | fontSize: 32.0, 24 | fontWeight: FontWeight.w900, 25 | letterSpacing: -2, 26 | ), 27 | titleMedium: TextStyle( 28 | fontSize: 24.0, 29 | letterSpacing: -1, 30 | ), 31 | titleSmall: TextStyle( 32 | fontSize: 18.0, 33 | letterSpacing: -0.50, 34 | ), 35 | bodyLarge: TextStyle( 36 | letterSpacing: -0.50, 37 | ), 38 | bodyMedium: TextStyle( 39 | letterSpacing: -0.25, 40 | ), 41 | bodySmall: TextStyle( 42 | letterSpacing: -0.25, 43 | ), 44 | labelLarge: TextStyle( 45 | letterSpacing: -0.25, 46 | ), 47 | labelMedium: TextStyle( 48 | letterSpacing: -0.25, 49 | ), 50 | labelSmall: TextStyle( 51 | letterSpacing: -0.25, 52 | ), 53 | ), 54 | ); 55 | 56 | static const Color githubPrimaryColor = Colors.white; 57 | static const Color githubSecondaryColor = Color.fromRGBO(14, 17, 23, 1.0); 58 | static const Color donationServicePrimaryColor = Colors.white; 59 | static const Color donationServiceSecondaryColor = 60 | Color.fromRGBO(83, 183, 248, 1.0); 61 | static const Color socialInstagramPrimaryColor = Colors.pink; 62 | static const Color socialInstagramSecondaryColor = Colors.white; 63 | } 64 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | simply_qibla 33 | 34 | 35 | 39 | 40 | 41 | 42 | 43 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | import 'package:google_maps_flutter_android/google_maps_flutter_android.dart'; 6 | import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; 7 | import 'package:simply_qibla/globals/globals.dart'; 8 | import 'package:simply_qibla/helpers/maps_renderer_helper.dart'; 9 | import 'package:simply_qibla/helpers/shared_preferences_helper.dart'; 10 | import 'package:simply_qibla/l10n/app_localizations.dart'; 11 | import 'package:simply_qibla/pages/map_page.dart'; 12 | import 'package:simply_qibla/pages/onboarding_page.dart'; 13 | import 'package:simply_qibla/theme/theme.dart'; 14 | 15 | bool hasSeenOnboarding = false; 16 | 17 | Future main() async { 18 | WidgetsFlutterBinding.ensureInitialized(); 19 | SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( 20 | statusBarColor: Colors.transparent, 21 | systemNavigationBarColor: Colors.transparent, 22 | )); 23 | SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); 24 | 25 | if (Platform.isAndroid) { 26 | final GoogleMapsFlutterPlatform mapsImplementation = 27 | GoogleMapsFlutterPlatform.instance; 28 | if (mapsImplementation is GoogleMapsFlutterAndroid) { 29 | mapsImplementation.useAndroidViewSurface = true; 30 | initializeMapRenderer(); 31 | } 32 | } 33 | 34 | hasSeenOnboarding = await getOnboardingStatus(); 35 | runApp(const MyApp()); 36 | } 37 | 38 | class MyApp extends StatelessWidget { 39 | const MyApp({super.key}); 40 | 41 | @override 42 | Widget build(BuildContext context) { 43 | return MaterialApp( 44 | onGenerateTitle: (BuildContext context) { 45 | return AppLocalizations.of(context)!.appNamePascalCase; 46 | }, 47 | localizationsDelegates: AppLocalizations.localizationsDelegates, 48 | supportedLocales: AppLocalizations.supportedLocales, 49 | themeMode: ThemeMode.dark, 50 | darkTheme: AppThemes.darkTheme, 51 | home: hasSeenOnboarding ? const MapPage() : const OnboardingPage(), 52 | scaffoldMessengerKey: snackbarKey, 53 | ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /test/map_page_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_tabler_icons/flutter_tabler_icons.dart'; 3 | import 'package:flutter_test/flutter_test.dart'; 4 | import 'package:google_maps_flutter/google_maps_flutter.dart'; 5 | import 'package:mockito/mockito.dart'; 6 | import 'package:simply_qibla/l10n/app_localizations.dart'; 7 | import 'package:simply_qibla/pages/map_page.dart'; 8 | 9 | class MockGoogleMapController extends Mock implements GoogleMapController {} 10 | 11 | void main() { 12 | group('MapPage', () { 13 | Future pumpMapPage(WidgetTester tester) async { 14 | await tester.pumpWidget( 15 | const MaterialApp( 16 | localizationsDelegates: AppLocalizations.localizationsDelegates, 17 | supportedLocales: AppLocalizations.supportedLocales, 18 | home: MapPage(), 19 | ), 20 | ); 21 | 22 | // Allow the map to render 23 | await tester.pump(const Duration(seconds: 1)); 24 | } 25 | 26 | testWidgets('Toggles map type when the toggle button is pressed', 27 | (WidgetTester tester) async { 28 | await pumpMapPage(tester); 29 | 30 | // Verify initial map type is normal 31 | final GoogleMap googleMap = tester.widget(find.byType(GoogleMap)); 32 | expect(googleMap.mapType, MapType.normal); 33 | 34 | // Tap the toggle button 35 | await tester.tap(find.byIcon(TablerIcons.map)); 36 | await tester.pump(const Duration( 37 | milliseconds: 300)); // Add a short delay for the tap action 38 | 39 | // Verify map type is changed to hybrid 40 | final GoogleMap googleMapAfterFirstTap = 41 | tester.widget(find.byType(GoogleMap)); 42 | expect(googleMapAfterFirstTap.mapType, MapType.hybrid); 43 | 44 | // Tap the toggle button again 45 | await tester.tap(find.byIcon(TablerIcons.map)); 46 | await tester.pump(const Duration( 47 | milliseconds: 300)); // Add a short delay for the tap action 48 | 49 | // Verify map type is changed back to normal 50 | final GoogleMap googleMapAfterSecondTap = 51 | tester.widget(find.byType(GoogleMap)); 52 | expect(googleMapAfterSecondTap.mapType, MapType.normal); 53 | }); 54 | }); 55 | } 56 | -------------------------------------------------------------------------------- /lib/l10n/app_ar.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "ar", 3 | "appNamePascalCase": "سمبلي قبلة", 4 | "appAboutLegalese": "© ٢٠٢٤ TowardsIkhlaas", 5 | "changeLocationBarText": "الانتقال إلى موقع محدد؟ :)", 6 | "latitudeFieldLabel": "(أرقام 0-9) خط العرض", 7 | "longitudeFieldLabel": "(أرقام 0-9) خط الطول", 8 | "skipText": "تخطي", 9 | "doneText": "تم", 10 | "okText": "حسنا", 11 | "cancelText": "إلغاء", 12 | "clearText": "مسح", 13 | "allowText": "يسمح", 14 | "turnOnText": "تشغيل", 15 | "coordinatesInputFormTitle": "أدخل الإحداثيات", 16 | "centerConsoleCenteringText": "جارٍ تحديد موقعك...", 17 | "centerConsoleDraggingText": "ارفع لإظهار خط القبلة", 18 | "centerConsoleIdleText": "كم إلى الكعبة", 19 | "locationDisabled": "تم تعطيل الموقعك.", 20 | "locationDeniedInitial": "يرجى السماح بإذن الموقع لاستخدام هذه الميزة. نحن لا نخزن أو نبيع بياناتك. :)", 21 | "locationDeniedPermanent": "يرجى السماح بإذن الموقعك لاستخدام هذه الميزة.", 22 | "latitudeErrorText": "قيمة خط العرض غير صالحة", 23 | "longitudeErrorText": "قيمة خط الطول غير صالحة", 24 | "thankYouText": "جزاك الله خيرًا لاستخدامك هذا التطبيق!", 25 | "supportAppealText": "يتطلب تشغيل هذا التطبيق وصيانته (Google Maps API). يرجى النظر في دعم المشروع من خلال الأزرار أدناه (سيتم التبرع بالمبالغ الزائدة للجمعيات الخيرية المسجلة).", 26 | "githubButtonText": "ادعمنا على GitHub", 27 | "donateButtonText": "ادعمنا على Ko-Fi", 28 | "socialInstagramButtonText": "تابعنا على Instagram", 29 | "shareButtonText": "شارك مع الأصدقاء", 30 | "shareContentText": "السلام عليكم ورحمة الله وبركاته! تحقق من هذا التطبيق الجميل والدقيق لتحديد القبلة", 31 | "onboardingUsageTitle": "كيف يعمل هذا؟", 32 | "onboardingLocationTitle": "دع التطبيق يجد موقعك.", 33 | "onboardingSupportTitle": "ادعم مهمتنا!", 34 | "onboardingUsageBody": "السلام عليكم! لاستخدام التطبيق، ضع جهازك بشكل مسطح وقم بتدويره ليصطف مع المعالم القريبة المعروضة في الخريطة، مثل الشوارع والمباني من حولك.", 35 | "onboardingLocationBody": "تعد أذونات الموقع ضرورية لكي يعمل التطبيق بشكل مثالي، ولكنها ليست إلزامية. كن مطمئنًا، بياناتك لن يتم جمعها أو بيعها.", 36 | "onboardingSupportBody": "سمبلي قبلة خالي من الإعلانات ومفتوح المصدر. إذا أعجبك ما تراه، يرجى دعمنا من خلال الروابط داخل التطبيق. سيتم استخدام دعمك لتشغيل التطبيق، وسيتم التبرع بالفائض للجمعيات الخيرية المسجلة." 37 | } -------------------------------------------------------------------------------- /.github/SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support and Help 2 | 3 | Need help getting started or using a project? Here's how. 4 | 5 | ## How to get help 6 | 7 | Generally, we do not use GitHub as a support forum. For any usage questions that are not specific to the project itself, please ask on [Stack Overflow](https://stackoverflow.com) instead. By doing so, you are more likely to quickly solve your problem, and you will allow anyone else with the same question to find the answer. This also allows maintainers to focus on improving the project for others. 8 | 9 | Please seek support in the following ways: 10 | 11 | 1. :book: **Read the documentation and other guides** for the project to see if you can figure it out on your own. These should be located in a root `docs/` directory. If there is an example project, explore that to learn how it works to see if you can answer your question. 12 | 13 | 1. :bulb: **Search for answers and ask questions on [Stack Overflow](https://stackoverflow.com).** This is the most appropriate place for debugging issues specific to your use of the project, or figuring out how to use the project in a specific way. 14 | 15 | 1. :memo: As a **last resort**, you may open an issue on GitHub to ask for help. However, please clearly explain what you are trying to do, and list what you have already attempted to solve the problem. Provide code samples, but **do not** attach your entire project for someone else to debug. Review our [contributing guidelines](https://github.com/TowardsIkhlaas/simply_qibla/blob/master/.github/CONTRIBUTING.md). 16 | 17 | ## What NOT to do 18 | 19 | Please **do not** do any the following: 20 | 21 | 1. :x: Do not reach out to the author or contributor on Twitter (or other social media) by tweeting or sending a direct message. 22 | 23 | 1. :x: Do not email the author or contributor. 24 | 25 | 1. :x: Do not open duplicate issues or litter an existing issue with +1's. 26 | 27 | These are not appropriate avenues for seeking help or support with an open-source project. Please follow the guidelines in the previous section. Public questions get public answers, which benefits everyone in the community. ✌️ 28 | 29 | ## Customer Support 30 | 31 | As the team is just me at this point, I do not guarantee any sort of "customer support" for open-source projects. However, I will do my best. -------------------------------------------------------------------------------- /windows/runner/flutter_window.cpp: -------------------------------------------------------------------------------- 1 | #include "flutter_window.h" 2 | 3 | #include 4 | 5 | #include "flutter/generated_plugin_registrant.h" 6 | 7 | FlutterWindow::FlutterWindow(const flutter::DartProject& project) 8 | : project_(project) {} 9 | 10 | FlutterWindow::~FlutterWindow() {} 11 | 12 | bool FlutterWindow::OnCreate() { 13 | if (!Win32Window::OnCreate()) { 14 | return false; 15 | } 16 | 17 | RECT frame = GetClientArea(); 18 | 19 | // The size here must match the window dimensions to avoid unnecessary surface 20 | // creation / destruction in the startup path. 21 | flutter_controller_ = std::make_unique( 22 | frame.right - frame.left, frame.bottom - frame.top, project_); 23 | // Ensure that basic setup of the controller was successful. 24 | if (!flutter_controller_->engine() || !flutter_controller_->view()) { 25 | return false; 26 | } 27 | RegisterPlugins(flutter_controller_->engine()); 28 | SetChildContent(flutter_controller_->view()->GetNativeWindow()); 29 | 30 | flutter_controller_->engine()->SetNextFrameCallback([&]() { 31 | this->Show(); 32 | }); 33 | 34 | // Flutter can complete the first frame before the "show window" callback is 35 | // registered. The following call ensures a frame is pending to ensure the 36 | // window is shown. It is a no-op if the first frame hasn't completed yet. 37 | flutter_controller_->ForceRedraw(); 38 | 39 | return true; 40 | } 41 | 42 | void FlutterWindow::OnDestroy() { 43 | if (flutter_controller_) { 44 | flutter_controller_ = nullptr; 45 | } 46 | 47 | Win32Window::OnDestroy(); 48 | } 49 | 50 | LRESULT 51 | FlutterWindow::MessageHandler(HWND hwnd, UINT const message, 52 | WPARAM const wparam, 53 | LPARAM const lparam) noexcept { 54 | // Give Flutter, including plugins, an opportunity to handle window messages. 55 | if (flutter_controller_) { 56 | std::optional result = 57 | flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, 58 | lparam); 59 | if (result) { 60 | return *result; 61 | } 62 | } 63 | 64 | switch (message) { 65 | case WM_FONTCHANGE: 66 | flutter_controller_->engine()->ReloadSystemFonts(); 67 | break; 68 | } 69 | 70 | return Win32Window::MessageHandler(hwnd, message, wparam, lparam); 71 | } 72 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/BUG-REPORT.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: File a bug report. 3 | title: "[Bug]: " 4 | labels: ["bug", "triage"] 5 | assignees: 6 | - ahmd-sh 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | Thanks for taking the time to fill out this bug report! 12 | - type: input 13 | id: contact 14 | attributes: 15 | label: Contact Details 16 | description: How can we get in touch with you if we need more info? 17 | placeholder: ex. email@example.com 18 | validations: 19 | required: false 20 | - type: textarea 21 | id: what-happened 22 | attributes: 23 | label: What happened? 24 | description: ALSO tell us, what did you expect to happen? 25 | placeholder: Tell us what you see! 26 | value: "The app did not load! I expected the app to load." 27 | validations: 28 | required: true 29 | - type: textarea 30 | id: version 31 | attributes: 32 | label: What version of SimplyQibla are you running? 33 | description: You can see it by tapping the info button on the top right of the SimplyQibla app. 34 | placeholder: ex. 1.1.2 35 | value: "1.1.2" 36 | validations: 37 | required: true 38 | - type: dropdown 39 | id: browsers 40 | attributes: 41 | label: What platform(s) are you seeing the problem on? 42 | multiple: true 43 | options: 44 | - Android 45 | - iOS 46 | - iPadOS 47 | - type: textarea 48 | attributes: 49 | label: Screenshots 50 | description: | 51 | Attach screenshots here if appropriate. 52 | 53 | Tip: You can attach images by clicking this area to highlight it and then dragging files in. 54 | validations: 55 | required: false 56 | - type: textarea 57 | id: logs 58 | attributes: 59 | label: Relevant log output 60 | description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. 61 | render: shell 62 | - type: checkboxes 63 | id: terms 64 | attributes: 65 | label: Code of Conduct 66 | description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/TowardsIkhlaas/simply_qibla/blob/master/.github/CODE_OF_CONDUCT.md). 67 | options: 68 | - label: I agree to follow this project's Code of Conduct 69 | required: true 70 | -------------------------------------------------------------------------------- /lib/widgets/coordinates_form_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_tabler_icons/flutter_tabler_icons.dart'; 3 | import 'package:google_maps_flutter/google_maps_flutter.dart'; 4 | import 'package:simply_qibla/l10n/app_localizations.dart'; 5 | import 'package:simply_qibla/styles/style.dart'; 6 | import 'package:simply_qibla/widgets/coordinates_input_form.dart'; 7 | 8 | class CoordinatesFormBar extends StatefulWidget { 9 | final Function(LatLng) onCoordinatesSubmit; 10 | 11 | const CoordinatesFormBar({ 12 | required this.onCoordinatesSubmit, 13 | super.key, 14 | }); 15 | 16 | @override 17 | State<CoordinatesFormBar> createState() => _CoordinatesFormBarState(); 18 | } 19 | 20 | class _CoordinatesFormBarState extends State<CoordinatesFormBar> { 21 | final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); 22 | TextEditingController latitudeController = TextEditingController(); 23 | TextEditingController longitudeController = TextEditingController(); 24 | 25 | @override 26 | void dispose() { 27 | latitudeController.dispose(); 28 | longitudeController.dispose(); 29 | super.dispose(); 30 | } 31 | 32 | @override 33 | Widget build(BuildContext context) { 34 | void showLatLngDialog(BuildContext context) async { 35 | showDialog( 36 | context: context, 37 | builder: (BuildContext context) => CoordinatesInputForm( 38 | formKey: _formKey, 39 | latitudeController: latitudeController, 40 | longitudeController: longitudeController, 41 | onCoordinatesSubmit: widget.onCoordinatesSubmit, 42 | )); 43 | } 44 | 45 | return Container( 46 | padding: const EdgeInsets.all(AppPadding.standard), 47 | child: Row( 48 | mainAxisAlignment: MainAxisAlignment.center, 49 | children: <Widget>[ 50 | Expanded( 51 | child: SizedBox( 52 | height: AppDimensions.pillBarSize, 53 | child: ElevatedButton.icon( 54 | icon: const Icon( 55 | TablerIcons.search, 56 | size: AppDimensions.iconSizeSm, 57 | ), 58 | label: 59 | Text(AppLocalizations.of(context)!.changeLocationBarText), 60 | onPressed: () => showLatLngDialog(context), 61 | ), 62 | ), 63 | ), 64 | ], 65 | ), 66 | ); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /lib/l10n/app_id.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "id", 3 | "appNamePascalCase": "SimplyQibla", 4 | "appAboutLegalese": "© 2024 TowardsIkhlaas", 5 | "changeLocationBarText": "Ingin langsung ke lokasi tertentu? :)", 6 | "latitudeFieldLabel": "Lintang", 7 | "longitudeFieldLabel": "Bujur", 8 | "skipText": "Lewati", 9 | "doneText": "Selesai", 10 | "okText": "OK", 11 | "cancelText": "Batal", 12 | "clearText": "Hapus", 13 | "allowText": "IZINKAN", 14 | "turnOnText": "NYALAKAN", 15 | "coordinatesInputFormTitle": "Masukkan Koordinat", 16 | "centerConsoleCenteringText": "Mencari lokasi Anda...", 17 | "centerConsoleDraggingText": "Angkat untuk menampilkan garis kiblat", 18 | "centerConsoleIdleText": "km ke Ka'bah", 19 | "locationDisabled": "Layanan lokasi Anda dinonaktifkan.", 20 | "locationDeniedInitial": "Silakan izinkan akses lokasi untuk menggunakan fitur ini. Kami tidak menyimpan atau menjual data Anda. :)", 21 | "locationDeniedPermanent": "Silakan izinkan akses lokasi untuk menggunakan fitur ini.", 22 | "latitudeErrorText": "Nilai lintang tidak valid", 23 | "longitudeErrorText": "Nilai bujur tidak valid", 24 | "thankYouText": "JazakAllahu Khayran telah menggunakan aplikasi ini!", 25 | "supportAppealText": "Aplikasi ini memerlukan biaya untuk dijalankan dan dipelihara (Google Maps API). Mohon pertimbangkan untuk mendukung proyek ini melalui tombol di bawah (dana lebih akan disumbangkan ke badan amal terdaftar).", 26 | "githubButtonText": "Dukung kami di GitHub", 27 | "donateButtonText": "Dukung kami di Ko-Fi", 28 | "socialInstagramButtonText": "Ikuti kami di Instagram", 29 | "shareButtonText": "Bagikan dengan Teman", 30 | "shareContentText": "Assalamualaikum warahmatullahi wabarakatuh! Coba aplikasi kiblat yang indah dan akurat ini", 31 | "onboardingUsageTitle": "Bagaimana ini bekerja?", 32 | "onboardingLocationTitle": "Biarkan aplikasi menemukan Anda.", 33 | "onboardingSupportTitle": "Dukung misi kami!", 34 | "onboardingUsageBody": "Salaam! Untuk menggunakan aplikasi, pegang perangkat Anda dalam posisi datar dan putar untuk menyelaraskan dengan landmark di peta, seperti jalan dan bangunan di sekitar Anda.", 35 | "onboardingLocationBody": "Izin lokasi diperlukan agar aplikasi berfungsi dengan optimal, tetapi tidak wajib. Tenang, data Anda tidak dikumpulkan atau dijual.", 36 | "onboardingSupportBody": "SimplyQibla bebas iklan dan bersumber terbuka. Jika Anda menyukai aplikasi ini, mohon dukung melalui tautan dalam aplikasi. Dukungan Anda akan digunakan untuk menjalankan aplikasi, dan kelebihannya akan disumbangkan ke badan amal terdaftar." 37 | } -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.android.application" 3 | id "kotlin-android" 4 | id "dev.flutter.flutter-gradle-plugin" 5 | } 6 | 7 | def localProperties = new Properties() 8 | def localPropertiesFile = rootProject.file('local.properties') 9 | if (localPropertiesFile.exists()) { 10 | localPropertiesFile.withReader('UTF-8') { reader -> 11 | localProperties.load(reader) 12 | } 13 | } 14 | 15 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 16 | if (flutterVersionCode == null) { 17 | flutterVersionCode = '1' 18 | } 19 | 20 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 21 | if (flutterVersionName == null) { 22 | flutterVersionName = '1.0' 23 | } 24 | 25 | def keystoreProperties = new Properties() 26 | def keystorePropertiesFile = rootProject.file('key.properties') 27 | if (keystorePropertiesFile.exists()) { 28 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 29 | } 30 | 31 | android { 32 | namespace "com.towardsikhlaas.simplyqibla" 33 | compileSdk flutter.compileSdkVersion 34 | ndkVersion "27.0.12077973" 35 | 36 | compileOptions { 37 | sourceCompatibility JavaVersion.VERSION_1_8 38 | targetCompatibility JavaVersion.VERSION_1_8 39 | } 40 | 41 | kotlinOptions { 42 | jvmTarget = '1.8' 43 | } 44 | 45 | sourceSets { 46 | main.java.srcDirs += 'src/main/kotlin' 47 | } 48 | 49 | defaultConfig { 50 | applicationId "com.towardsikhlaas.simplyqibla" 51 | minSdkVersion flutter.minSdkVersion 52 | targetSdk flutter.targetSdkVersion 53 | versionCode flutterVersionCode.toInteger() 54 | versionName flutterVersionName 55 | 56 | if (keystorePropertiesFile.exists()) { 57 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 58 | resValue "string", "google_maps_api_key_android", keystoreProperties['GOOGLE_MAPS_API_KEY_ANDROID'] 59 | } 60 | } 61 | 62 | signingConfigs { 63 | release { 64 | keyAlias keystoreProperties['keyAlias'] 65 | keyPassword keystoreProperties['keyPassword'] 66 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null 67 | storePassword keystoreProperties['storePassword'] 68 | } 69 | } 70 | 71 | buildTypes { 72 | release { 73 | signingConfig signingConfigs.release 74 | } 75 | } 76 | } 77 | 78 | flutter { 79 | source '../..' 80 | } 81 | 82 | dependencies {} 83 | -------------------------------------------------------------------------------- /lib/l10n/app_ms.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "ms", 3 | "appNamePascalCase": "SimplyQibla", 4 | "appAboutLegalese": "© 2024 TowardsIkhlaas", 5 | "changeLocationBarText": "Mahu pergi ke lokasi tertentu? :)", 6 | "latitudeFieldLabel": "Latitud", 7 | "longitudeFieldLabel": "Longitud", 8 | "skipText": "Langkau", 9 | "doneText": "Selesai", 10 | "okText": "OK", 11 | "cancelText": "Batal", 12 | "clearText": "Kosongkan", 13 | "allowText": "IZINKAN", 14 | "turnOnText": "HIDUPKAN", 15 | "coordinatesInputFormTitle": "Masukkan Koordinat", 16 | "centerConsoleCenteringText": "Mencari lokasi anda...", 17 | "centerConsoleDraggingText": "Angkat untuk tunjukkan garis Qibla", 18 | "centerConsoleIdleText": "km ke Kaabah", 19 | "locationDisabled": "Lokasi anda dimatikan.", 20 | "locationDeniedInitial": "Sila benarkan kebenaran lokasi untuk menggunakan ciri ini. Kami tidak menyimpan atau menjual data anda. :)", 21 | "locationDeniedPermanent": "Sila benarkan kebenaran lokasi untuk menggunakan ciri ini.", 22 | "latitudeErrorText": "Nilai latitud tidak sah", 23 | "longitudeErrorText": "Nilai longitud tidak sah", 24 | "thankYouText": "JazakAllahu Khayran kerana menggunakan aplikasi ini!", 25 | "supportAppealText": "Aplikasi ini memerlukan kos untuk dijalankan dan diselenggara (Google Maps API). Sila pertimbangkan untuk menyokong projek ini melalui butang di bawah (lebih jumlah akan disumbangkan kepada badan amal berdaftar).", 26 | "githubButtonText": "Sokong kami di GitHub", 27 | "donateButtonText": "Sokong kami di Ko-Fi", 28 | "socialInstagramButtonText": "Ikuti kami di Instagram", 29 | "shareButtonText": "Kongsi dengan Rakan", 30 | "shareContentText": "As salaam alaykum warahmatullahi wabarakatuh! Lihat aplikasi Qibla yang indah dan tepat ini", 31 | "onboardingUsageTitle": "Bagaimana ia berfungsi?", 32 | "onboardingLocationTitle": "Biarkan aplikasi mencari anda.", 33 | "onboardingSupportTitle": "Sokong misi kami!", 34 | "onboardingUsageBody": "Salaam! Untuk menggunakan aplikasi ini, pegang peranti anda secara mendatar dan pusingkan untuk menyelaraskan dengan mercu tanda berhampiran yang ditunjukkan pada peta, seperti jalan dan bangunan di sekitar anda.", 35 | "onboardingLocationBody": "Kebenaran lokasi diperlukan agar aplikasi berfungsi dengan optimum, tetapi tidak wajib. Anda yakin, data anda tidak dikumpul atau dijual.", 36 | "onboardingSupportBody": "SimplyQibla tiada iklan dan sumber terbuka. Jika anda suka, sila sokong kami melalui pautan dalam aplikasi. Sokongan anda akan digunakan untuk menjalankan aplikasi, dan lebihan akan disumbangkan kepada badan amal berdaftar." 37 | } -------------------------------------------------------------------------------- /lib/l10n/app_pt.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "pt", 3 | "appNamePascalCase": "SimplyQibla", 4 | "appAboutLegalese": "© 2024 TowardsIkhlaas", 5 | "changeLocationBarText": "Pular para uma localização específica? :)", 6 | "latitudeFieldLabel": "Latitude", 7 | "longitudeFieldLabel": "Longitude", 8 | "skipText": "Pular", 9 | "doneText": "Concluído", 10 | "okText": "OK", 11 | "cancelText": "Cancelar", 12 | "clearText": "Limpar", 13 | "allowText": "PERMITIR", 14 | "turnOnText": "ATIVAR", 15 | "coordinatesInputFormTitle": "Insira as Coordenadas", 16 | "centerConsoleCenteringText": "Localizando você...", 17 | "centerConsoleDraggingText": "Levante para mostrar a linha da Qibla", 18 | "centerConsoleIdleText": "km até a Kaaba", 19 | "locationDisabled": "Sua localização está desativada.", 20 | "locationDeniedInitial": "Por favor, permita a permissão de localização para usar este recurso. Não armazenamos nem vendemos seus dados. :)", 21 | "locationDeniedPermanent": "Por favor, permita a permissão de localização para usar este recurso.", 22 | "latitudeErrorText": "Valor de latitude inválido", 23 | "longitudeErrorText": "Valor de longitude inválido", 24 | "thankYouText": "JazakAllahu Khayran por usar este aplicativo!", 25 | "supportAppealText": "Este aplicativo tem custos para operar e manter (Google Maps API). Considere apoiar o projeto pelos botões abaixo (valores excedentes serão doados a instituições de caridade registradas).", 26 | "githubButtonText": "Apoie-nos no GitHub", 27 | "donateButtonText": "Apoie-nos no Ko-Fi", 28 | "socialInstagramButtonText": "Siga-nos no Instagram", 29 | "shareButtonText": "Compartilhar com amigos", 30 | "shareContentText": "As-salaamu alaykum warahmatullahi wabarakatuh! Confira este lindo e preciso aplicativo de Qibla", 31 | "onboardingUsageTitle": "Como isso funciona?", 32 | "onboardingLocationTitle": "Deixe o aplicativo encontrar você.", 33 | "onboardingSupportTitle": "Apoie nossa missão!", 34 | "onboardingUsageBody": "Salaam! Para usar o aplicativo, mantenha seu dispositivo plano e gire-o para alinhar com os marcos próximos mostrados no mapa, como ruas e edifícios ao seu redor.", 35 | "onboardingLocationBody": "As permissões de localização são necessárias para que o aplicativo funcione de forma ideal, mas não são obrigatórias. Fique tranquilo, seus dados não são coletados nem vendidos.", 36 | "onboardingSupportBody": "SimplyQibla é livre de anúncios e open-source. Se você gostou, apoie-nos pelos links do aplicativo. Seu apoio será usado para manter o aplicativo, e o excedente será doado para instituições de caridade registradas." 37 | } -------------------------------------------------------------------------------- /lib/l10n/app_pt_BR.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "pt_BR", 3 | "appNamePascalCase": "SimplyQibla", 4 | "appAboutLegalese": "© 2024 TowardsIkhlaas", 5 | "changeLocationBarText": "Pular para uma localização específica? :)", 6 | "latitudeFieldLabel": "Latitude", 7 | "longitudeFieldLabel": "Longitude", 8 | "skipText": "Pular", 9 | "doneText": "Concluído", 10 | "okText": "OK", 11 | "cancelText": "Cancelar", 12 | "clearText": "Limpar", 13 | "allowText": "PERMITIR", 14 | "turnOnText": "ATIVAR", 15 | "coordinatesInputFormTitle": "Insira as Coordenadas", 16 | "centerConsoleCenteringText": "Localizando você...", 17 | "centerConsoleDraggingText": "Levante para mostrar a linha da Qibla", 18 | "centerConsoleIdleText": "km até a Kaaba", 19 | "locationDisabled": "Sua localização está desativada.", 20 | "locationDeniedInitial": "Por favor, permita a permissão de localização para usar este recurso. Não armazenamos nem vendemos seus dados. :)", 21 | "locationDeniedPermanent": "Por favor, permita a permissão de localização para usar este recurso.", 22 | "latitudeErrorText": "Valor de latitude inválido", 23 | "longitudeErrorText": "Valor de longitude inválido", 24 | "thankYouText": "JazakAllahu Khayran por usar este aplicativo!", 25 | "supportAppealText": "Este aplicativo tem custos para operar e manter (Google Maps API). Considere apoiar o projeto pelos botões abaixo (valores excedentes serão doados a instituições de caridade registradas).", 26 | "githubButtonText": "Apoie-nos no GitHub", 27 | "donateButtonText": "Apoie-nos no Ko-Fi", 28 | "socialInstagramButtonText": "Siga-nos no Instagram", 29 | "shareButtonText": "Compartilhar com amigos", 30 | "shareContentText": "As-salaamu alaykum warahmatullahi wabarakatuh! Confira este lindo e preciso aplicativo de Qibla", 31 | "onboardingUsageTitle": "Como isso funciona?", 32 | "onboardingLocationTitle": "Deixe o aplicativo encontrar você.", 33 | "onboardingSupportTitle": "Apoie nossa missão!", 34 | "onboardingUsageBody": "Salaam! Para usar o aplicativo, mantenha seu dispositivo plano e gire-o para alinhar com os marcos próximos mostrados no mapa, como ruas e edifícios ao seu redor.", 35 | "onboardingLocationBody": "As permissões de localização são necessárias para que o aplicativo funcione de forma ideal, mas não são obrigatórias. Fique tranquilo, seus dados não são coletados nem vendidos.", 36 | "onboardingSupportBody": "SimplyQibla é livre de anúncios e open-source. Se você gostou, apoie-nos pelos links do aplicativo. Seu apoio será usado para manter o aplicativo, e o excedente será doado para instituições de caridade registradas." 37 | } -------------------------------------------------------------------------------- /lib/l10n/app_pt_PT.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "pt_PT", 3 | "appNamePascalCase": "SimplyQibla", 4 | "appAboutLegalese": "© 2024 TowardsIkhlaas", 5 | "changeLocationBarText": "Ir para uma localização específica? :)", 6 | "latitudeFieldLabel": "Latitude", 7 | "longitudeFieldLabel": "Longitude", 8 | "skipText": "Saltar", 9 | "doneText": "Concluído", 10 | "okText": "OK", 11 | "cancelText": "Cancelar", 12 | "clearText": "Limpar", 13 | "allowText": "PERMITIR", 14 | "turnOnText": "LIGAR", 15 | "coordinatesInputFormTitle": "Introduzir Coordenadas", 16 | "centerConsoleCenteringText": "A localizar...", 17 | "centerConsoleDraggingText": "Levante para mostrar a linha da Qibla", 18 | "centerConsoleIdleText": "km até à Kaaba", 19 | "locationDisabled": "A sua localização está desativada.", 20 | "locationDeniedInitial": "Por favor, permita a permissão de localização para usar esta funcionalidade. Não guardamos nem vendemos os seus dados. :)", 21 | "locationDeniedPermanent": "Por favor, permita a permissão de localização para usar esta funcionalidade.", 22 | "latitudeErrorText": "Valor de latitude inválido", 23 | "longitudeErrorText": "Valor de longitude inválido", 24 | "thankYouText": "JazakAllahu Khayran por usar esta aplicação!", 25 | "supportAppealText": "Esta aplicação tem custos de funcionamento e manutenção (Google Maps API). Considere apoiar o projeto através dos botões abaixo (valores excedentes serão doados a instituições de caridade registadas).", 26 | "githubButtonText": "Apoie-nos no GitHub", 27 | "donateButtonText": "Apoie-nos no Ko-Fi", 28 | "socialInstagramButtonText": "Siga-nos no Instagram", 29 | "shareButtonText": "Partilhar com Amigos", 30 | "shareContentText": "As salaam alaykum warahmatullahi wabarakatuh! Veja esta aplicação Qibla bonita e precisa", 31 | "onboardingUsageTitle": "Como funciona?", 32 | "onboardingLocationTitle": "Deixe a aplicação encontrar a sua localização.", 33 | "onboardingSupportTitle": "Apoie a nossa missão!", 34 | "onboardingUsageBody": "Salaam! Para usar a aplicação, mantenha o dispositivo plano e rode-o para alinhar com os pontos de referência no mapa, como ruas e edifícios ao seu redor.", 35 | "onboardingLocationBody": "As permissões de localização são necessárias para o funcionamento ideal da aplicação, mas não obrigatórias. Garantimos que os seus dados não são recolhidos nem vendidos.", 36 | "onboardingSupportBody": "SimplyQibla é livre de anúncios e de código aberto. Se gosta da aplicação, apoie-nos através dos links na aplicação. O seu apoio será usado para manter a aplicação, e os valores excedentes serão doados a instituições de caridade registadas." 37 | } -------------------------------------------------------------------------------- /lib/widgets/center_console.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:geolocator/geolocator.dart'; 3 | import 'package:google_maps_flutter/google_maps_flutter.dart'; 4 | import 'package:intl/intl.dart'; 5 | import 'package:simply_qibla/constants/constants.dart'; 6 | import 'package:simply_qibla/l10n/app_localizations.dart'; 7 | import 'package:simply_qibla/styles/style.dart'; 8 | 9 | class CenterConsole extends StatelessWidget { 10 | final CenterConsoleState state; 11 | final CameraPosition currentCameraPosition; 12 | final bool isCameraMoving; 13 | 14 | const CenterConsole({ 15 | required this.state, 16 | required this.currentCameraPosition, 17 | required this.isCameraMoving, 18 | super.key, 19 | }); 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | Color consoleColor; 24 | String text; 25 | int distanceAway = calculateDistance( 26 | currentCameraPosition.target, MapConstants.qiblaPosition); 27 | String formattedDistance = 28 | NumberFormat.decimalPattern().format(distanceAway); 29 | 30 | switch (state) { 31 | case CenterConsoleState.centering: 32 | consoleColor = Colors.green; 33 | text = AppLocalizations.of(context)!.centerConsoleCenteringText; 34 | break; 35 | case CenterConsoleState.dragging: 36 | consoleColor = Colors.blue; 37 | text = AppLocalizations.of(context)!.centerConsoleDraggingText; 38 | break; 39 | case CenterConsoleState.idle: 40 | consoleColor = Theme.of(context).colorScheme.primaryContainer; 41 | text = 42 | '$formattedDistance ${AppLocalizations.of(context)!.centerConsoleIdleText}'; 43 | break; 44 | } 45 | 46 | return Container( 47 | decoration: BoxDecoration( 48 | borderRadius: BorderRadius.circular(AppDimensions.borderRadiusLg), 49 | border: Border.all( 50 | color: consoleColor, 51 | width: 1, 52 | ), 53 | boxShadow: <BoxShadow>[ 54 | BoxShadow( 55 | color: consoleColor.withValues(alpha: AppStyles.shadowOpacity), 56 | ), 57 | ], 58 | ), 59 | child: Center( 60 | child: Text( 61 | text, 62 | textAlign: TextAlign.center, 63 | style: TextStyle( 64 | color: consoleColor, 65 | ), 66 | ), 67 | ), 68 | ); 69 | } 70 | 71 | int calculateDistance(LatLng start, LatLng end) { 72 | double distance = Geolocator.distanceBetween( 73 | start.latitude, start.longitude, end.latitude, end.longitude); 74 | int distanceInKm = (distance / 1000).round(); 75 | return distanceInKm; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /lib/l10n/app_de.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "de", 3 | "appNamePascalCase": "SimplyQibla", 4 | "appAboutLegalese": "© 2024 TowardsIkhlaas", 5 | "changeLocationBarText": "Zu einem bestimmten Ort springen? :)", 6 | "latitudeFieldLabel": "Breitengrad", 7 | "longitudeFieldLabel": "Längengrad", 8 | "skipText": "Überspringen", 9 | "doneText": "Fertig", 10 | "okText": "OK", 11 | "cancelText": "Abbrechen", 12 | "clearText": "Löschen", 13 | "allowText": "ZULASSEN", 14 | "turnOnText": "AKTIVIEREN", 15 | "coordinatesInputFormTitle": "Koordinaten eingeben", 16 | "centerConsoleCenteringText": "Standort wird ermittelt...", 17 | "centerConsoleDraggingText": "Anheben, um die Qibla-Linie anzuzeigen", 18 | "centerConsoleIdleText": "km bis zur Kaaba", 19 | "locationDisabled": "Ihr Standort ist deaktiviert.", 20 | "locationDeniedInitial": "Bitte erlauben Sie die Standortberechtigung, um diese Funktion zu nutzen. Wir speichern oder verkaufen Ihre Daten nicht. :)", 21 | "locationDeniedPermanent": "Bitte erlauben Sie die Standortberechtigung, um diese Funktion zu nutzen.", 22 | "latitudeErrorText": "Ungültiger Breitengrad-Wert", 23 | "longitudeErrorText": "Ungültiger Längengrad-Wert", 24 | "thankYouText": "JazakAllahu Khayran für die Nutzung dieser App!", 25 | "supportAppealText": "Diese App verursacht Kosten für Betrieb und Wartung (Google Maps API). Bitte unterstützen Sie das Projekt über die untenstehenden Buttons (überschüssige Beträge werden an registrierte Wohltätigkeitsorganisationen gespendet).", 26 | "githubButtonText": "Support auf GitHub", 27 | "donateButtonText": "Support auf Ko-Fi", 28 | "socialInstagramButtonText": "Folgen Sie uns auf Instagram", 29 | "shareButtonText": "Mit Freunden teilen", 30 | "shareContentText": "As-salamu alaykum wa rahmatullahi wa barakatuh! Schau dir diese schöne und genaue Qibla-App an", 31 | "onboardingUsageTitle": "Wie funktioniert das?", 32 | "onboardingLocationTitle": "Lassen Sie die App Ihren Standort finden.", 33 | "onboardingSupportTitle": "Unterstützen Sie unsere Mission!", 34 | "onboardingUsageBody": "Salaam! Um die App zu nutzen, halten Sie Ihr Gerät flach und drehen Sie es, um sich an nahegelegenen Orientierungspunkten auf der Karte auszurichten, wie Straßen und Gebäuden in Ihrer Umgebung.", 35 | "onboardingLocationBody": "Standortberechtigungen sind notwendig, damit die App optimal funktioniert, aber nicht zwingend erforderlich. Seien Sie versichert, Ihre Daten werden weder gesammelt noch verkauft.", 36 | "onboardingSupportBody": "SimplyQibla ist werbefrei und Open-Source. Wenn Ihnen gefällt, was Sie sehen, unterstützen Sie uns bitte über die In-App-Links. Ihre Unterstützung wird verwendet, um die App zu betreiben, und Überschüsse werden an registrierte Wohltätigkeitsorganisationen gespendet." 37 | } -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 2 | <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 3 | <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 4 | <uses-permission android:name="android.permission.INTERNET"/> 5 | <application 6 | android:label="@string/app_name" 7 | android:name="${applicationName}" 8 | android:icon="@mipmap/ic_launcher"> 9 | <activity 10 | android:name=".MainActivity" 11 | android:exported="true" 12 | android:launchMode="singleTop" 13 | android:theme="@style/LaunchTheme" 14 | android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" 15 | android:hardwareAccelerated="true" 16 | android:screenOrientation="portrait" 17 | android:windowSoftInputMode="adjustResize"> 18 | <!-- Specifies an Android theme to apply to this Activity as soon as 19 | the Android process has started. This theme is visible to the user 20 | while the Flutter UI initializes. After that, this theme continues 21 | to determine the Window background behind the Flutter UI. --> 22 | <meta-data 23 | android:name="io.flutter.embedding.android.NormalTheme" 24 | android:resource="@style/NormalTheme" 25 | /> 26 | <intent-filter> 27 | <action android:name="android.intent.action.MAIN"/> 28 | <category android:name="android.intent.category.LAUNCHER"/> 29 | </intent-filter> 30 | </activity> 31 | <meta-data 32 | android:name="com.google.android.geo.API_KEY" 33 | android:value="@string/google_maps_api_key_android" 34 | /> 35 | <!-- Don't delete the meta-data below. 36 | This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> 37 | <meta-data 38 | android:name="flutterEmbedding" 39 | android:value="2" /> 40 | </application> 41 | <!-- Required to query activities that can process text, see: 42 | https://developer.android.com/training/package-visibility?hl=en and 43 | https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT. 44 | 45 | In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --> 46 | <queries> 47 | <intent> 48 | <action android:name="android.intent.action.PROCESS_TEXT"/> 49 | <data android:mimeType="text/plain"/> 50 | </intent> 51 | </queries> 52 | </manifest> 53 | -------------------------------------------------------------------------------- /lib/l10n/app_fr.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "fr", 3 | "appNamePascalCase": "SimplyQibla", 4 | "appAboutLegalese": "© 2024 TowardsIkhlaas", 5 | "changeLocationBarText": "Aller à un lieu spécifique ? :)", 6 | "latitudeFieldLabel": "Latitude", 7 | "longitudeFieldLabel": "Longitude", 8 | "skipText": "Ignorer", 9 | "doneText": "Terminé", 10 | "okText": "OK", 11 | "cancelText": "Annuler", 12 | "clearText": "Effacer", 13 | "allowText": "AUTORISER", 14 | "turnOnText": "ACTIVER", 15 | "coordinatesInputFormTitle": "Entrer les coordonnées", 16 | "centerConsoleCenteringText": "Localisation en cours...", 17 | "centerConsoleDraggingText": "Soulevez pour afficher la ligne de Qibla", 18 | "centerConsoleIdleText": "km jusqu'à la Kaaba", 19 | "locationDisabled": "Votre localisation est désactivée.", 20 | "locationDeniedInitial": "Veuillez autoriser la permission de localisation pour utiliser cette fonctionnalité. Nous ne stockons ni ne vendons vos données. :)", 21 | "locationDeniedPermanent": "Veuillez autoriser la permission de localisation pour utiliser cette fonctionnalité.", 22 | "latitudeErrorText": "Valeur de latitude invalide", 23 | "longitudeErrorText": "Valeur de longitude invalide", 24 | "thankYouText": "JazakAllahu Khayran d'utiliser cette application !", 25 | "supportAppealText": "Cette application a des coûts de fonctionnement et de maintenance (API Google Maps). Veuillez envisager de soutenir le projet via les boutons ci-dessous (les montants excédentaires seront donnés à des associations caritatives enregistrées).", 26 | "githubButtonText": "Soutenez-nous sur GitHub", 27 | "donateButtonText": "Soutenez-nous sur Ko-Fi", 28 | "socialInstagramButtonText": "Suivez-nous sur Instagram", 29 | "shareButtonText": "Partager avec des amis", 30 | "shareContentText": "As salam alaykum warahmatullahi wabarakatuh ! Découvrez cette belle application de Qibla, précise et pratique.", 31 | "onboardingUsageTitle": "Comment ça marche ?", 32 | "onboardingLocationTitle": "Laissez l'application vous localiser.", 33 | "onboardingSupportTitle": "Soutenez notre mission !", 34 | "onboardingUsageBody": "Salaam ! Pour utiliser l'application, tenez votre appareil à plat et faites-le pivoter pour l'aligner avec les points de repère proches affichés sur la carte, tels que les rues et les bâtiments autour de vous.", 35 | "onboardingLocationBody": "Les autorisations de localisation sont nécessaires pour que l'application fonctionne de manière optimale, mais ne sont pas obligatoires. Soyez rassurés, vos données ne sont ni collectées ni vendues.", 36 | "onboardingSupportBody": "SimplyQibla est sans publicité et open-source. Si vous aimez ce que vous voyez, veuillez nous soutenir via les liens dans l'application. Votre soutien servira à faire fonctionner l'application, et les excédents seront donnés à des œuvres caritatives enregistrées." 37 | } -------------------------------------------------------------------------------- /linux/flutter/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # This file controls Flutter-level build steps. It should not be edited. 2 | cmake_minimum_required(VERSION 3.10) 3 | 4 | set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") 5 | 6 | # Configuration provided via flutter tool. 7 | include(${EPHEMERAL_DIR}/generated_config.cmake) 8 | 9 | # TODO: Move the rest of this into files in ephemeral. See 10 | # https://github.com/flutter/flutter/issues/57146. 11 | 12 | # Serves the same purpose as list(TRANSFORM ... PREPEND ...), 13 | # which isn't available in 3.10. 14 | function(list_prepend LIST_NAME PREFIX) 15 | set(NEW_LIST "") 16 | foreach(element ${${LIST_NAME}}) 17 | list(APPEND NEW_LIST "${PREFIX}${element}") 18 | endforeach(element) 19 | set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) 20 | endfunction() 21 | 22 | # === Flutter Library === 23 | # System-level dependencies. 24 | find_package(PkgConfig REQUIRED) 25 | pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) 26 | pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) 27 | pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) 28 | 29 | set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") 30 | 31 | # Published to parent scope for install step. 32 | set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) 33 | set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) 34 | set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) 35 | set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) 36 | 37 | list(APPEND FLUTTER_LIBRARY_HEADERS 38 | "fl_basic_message_channel.h" 39 | "fl_binary_codec.h" 40 | "fl_binary_messenger.h" 41 | "fl_dart_project.h" 42 | "fl_engine.h" 43 | "fl_json_message_codec.h" 44 | "fl_json_method_codec.h" 45 | "fl_message_codec.h" 46 | "fl_method_call.h" 47 | "fl_method_channel.h" 48 | "fl_method_codec.h" 49 | "fl_method_response.h" 50 | "fl_plugin_registrar.h" 51 | "fl_plugin_registry.h" 52 | "fl_standard_message_codec.h" 53 | "fl_standard_method_codec.h" 54 | "fl_string_codec.h" 55 | "fl_value.h" 56 | "fl_view.h" 57 | "flutter_linux.h" 58 | ) 59 | list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") 60 | add_library(flutter INTERFACE) 61 | target_include_directories(flutter INTERFACE 62 | "${EPHEMERAL_DIR}" 63 | ) 64 | target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") 65 | target_link_libraries(flutter INTERFACE 66 | PkgConfig::GTK 67 | PkgConfig::GLIB 68 | PkgConfig::GIO 69 | ) 70 | add_dependencies(flutter flutter_assemble) 71 | 72 | # === Flutter tool backend === 73 | # _phony_ is a non-existent file to force this command to run every time, 74 | # since currently there's no way to get a full input/output list from the 75 | # flutter tool. 76 | add_custom_command( 77 | OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} 78 | ${CMAKE_CURRENT_BINARY_DIR}/_phony_ 79 | COMMAND ${CMAKE_COMMAND} -E env 80 | ${FLUTTER_TOOL_ENVIRONMENT} 81 | "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" 82 | ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} 83 | VERBATIM 84 | ) 85 | add_custom_target(flutter_assemble DEPENDS 86 | "${FLUTTER_LIBRARY}" 87 | ${FLUTTER_LIBRARY_HEADERS} 88 | ) 89 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at **towardsikhlaas+oss@gmail.com**. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /windows/runner/Runner.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #pragma code_page(65001) 4 | #include "resource.h" 5 | 6 | #define APSTUDIO_READONLY_SYMBOLS 7 | ///////////////////////////////////////////////////////////////////////////// 8 | // 9 | // Generated from the TEXTINCLUDE 2 resource. 10 | // 11 | #include "winres.h" 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (United States) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 21 | 22 | #ifdef APSTUDIO_INVOKED 23 | ///////////////////////////////////////////////////////////////////////////// 24 | // 25 | // TEXTINCLUDE 26 | // 27 | 28 | 1 TEXTINCLUDE 29 | BEGIN 30 | "resource.h\0" 31 | END 32 | 33 | 2 TEXTINCLUDE 34 | BEGIN 35 | "#include ""winres.h""\r\n" 36 | "\0" 37 | END 38 | 39 | 3 TEXTINCLUDE 40 | BEGIN 41 | "\r\n" 42 | "\0" 43 | END 44 | 45 | #endif // APSTUDIO_INVOKED 46 | 47 | 48 | ///////////////////////////////////////////////////////////////////////////// 49 | // 50 | // Icon 51 | // 52 | 53 | // Icon with lowest ID value placed first to ensure application icon 54 | // remains consistent on all systems. 55 | IDI_APP_ICON ICON "resources\\app_icon.ico" 56 | 57 | 58 | ///////////////////////////////////////////////////////////////////////////// 59 | // 60 | // Version 61 | // 62 | 63 | #if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) 64 | #define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD 65 | #else 66 | #define VERSION_AS_NUMBER 1,0,0,0 67 | #endif 68 | 69 | #if defined(FLUTTER_VERSION) 70 | #define VERSION_AS_STRING FLUTTER_VERSION 71 | #else 72 | #define VERSION_AS_STRING "1.0.0" 73 | #endif 74 | 75 | VS_VERSION_INFO VERSIONINFO 76 | FILEVERSION VERSION_AS_NUMBER 77 | PRODUCTVERSION VERSION_AS_NUMBER 78 | FILEFLAGSMASK VS_FFI_FILEFLAGSMASK 79 | #ifdef _DEBUG 80 | FILEFLAGS VS_FF_DEBUG 81 | #else 82 | FILEFLAGS 0x0L 83 | #endif 84 | FILEOS VOS__WINDOWS32 85 | FILETYPE VFT_APP 86 | FILESUBTYPE 0x0L 87 | BEGIN 88 | BLOCK "StringFileInfo" 89 | BEGIN 90 | BLOCK "040904e4" 91 | BEGIN 92 | VALUE "CompanyName", "com.example" "\0" 93 | VALUE "FileDescription", "simply_qibla" "\0" 94 | VALUE "FileVersion", VERSION_AS_STRING "\0" 95 | VALUE "InternalName", "simply_qibla" "\0" 96 | VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" 97 | VALUE "OriginalFilename", "simply_qibla.exe" "\0" 98 | VALUE "ProductName", "simply_qibla" "\0" 99 | VALUE "ProductVersion", VERSION_AS_STRING "\0" 100 | END 101 | END 102 | BLOCK "VarFileInfo" 103 | BEGIN 104 | VALUE "Translation", 0x409, 1252 105 | END 106 | END 107 | 108 | #endif // English (United States) resources 109 | ///////////////////////////////////////////////////////////////////////////// 110 | 111 | 112 | 113 | #ifndef APSTUDIO_INVOKED 114 | ///////////////////////////////////////////////////////////////////////////// 115 | // 116 | // Generated from the TEXTINCLUDE 3 resource. 117 | // 118 | 119 | 120 | ///////////////////////////////////////////////////////////////////////////// 121 | #endif // not APSTUDIO_INVOKED 122 | -------------------------------------------------------------------------------- /lib/l10n/app_localizations_ar.dart: -------------------------------------------------------------------------------- 1 | // ignore: unused_import 2 | import 'package:intl/intl.dart' as intl; 3 | import 'app_localizations.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | 7 | /// The translations for Arabic (`ar`). 8 | class AppLocalizationsAr extends AppLocalizations { 9 | AppLocalizationsAr([String locale = 'ar']) : super(locale); 10 | 11 | @override 12 | String get appNamePascalCase => 'سمبلي قبلة'; 13 | 14 | @override 15 | String get appAboutLegalese => '© ٢٠٢٤ TowardsIkhlaas'; 16 | 17 | @override 18 | String get changeLocationBarText => 'الانتقال إلى موقع محدد؟ :)'; 19 | 20 | @override 21 | String get latitudeFieldLabel => '(أرقام 0-9) خط العرض'; 22 | 23 | @override 24 | String get longitudeFieldLabel => '(أرقام 0-9) خط الطول'; 25 | 26 | @override 27 | String get skipText => 'تخطي'; 28 | 29 | @override 30 | String get doneText => 'تم'; 31 | 32 | @override 33 | String get okText => 'حسنا'; 34 | 35 | @override 36 | String get cancelText => 'إلغاء'; 37 | 38 | @override 39 | String get clearText => 'مسح'; 40 | 41 | @override 42 | String get allowText => 'يسمح'; 43 | 44 | @override 45 | String get turnOnText => 'تشغيل'; 46 | 47 | @override 48 | String get coordinatesInputFormTitle => 'أدخل الإحداثيات'; 49 | 50 | @override 51 | String get centerConsoleCenteringText => 'جارٍ تحديد موقعك...'; 52 | 53 | @override 54 | String get centerConsoleDraggingText => 'ارفع لإظهار خط القبلة'; 55 | 56 | @override 57 | String get centerConsoleIdleText => 'كم إلى الكعبة'; 58 | 59 | @override 60 | String get locationDisabled => 'تم تعطيل الموقعك.'; 61 | 62 | @override 63 | String get locationDeniedInitial => 64 | 'يرجى السماح بإذن الموقع لاستخدام هذه الميزة. نحن لا نخزن أو نبيع بياناتك. :)'; 65 | 66 | @override 67 | String get locationDeniedPermanent => 68 | 'يرجى السماح بإذن الموقعك لاستخدام هذه الميزة.'; 69 | 70 | @override 71 | String get latitudeErrorText => 'قيمة خط العرض غير صالحة'; 72 | 73 | @override 74 | String get longitudeErrorText => 'قيمة خط الطول غير صالحة'; 75 | 76 | @override 77 | String get thankYouText => 'جزاك الله خيرًا لاستخدامك هذا التطبيق!'; 78 | 79 | @override 80 | String get supportAppealText => 81 | 'يتطلب تشغيل هذا التطبيق وصيانته (Google Maps API). يرجى النظر في دعم المشروع من خلال الأزرار أدناه (سيتم التبرع بالمبالغ الزائدة للجمعيات الخيرية المسجلة).'; 82 | 83 | @override 84 | String get githubButtonText => 'ادعمنا على GitHub'; 85 | 86 | @override 87 | String get donateButtonText => 'ادعمنا على Ko-Fi'; 88 | 89 | @override 90 | String get socialInstagramButtonText => 'تابعنا على Instagram'; 91 | 92 | @override 93 | String get shareButtonText => 'شارك مع الأصدقاء'; 94 | 95 | @override 96 | String get shareContentText => 97 | 'السلام عليكم ورحمة الله وبركاته! تحقق من هذا التطبيق الجميل والدقيق لتحديد القبلة'; 98 | 99 | @override 100 | String get onboardingUsageTitle => 'كيف يعمل هذا؟'; 101 | 102 | @override 103 | String get onboardingLocationTitle => 'دع التطبيق يجد موقعك.'; 104 | 105 | @override 106 | String get onboardingSupportTitle => 'ادعم مهمتنا!'; 107 | 108 | @override 109 | String get onboardingUsageBody => 110 | 'السلام عليكم! لاستخدام التطبيق، ضع جهازك بشكل مسطح وقم بتدويره ليصطف مع المعالم القريبة المعروضة في الخريطة، مثل الشوارع والمباني من حولك.'; 111 | 112 | @override 113 | String get onboardingLocationBody => 114 | 'تعد أذونات الموقع ضرورية لكي يعمل التطبيق بشكل مثالي، ولكنها ليست إلزامية. كن مطمئنًا، بياناتك لن يتم جمعها أو بيعها.'; 115 | 116 | @override 117 | String get onboardingSupportBody => 118 | 'سمبلي قبلة خالي من الإعلانات ومفتوح المصدر. إذا أعجبك ما تراه، يرجى دعمنا من خلال الروابط داخل التطبيق. سيتم استخدام دعمك لتشغيل التطبيق، وسيتم التبرع بالفائض للجمعيات الخيرية المسجلة.'; 119 | } 120 | -------------------------------------------------------------------------------- /lib/l10n/app_localizations_en.dart: -------------------------------------------------------------------------------- 1 | // ignore: unused_import 2 | import 'package:intl/intl.dart' as intl; 3 | import 'app_localizations.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | 7 | /// The translations for English (`en`). 8 | class AppLocalizationsEn extends AppLocalizations { 9 | AppLocalizationsEn([String locale = 'en']) : super(locale); 10 | 11 | @override 12 | String get appNamePascalCase => 'SimplyQibla'; 13 | 14 | @override 15 | String get appAboutLegalese => '© 2024 TowardsIkhlaas'; 16 | 17 | @override 18 | String get changeLocationBarText => 'Jump to a specific location? :)'; 19 | 20 | @override 21 | String get latitudeFieldLabel => 'Latitude'; 22 | 23 | @override 24 | String get longitudeFieldLabel => 'Longitude'; 25 | 26 | @override 27 | String get skipText => 'Skip'; 28 | 29 | @override 30 | String get doneText => 'Done'; 31 | 32 | @override 33 | String get okText => 'OK'; 34 | 35 | @override 36 | String get cancelText => 'Cancel'; 37 | 38 | @override 39 | String get clearText => 'Clear'; 40 | 41 | @override 42 | String get allowText => 'ALLOW'; 43 | 44 | @override 45 | String get turnOnText => 'TURN ON'; 46 | 47 | @override 48 | String get coordinatesInputFormTitle => 'Enter Coordinates'; 49 | 50 | @override 51 | String get centerConsoleCenteringText => 'Locating you...'; 52 | 53 | @override 54 | String get centerConsoleDraggingText => 'Lift to show Qibla line'; 55 | 56 | @override 57 | String get centerConsoleIdleText => 'km to the Kaaba'; 58 | 59 | @override 60 | String get locationDisabled => 'Your location is off.'; 61 | 62 | @override 63 | String get locationDeniedInitial => 64 | 'Please allow location permission to use this feature. We do not store or sell your data. :)'; 65 | 66 | @override 67 | String get locationDeniedPermanent => 68 | 'Please allow location permission to use this feature.'; 69 | 70 | @override 71 | String get latitudeErrorText => 'Invalid latitude value'; 72 | 73 | @override 74 | String get longitudeErrorText => 'Invalid longitude value'; 75 | 76 | @override 77 | String get thankYouText => 'JazakAllahu Khayran for using this app!'; 78 | 79 | @override 80 | String get supportAppealText => 81 | 'This app costs to run and maintain (Google Maps API). Please consider supporting the project through the buttons below (excess amounts will be donated to registered charities).'; 82 | 83 | @override 84 | String get githubButtonText => 'Support us on GitHub'; 85 | 86 | @override 87 | String get donateButtonText => 'Support us on Ko-Fi'; 88 | 89 | @override 90 | String get socialInstagramButtonText => 'Follow us on Instagram'; 91 | 92 | @override 93 | String get shareButtonText => 'Share with Friends'; 94 | 95 | @override 96 | String get shareContentText => 97 | 'As salaam alaykum warahmatullahi wabarakatuh! Check out this beautiful and accurate Qibla app'; 98 | 99 | @override 100 | String get onboardingUsageTitle => 'How does this work?'; 101 | 102 | @override 103 | String get onboardingLocationTitle => 'Let the app find you.'; 104 | 105 | @override 106 | String get onboardingSupportTitle => 'Support our mission!'; 107 | 108 | @override 109 | String get onboardingUsageBody => 110 | 'Salaam! To use the app, hold your device flat and rotate it to align with nearby landmarks shown in the map, like streets and buildings around you.'; 111 | 112 | @override 113 | String get onboardingLocationBody => 114 | 'Location permissions are needed for the app to function ideally, but not required. Rest assured, your data is neither collected nor sold.'; 115 | 116 | @override 117 | String get onboardingSupportBody => 118 | 'SimplyQibla is ad-free and open-source. If you like what you see, please support us through the in-app links. Your support will be used to run the app, and excess will be donated to registered charities.'; 119 | } 120 | -------------------------------------------------------------------------------- /windows/runner/win32_window.h: -------------------------------------------------------------------------------- 1 | #ifndef RUNNER_WIN32_WINDOW_H_ 2 | #define RUNNER_WIN32_WINDOW_H_ 3 | 4 | #include <windows.h> 5 | 6 | #include <functional> 7 | #include <memory> 8 | #include <string> 9 | 10 | // A class abstraction for a high DPI-aware Win32 Window. Intended to be 11 | // inherited from by classes that wish to specialize with custom 12 | // rendering and input handling 13 | class Win32Window { 14 | public: 15 | struct Point { 16 | unsigned int x; 17 | unsigned int y; 18 | Point(unsigned int x, unsigned int y) : x(x), y(y) {} 19 | }; 20 | 21 | struct Size { 22 | unsigned int width; 23 | unsigned int height; 24 | Size(unsigned int width, unsigned int height) 25 | : width(width), height(height) {} 26 | }; 27 | 28 | Win32Window(); 29 | virtual ~Win32Window(); 30 | 31 | // Creates a win32 window with |title| that is positioned and sized using 32 | // |origin| and |size|. New windows are created on the default monitor. Window 33 | // sizes are specified to the OS in physical pixels, hence to ensure a 34 | // consistent size this function will scale the inputted width and height as 35 | // as appropriate for the default monitor. The window is invisible until 36 | // |Show| is called. Returns true if the window was created successfully. 37 | bool Create(const std::wstring& title, const Point& origin, const Size& size); 38 | 39 | // Show the current window. Returns true if the window was successfully shown. 40 | bool Show(); 41 | 42 | // Release OS resources associated with window. 43 | void Destroy(); 44 | 45 | // Inserts |content| into the window tree. 46 | void SetChildContent(HWND content); 47 | 48 | // Returns the backing Window handle to enable clients to set icon and other 49 | // window properties. Returns nullptr if the window has been destroyed. 50 | HWND GetHandle(); 51 | 52 | // If true, closing this window will quit the application. 53 | void SetQuitOnClose(bool quit_on_close); 54 | 55 | // Return a RECT representing the bounds of the current client area. 56 | RECT GetClientArea(); 57 | 58 | protected: 59 | // Processes and route salient window messages for mouse handling, 60 | // size change and DPI. Delegates handling of these to member overloads that 61 | // inheriting classes can handle. 62 | virtual LRESULT MessageHandler(HWND window, 63 | UINT const message, 64 | WPARAM const wparam, 65 | LPARAM const lparam) noexcept; 66 | 67 | // Called when CreateAndShow is called, allowing subclass window-related 68 | // setup. Subclasses should return false if setup fails. 69 | virtual bool OnCreate(); 70 | 71 | // Called when Destroy is called. 72 | virtual void OnDestroy(); 73 | 74 | private: 75 | friend class WindowClassRegistrar; 76 | 77 | // OS callback called by message pump. Handles the WM_NCCREATE message which 78 | // is passed when the non-client area is being created and enables automatic 79 | // non-client DPI scaling so that the non-client area automatically 80 | // responds to changes in DPI. All other messages are handled by 81 | // MessageHandler. 82 | static LRESULT CALLBACK WndProc(HWND const window, 83 | UINT const message, 84 | WPARAM const wparam, 85 | LPARAM const lparam) noexcept; 86 | 87 | // Retrieves a class instance pointer for |window| 88 | static Win32Window* GetThisFromHandle(HWND const window) noexcept; 89 | 90 | // Update the window frame's theme to match the system theme. 91 | static void UpdateTheme(HWND const window); 92 | 93 | bool quit_on_close_ = false; 94 | 95 | // window handle for top level window. 96 | HWND window_handle_ = nullptr; 97 | 98 | // window handle for hosted content. 99 | HWND child_content_ = nullptr; 100 | }; 101 | 102 | #endif // RUNNER_WIN32_WINDOW_H_ 103 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <Scheme 3 | LastUpgradeVersion = "1510" 4 | version = "1.3"> 5 | <BuildAction 6 | parallelizeBuildables = "YES" 7 | buildImplicitDependencies = "YES"> 8 | <BuildActionEntries> 9 | <BuildActionEntry 10 | buildForTesting = "YES" 11 | buildForRunning = "YES" 12 | buildForProfiling = "YES" 13 | buildForArchiving = "YES" 14 | buildForAnalyzing = "YES"> 15 | <BuildableReference 16 | BuildableIdentifier = "primary" 17 | BlueprintIdentifier = "33CC10EC2044A3C60003C045" 18 | BuildableName = "simply_qibla.app" 19 | BlueprintName = "Runner" 20 | ReferencedContainer = "container:Runner.xcodeproj"> 21 | </BuildableReference> 22 | </BuildActionEntry> 23 | </BuildActionEntries> 24 | </BuildAction> 25 | <TestAction 26 | buildConfiguration = "Debug" 27 | selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 28 | selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 29 | shouldUseLaunchSchemeArgsEnv = "YES"> 30 | <MacroExpansion> 31 | <BuildableReference 32 | BuildableIdentifier = "primary" 33 | BlueprintIdentifier = "33CC10EC2044A3C60003C045" 34 | BuildableName = "simply_qibla.app" 35 | BlueprintName = "Runner" 36 | ReferencedContainer = "container:Runner.xcodeproj"> 37 | </BuildableReference> 38 | </MacroExpansion> 39 | <Testables> 40 | <TestableReference 41 | skipped = "NO" 42 | parallelizable = "YES"> 43 | <BuildableReference 44 | BuildableIdentifier = "primary" 45 | BlueprintIdentifier = "331C80D4294CF70F00263BE5" 46 | BuildableName = "RunnerTests.xctest" 47 | BlueprintName = "RunnerTests" 48 | ReferencedContainer = "container:Runner.xcodeproj"> 49 | </BuildableReference> 50 | </TestableReference> 51 | </Testables> 52 | </TestAction> 53 | <LaunchAction 54 | buildConfiguration = "Debug" 55 | selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 56 | selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 57 | launchStyle = "0" 58 | useCustomWorkingDirectory = "NO" 59 | ignoresPersistentStateOnLaunch = "NO" 60 | debugDocumentVersioning = "YES" 61 | debugServiceExtension = "internal" 62 | allowLocationSimulation = "YES"> 63 | <BuildableProductRunnable 64 | runnableDebuggingMode = "0"> 65 | <BuildableReference 66 | BuildableIdentifier = "primary" 67 | BlueprintIdentifier = "33CC10EC2044A3C60003C045" 68 | BuildableName = "simply_qibla.app" 69 | BlueprintName = "Runner" 70 | ReferencedContainer = "container:Runner.xcodeproj"> 71 | </BuildableReference> 72 | </BuildableProductRunnable> 73 | </LaunchAction> 74 | <ProfileAction 75 | buildConfiguration = "Profile" 76 | shouldUseLaunchSchemeArgsEnv = "YES" 77 | savedToolIdentifier = "" 78 | useCustomWorkingDirectory = "NO" 79 | debugDocumentVersioning = "YES"> 80 | <BuildableProductRunnable 81 | runnableDebuggingMode = "0"> 82 | <BuildableReference 83 | BuildableIdentifier = "primary" 84 | BlueprintIdentifier = "33CC10EC2044A3C60003C045" 85 | BuildableName = "simply_qibla.app" 86 | BlueprintName = "Runner" 87 | ReferencedContainer = "container:Runner.xcodeproj"> 88 | </BuildableReference> 89 | </BuildableProductRunnable> 90 | </ProfileAction> 91 | <AnalyzeAction 92 | buildConfiguration = "Debug"> 93 | </AnalyzeAction> 94 | <ArchiveAction 95 | buildConfiguration = "Release" 96 | revealArchiveInOrganizer = "YES"> 97 | </ArchiveAction> 98 | </Scheme> 99 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 | <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> 3 | <dependencies> 4 | <deployment identifier="iOS"/> 5 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> 6 | </dependencies> 7 | <scenes> 8 | <!--View Controller--> 9 | <scene sceneID="EHf-IW-A2E"> 10 | <objects> 11 | <viewController id="01J-lp-oVM" sceneMemberID="viewController"> 12 | <layoutGuides> 13 | <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> 14 | <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> 15 | </layoutGuides> 16 | <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> 17 | <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 18 | <subviews> 19 | <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" image="LaunchBackground" translatesAutoresizingMaskIntoConstraints="NO" id="tWc-Dq-wcI"/> 20 | <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"></imageView> 21 | <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" image="BrandingImage" translatesAutoresizingMaskIntoConstraints="NO" id="Uyq-Kz-ftE"/> 22 | </subviews> 23 | <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 24 | <constraints> 25 | <constraint firstAttribute="bottom" secondItem="Uyq-Kz-ftE" secondAttribute="bottom" id="8Yb-q4-8bl"/> 26 | <constraint firstItem="Uyq-Kz-ftE" firstAttribute="centerX" secondItem="YRO-k0-Ey4" secondAttribute="centerX" id="3kg-TC-cPP"/> 27 | <constraint firstItem="YRO-k0-Ey4" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="3T2-ad-Qdv"/> 28 | <constraint firstItem="tWc-Dq-wcI" firstAttribute="bottom" secondItem="Ze5-6b-2t3" secondAttribute="bottom" id="RPx-PI-7Xg"/> 29 | <constraint firstItem="tWc-Dq-wcI" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="SdS-ul-q2q"/> 30 | <constraint firstAttribute="trailing" secondItem="tWc-Dq-wcI" secondAttribute="trailing" id="Swv-Gf-Rwn"/> 31 | <constraint firstAttribute="trailing" secondItem="YRO-k0-Ey4" secondAttribute="trailing" id="TQA-XW-tRk"/> 32 | <constraint firstItem="YRO-k0-Ey4" firstAttribute="bottom" secondItem="Ze5-6b-2t3" secondAttribute="bottom" id="duK-uY-Gun"/> 33 | <constraint firstItem="tWc-Dq-wcI" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="kV7-tw-vXt"/> 34 | <constraint firstItem="YRO-k0-Ey4" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="xPn-NY-SIU"/> 35 | </constraints> 36 | </view> 37 | </viewController> 38 | <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> 39 | </objects> 40 | <point key="canvasLocation" x="53" y="375"/> 41 | </scene> 42 | </scenes> 43 | <resources> 44 | <image name="LaunchImage" width="1024" height="1024"/> 45 | <image name="LaunchBackground" width="1" height="1"/> 46 | <image name="BrandingImage" width="1" height="1"/> 47 | </resources> 48 | </document> 49 | -------------------------------------------------------------------------------- /lib/widgets/user_location_icon.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | import 'dart:ui' as ui; 3 | import 'package:flutter/material.dart'; 4 | 5 | class LocationIconPainter extends CustomPainter { 6 | final Color primaryColor; 7 | final Color borderColor; 8 | final double direction; 9 | 10 | const LocationIconPainter({ 11 | required this.primaryColor, 12 | required this.borderColor, 13 | required this.direction, 14 | }); 15 | 16 | @override 17 | void paint(Canvas canvas, Size size) { 18 | final Offset center = Offset(size.width / 2, size.height / 2); 19 | final double radius = size.width * 0.6; 20 | 21 | canvas.save(); 22 | final Path clipPath = Path() 23 | ..addOval(Rect.fromCircle(center: center, radius: radius)); 24 | canvas.clipPath(clipPath); 25 | canvas.save(); 26 | canvas.translate(center.dx, center.dy); 27 | canvas.rotate(direction); 28 | canvas.translate(-center.dx, -center.dy); 29 | 30 | // Draw direction cone with adjusted dimensions 31 | final ui.Path conePath = Path(); 32 | final double coneWidth = size.width; 33 | final double coneHeight = size.height * 0.8; 34 | final double coneYOffset = size.height * 0.20; 35 | 36 | conePath.moveTo(center.dx, center.dy - coneHeight / 2 + coneYOffset); 37 | conePath.lineTo( 38 | center.dx + coneWidth / 2, center.dy + coneHeight / 2 + coneYOffset); 39 | conePath.lineTo( 40 | center.dx - coneWidth / 2, center.dy + coneHeight / 2 + coneYOffset); 41 | conePath.close(); 42 | 43 | // Create gradient for the cone 44 | final ui.Gradient coneGradient = ui.Gradient.radial( 45 | Offset(center.dx, center.dy - coneHeight / 2 + coneYOffset), 46 | radius * 1.25, 47 | <ui.Color>[ 48 | primaryColor, 49 | primaryColor.withValues(alpha: 0.0), 50 | ], 51 | ); 52 | 53 | final ui.Paint conePaint = Paint()..shader = coneGradient; 54 | canvas.drawPath(conePath, conePaint); 55 | 56 | // Restore canvas rotation 57 | canvas.restore(); 58 | 59 | // Draw the outer white circle shadow 60 | final ui.Paint shadowPaint = Paint() 61 | ..color = Colors.black.withValues(alpha: 0.3) 62 | ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 3.0) 63 | ..style = PaintingStyle.fill; 64 | 65 | canvas.drawCircle(center, size.width * 0.20, shadowPaint); 66 | 67 | // Draw outer white circle for border 68 | final double outerCircleRadius = size.width * 0.20; 69 | final ui.Paint outerCirclePaint = Paint() 70 | ..color = borderColor 71 | ..style = PaintingStyle.fill; 72 | 73 | canvas.drawCircle(center, outerCircleRadius, outerCirclePaint); 74 | 75 | // Draw inner colored circle 76 | final double innerCircleRadius = size.width * 0.13; 77 | final ui.Paint innerCirclePaint = Paint() 78 | ..color = primaryColor 79 | ..style = PaintingStyle.fill; 80 | 81 | canvas.drawCircle(center, innerCircleRadius, innerCirclePaint); 82 | 83 | // Restore the original canvas state 84 | canvas.restore(); 85 | } 86 | 87 | @override 88 | bool shouldRepaint(LocationIconPainter oldDelegate) { 89 | return oldDelegate.primaryColor != primaryColor || 90 | oldDelegate.borderColor != borderColor || 91 | oldDelegate.direction != direction; 92 | } 93 | } 94 | 95 | class UserLocationIcon extends StatelessWidget { 96 | final double size; 97 | final Color primaryColor; 98 | final Color borderColor; 99 | final double direction; 100 | 101 | const UserLocationIcon({ 102 | super.key, 103 | this.size = 64.0, 104 | this.primaryColor = Colors.grey, 105 | this.borderColor = Colors.white, 106 | this.direction = pi, 107 | }); 108 | 109 | @override 110 | Widget build(BuildContext context) { 111 | return SizedBox( 112 | width: size, 113 | height: size, 114 | child: CustomPaint( 115 | painter: LocationIconPainter( 116 | primaryColor: primaryColor, 117 | borderColor: borderColor, 118 | direction: direction, 119 | ), 120 | ), 121 | ); 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /lib/l10n/app_localizations_id.dart: -------------------------------------------------------------------------------- 1 | // ignore: unused_import 2 | import 'package:intl/intl.dart' as intl; 3 | import 'app_localizations.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | 7 | /// The translations for Indonesian (`id`). 8 | class AppLocalizationsId extends AppLocalizations { 9 | AppLocalizationsId([String locale = 'id']) : super(locale); 10 | 11 | @override 12 | String get appNamePascalCase => 'SimplyQibla'; 13 | 14 | @override 15 | String get appAboutLegalese => '© 2024 TowardsIkhlaas'; 16 | 17 | @override 18 | String get changeLocationBarText => 'Ingin langsung ke lokasi tertentu? :)'; 19 | 20 | @override 21 | String get latitudeFieldLabel => 'Lintang'; 22 | 23 | @override 24 | String get longitudeFieldLabel => 'Bujur'; 25 | 26 | @override 27 | String get skipText => 'Lewati'; 28 | 29 | @override 30 | String get doneText => 'Selesai'; 31 | 32 | @override 33 | String get okText => 'OK'; 34 | 35 | @override 36 | String get cancelText => 'Batal'; 37 | 38 | @override 39 | String get clearText => 'Hapus'; 40 | 41 | @override 42 | String get allowText => 'IZINKAN'; 43 | 44 | @override 45 | String get turnOnText => 'NYALAKAN'; 46 | 47 | @override 48 | String get coordinatesInputFormTitle => 'Masukkan Koordinat'; 49 | 50 | @override 51 | String get centerConsoleCenteringText => 'Mencari lokasi Anda...'; 52 | 53 | @override 54 | String get centerConsoleDraggingText => 55 | 'Angkat untuk menampilkan garis kiblat'; 56 | 57 | @override 58 | String get centerConsoleIdleText => 'km ke Ka\'bah'; 59 | 60 | @override 61 | String get locationDisabled => 'Layanan lokasi Anda dinonaktifkan.'; 62 | 63 | @override 64 | String get locationDeniedInitial => 65 | 'Silakan izinkan akses lokasi untuk menggunakan fitur ini. Kami tidak menyimpan atau menjual data Anda. :)'; 66 | 67 | @override 68 | String get locationDeniedPermanent => 69 | 'Silakan izinkan akses lokasi untuk menggunakan fitur ini.'; 70 | 71 | @override 72 | String get latitudeErrorText => 'Nilai lintang tidak valid'; 73 | 74 | @override 75 | String get longitudeErrorText => 'Nilai bujur tidak valid'; 76 | 77 | @override 78 | String get thankYouText => 79 | 'JazakAllahu Khayran telah menggunakan aplikasi ini!'; 80 | 81 | @override 82 | String get supportAppealText => 83 | 'Aplikasi ini memerlukan biaya untuk dijalankan dan dipelihara (Google Maps API). Mohon pertimbangkan untuk mendukung proyek ini melalui tombol di bawah (dana lebih akan disumbangkan ke badan amal terdaftar).'; 84 | 85 | @override 86 | String get githubButtonText => 'Dukung kami di GitHub'; 87 | 88 | @override 89 | String get donateButtonText => 'Dukung kami di Ko-Fi'; 90 | 91 | @override 92 | String get socialInstagramButtonText => 'Ikuti kami di Instagram'; 93 | 94 | @override 95 | String get shareButtonText => 'Bagikan dengan Teman'; 96 | 97 | @override 98 | String get shareContentText => 99 | 'Assalamualaikum warahmatullahi wabarakatuh! Coba aplikasi kiblat yang indah dan akurat ini'; 100 | 101 | @override 102 | String get onboardingUsageTitle => 'Bagaimana ini bekerja?'; 103 | 104 | @override 105 | String get onboardingLocationTitle => 'Biarkan aplikasi menemukan Anda.'; 106 | 107 | @override 108 | String get onboardingSupportTitle => 'Dukung misi kami!'; 109 | 110 | @override 111 | String get onboardingUsageBody => 112 | 'Salaam! Untuk menggunakan aplikasi, pegang perangkat Anda dalam posisi datar dan putar untuk menyelaraskan dengan landmark di peta, seperti jalan dan bangunan di sekitar Anda.'; 113 | 114 | @override 115 | String get onboardingLocationBody => 116 | 'Izin lokasi diperlukan agar aplikasi berfungsi dengan optimal, tetapi tidak wajib. Tenang, data Anda tidak dikumpulkan atau dijual.'; 117 | 118 | @override 119 | String get onboardingSupportBody => 120 | 'SimplyQibla bebas iklan dan bersumber terbuka. Jika Anda menyukai aplikasi ini, mohon dukung melalui tautan dalam aplikasi. Dukungan Anda akan digunakan untuk menjalankan aplikasi, dan kelebihannya akan disumbangkan ke badan amal terdaftar.'; 121 | } 122 | -------------------------------------------------------------------------------- /lib/l10n/app_localizations_ms.dart: -------------------------------------------------------------------------------- 1 | // ignore: unused_import 2 | import 'package:intl/intl.dart' as intl; 3 | import 'app_localizations.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | 7 | /// The translations for Malay (`ms`). 8 | class AppLocalizationsMs extends AppLocalizations { 9 | AppLocalizationsMs([String locale = 'ms']) : super(locale); 10 | 11 | @override 12 | String get appNamePascalCase => 'SimplyQibla'; 13 | 14 | @override 15 | String get appAboutLegalese => '© 2024 TowardsIkhlaas'; 16 | 17 | @override 18 | String get changeLocationBarText => 'Mahu pergi ke lokasi tertentu? :)'; 19 | 20 | @override 21 | String get latitudeFieldLabel => 'Latitud'; 22 | 23 | @override 24 | String get longitudeFieldLabel => 'Longitud'; 25 | 26 | @override 27 | String get skipText => 'Langkau'; 28 | 29 | @override 30 | String get doneText => 'Selesai'; 31 | 32 | @override 33 | String get okText => 'OK'; 34 | 35 | @override 36 | String get cancelText => 'Batal'; 37 | 38 | @override 39 | String get clearText => 'Kosongkan'; 40 | 41 | @override 42 | String get allowText => 'IZINKAN'; 43 | 44 | @override 45 | String get turnOnText => 'HIDUPKAN'; 46 | 47 | @override 48 | String get coordinatesInputFormTitle => 'Masukkan Koordinat'; 49 | 50 | @override 51 | String get centerConsoleCenteringText => 'Mencari lokasi anda...'; 52 | 53 | @override 54 | String get centerConsoleDraggingText => 'Angkat untuk tunjukkan garis Qibla'; 55 | 56 | @override 57 | String get centerConsoleIdleText => 'km ke Kaabah'; 58 | 59 | @override 60 | String get locationDisabled => 'Lokasi anda dimatikan.'; 61 | 62 | @override 63 | String get locationDeniedInitial => 64 | 'Sila benarkan kebenaran lokasi untuk menggunakan ciri ini. Kami tidak menyimpan atau menjual data anda. :)'; 65 | 66 | @override 67 | String get locationDeniedPermanent => 68 | 'Sila benarkan kebenaran lokasi untuk menggunakan ciri ini.'; 69 | 70 | @override 71 | String get latitudeErrorText => 'Nilai latitud tidak sah'; 72 | 73 | @override 74 | String get longitudeErrorText => 'Nilai longitud tidak sah'; 75 | 76 | @override 77 | String get thankYouText => 78 | 'JazakAllahu Khayran kerana menggunakan aplikasi ini!'; 79 | 80 | @override 81 | String get supportAppealText => 82 | 'Aplikasi ini memerlukan kos untuk dijalankan dan diselenggara (Google Maps API). Sila pertimbangkan untuk menyokong projek ini melalui butang di bawah (lebih jumlah akan disumbangkan kepada badan amal berdaftar).'; 83 | 84 | @override 85 | String get githubButtonText => 'Sokong kami di GitHub'; 86 | 87 | @override 88 | String get donateButtonText => 'Sokong kami di Ko-Fi'; 89 | 90 | @override 91 | String get socialInstagramButtonText => 'Ikuti kami di Instagram'; 92 | 93 | @override 94 | String get shareButtonText => 'Kongsi dengan Rakan'; 95 | 96 | @override 97 | String get shareContentText => 98 | 'As salaam alaykum warahmatullahi wabarakatuh! Lihat aplikasi Qibla yang indah dan tepat ini'; 99 | 100 | @override 101 | String get onboardingUsageTitle => 'Bagaimana ia berfungsi?'; 102 | 103 | @override 104 | String get onboardingLocationTitle => 'Biarkan aplikasi mencari anda.'; 105 | 106 | @override 107 | String get onboardingSupportTitle => 'Sokong misi kami!'; 108 | 109 | @override 110 | String get onboardingUsageBody => 111 | 'Salaam! Untuk menggunakan aplikasi ini, pegang peranti anda secara mendatar dan pusingkan untuk menyelaraskan dengan mercu tanda berhampiran yang ditunjukkan pada peta, seperti jalan dan bangunan di sekitar anda.'; 112 | 113 | @override 114 | String get onboardingLocationBody => 115 | 'Kebenaran lokasi diperlukan agar aplikasi berfungsi dengan optimum, tetapi tidak wajib. Anda yakin, data anda tidak dikumpul atau dijual.'; 116 | 117 | @override 118 | String get onboardingSupportBody => 119 | 'SimplyQibla tiada iklan dan sumber terbuka. Jika anda suka, sila sokong kami melalui pautan dalam aplikasi. Sokongan anda akan digunakan untuk menjalankan aplikasi, dan lebihan akan disumbangkan kepada badan amal berdaftar.'; 120 | } 121 | --------------------------------------------------------------------------------