diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 3d1b370c..2b3714e0 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -1,7 +1,7 @@ name: Android CI on: push: - branches: [ main, telemetry ] + branches: [ main ] pull_request: branches: [ '*' ] workflow_dispatch: diff --git a/CHANGELOG.md b/CHANGELOG.md index c6c58fcf..200973e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,15 @@ # Tehro Changelog -## Unreleased +## v2.3.1 + +- Added station search support. +- Fixed map loading indicator's exit animation. + +## v2.3.0 - Fixed state restore if the app process was killed on the line screen. +- Line screen navigations no longer stack on top of each other and only the last one is kept. +- Added Firebase (Analytics, Crashlytics & Performance) on GitHub & Play builds. ## v2.2.1 diff --git a/README.md b/README.md index d849bc49..0da6ee42 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Tehro is a guide app for Tehran Metro powered by [Jetpack Compose](https://devel You can get the official releases from either [GitHub](https://github.com/yasandev/tehro-android/releases), [F-Droid](https://f-droid.org/packages/dev.yasan.metro.fdroid/) or [Google Play Store](https://play.google.com/store/apps/details?id=dev.yasan.metro). -The F-Droid releases **do not** have internet access permission & any telemetry. The GitHub & Google Play Store releases **do** have Firebase telemetry. +**Note:** The F-Droid releases do **not** have internet access permission & any telemetry. The GitHub & Google Play Store releases do have Firebase telemetry. ## Database diff --git a/app/build.gradle b/app/build.gradle index 61ffb8b9..44393676 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,8 @@ android { minSdk 21 targetSdk 31 - versionCode 230 - versionName "2.3.0" + versionCode 231 + versionName "2.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/MetroDatabase.kt b/app/src/main/java/dev/yasan/metro/tehran/data/db/MetroDatabase.kt index 217cea5c..2a2ee62d 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/MetroDatabase.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/db/MetroDatabase.kt @@ -3,10 +3,13 @@ package dev.yasan.metro.tehran.data.db import androidx.room.Database import androidx.room.RoomDatabase import dev.yasan.metro.tehran.data.db.dao.* -import dev.yasan.metro.tehran.data.db.entity.* -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelWheelchair -import dev.yasan.metro.tehran.data.db.entity.accessibility.WcAvailabilityLevel +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelBlindness +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelWheelchair +import dev.yasan.metro.tehran.model.tehro.accessibility.WcAvailabilityLevel +import dev.yasan.metro.tehran.model.tehro.DatabaseInformation +import dev.yasan.metro.tehran.model.tehro.Intersection +import dev.yasan.metro.tehran.model.tehro.Line +import dev.yasan.metro.tehran.model.tehro.Station import javax.inject.Inject @Database( diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/AccessibilityLevelBlindnessDAO.kt b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/AccessibilityLevelBlindnessDAO.kt index cc773dae..a61b183f 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/AccessibilityLevelBlindnessDAO.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/AccessibilityLevelBlindnessDAO.kt @@ -3,8 +3,7 @@ package dev.yasan.metro.tehran.data.db.dao import androidx.room.Dao import androidx.room.Query import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelBlindness /** * Data access object for [AccessibilityLevelBlindness]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/AccessibilityLevelWheelchairDAO.kt b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/AccessibilityLevelWheelchairDAO.kt index cfab78ab..4ccb3d55 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/AccessibilityLevelWheelchairDAO.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/AccessibilityLevelWheelchairDAO.kt @@ -3,9 +3,7 @@ package dev.yasan.metro.tehran.data.db.dao import androidx.room.Dao import androidx.room.Query import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelWheelchair +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelWheelchair /** * Data access object for [AccessibilityLevelWheelchair]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/DatabaseInformationDAO.kt b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/DatabaseInformationDAO.kt index c8255eb0..3392f13f 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/DatabaseInformationDAO.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/DatabaseInformationDAO.kt @@ -3,7 +3,7 @@ package dev.yasan.metro.tehran.data.db.dao import androidx.room.Dao import androidx.room.Query import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.DatabaseInformation +import dev.yasan.metro.tehran.model.tehro.DatabaseInformation /** * Data access object for [DatabaseInformation]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/IntersectionDAO.kt b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/IntersectionDAO.kt index 27d53c8b..c2363878 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/IntersectionDAO.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/IntersectionDAO.kt @@ -3,7 +3,7 @@ package dev.yasan.metro.tehran.data.db.dao import androidx.room.Dao import androidx.room.Query import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Intersection +import dev.yasan.metro.tehran.model.tehro.Intersection /** * Data access object for [Intersection]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/LineDAO.kt b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/LineDAO.kt index 29f7657c..777abbfa 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/LineDAO.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/LineDAO.kt @@ -3,7 +3,7 @@ package dev.yasan.metro.tehran.data.db.dao import androidx.room.Dao import androidx.room.Query import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Line +import dev.yasan.metro.tehran.model.tehro.Line /** * Data access object for [Line]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/StationDAO.kt b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/StationDAO.kt index 0ab6b580..160ddaa7 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/StationDAO.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/StationDAO.kt @@ -3,7 +3,7 @@ package dev.yasan.metro.tehran.data.db.dao import androidx.room.Dao import androidx.room.Query import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.tehro.Station /** * Data access object for [Station]. @@ -31,4 +31,10 @@ interface StationDAO { @Query("SELECT * FROM stations WHERE line_id=:lineId") suspend fun getByLineId(lineId: Int): List + /** + * @return A [Station] that matches the query if any exist. + */ + @Query("SELECT * FROM stations WHERE name_en LIKE '%' || :query || '%' OR name_fa LIKE '%' || :query || '%' ORDER BY name_en COLLATE NOCASE ASC") + suspend fun search(query: String): List + } diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/WcAvailabilityLevelDAO.kt b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/WcAvailabilityLevelDAO.kt index ed292689..9ee4e697 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/WcAvailabilityLevelDAO.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/db/dao/WcAvailabilityLevelDAO.kt @@ -3,10 +3,7 @@ package dev.yasan.metro.tehran.data.db.dao import androidx.room.Dao import androidx.room.Query import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelWheelchair -import dev.yasan.metro.tehran.data.db.entity.accessibility.WcAvailabilityLevel +import dev.yasan.metro.tehran.model.tehro.accessibility.WcAvailabilityLevel /** * Data access object for [WcAvailabilityLevel]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/station/accessibility/AccessibilityRepositoryImp.kt b/app/src/main/java/dev/yasan/metro/tehran/data/repository/accessibility/AccessibilityRepositoryImp.kt similarity index 73% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/station/accessibility/AccessibilityRepositoryImp.kt rename to app/src/main/java/dev/yasan/metro/tehran/data/repository/accessibility/AccessibilityRepositoryImp.kt index 2227a28e..cf06353b 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/station/accessibility/AccessibilityRepositoryImp.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/repository/accessibility/AccessibilityRepositoryImp.kt @@ -1,16 +1,12 @@ -package dev.yasan.metro.tehran.data.repo.station.accessibility +package dev.yasan.metro.tehran.data.repository.accessibility -import android.util.Log import dev.yasan.metro.tehran.data.db.dao.AccessibilityLevelBlindnessDAO import dev.yasan.metro.tehran.data.db.dao.AccessibilityLevelWheelchairDAO -import dev.yasan.metro.tehran.data.db.dao.StationDAO import dev.yasan.metro.tehran.data.db.dao.WcAvailabilityLevelDAO -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelWheelchair -import dev.yasan.metro.tehran.data.db.entity.accessibility.WcAvailabilityLevel -import dev.yasan.metro.tehran.data.repo.intersection.IntersectionRepository -import dev.yasan.metro.tehran.data.repo.line.LineRepository +import dev.yasan.metro.tehran.domain.repository.accessibility.AccessibilityRepository +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelBlindness +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelWheelchair +import dev.yasan.metro.tehran.model.tehro.accessibility.WcAvailabilityLevel import javax.inject.Inject /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/dbinfo/DatabaseInformationRepositoryImp.kt b/app/src/main/java/dev/yasan/metro/tehran/data/repository/dbinfo/DatabaseInformationRepositoryImp.kt similarity index 68% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/dbinfo/DatabaseInformationRepositoryImp.kt rename to app/src/main/java/dev/yasan/metro/tehran/data/repository/dbinfo/DatabaseInformationRepositoryImp.kt index 0d907572..75d42941 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/dbinfo/DatabaseInformationRepositoryImp.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/repository/dbinfo/DatabaseInformationRepositoryImp.kt @@ -1,7 +1,8 @@ -package dev.yasan.metro.tehran.data.repo.dbinfo +package dev.yasan.metro.tehran.data.repository.dbinfo import dev.yasan.metro.tehran.data.db.dao.DatabaseInformationDAO -import dev.yasan.metro.tehran.data.db.entity.DatabaseInformation +import dev.yasan.metro.tehran.domain.repository.dbinfo.DatabaseInformationRepository +import dev.yasan.metro.tehran.model.tehro.DatabaseInformation import javax.inject.Inject /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/intersection/IntersectionRepositoryImp.kt b/app/src/main/java/dev/yasan/metro/tehran/data/repository/intersection/IntersectionRepositoryImp.kt similarity index 75% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/intersection/IntersectionRepositoryImp.kt rename to app/src/main/java/dev/yasan/metro/tehran/data/repository/intersection/IntersectionRepositoryImp.kt index f0ee36ff..ac13ba36 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/intersection/IntersectionRepositoryImp.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/repository/intersection/IntersectionRepositoryImp.kt @@ -1,7 +1,8 @@ -package dev.yasan.metro.tehran.data.repo.intersection +package dev.yasan.metro.tehran.data.repository.intersection import dev.yasan.metro.tehran.data.db.dao.IntersectionDAO -import dev.yasan.metro.tehran.data.db.entity.Intersection +import dev.yasan.metro.tehran.domain.repository.intersection.IntersectionRepository +import dev.yasan.metro.tehran.model.tehro.Intersection import javax.inject.Inject /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/line/LineRepositoryImp.kt b/app/src/main/java/dev/yasan/metro/tehran/data/repository/line/LineRepositoryImp.kt similarity index 72% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/line/LineRepositoryImp.kt rename to app/src/main/java/dev/yasan/metro/tehran/data/repository/line/LineRepositoryImp.kt index 0063873d..2584253f 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/line/LineRepositoryImp.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/repository/line/LineRepositoryImp.kt @@ -1,7 +1,8 @@ -package dev.yasan.metro.tehran.data.repo.line +package dev.yasan.metro.tehran.data.repository.line import dev.yasan.metro.tehran.data.db.dao.LineDAO -import dev.yasan.metro.tehran.data.db.entity.Line +import dev.yasan.metro.tehran.domain.repository.line.LineRepository +import dev.yasan.metro.tehran.model.tehro.Line import javax.inject.Inject /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/stat/StatRepositoryImp.kt b/app/src/main/java/dev/yasan/metro/tehran/data/repository/stat/StatRepositoryImp.kt similarity index 92% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/stat/StatRepositoryImp.kt rename to app/src/main/java/dev/yasan/metro/tehran/data/repository/stat/StatRepositoryImp.kt index efcfa656..aa74579a 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/stat/StatRepositoryImp.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/repository/stat/StatRepositoryImp.kt @@ -1,11 +1,12 @@ -package dev.yasan.metro.tehran.data.repo.stat +package dev.yasan.metro.tehran.data.repository.stat import dev.yasan.metro.tehran.R import dev.yasan.metro.tehran.data.db.dao.* -import dev.yasan.metro.tehran.data.db.entity.Stat -import dev.yasan.metro.tehran.data.db.entity.StatComplex -import dev.yasan.metro.tehran.data.repo.station.StationRepository -import dev.yasan.metro.tehran.data.repo.station.accessibility.AccessibilityRepository +import dev.yasan.metro.tehran.model.tehro.Stat +import dev.yasan.metro.tehran.model.tehro.StatComplex +import dev.yasan.metro.tehran.domain.repository.station.StationRepository +import dev.yasan.metro.tehran.domain.repository.accessibility.AccessibilityRepository +import dev.yasan.metro.tehran.domain.repository.stat.StatRepository import javax.inject.Inject /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/station/StationRepositoryImp.kt b/app/src/main/java/dev/yasan/metro/tehran/data/repository/station/StationRepositoryImp.kt similarity index 82% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/station/StationRepositoryImp.kt rename to app/src/main/java/dev/yasan/metro/tehran/data/repository/station/StationRepositoryImp.kt index 8894b56f..09a154ff 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/station/StationRepositoryImp.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/data/repository/station/StationRepositoryImp.kt @@ -1,10 +1,11 @@ -package dev.yasan.metro.tehran.data.repo.station +package dev.yasan.metro.tehran.data.repository.station import dev.yasan.metro.tehran.data.db.dao.StationDAO -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.repo.intersection.IntersectionRepository -import dev.yasan.metro.tehran.data.repo.line.LineRepository -import dev.yasan.metro.tehran.data.repo.station.accessibility.AccessibilityRepository +import dev.yasan.metro.tehran.domain.repository.accessibility.AccessibilityRepository +import dev.yasan.metro.tehran.domain.repository.intersection.IntersectionRepository +import dev.yasan.metro.tehran.domain.repository.line.LineRepository +import dev.yasan.metro.tehran.domain.repository.station.StationRepository +import dev.yasan.metro.tehran.model.tehro.Station import javax.inject.Inject /** @@ -54,6 +55,9 @@ class StationRepositoryImp @Inject constructor( } override suspend fun fetchAdditionalStationData(station: Station): Station { + + station.line = lineRepository.getLine(lineId = station.lineId) + intersectionRepository.getIntersectionByStationId(stationId = station.id) ?.let { intersection -> intersection.stationA = @@ -94,4 +98,10 @@ class StationRepositoryImp @Inject constructor( } } + override suspend fun searchStations(complete: Boolean, query: String): List { + val stations = stationDAO.search(query = query) + return if (complete) fetchAdditionalStationData(stations = stations) + else stations + } + } diff --git a/app/src/main/java/dev/yasan/metro/tehran/di/ApplicationModule.kt b/app/src/main/java/dev/yasan/metro/tehran/di/ApplicationModule.kt index 24cf9612..ea2b2dce 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/di/ApplicationModule.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/di/ApplicationModule.kt @@ -9,18 +9,18 @@ import dagger.hilt.components.SingletonComponent import dev.yasan.kit.core.DispatcherProvider import dev.yasan.metro.tehran.data.db.MetroDatabase import dev.yasan.metro.tehran.data.db.dao.* -import dev.yasan.metro.tehran.data.repo.dbinfo.DatabaseInformationRepository -import dev.yasan.metro.tehran.data.repo.dbinfo.DatabaseInformationRepositoryImp -import dev.yasan.metro.tehran.data.repo.intersection.IntersectionRepository -import dev.yasan.metro.tehran.data.repo.intersection.IntersectionRepositoryImp -import dev.yasan.metro.tehran.data.repo.line.LineRepository -import dev.yasan.metro.tehran.data.repo.line.LineRepositoryImp -import dev.yasan.metro.tehran.data.repo.stat.StatRepository -import dev.yasan.metro.tehran.data.repo.stat.StatRepositoryImp -import dev.yasan.metro.tehran.data.repo.station.StationRepository -import dev.yasan.metro.tehran.data.repo.station.StationRepositoryImp -import dev.yasan.metro.tehran.data.repo.station.accessibility.AccessibilityRepository -import dev.yasan.metro.tehran.data.repo.station.accessibility.AccessibilityRepositoryImp +import dev.yasan.metro.tehran.domain.repository.dbinfo.DatabaseInformationRepository +import dev.yasan.metro.tehran.data.repository.dbinfo.DatabaseInformationRepositoryImp +import dev.yasan.metro.tehran.domain.repository.intersection.IntersectionRepository +import dev.yasan.metro.tehran.data.repository.intersection.IntersectionRepositoryImp +import dev.yasan.metro.tehran.domain.repository.line.LineRepository +import dev.yasan.metro.tehran.data.repository.line.LineRepositoryImp +import dev.yasan.metro.tehran.domain.repository.stat.StatRepository +import dev.yasan.metro.tehran.data.repository.stat.StatRepositoryImp +import dev.yasan.metro.tehran.domain.repository.station.StationRepository +import dev.yasan.metro.tehran.data.repository.station.StationRepositoryImp +import dev.yasan.metro.tehran.domain.repository.accessibility.AccessibilityRepository +import dev.yasan.metro.tehran.data.repository.accessibility.AccessibilityRepositoryImp import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import javax.inject.Singleton diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/station/accessibility/AccessibilityRepository.kt b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/accessibility/AccessibilityRepository.kt similarity index 75% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/station/accessibility/AccessibilityRepository.kt rename to app/src/main/java/dev/yasan/metro/tehran/domain/repository/accessibility/AccessibilityRepository.kt index 5f6079d0..25845841 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/station/accessibility/AccessibilityRepository.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/accessibility/AccessibilityRepository.kt @@ -1,9 +1,9 @@ -package dev.yasan.metro.tehran.data.repo.station.accessibility +package dev.yasan.metro.tehran.domain.repository.accessibility -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelWheelchair -import dev.yasan.metro.tehran.data.db.entity.accessibility.WcAvailabilityLevel +import dev.yasan.metro.tehran.model.tehro.Station +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelBlindness +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelWheelchair +import dev.yasan.metro.tehran.model.tehro.accessibility.WcAvailabilityLevel /** * Handles all data related to [Station] accessibility. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/dbinfo/DatabaseInformationRepository.kt b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/dbinfo/DatabaseInformationRepository.kt similarity index 74% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/dbinfo/DatabaseInformationRepository.kt rename to app/src/main/java/dev/yasan/metro/tehran/domain/repository/dbinfo/DatabaseInformationRepository.kt index 72e61d80..b0501e7c 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/dbinfo/DatabaseInformationRepository.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/dbinfo/DatabaseInformationRepository.kt @@ -1,7 +1,7 @@ -package dev.yasan.metro.tehran.data.repo.dbinfo +package dev.yasan.metro.tehran.domain.repository.dbinfo import dev.yasan.metro.tehran.data.db.dao.DatabaseInformationDAO -import dev.yasan.metro.tehran.data.db.entity.DatabaseInformation +import dev.yasan.metro.tehran.model.tehro.DatabaseInformation /** * Handles all data related to [DatabaseInformation]s. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/intersection/IntersectionRepository.kt b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/intersection/IntersectionRepository.kt similarity index 81% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/intersection/IntersectionRepository.kt rename to app/src/main/java/dev/yasan/metro/tehran/domain/repository/intersection/IntersectionRepository.kt index 5b3f144e..b5cedc4b 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/intersection/IntersectionRepository.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/intersection/IntersectionRepository.kt @@ -1,7 +1,7 @@ -package dev.yasan.metro.tehran.data.repo.intersection +package dev.yasan.metro.tehran.domain.repository.intersection import dev.yasan.metro.tehran.data.db.dao.IntersectionDAO -import dev.yasan.metro.tehran.data.db.entity.Intersection +import dev.yasan.metro.tehran.model.tehro.Intersection /** * Handles all data related to [Intersection]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/line/LineRepository.kt b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/line/LineRepository.kt similarity index 79% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/line/LineRepository.kt rename to app/src/main/java/dev/yasan/metro/tehran/domain/repository/line/LineRepository.kt index d5b2f60b..f4a57de6 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/line/LineRepository.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/line/LineRepository.kt @@ -1,7 +1,7 @@ -package dev.yasan.metro.tehran.data.repo.line +package dev.yasan.metro.tehran.domain.repository.line import dev.yasan.metro.tehran.data.db.dao.LineDAO -import dev.yasan.metro.tehran.data.db.entity.Line +import dev.yasan.metro.tehran.model.tehro.Line /** * Handles all data related to [Line]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/stat/StatRepository.kt b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/stat/StatRepository.kt similarity index 69% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/stat/StatRepository.kt rename to app/src/main/java/dev/yasan/metro/tehran/domain/repository/stat/StatRepository.kt index 507427b1..666794ee 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/stat/StatRepository.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/stat/StatRepository.kt @@ -1,7 +1,7 @@ -package dev.yasan.metro.tehran.data.repo.stat +package dev.yasan.metro.tehran.domain.repository.stat -import dev.yasan.metro.tehran.data.db.entity.Stat -import dev.yasan.metro.tehran.data.db.entity.StatComplex +import dev.yasan.metro.tehran.model.tehro.Stat +import dev.yasan.metro.tehran.model.tehro.StatComplex /** * Handles all data related to [Stat]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/repo/station/StationRepository.kt b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/station/StationRepository.kt similarity index 82% rename from app/src/main/java/dev/yasan/metro/tehran/data/repo/station/StationRepository.kt rename to app/src/main/java/dev/yasan/metro/tehran/domain/repository/station/StationRepository.kt index f465e67a..68972ccd 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/repo/station/StationRepository.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/domain/repository/station/StationRepository.kt @@ -1,7 +1,7 @@ -package dev.yasan.metro.tehran.data.repo.station +package dev.yasan.metro.tehran.domain.repository.station import dev.yasan.metro.tehran.data.db.dao.StationDAO -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.tehro.Station /** * Handles all data related to [Station]. @@ -16,7 +16,10 @@ interface StationRepository { * * @see StationDAO */ - suspend fun getStations(complete: Boolean = false, removeDuplicate: Boolean = false): List + suspend fun getStations( + complete: Boolean = false, + removeDuplicate: Boolean = false + ): List /** * @return A list of all [Station]s in the line with the matching [lineId]. @@ -48,4 +51,6 @@ interface StationRepository { */ suspend fun fetchAdditionalStationData(stations: List): List + suspend fun searchStations(complete: Boolean, query: String): List + } diff --git a/app/src/main/java/dev/yasan/metro/tehran/model/misc/LaunchSource.kt b/app/src/main/java/dev/yasan/metro/tehran/model/misc/LaunchSource.kt new file mode 100644 index 00000000..f832c2dc --- /dev/null +++ b/app/src/main/java/dev/yasan/metro/tehran/model/misc/LaunchSource.kt @@ -0,0 +1,21 @@ +package dev.yasan.metro.tehran.model.misc + +/** + * Indicates the source of the launch. + * + * Used on some composables to customize the interface & behavior based on it as a better alternative to boolean parameters. + */ +enum class LaunchSource { + INVALID, + HOME, + LINE, + SEARCH, + MAP; + + companion object { + + fun fromInt(int: Int) = LaunchSource.values().getOrNull(int) ?: INVALID + + } + +} \ No newline at end of file diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/DatabaseInformation.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/DatabaseInformation.kt similarity index 96% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/DatabaseInformation.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/DatabaseInformation.kt index 2a05bd7f..d03b47df 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/DatabaseInformation.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/DatabaseInformation.kt @@ -1,4 +1,4 @@ -package dev.yasan.metro.tehran.data.db.entity +package dev.yasan.metro.tehran.model.tehro import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Intersection.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/Intersection.kt similarity index 97% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Intersection.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/Intersection.kt index 10d01443..da061319 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Intersection.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/Intersection.kt @@ -1,4 +1,4 @@ -package dev.yasan.metro.tehran.data.db.entity +package dev.yasan.metro.tehran.model.tehro import androidx.room.* import dev.yasan.metro.tehran.data.db.MetroDatabase diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Line.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/Line.kt similarity index 86% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Line.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/Line.kt index 8720a129..1dcfdc6d 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Line.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/Line.kt @@ -1,9 +1,11 @@ -package dev.yasan.metro.tehran.data.db.entity +package dev.yasan.metro.tehran.model.tehro import android.content.Context import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource -import androidx.room.* +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.PrimaryKey import dev.yasan.metro.tehran.R import dev.yasan.metro.tehran.data.db.MetroDatabase import dev.yasan.metro.tehran.util.LocaleHelper @@ -44,7 +46,7 @@ data class Line( fun getFullName(context: Context): String { var mName = "${context.getString(R.string.line)} $name" if (type == LineType.METRO_BRANCH) { - mName += " ${context.getString(R.string.branch)}" + mName += " (${context.getString(R.string.branch)})" } return mName } diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/LineType.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/LineType.kt similarity index 93% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/LineType.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/LineType.kt index 43d2771c..5825d284 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/LineType.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/LineType.kt @@ -1,4 +1,4 @@ -package dev.yasan.metro.tehran.data.db.entity +package dev.yasan.metro.tehran.model.tehro import dev.yasan.metro.tehran.data.db.MetroDatabase diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Stat.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/Stat.kt similarity index 80% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Stat.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/Stat.kt index e8ca65ee..40d100e9 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Stat.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/Stat.kt @@ -1,4 +1,4 @@ -package dev.yasan.metro.tehran.data.db.entity +package dev.yasan.metro.tehran.model.tehro import androidx.annotation.StringRes diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/StatComplex.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/StatComplex.kt similarity index 85% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/StatComplex.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/StatComplex.kt index 201a12ba..1b0aea8a 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/StatComplex.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/StatComplex.kt @@ -1,4 +1,4 @@ -package dev.yasan.metro.tehran.data.db.entity +package dev.yasan.metro.tehran.model.tehro import dev.yasan.metro.tehran.util.LocaleHelper diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Station.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/Station.kt similarity index 93% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Station.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/Station.kt index 03484152..08491003 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/Station.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/Station.kt @@ -1,14 +1,12 @@ -package dev.yasan.metro.tehran.data.db.entity +package dev.yasan.metro.tehran.model.tehro import androidx.compose.material.icons.sharp.* import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.room.* -import dev.yasan.metro.tehran.R import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelWheelchair -import dev.yasan.metro.tehran.data.db.entity.accessibility.WcAvailabilityLevel +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelBlindness +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelWheelchair +import dev.yasan.metro.tehran.model.tehro.accessibility.WcAvailabilityLevel import dev.yasan.metro.tehran.ui.theme.TehroIcons import dev.yasan.metro.tehran.util.LocaleHelper import dev.yasan.metro.tehran.util.PrideHelper diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelAbstract.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelAbstract.kt similarity index 95% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelAbstract.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelAbstract.kt index abfb56aa..d4968b3c 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelAbstract.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelAbstract.kt @@ -1,4 +1,4 @@ -package dev.yasan.metro.tehran.data.db.entity.accessibility +package dev.yasan.metro.tehran.model.tehro.accessibility import androidx.room.Ignore import dev.yasan.metro.tehran.util.LocaleHelper diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelBlindness.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelBlindness.kt similarity index 85% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelBlindness.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelBlindness.kt index edb61899..43a78708 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelBlindness.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelBlindness.kt @@ -1,8 +1,8 @@ -package dev.yasan.metro.tehran.data.db.entity.accessibility +package dev.yasan.metro.tehran.model.tehro.accessibility import androidx.room.* import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.tehro.Station /** * This class defines different visually impaired accessibility levels on [MetroDatabase]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelWheelchair.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelWheelchair.kt similarity index 76% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelWheelchair.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelWheelchair.kt index 0a73c467..84f8fb42 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/AccessibilityLevelWheelchair.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/AccessibilityLevelWheelchair.kt @@ -1,8 +1,10 @@ -package dev.yasan.metro.tehran.data.db.entity.accessibility +package dev.yasan.metro.tehran.model.tehro.accessibility -import androidx.room.* +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.tehro.Station /** * This class defines different wheelchair accessibility levels on [MetroDatabase]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/WcAvailabilityLevel.kt b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/WcAvailabilityLevel.kt similarity index 84% rename from app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/WcAvailabilityLevel.kt rename to app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/WcAvailabilityLevel.kt index 8e9211b0..dbe15eba 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/data/db/entity/accessibility/WcAvailabilityLevel.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/model/tehro/accessibility/WcAvailabilityLevel.kt @@ -1,8 +1,8 @@ -package dev.yasan.metro.tehran.data.db.entity.accessibility +package dev.yasan.metro.tehran.model.tehro.accessibility import androidx.room.* import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.tehro.Station /** * This class defines different WC availability levels on [MetroDatabase]. diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehScreen.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehScreen.kt index 0a2391c2..cad6250f 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehScreen.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehScreen.kt @@ -1,5 +1,6 @@ package dev.yasan.metro.tehran.ui.composable.common.teh +import androidx.compose.animation.animateContentSize import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -13,7 +14,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.colorResource import androidx.compose.ui.text.font.FontFamily import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.ui.theme.themePrimary import dev.yasan.metro.tehran.util.LocaleHelper /** @@ -41,6 +41,7 @@ fun TehScreen( LazyColumn( modifier = Modifier + .animateContentSize() .fillMaxWidth() .weight(1f), horizontalAlignment = Alignment.CenterHorizontally diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehSwitchable.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehSwitchable.kt new file mode 100644 index 00000000..ffb14062 --- /dev/null +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehSwitchable.kt @@ -0,0 +1,131 @@ +package dev.yasan.metro.tehran.ui.composable.common.teh + +import android.widget.Toast +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.material.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.sp +import dev.yasan.kit.compose.foundation.grid +import dev.yasan.metro.tehran.R + +enum class TehSwitchableType { + SWITCH, CHECKBOX +} + +@OptIn(ExperimentalAnimationApi::class) +@Composable +fun TehSwitchable( + title: String, + type: TehSwitchableType = TehSwitchableType.SWITCH, + fontFamily: FontFamily?, + description: String? = null, + icon: ImageVector? = null, + getter: () -> Boolean, + setter: (Boolean) -> Unit, + enabled: Boolean = true, + disabledReason: String? = null, +) { + + val context = LocalContext.current + val checkedState: MutableState = remember { mutableStateOf(getter()) } + + Column { + Row( + modifier = Modifier + .clickable { + if (enabled) { + checkedState.value = !checkedState.value + setter(checkedState.value) + } else if (!disabledReason.isNullOrBlank()) { + Toast + .makeText(context, disabledReason, Toast.LENGTH_SHORT) + .show() + } + } + .background(colorResource(id = R.color.layer_foreground)) + .padding(horizontal = grid(2)), + verticalAlignment = Alignment.CenterVertically + ) { + if (icon != null) { + Icon( + icon, + contentDescription = title, + tint = colorResource(id = R.color.text_title), + modifier = Modifier.padding(end = grid(2)) + ) + } + Column( + modifier = Modifier + .padding(end = grid()) + .weight(1f) + .padding(vertical = grid(2)) + ) { + Text( + text = title, + color = colorResource(id = if (enabled) R.color.text_title else R.color.text_desc), + fontFamily = fontFamily, + modifier = Modifier, + textAlign = TextAlign.Start, + fontWeight = FontWeight.Medium, + fontSize = 16.sp + ) + if (!description.isNullOrBlank()) { + Text( + text = description, + color = colorResource(id = R.color.text_desc), + modifier = Modifier, + fontSize = 12.sp, + fontFamily = fontFamily, + fontWeight = FontWeight.Light, + ) + } + } + + when (type) { + TehSwitchableType.CHECKBOX -> { + Checkbox( + checked = checkedState.value, + onCheckedChange = { + checkedState.value = it + setter(it) + }, + enabled = enabled + ) + } + TehSwitchableType.SWITCH -> { + Switch( + checked = checkedState.value, + onCheckedChange = { + checkedState.value = it + setter(it) + }, + colors = SwitchDefaults.colors( + checkedThumbColor = colorResource(id = R.color.text_title), + uncheckedThumbColor = colorResource(id = R.color.text_desc), + checkedTrackColor = colorResource(id = R.color.text_title), + uncheckedTrackColor = colorResource(id = R.color.text_desc), + ), + enabled = enabled + ) + } + } + } + TehDivider() + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehTitle.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehTitle.kt index a442a20c..5a952732 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehTitle.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/common/teh/TehTitle.kt @@ -19,7 +19,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.sp import dev.yasan.kit.compose.foundation.grid import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Line +import dev.yasan.metro.tehran.model.tehro.Line import dev.yasan.metro.tehran.ui.preview.line.LinePreviewProvider import dev.yasan.metro.tehran.ui.theme.vazirFamily import dev.yasan.metro.tehran.util.LocaleHelper diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/MainViewModel.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/MainViewModel.kt index 25f86e31..615a9e3a 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/MainViewModel.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/MainViewModel.kt @@ -8,9 +8,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.yasan.kit.core.DispatcherProvider import dev.yasan.kit.core.Resource import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.MetroDatabase -import dev.yasan.metro.tehran.data.db.entity.Line -import dev.yasan.metro.tehran.data.repo.line.LineRepository +import dev.yasan.metro.tehran.model.tehro.Line +import dev.yasan.metro.tehran.domain.repository.line.LineRepository import dev.yasan.metro.tehran.ui.composable.screen.home.HomeScreen import kotlinx.coroutines.launch import javax.inject.Inject diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/AboutViewModel.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/AboutViewModel.kt index 76176694..13131f37 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/AboutViewModel.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/AboutViewModel.kt @@ -8,11 +8,11 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.yasan.kit.core.DispatcherProvider import dev.yasan.kit.core.Resource import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.DatabaseInformation -import dev.yasan.metro.tehran.data.db.entity.Stat -import dev.yasan.metro.tehran.data.db.entity.StatComplex -import dev.yasan.metro.tehran.data.repo.dbinfo.DatabaseInformationRepository -import dev.yasan.metro.tehran.data.repo.stat.StatRepository +import dev.yasan.metro.tehran.model.tehro.DatabaseInformation +import dev.yasan.metro.tehran.model.tehro.Stat +import dev.yasan.metro.tehran.model.tehro.StatComplex +import dev.yasan.metro.tehran.domain.repository.dbinfo.DatabaseInformationRepository +import dev.yasan.metro.tehran.domain.repository.stat.StatRepository import kotlinx.coroutines.launch import javax.inject.Inject diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/app/AboutSegmentApp.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/app/AboutSegmentApp.kt index 135c3d48..db491b2e 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/app/AboutSegmentApp.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/app/AboutSegmentApp.kt @@ -22,13 +22,12 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.compose.type.rubikFamily import dev.yasan.kit.core.WebHelper import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.DatabaseInformation +import dev.yasan.metro.tehran.model.tehro.DatabaseInformation import dev.yasan.metro.tehran.ui.composable.common.teh.TehButton import dev.yasan.metro.tehran.ui.composable.common.teh.TehDivider import dev.yasan.metro.tehran.ui.composable.screen.about.AboutScreen diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/SegmentStats.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/SegmentStats.kt index 9a19ddd6..dd47cb77 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/SegmentStats.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/SegmentStats.kt @@ -20,8 +20,8 @@ import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.core.Resource import dev.yasan.kit.core.WebHelper import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.DatabaseInformation -import dev.yasan.metro.tehran.data.db.entity.Stat +import dev.yasan.metro.tehran.model.tehro.DatabaseInformation +import dev.yasan.metro.tehran.model.tehro.Stat import dev.yasan.metro.tehran.ui.composable.common.teh.TehButton import dev.yasan.metro.tehran.ui.composable.common.teh.TehDivider import dev.yasan.metro.tehran.ui.composable.common.teh.TehProgress diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/SegmentStatsComplex.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/SegmentStatsComplex.kt index 97514c7c..04f55322 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/SegmentStatsComplex.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/SegmentStatsComplex.kt @@ -17,7 +17,7 @@ import androidx.compose.ui.unit.sp import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.core.Resource import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.StatComplex +import dev.yasan.metro.tehran.model.tehro.StatComplex import dev.yasan.metro.tehran.ui.composable.common.teh.TehDivider import dev.yasan.metro.tehran.ui.composable.common.teh.TehProgress import dev.yasan.metro.tehran.ui.composable.screen.about.AboutScreen diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/list/StatsComplexList.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/list/StatsComplexList.kt index ce3bbe3b..61ede32a 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/list/StatsComplexList.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/list/StatsComplexList.kt @@ -16,8 +16,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp import dev.yasan.kit.compose.foundation.grid import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Stat -import dev.yasan.metro.tehran.data.db.entity.StatComplex +import dev.yasan.metro.tehran.model.tehro.Stat +import dev.yasan.metro.tehran.model.tehro.StatComplex import dev.yasan.metro.tehran.util.LocaleHelper import dev.yasan.metro.tehran.util.extension.toPersianNumbers diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/list/StatsList.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/list/StatsList.kt index 7ec80b5d..4ef40ffa 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/list/StatsList.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/about/modules/stat/list/StatsList.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.compose.type.rubikFamily import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Stat +import dev.yasan.metro.tehran.model.tehro.Stat import dev.yasan.metro.tehran.ui.preview.stat.StatListPreviewProvider import dev.yasan.metro.tehran.ui.theme.vazirFamily import dev.yasan.metro.tehran.util.LocaleHelper diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/HomeScreen.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/HomeScreen.kt index 619576a7..bf6c63c3 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/HomeScreen.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/HomeScreen.kt @@ -5,6 +5,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.sharp.Info +import androidx.compose.material.icons.sharp.Map +import androidx.compose.material.icons.sharp.Search import androidx.compose.runtime.Composable import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Modifier @@ -18,10 +20,11 @@ import dev.yasan.metro.tehran.R import dev.yasan.metro.tehran.ui.composable.common.teh.* import dev.yasan.metro.tehran.ui.composable.screen.MainViewModel import dev.yasan.metro.tehran.ui.composable.screen.home.modules.AppVersionFooter +import dev.yasan.metro.tehran.ui.composable.screen.home.modules.HomeButton import dev.yasan.metro.tehran.ui.composable.screen.home.modules.LineItem -import dev.yasan.metro.tehran.ui.composable.screen.home.modules.MapButton import dev.yasan.metro.tehran.ui.navigation.NavGraph import dev.yasan.metro.tehran.ui.navigation.NavRoutes +import dev.yasan.metro.tehran.ui.navigation.Navigator import dev.yasan.metro.tehran.ui.theme.TehroIcons /** @@ -61,7 +64,15 @@ fun HomeScreen( } item { - MapButton(navController = navController) + HomeButton(title = stringResource(id = R.string.search), icon = TehroIcons.Search) { + Navigator.navigateToSearch(navController = navController) + } + } + + item { + HomeButton(title = stringResource(id = R.string.map), icon = TehroIcons.Map) { + Navigator.navigateToMap(navController = navController) + } } item { diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/MapButton.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/HomeButton.kt similarity index 65% rename from app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/MapButton.kt rename to app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/HomeButton.kt index 8f815766..67a0603b 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/MapButton.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/HomeButton.kt @@ -8,34 +8,33 @@ import androidx.compose.foundation.layout.* import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.material.icons.sharp.Map +import androidx.compose.material.icons.sharp.Search import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.sp -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.compose.type.rubikFamily import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.ui.composable.screen.map.MapScreen -import dev.yasan.metro.tehran.ui.navigation.NavRoutes -import dev.yasan.metro.tehran.ui.theme.* +import dev.yasan.metro.tehran.ui.theme.TehroIcons +import dev.yasan.metro.tehran.ui.theme.dimenDivider +import dev.yasan.metro.tehran.ui.theme.vazirFamily import dev.yasan.metro.tehran.util.LocaleHelper import dev.yasan.metro.tehran.util.extension.getTextOnColor -/** - * A simple button that navigated the user to [MapScreen]. - */ @Composable -fun MapButton( +fun HomeButton( modifier: Modifier = Modifier, - navController: NavController, + title: String, + icon: ImageVector, fontFamily: FontFamily = LocaleHelper.properFontFamily, + onClick: () -> Unit ) { val colorBackground = colorResource(id = R.color.layer_foreground) val colorForeground = colorBackground.getTextOnColor() @@ -46,15 +45,13 @@ fun MapButton( .fillMaxWidth() .background(color = colorBackground) .border(width = dimenDivider, color = colorForeground) - .clickable { - navController.navigate(NavRoutes.routeMap()) - } + .clickable(onClick = onClick) .padding(grid(2)), verticalAlignment = Alignment.CenterVertically ) { Text( modifier = Modifier.weight(1f), - text = stringResource(id = R.string.map).uppercase(), + text = title.uppercase(), color = colorForeground, fontFamily = fontFamily, fontWeight = FontWeight.Bold, @@ -62,8 +59,8 @@ fun MapButton( ) Spacer(modifier = Modifier.requiredWidth(grid(2))) Icon( - imageVector = TehroIcons.Map, - contentDescription = stringResource(id = R.string.map), + imageVector = icon, + contentDescription = title, tint = colorForeground ) } @@ -72,7 +69,14 @@ fun MapButton( @Preview( name = "Map Button [en]", group = "Map Button", - locale = "en" + locale = "en", + uiMode = Configuration.UI_MODE_NIGHT_NO +) +@Preview( + name = "Map Button [en]", + group = "Map Button", + locale = "en", + uiMode = Configuration.UI_MODE_NIGHT_YES ) @Composable private fun MapButtonPreviewEn() { @@ -82,7 +86,11 @@ private fun MapButtonPreviewEn() { .padding(bottom = grid()) ) { Spacer(modifier = Modifier.requiredHeight(grid())) - MapButton(navController = rememberNavController(), fontFamily = rubikFamily) + HomeButton( + title = stringResource(id = R.string.map), + icon = TehroIcons.Map, + fontFamily = rubikFamily, + ) {} Spacer(modifier = Modifier.requiredHeight(grid())) } } @@ -90,7 +98,14 @@ private fun MapButtonPreviewEn() { @Preview( name = "Map Button [fa]", group = "Map Button", - locale = "fa" + locale = "fa", + uiMode = Configuration.UI_MODE_NIGHT_NO +) +@Preview( + name = "Map Button [fa]", + group = "Map Button", + locale = "fa", + uiMode = Configuration.UI_MODE_NIGHT_YES ) @Composable private fun MapButtonPreviewFa() { @@ -100,45 +115,69 @@ private fun MapButtonPreviewFa() { .padding(bottom = grid()) ) { Spacer(modifier = Modifier.requiredHeight(grid())) - MapButton(navController = rememberNavController(), fontFamily = vazirFamily) + HomeButton( + title = stringResource(id = R.string.map), + icon = TehroIcons.Map, + fontFamily = vazirFamily, + ) {} Spacer(modifier = Modifier.requiredHeight(grid())) } } @Preview( - name = "Map Button [en]", - group = "Map Button", + name = "Search Button [en]", + group = "Search Button", + locale = "en", + uiMode = Configuration.UI_MODE_NIGHT_NO +) +@Preview( + name = "Search Button [en]", + group = "Search Button", locale = "en", uiMode = Configuration.UI_MODE_NIGHT_YES ) @Composable -private fun MapButtonPreviewEnDark() { +private fun SearchButtonPreviewEn() { Column( modifier = Modifier .background(colorResource(id = R.color.layer_midground)) .padding(bottom = grid()) ) { Spacer(modifier = Modifier.requiredHeight(grid())) - MapButton(navController = rememberNavController(), fontFamily = rubikFamily) + HomeButton( + title = stringResource(id = R.string.search), + icon = TehroIcons.Search, + fontFamily = rubikFamily, + ) {} Spacer(modifier = Modifier.requiredHeight(grid())) } } @Preview( - name = "Map Button [fa]", - group = "Map Button", + name = "Search Button [fa]", + group = "Search Button", + locale = "fa", + uiMode = Configuration.UI_MODE_NIGHT_NO +) +@Preview( + name = "Search Button [fa]", + group = "Search Button", locale = "fa", uiMode = Configuration.UI_MODE_NIGHT_YES ) @Composable -private fun MapButtonPreviewFaDark() { +private fun SearchButtonPreviewFa() { Column( modifier = Modifier .background(colorResource(id = R.color.layer_midground)) .padding(bottom = grid()) ) { Spacer(modifier = Modifier.requiredHeight(grid())) - MapButton(navController = rememberNavController(), fontFamily = vazirFamily) + HomeButton( + title = stringResource(id = R.string.search), + icon = TehroIcons.Search, + fontFamily = vazirFamily, + ) {} Spacer(modifier = Modifier.requiredHeight(grid())) } } diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/LineItem.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/LineItem.kt index 6e365975..ace6c35a 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/LineItem.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/home/modules/LineItem.kt @@ -19,8 +19,9 @@ import androidx.navigation.compose.rememberNavController import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.compose.type.rubikFamily import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Line -import dev.yasan.metro.tehran.data.db.entity.LineType +import dev.yasan.metro.tehran.model.misc.LaunchSource +import dev.yasan.metro.tehran.model.tehro.Line +import dev.yasan.metro.tehran.model.tehro.LineType import dev.yasan.metro.tehran.ui.navigation.Navigator import dev.yasan.metro.tehran.ui.preview.line.LineListPreviewProvider import dev.yasan.metro.tehran.ui.preview.line.LinePreviewProvider @@ -51,7 +52,8 @@ fun LineItem( .clickable { Navigator.navigateToLineDetails( navController = navController, - line = line + line = line, + launchSource = LaunchSource.LINE ) } .padding(grid(2)), diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/LineScreen.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/LineScreen.kt index 3d90cd5a..70d23038 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/LineScreen.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/LineScreen.kt @@ -14,8 +14,9 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.core.Resource import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Line -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.misc.LaunchSource +import dev.yasan.metro.tehran.model.tehro.Line +import dev.yasan.metro.tehran.model.tehro.Station import dev.yasan.metro.tehran.ui.composable.common.teh.TehError import dev.yasan.metro.tehran.ui.composable.common.teh.TehFooter import dev.yasan.metro.tehran.ui.composable.common.teh.TehProgress @@ -79,6 +80,7 @@ fun LineScreen( StationItem( station = station, navController = navController, + launchSource = LaunchSource.LINE ) } diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/LineViewModel.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/LineViewModel.kt index 26984a9f..1bc78939 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/LineViewModel.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/LineViewModel.kt @@ -11,9 +11,9 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.yasan.kit.core.DispatcherProvider import dev.yasan.kit.core.Resource import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.repo.line.LineRepository -import dev.yasan.metro.tehran.data.repo.station.StationRepository +import dev.yasan.metro.tehran.model.tehro.Station +import dev.yasan.metro.tehran.domain.repository.line.LineRepository +import dev.yasan.metro.tehran.domain.repository.station.StationRepository import kotlinx.coroutines.launch import javax.inject.Inject diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/modules/StationItem.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/modules/StationItem.kt index 8015cfa5..81a2384a 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/modules/StationItem.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/line/modules/StationItem.kt @@ -22,41 +22,66 @@ import androidx.navigation.compose.rememberNavController import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.compose.type.rubikFamily import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.misc.LaunchSource +import dev.yasan.metro.tehran.model.tehro.Station import dev.yasan.metro.tehran.ui.navigation.NavRoutes import dev.yasan.metro.tehran.ui.preview.station.StationListPreviewProvider import dev.yasan.metro.tehran.ui.preview.station.StationPreviewProvider -import dev.yasan.metro.tehran.ui.theme.* +import dev.yasan.metro.tehran.ui.theme.TehroIcons +import dev.yasan.metro.tehran.ui.theme.dimenDivider +import dev.yasan.metro.tehran.ui.theme.vazirFamily import dev.yasan.metro.tehran.util.LocaleHelper import dev.yasan.metro.tehran.util.extension.getTextOnColor +private const val TAG = "StationItem" + /** * Composable function that shows a single [Station]. */ @Composable fun StationItem( + modifier: Modifier = Modifier, station: Station, navController: NavController, fontFamily: FontFamily = LocaleHelper.properFontFamily, + launchSource: LaunchSource, + onClickExtra: () -> Unit = {}, forceFarsi: Boolean = false ) { + val hasInterchange = station.intersection != null val oppositeLineColor = station.intersection?.getOppositeLine(stationId = station.id)?.color - val colorBackground = oppositeLineColor ?: colorResource(id = R.color.layer_foreground) - val colorBorder = oppositeLineColor ?: colorResource(id = R.color.divider) - val colorForeground = - if (hasInterchange) colorBackground.getTextOnColor() - else colorResource(id = R.color.text_title) + val colorBackgroundDefault = colorResource(id = R.color.layer_foreground) + val colorBackground = when (launchSource) { + LaunchSource.SEARCH -> station.line?.color ?: colorBackgroundDefault + else -> oppositeLineColor ?: colorBackgroundDefault + } + + val colorBorder = when (launchSource) { + LaunchSource.SEARCH -> colorBackground + else -> oppositeLineColor ?: colorResource(id = R.color.divider) + } + + val colorForeground = when (launchSource) { + LaunchSource.SEARCH -> colorBackground.getTextOnColor() + else -> if (hasInterchange) colorBackground.getTextOnColor() else colorResource(id = R.color.text_title) + } Row( - modifier = Modifier + modifier = modifier .padding(horizontal = grid(1.5f)) .padding(top = grid()) .fillMaxWidth() .background(color = colorBackground) .clickable { - navController.navigate(NavRoutes.routeStation(station = station)) + onClickExtra() + navController.navigate( + NavRoutes.routeStation( + station = station, + launchSource = launchSource, + ) + ) } .border(width = dimenDivider, color = colorBorder) .padding(horizontal = grid(2)) @@ -119,7 +144,8 @@ private fun StationItemPreviewFa(@PreviewParameter(StationPreviewProvider::class station = station, navController = rememberNavController(), fontFamily = vazirFamily, - forceFarsi = true + forceFarsi = true, + launchSource = LaunchSource.LINE ) Spacer(modifier = Modifier.requiredHeight(grid(0.5f))) } @@ -149,7 +175,8 @@ private fun StationItemPreviewEn(@PreviewParameter(StationPreviewProvider::class station = station, navController = rememberNavController(), fontFamily = rubikFamily, - forceFarsi = false + forceFarsi = false, + launchSource = LaunchSource.LINE ) Spacer(modifier = Modifier.requiredHeight(grid(0.5f))) } @@ -177,7 +204,8 @@ private fun StationItemsPreviewEn(@PreviewParameter(StationListPreviewProvider:: station = station, navController = navController, fontFamily = rubikFamily, - forceFarsi = false + forceFarsi = false, + launchSource = LaunchSource.LINE ) } Spacer(modifier = Modifier.requiredHeight(grid(2))) @@ -206,7 +234,8 @@ private fun StationItemsPreviewFa(@PreviewParameter(StationListPreviewProvider:: station = station, navController = navController, fontFamily = vazirFamily, - forceFarsi = true + forceFarsi = true, + launchSource = LaunchSource.LINE ) } Spacer(modifier = Modifier.requiredHeight(grid(2))) diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/map/MapScreen.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/map/MapScreen.kt index 02a646c8..76308381 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/map/MapScreen.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/map/MapScreen.kt @@ -2,6 +2,8 @@ package dev.yasan.metro.tehran.ui.composable.screen.map import android.util.Log import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -21,7 +23,6 @@ import dev.yasan.metro.tehran.ui.composable.common.teh.TehProgress import dev.yasan.metro.tehran.ui.composable.common.teh.TehTitle import dev.yasan.metro.tehran.ui.navigation.NavGraph import dev.yasan.metro.tehran.ui.navigation.NavRoutes -import dev.yasan.metro.tehran.ui.theme.themePrimary private const val TAG = "MapScreen" @@ -92,9 +93,14 @@ fun MapScreen(mapViewModel: MapViewModel) { } ) - androidx.compose.animation.AnimatedVisibility(visible = isLoaded.value != true) { + androidx.compose.animation.AnimatedVisibility( + visible = isLoaded.value != true, + enter = fadeIn(), + exit = fadeOut() + ) { TehProgress() } + } } } diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/SearchScreen.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/SearchScreen.kt new file mode 100644 index 00000000..5bdd82b0 --- /dev/null +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/SearchScreen.kt @@ -0,0 +1,184 @@ +package dev.yasan.metro.tehran.ui.composable.screen.search + +import androidx.compose.animation.* +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.lazy.items +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.navigation.NavController +import dev.yasan.kit.compose.foundation.grid +import dev.yasan.metro.tehran.R +import dev.yasan.metro.tehran.model.misc.LaunchSource +import dev.yasan.metro.tehran.model.tehro.Line +import dev.yasan.metro.tehran.ui.composable.common.teh.TehFooter +import dev.yasan.metro.tehran.ui.composable.common.teh.TehProgress +import dev.yasan.metro.tehran.ui.composable.common.teh.TehScreen +import dev.yasan.metro.tehran.ui.composable.common.teh.TehSwitchable +import dev.yasan.metro.tehran.ui.composable.screen.line.modules.StationItem +import dev.yasan.metro.tehran.ui.composable.screen.search.modules.SearchField +import dev.yasan.metro.tehran.util.LocaleHelper + +@OptIn( + ExperimentalComposeUiApi::class, + androidx.compose.foundation.ExperimentalFoundationApi::class +) +@Composable +fun SearchScreen(viewModel: SearchViewModel, navController: NavController) { + + val context = LocalContext.current + val keyboardController = LocalSoftwareKeyboardController.current + val focusManager = LocalFocusManager.current + + val queryState = rememberSaveable { mutableStateOf("") } + val groupEnabled = rememberSaveable { mutableStateOf(true) } + + val results = viewModel.results.observeAsState() + val loading = viewModel.loading.observeAsState() + + val resultsList = results.value?.data ?: emptyList() + + TehScreen(title = stringResource(id = R.string.search)) { + + stickyHeader { + + SearchField( + value = queryState.value, + onValueChange = { + queryState.value = it + viewModel.search(query = it) + }, + onDone = { + keyboardController?.hide() + focusManager.clearFocus() + } + ) + + } + + item { + TehSwitchable( + title = stringResource(R.string.group_by_line), + fontFamily = LocaleHelper.properFontFamily, + getter = { groupEnabled.value }, + setter = { groupEnabled.value = it } + ) + } + + item { + AnimatedVisibility( + visible = loading.value == true, + enter = expandVertically() + fadeIn(), + exit = shrinkVertically() + fadeOut() + ) { + TehProgress() + } + } + + item { + AnimatedVisibility( + visible = !groupEnabled.value, + enter = expandVertically() + fadeIn(), + exit = shrinkVertically() + fadeOut() + ) { + Spacer(modifier = Modifier.requiredHeight(grid())) + } + } + + if (groupEnabled.value) { + + val groupedResults = resultsList.groupBy { it.line } + .toSortedMap(compareBy { it?.id ?: 0 }.thenBy { it?.name ?: "" }) + + groupedResults.forEach { group -> + + item { + + Text( + modifier = Modifier + .padding(horizontal = grid(2)) + .padding(top = grid(2), bottom = grid()), + text = (group.key?.getFullName(context = context) + ?: stringResource(id = R.string.line)).uppercase(), + color = colorResource(id = R.color.text_title), + fontFamily = LocaleHelper.properFontFamily, + fontWeight = FontWeight.Bold + ) + + } + + items( + items = group.value, + key = { station -> station.id } + ) { station -> + StationItem( + modifier = Modifier.animateItemPlacement(), + station = station, + navController = navController, + launchSource = LaunchSource.SEARCH, + onClickExtra = { + keyboardController?.hide() + focusManager.clearFocus() + } + ) + } + + } + + } else { + + items( + items = resultsList, + key = { station -> station.id } + ) { station -> + StationItem( + modifier = Modifier.animateItemPlacement(), + station = station, + navController = navController, + launchSource = LaunchSource.SEARCH, + onClickExtra = { + keyboardController?.hide() + focusManager.clearFocus() + } + ) + } + + } + + item { + AnimatedVisibility( + visible = queryState.value.isNotBlank() && resultsList.isEmpty(), + enter = expandVertically() + fadeIn(), + exit = shrinkVertically() + fadeOut() + ) { + TehFooter(text = stringResource(R.string.no_stations_found)) + } + } + + item { + AnimatedVisibility( + visible = resultsList.isNotEmpty(), + enter = expandVertically() + fadeIn(), + exit = shrinkVertically() + fadeOut() + ) { + TehFooter(text = stringResource(R.string.n_stations, resultsList.size)) + } + } + + } + +} + + diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/SearchViewModel.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/SearchViewModel.kt new file mode 100644 index 00000000..eeba94c5 --- /dev/null +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/SearchViewModel.kt @@ -0,0 +1,68 @@ +package dev.yasan.metro.tehran.ui.composable.screen.search + +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import dev.yasan.kit.core.DispatcherProvider +import dev.yasan.kit.core.Resource +import dev.yasan.metro.tehran.R +import dev.yasan.metro.tehran.domain.repository.station.StationRepository +import dev.yasan.metro.tehran.model.tehro.Station +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * ViewModel for [SearchScreen]. + */ +@HiltViewModel +class SearchViewModel @Inject constructor( + private val dispatchers: DispatcherProvider, + private val stationRepository: StationRepository +) : ViewModel() { + + companion object { + private const val TAG = "SearchViewModel" + private const val SEARCH_QUERY_MIN_LENGTH = 1 + } + + private var _loading = MutableLiveData(false) + val loading: LiveData get() = _loading + + private var _results = MutableLiveData>>(Resource.Initial()) + val results: LiveData>> get() = _results + + /** + * Search stations by query. Unlike everywhere else, this method never posts [Resource.Loading]. + * This is done to prevent the UI from flickering when the user is typing. + * Loading state is posted on [_loading] instead. + */ + fun search(query: String) { + Log.d(TAG, "search: $query") + viewModelScope.launch(dispatchers.io) { + _loading.postValue(true) + if (query.trim().length < SEARCH_QUERY_MIN_LENGTH) { + _results.postValue(Resource.Success(emptyList())) + _loading.postValue(false) + } else { + try { + _results.postValue( + Resource.Success( + stationRepository.searchStations( + complete = true, + query = query + ) + ) + ) + _loading.postValue(false) + } catch (e: Exception) { + _results.postValue(Resource.Error(messageResourceId = R.string.error)) + _loading.postValue(false) + } + } + } + } + +} diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/modules/SearchField.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/modules/SearchField.kt new file mode 100644 index 00000000..7ed3a059 --- /dev/null +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/search/modules/SearchField.kt @@ -0,0 +1,143 @@ +package dev.yasan.metro.tehran.ui.composable.screen.search.modules + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.Icon +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text +import androidx.compose.material.TextFieldDefaults +import androidx.compose.material.icons.sharp.Clear +import androidx.compose.material.icons.sharp.Search +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import dev.yasan.kit.compose.foundation.grid +import dev.yasan.kit.compose.type.rubikFamily +import dev.yasan.metro.tehran.R +import dev.yasan.metro.tehran.ui.composable.common.teh.TehDivider +import dev.yasan.metro.tehran.ui.theme.TehroIcons +import dev.yasan.metro.tehran.util.LocaleHelper + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun SearchField( + modifier: Modifier = Modifier, + value: String, + onValueChange: (String) -> Unit, + onDone: () -> Unit, +) { + + val focusRequester = remember { FocusRequester() } + + Column(modifier = modifier) { + + OutlinedTextField( + modifier = Modifier + .background( + color = colorResource(id = R.color.layer_midground) + ) + .fillMaxWidth() + .padding( + start = grid(1.5f), + end = grid(1.5f), + top = grid(), + bottom = grid(2) + ) + .focusRequester(focusRequester), + value = value, + onValueChange = { + if (it.length <= 10) { + onValueChange(it) + } + }, + textStyle = TextStyle( + fontFamily = rubikFamily, + color = colorResource(id = R.color.text_title), + fontSize = 18.sp + ), + label = { + Text( + text = stringResource(id = R.string.line_name), + fontFamily = LocaleHelper.properFontFamily, + color = colorResource(id = R.color.text_title) + ) + }, + singleLine = true, + leadingIcon = { + Icon( + TehroIcons.Search, + contentDescription = stringResource(id = R.string.search), + tint = colorResource(id = R.color.text_title), + modifier = Modifier + .clickable(onClick = onDone) + .padding(grid(2)) + ) + }, + keyboardOptions = KeyboardOptions( + autoCorrect = true, + capitalization = KeyboardCapitalization.Words, + keyboardType = KeyboardType.Text, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { + onDone() + } + ), + trailingIcon = { + AnimatedVisibility( + visible = value.isNotEmpty(), + enter = fadeIn(), + exit = fadeOut() + ) { + Icon( + TehroIcons.Clear, + contentDescription = null, + tint = colorResource(id = R.color.text_title), + modifier = Modifier + .clickable { + onValueChange("") + } + .padding(grid(2)) + ) + } + }, + shape = RoundedCornerShape(0.dp), + colors = TextFieldDefaults.outlinedTextFieldColors( + cursorColor = colorResource(id = R.color.text_title), + focusedBorderColor = colorResource(id = R.color.text_title), + unfocusedBorderColor = colorResource(id = R.color.text_desc) + ) + ) + + TehDivider() + + } + + DisposableEffect(Unit) { + focusRequester.requestFocus() + onDispose { } + } + +} \ No newline at end of file diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/StationScreen.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/StationScreen.kt index 7193bbab..44e5a31e 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/StationScreen.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/StationScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.livedata.observeAsState import androidx.navigation.NavController import dev.yasan.kit.core.Resource +import dev.yasan.metro.tehran.model.misc.LaunchSource import dev.yasan.metro.tehran.ui.composable.common.teh.TehError import dev.yasan.metro.tehran.ui.composable.common.teh.TehErrorType import dev.yasan.metro.tehran.ui.composable.common.teh.TehProgress @@ -13,7 +14,8 @@ import dev.yasan.metro.tehran.ui.composable.screen.station.modules.StationScreen fun StationScreen( stationViewModel: StationViewModel, navController: NavController, - stationId: Int + stationId: Int, + launchSource: LaunchSource ) { fun loadData() { @@ -33,10 +35,15 @@ fun StationScreen( } is Resource.Success -> { val station = stationResource.value!!.data!! - StationScreenSuccess(station = station, navController = navController) + StationScreenSuccess( + station = station, + navController = navController, + launchSource = launchSource + ) } else -> { TehProgress() } } + } diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/StationViewModel.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/StationViewModel.kt index 32b06c0d..f2319098 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/StationViewModel.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/StationViewModel.kt @@ -8,10 +8,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.yasan.kit.core.DispatcherProvider import dev.yasan.kit.core.Resource import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.repo.intersection.IntersectionRepository -import dev.yasan.metro.tehran.data.repo.line.LineRepository -import dev.yasan.metro.tehran.data.repo.station.StationRepository +import dev.yasan.metro.tehran.model.tehro.Station +import dev.yasan.metro.tehran.domain.repository.station.StationRepository import kotlinx.coroutines.launch import javax.inject.Inject diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/modules/StationScreenSuccess.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/modules/StationScreenSuccess.kt index 930fce6b..5aab20cd 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/modules/StationScreenSuccess.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/modules/StationScreenSuccess.kt @@ -29,8 +29,8 @@ import androidx.navigation.compose.rememberNavController import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.compose.type.rubikFamily import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.LineType -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.misc.LaunchSource +import dev.yasan.metro.tehran.model.tehro.Station import dev.yasan.metro.tehran.ui.composable.common.teh.TehButton import dev.yasan.metro.tehran.ui.composable.screen.station.modules.accessibility.AccessibilityEmsIndicator import dev.yasan.metro.tehran.ui.composable.screen.station.modules.accessibility.AccessibilityIndicator @@ -45,6 +45,7 @@ fun StationScreenSuccess( station: Station, navController: NavController, fontFamily: FontFamily = LocaleHelper.properFontFamily, + launchSource: LaunchSource, forceFarsi: Boolean = false ) { @@ -145,37 +146,54 @@ fun StationScreenSuccess( } - station.intersection?.let { intersection -> + if (launchSource == LaunchSource.SEARCH) { - intersection.getOppositeLine(stationId = station.id)?.let { line -> + station.line?.let { line -> - val intersectionButtonTitle: String = - when (line.type) { - LineType.METRO_BRANCH -> - "${stringResource(id = R.string.line)} ${line.name} (${ - stringResource( - id = R.string.branch - ) - })" - else -> "${stringResource(id = R.string.line)} ${line.name}" + TehButton( + colorBackground = line.color, + colorBorder = line.color, + modifier = Modifier.fillMaxWidth(), + title = line.getFullName(context = context), + icon = TehroIcons.MultipleStop, + onClick = { + Navigator.navigateToLineDetails( + navController = navController, + line = line, + launchSource = launchSource + ) } + ) + + Spacer(modifier = Modifier.requiredHeight(grid(2))) + + } + + } + + station.intersection?.let { intersection -> + + intersection.getOppositeLine(stationId = station.id)?.let { line -> TehButton( colorBackground = line.color, colorBorder = line.color, modifier = Modifier.fillMaxWidth(), - title = intersectionButtonTitle, + title = line.getFullName(context = context), icon = TehroIcons.MultipleStop, onClick = { Navigator.navigateToLineDetails( navController = navController, - line = line + line = line, + launchSource = launchSource ) } ) Spacer(modifier = Modifier.requiredHeight(grid(2))) + } + } } @@ -201,7 +219,8 @@ private fun StationScreenSuccessPreviewEn(@PreviewParameter(StationPreviewProvid StationScreenSuccess( station = station, fontFamily = rubikFamily, - navController = rememberNavController() + navController = rememberNavController(), + launchSource = LaunchSource.LINE ) } @@ -223,6 +242,7 @@ private fun StationScreenSuccessPreviewFa(@PreviewParameter(StationPreviewProvid station = station, fontFamily = vazirFamily, forceFarsi = true, - navController = rememberNavController() + navController = rememberNavController(), + launchSource = LaunchSource.LINE ) } diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/modules/accessibility/AccessibilityIndicator.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/modules/accessibility/AccessibilityIndicator.kt index 09c7dd1d..8137a368 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/modules/accessibility/AccessibilityIndicator.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/composable/screen/station/modules/accessibility/AccessibilityIndicator.kt @@ -17,10 +17,10 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import dev.yasan.kit.compose.foundation.grid import dev.yasan.kit.compose.type.rubikFamily import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevel -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelWheelchair -import dev.yasan.metro.tehran.data.db.entity.accessibility.WcAvailabilityLevel +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevel +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelBlindness +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelWheelchair +import dev.yasan.metro.tehran.model.tehro.accessibility.WcAvailabilityLevel import dev.yasan.metro.tehran.ui.preview.station.accessibility.StationAccessibilityPreviewProvider import dev.yasan.metro.tehran.ui.theme.TehroIcons import dev.yasan.metro.tehran.ui.theme.dimenDivider diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/NavGraph.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/NavGraph.kt index 54e95382..048a092a 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/NavGraph.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/NavGraph.kt @@ -17,6 +17,7 @@ import com.google.accompanist.navigation.material.bottomSheet import com.google.accompanist.navigation.material.rememberBottomSheetNavigator import com.google.accompanist.systemuicontroller.rememberSystemUiController import dev.yasan.metro.tehran.R +import dev.yasan.metro.tehran.model.misc.LaunchSource import dev.yasan.metro.tehran.ui.composable.screen.MainViewModel import dev.yasan.metro.tehran.ui.composable.screen.about.AboutScreen import dev.yasan.metro.tehran.ui.composable.screen.about.AboutViewModel @@ -25,6 +26,8 @@ import dev.yasan.metro.tehran.ui.composable.screen.line.LineScreen import dev.yasan.metro.tehran.ui.composable.screen.line.LineViewModel import dev.yasan.metro.tehran.ui.composable.screen.map.MapScreen import dev.yasan.metro.tehran.ui.composable.screen.map.MapViewModel +import dev.yasan.metro.tehran.ui.composable.screen.search.SearchScreen +import dev.yasan.metro.tehran.ui.composable.screen.search.SearchViewModel import dev.yasan.metro.tehran.ui.composable.screen.station.StationScreen import dev.yasan.metro.tehran.ui.composable.screen.station.StationViewModel @@ -99,6 +102,16 @@ fun NavGraph( } + composable(route = NavRoutes.routeSearch()) { + + systemUiController.setStatusBarColor(color = colorResource(id = R.color.layer_midground)) + + val searchViewModel: SearchViewModel = hiltViewModel(it) + + SearchScreen(viewModel = searchViewModel, navController = navController) + + } + composable(route = NavRoutes.routeMap()) { systemUiController.setStatusBarColor(color = colorResource(id = R.color.layer_midground)) @@ -123,20 +136,28 @@ fun NavGraph( navArgument(NavRoutes.EXTRA_STATION_ID) { type = NavType.IntType }, + navArgument(NavRoutes.EXTRA_LAUNCH_SOURCE) { + type = NavType.IntType + } ) ) { val stationId = it.arguments?.getInt(NavRoutes.EXTRA_STATION_ID) ?: 0 + val launchSource = + it.arguments?.getInt(NavRoutes.EXTRA_LAUNCH_SOURCE) ?: LaunchSource.INVALID.ordinal val stationViewModel: StationViewModel = hiltViewModel(it) StationScreen( stationViewModel = stationViewModel, navController = navController, - stationId = stationId + stationId = stationId, + launchSource = LaunchSource.fromInt(launchSource) ) + } + } } } diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/NavRoutes.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/NavRoutes.kt index c8c4656a..8b1b03d2 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/NavRoutes.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/NavRoutes.kt @@ -1,10 +1,12 @@ package dev.yasan.metro.tehran.ui.navigation -import dev.yasan.metro.tehran.data.db.entity.Line -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.misc.LaunchSource +import dev.yasan.metro.tehran.model.tehro.Line +import dev.yasan.metro.tehran.model.tehro.Station import dev.yasan.metro.tehran.ui.composable.screen.home.HomeScreen import dev.yasan.metro.tehran.ui.composable.screen.line.LineScreen import dev.yasan.metro.tehran.ui.composable.screen.map.MapScreen +import dev.yasan.metro.tehran.ui.composable.screen.search.SearchScreen import dev.yasan.metro.tehran.ui.composable.screen.station.StationScreen /** @@ -40,16 +42,26 @@ object NavRoutes { private const val ROUTE_STATION = "station" const val EXTRA_STATION_ID = "stationId" + const val EXTRA_LAUNCH_SOURCE = "launchSource" /** * @return Navigation route for [StationScreen] with navigation arguments. */ - fun routeStation(station: Station) = "$ROUTE_STATION/${station.id}" + fun routeStation(station: Station, launchSource: LaunchSource) = "$ROUTE_STATION/${station.id}/${launchSource.ordinal}" /** * @return Navigation route for [StationScreen]. */ - fun routeStationBase() = "$ROUTE_STATION/{$EXTRA_STATION_ID}" + fun routeStationBase() = "$ROUTE_STATION/{$EXTRA_STATION_ID}/{$EXTRA_LAUNCH_SOURCE}" + + // Search + + private const val ROUTE_SEARCH = "search" + + /** + * @return Navigation route for [SearchScreen]. + */ + fun routeSearch() = ROUTE_SEARCH // Map diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/Navigator.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/Navigator.kt index 8e723976..59c059c9 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/Navigator.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/navigation/Navigator.kt @@ -2,7 +2,8 @@ package dev.yasan.metro.tehran.ui.navigation import android.util.Log import androidx.navigation.NavController -import dev.yasan.metro.tehran.data.db.entity.Line +import dev.yasan.metro.tehran.model.misc.LaunchSource +import dev.yasan.metro.tehran.model.tehro.Line import dev.yasan.metro.tehran.ui.composable.screen.line.LineScreen /** @@ -13,13 +14,25 @@ object Navigator { private const val TAG = "Navigator" + fun navigateToSearch(navController: NavController) { + navController.navigate(NavRoutes.routeSearch()) + } + + fun navigateToMap(navController: NavController) { + navController.navigate(NavRoutes.routeMap()) + } + /** * Navigates to [LineScreen]. */ - fun navigateToLineDetails(navController: NavController, line: Line) { + fun navigateToLineDetails( + navController: NavController, + line: Line, + launchSource: LaunchSource + ) { Log.d(TAG, "navigateToLineDetails: line ${line.nameEn}") navController.navigate(NavRoutes.routeLine(line = line)) { - popUpTo(NavRoutes.routeLineBase()) { + popUpTo(if (launchSource == LaunchSource.LINE) NavRoutes.routeLineBase() else NavRoutes.routeSearch()) { inclusive = true } } diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/dbinfo/DatabaseInformationPreviewProvider.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/dbinfo/DatabaseInformationPreviewProvider.kt index a6b98dba..ee6688e7 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/dbinfo/DatabaseInformationPreviewProvider.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/dbinfo/DatabaseInformationPreviewProvider.kt @@ -1,7 +1,7 @@ package dev.yasan.metro.tehran.ui.preview.dbinfo import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import dev.yasan.metro.tehran.data.db.entity.DatabaseInformation +import dev.yasan.metro.tehran.model.tehro.DatabaseInformation import dev.yasan.metro.tehran.util.PreviewHelper /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/line/LineListPreviewProvider.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/line/LineListPreviewProvider.kt index cccce0f5..fa6b3c80 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/line/LineListPreviewProvider.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/line/LineListPreviewProvider.kt @@ -1,7 +1,7 @@ package dev.yasan.metro.tehran.ui.preview.line import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import dev.yasan.metro.tehran.data.db.entity.Line +import dev.yasan.metro.tehran.model.tehro.Line import dev.yasan.metro.tehran.util.PreviewHelper /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/line/LinePreviewProvider.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/line/LinePreviewProvider.kt index feb3820b..38b60129 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/line/LinePreviewProvider.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/line/LinePreviewProvider.kt @@ -1,7 +1,7 @@ package dev.yasan.metro.tehran.ui.preview.line import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import dev.yasan.metro.tehran.data.db.entity.Line +import dev.yasan.metro.tehran.model.tehro.Line import dev.yasan.metro.tehran.util.PreviewHelper /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/stat/StatListPreviewProvider.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/stat/StatListPreviewProvider.kt index e1a31383..74cc3e77 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/stat/StatListPreviewProvider.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/stat/StatListPreviewProvider.kt @@ -2,9 +2,7 @@ package dev.yasan.metro.tehran.ui.preview.stat import androidx.compose.ui.tooling.preview.PreviewParameterProvider import dev.yasan.metro.tehran.R -import dev.yasan.metro.tehran.data.db.entity.Stat -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.util.PreviewHelper +import dev.yasan.metro.tehran.model.tehro.Stat /** * Provides preview parameters for [List]<[Stat]>. diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/StationListPreviewProvider.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/StationListPreviewProvider.kt index a2c02727..52e8b611 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/StationListPreviewProvider.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/StationListPreviewProvider.kt @@ -1,7 +1,7 @@ package dev.yasan.metro.tehran.ui.preview.station import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.tehro.Station import dev.yasan.metro.tehran.util.PreviewHelper /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/StationPreviewProvider.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/StationPreviewProvider.kt index c1241758..76043efa 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/StationPreviewProvider.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/StationPreviewProvider.kt @@ -1,7 +1,7 @@ package dev.yasan.metro.tehran.ui.preview.station import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import dev.yasan.metro.tehran.data.db.entity.Station +import dev.yasan.metro.tehran.model.tehro.Station import dev.yasan.metro.tehran.util.PreviewHelper /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/accessibility/StationAccessibilityPreviewProvider.kt b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/accessibility/StationAccessibilityPreviewProvider.kt index fbc1dc5d..ad6951ee 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/accessibility/StationAccessibilityPreviewProvider.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/ui/preview/station/accessibility/StationAccessibilityPreviewProvider.kt @@ -1,9 +1,7 @@ package dev.yasan.metro.tehran.ui.preview.station.accessibility import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import dev.yasan.metro.tehran.data.db.entity.Station -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevel -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevel import dev.yasan.metro.tehran.util.PreviewHelper /** diff --git a/app/src/main/java/dev/yasan/metro/tehran/util/PreviewHelper.kt b/app/src/main/java/dev/yasan/metro/tehran/util/PreviewHelper.kt index 7f0afdd0..f152c040 100644 --- a/app/src/main/java/dev/yasan/metro/tehran/util/PreviewHelper.kt +++ b/app/src/main/java/dev/yasan/metro/tehran/util/PreviewHelper.kt @@ -1,11 +1,11 @@ package dev.yasan.metro.tehran.util import androidx.compose.ui.graphics.Color -import dev.yasan.metro.tehran.data.db.entity.* -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevel -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelBlindness -import dev.yasan.metro.tehran.data.db.entity.accessibility.AccessibilityLevelWheelchair -import dev.yasan.metro.tehran.data.db.entity.accessibility.WcAvailabilityLevel +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevel +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelBlindness +import dev.yasan.metro.tehran.model.tehro.accessibility.AccessibilityLevelWheelchair +import dev.yasan.metro.tehran.model.tehro.accessibility.WcAvailabilityLevel +import dev.yasan.metro.tehran.model.tehro.* /** * Provides dummy data to composable previews. All dummy variables for previews must be created here so they can be reused. diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index e4f41664..35222530 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -12,7 +12,7 @@ لوگو یاسان نقشه خط‌ها - هیچ ایستگاه‌ای پیدا نشد + ایستگاه‌ای پیدا نشد هیچ خطی پیدا نشد "نسخه " انشعاب @@ -50,4 +50,7 @@ لوکیشن ایستگاه‌ها دسترسی ایستگاه‌ها آمار + جست‌وجو + نام ایستگاه + گروه‌بندی نسبت به خط \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ea1ac710..56714797 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -51,4 +51,7 @@ Station Location Station Accessibility Statistics + Search + Line Name + Group by Line \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/230.txt b/fastlane/metadata/android/en-US/changelogs/230.txt new file mode 100644 index 00000000..bb16bc6d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/230.txt @@ -0,0 +1,3 @@ +- Fixed state restore if the app process was killed on the line screen. +- Line screen navigations no longer stack on top of each other and only the last one is kept. +- Added Firebase (Analytics, Crashlytics & Performance) on GitHub & Play builds. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/231.txt b/fastlane/metadata/android/en-US/changelogs/231.txt new file mode 100644 index 00000000..dd460af4 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/231.txt @@ -0,0 +1,2 @@ +- Added station search support. +- Fixed map loading indicator's exit animation. \ No newline at end of file diff --git a/fastlane/metadata/android/fa/changelogs/204.txt b/fastlane/metadata/android/fa/changelogs/204.txt deleted file mode 100644 index f4f14636..00000000 --- a/fastlane/metadata/android/fa/changelogs/204.txt +++ /dev/null @@ -1 +0,0 @@ -- حذف Firebase. \ No newline at end of file diff --git a/fastlane/metadata/android/fa/changelogs/205.txt b/fastlane/metadata/android/fa/changelogs/205.txt deleted file mode 100644 index 40f805e2..00000000 --- a/fastlane/metadata/android/fa/changelogs/205.txt +++ /dev/null @@ -1,4 +0,0 @@ -- اضافه شدن صفحه‌ی جزییات ایستگاه که اطلاعات بیشتر از جمله لوکیشن را نشان میدهد. -- حل نشان داده شده اسم عددی خط‌ها با اعداد لاتین بجای فارسی. -- نشان دادن تاریخ آخرین بروزرسانی پایگاه داده در صفحه‌ی درباره. -- حذف نسخه‌ی پراید از لوگوی یاسان. \ No newline at end of file diff --git a/fastlane/metadata/android/fa/changelogs/210.txt b/fastlane/metadata/android/fa/changelogs/210.txt deleted file mode 100644 index ce5d2ded..00000000 --- a/fastlane/metadata/android/fa/changelogs/210.txt +++ /dev/null @@ -1,4 +0,0 @@ -- نشان دادن اطلاعات بیشتر درمود ایستگاه‌ها در صفحه‌ی جزییات ایستگاه. -- نشان دادن اسم نسخه‌ی نصب شده‌ی اپ در صفحه‌ی اصلی. -- نسان دادن تاریخ بروزرسانی پایگاه‌داده به تاریخ جلالی در زمانی که اپ فارسی است.- بهبود ظاهر اسم اپ در صفحه‌ی درباره. -- نشان دادن اطلاعات ساده‌ درمورد پایگاه داده در صفحه‌ی درباره. \ No newline at end of file diff --git a/fastlane/metadata/android/fa/changelogs/211.txt b/fastlane/metadata/android/fa/changelogs/211.txt deleted file mode 100644 index 5f8c315a..00000000 --- a/fastlane/metadata/android/fa/changelogs/211.txt +++ /dev/null @@ -1,3 +0,0 @@ -- بروزرسانی ظاهر برنامه. -- بهبود محتوای صفحه‌ی درباره و اضافه شدن یک انیمیشن به آن. -- حل مشکل بسته شدن برنامه بعد از باز کردن صفحه‌ی درباره. \ No newline at end of file diff --git a/fastlane/metadata/android/fa/changelogs/220.txt b/fastlane/metadata/android/fa/changelogs/220.txt deleted file mode 100644 index e3669a2c..00000000 --- a/fastlane/metadata/android/fa/changelogs/220.txt +++ /dev/null @@ -1,4 +0,0 @@ -- کامل شدن اطلاعات دسترسی نابینایان و ویلچر. -- افزوده شدن اطلاعات درمورد سرویس بهداشتی در ایستگاه‌ها. -- بهبود ظاهر لوگو در صفحه‌ی درباره. -- اضافه شدن بخش آمار در صفحه‌ی درباره. \ No newline at end of file diff --git a/fastlane/metadata/android/fa/changelogs/221.txt b/fastlane/metadata/android/fa/changelogs/221.txt deleted file mode 100644 index 2f23b409..00000000 --- a/fastlane/metadata/android/fa/changelogs/221.txt +++ /dev/null @@ -1 +0,0 @@ -- بروزرسانی و حل غلط‌های املایی متن‌ها. \ No newline at end of file diff --git a/ydk b/ydk index 91bf8f09..129519f3 160000 --- a/ydk +++ b/ydk @@ -1 +1 @@ -Subproject commit 91bf8f0955a72e08b22c52aab4606d953cb56b0f +Subproject commit 129519f3c96720684d109fb76fb2a13044f2777c