16 Commits

Author SHA1 Message Date
1be2cb425c Merge pull request 'BUG FIX: Favourite state was not showing' (#2) from bugfix-round into main
Reviewed-on: #2
2025-08-01 19:59:27 +00:00
571db144c4 Fixed a bug with favourites 2025-08-01 13:57:52 -06:00
49c9a6dce1 Update LICENSE 2025-08-01 06:34:19 +00:00
c4e6d6b69f Build 0.5.0 2025-07-31 18:44:36 -06:00
9ecfcc2a74 No actions 2025-07-31 18:36:31 -06:00
f5db153ac2 plssss
Some checks failed
Check / check (pull_request) Has been cancelled
Check / uiTests (30) (pull_request) Has been cancelled
Sign / sign (push) Has been cancelled
2025-07-31 18:35:40 -06:00
3c83f740d4 Sorry one more
Some checks failed
Check / uiTests (30) (pull_request) Has been cancelled
Check / check (pull_request) Has been cancelled
Sign / sign (push) Has been cancelled
2025-07-31 18:33:22 -06:00
1b4323c2bb Convert to my app, so I can continue a fork! 2025-07-31 18:33:10 -06:00
mroetsc
dc4ba51896 Fixed Shopping List API paths for compatibility with Mealie 2.0 2025-05-17 10:34:24 +02:00
Kirill Kamakin
2dd0ec3403 Update README.md 2024-11-09 17:44:27 +01:00
renovate[bot]
fd39b7ebe6 Update lifecycle to v2.8.6 (#322)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 18:28:01 +00:00
renovate[bot]
79e0ef62e5 Update dependency androidx.compose.material:material to v1.7.3 (#330)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 20:15:36 +02:00
renovate[bot]
459294cec7 Update dependency gradle to v8.10.2 (#327)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 17:57:20 +00:00
renovate[bot]
e160580f69 Update dependency androidx.compose:compose-bom to v2024.09.03 (#311)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 17:43:44 +00:00
renovate[bot]
c5bc5fad22 Update dependency org.jetbrains.kotlinx:kotlinx-serialization-json to v1.7.3 (#328)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 19:32:51 +02:00
renovate[bot]
a471251ff3 Update dependency com.google.accompanist:accompanist-themeadapter-material3 to v0.36.0 (#324)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-29 07:00:48 +00:00
304 changed files with 2100 additions and 2097 deletions

View File

@@ -1,91 +0,0 @@
name: Check
on: [ pull_request ]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2
with:
fastlaneDir: ./fastlane/metadata/android
usePlayStoreLocales: true
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Checks
run: ./gradlew check :app:koverXmlReportRelease :app:koverVerifyRelease
- name: SonarCloud
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./gradlew sonar
- name: Publish test reports
uses: mikepenz/action-junit-report@v4
if: always() # always run even if the previous step fails
with:
report_paths: './**/build/test-results/**/TEST-*.xml'
uiTests:
runs-on: ubuntu-latest
strategy:
matrix:
api-level: [ 30 ]
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@v1.3.1
with:
android: false
large-packages: true
tool-cache: true
dotnet: true
haskell: true
docker-images: true
swap-storage: true
- name: Enable KVM group perms
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- uses: actions/checkout@v4
name: Checkout the code
with:
fetch-depth: 0
- uses: actions/setup-java@v4
name: Setup JDK 17
with:
distribution: 'zulu'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
validate-wrappers: true
gradle-home-cache-cleanup: true
- name: Run tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-level }}
arch: x86_64
disable-animations: true
disk-size: 6000M
heap-size: 600M
script: ./gradlew :app:connectedCheck

View File

@@ -1,61 +0,0 @@
name: Sign
on:
push:
branches:
- master
jobs:
sign:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Setup Gradle
uses: gradle/gradle-build-action@v3
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Restore keystore
env:
MEALIENT_KEY_STORE: ${{ secrets.MEALIENT_KEY_STORE }}
MEALIENT_KEY_STORE_PASSWORD: ${{ secrets.MEALIENT_KEY_STORE_PASSWORD }}
MEALIENT_KEY_ALIAS: ${{ secrets.MEALIENT_KEY_ALIAS }}
MEALIENT_KEY_PASSWORD: ${{ secrets.MEALIENT_KEY_PASSWORD }}
run: |
echo "$MEALIENT_KEY_STORE" | base64 -d > app/keystore.jks
echo "storeFile=keystore.jks" > keystore.properties
echo "storePassword=$MEALIENT_KEY_STORE_PASSWORD" >> keystore.properties
echo "keyAlias=$MEALIENT_KEY_ALIAS" >> keystore.properties
echo "keyPassword=$MEALIENT_KEY_PASSWORD" >> keystore.properties
- name: APK
run: |
./gradlew build
cp app/build/outputs/apk/release/*.apk mealient-release.apk
- name: Bundle
run: |
./gradlew bundle
cp app/build/outputs/bundle/release/*.aab mealient-release.aab
- name: Upload release build
uses: actions/upload-artifact@v4
with:
name: Release build
path: |
mealient-release.apk
mealient-release.aab
- name: SonarCloud
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./gradlew sonar

View File

@@ -1,6 +1,7 @@
MIT License MIT License
Copyright (c) 2022, Kirill Kamakin Copyright (c) 2022, Kirill Kamakin
Copyright (c) 2025, Atridad Lahiji
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@@ -16,6 +17,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@@ -2,7 +2,7 @@
Welcome to the Mealient app for Android! Welcome to the Mealient app for Android!
This is an open source Android app developed by Kirill Kamakin. The source code is available on This is an open source Android app developed by Kirill Kamakin and forked by Atridad Lahiji. The source code is available on
GitHub under the MIT license; the app is also available on Google Play. GitHub under the MIT license; the app is also available on Google Play.
I hereby state, to the best of my knowledge and belief, that I have not programmed this app to I hereby state, to the best of my knowledge and belief, that I have not programmed this app to
@@ -11,6 +11,4 @@ the Mealie server(s) that you connect to. It can be removed by the administrator
server(s). server(s).
Yours sincerely, Yours sincerely,
Kirill Kamakin. Kirill Kamakin and Atridad Lahiji
Stockholm, Sweden
mealient@gmail.com

View File

@@ -1,21 +1,13 @@
[![Crowdin](https://badges.crowdin.net/mealient/localized.svg)](https://crowdin.com/project/mealient)
<a href='https://play.google.com/store/apps/details?id=gq.kirmanak.mealient&utm_source=github&utm_campaign=readme&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img width="200" alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png'/></a>
<a href="https://f-droid.org/packages/gq.kirmanak.mealient">
<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">
</a>
# Mealient # Mealient
## DISCLAIMER ## DISCLAIMERS
This project is developed independently from the core Mealie project. It is NOT associated with the This project is developed independently from the core Mealie project. It is NOT associated with the
core Mealie developers. Any issues must be reported to the Mealient repository, NOT the Mealie core Mealie developers. Any issues must be reported to the Mealient repository, NOT the Mealie
repository. repository.
Also, this is a fork of the original Mealient project. All credit goes to Kirill Kamakin on GitHub for the original project.
## What is this? ## What is this?
An unofficial Android client for [Mealie](https://github.com/mealie-recipes/mealie/). It enables you An unofficial Android client for [Mealie](https://github.com/mealie-recipes/mealie/). It enables you
@@ -30,16 +22,9 @@ Displays the list of recipes, some information about each of the recipes, even r
available! available!
The list of shopping lists is also available, each shopping list can be viewed and modified. The list of shopping lists is also available, each shopping list can be viewed and modified.
## Screenshots
<img src="https://github.com/kirmanak/Mealient/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png?raw=true" width="236" height="500" /> <img src="https://github.com/kirmanak/Mealient/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png?raw=true" width="236" height="500" /> <img src="https://github.com/kirmanak/Mealient/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png?raw=true" width="236" height="500" /> <img src="https://github.com/kirmanak/Mealient/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png?raw=true" width="236" height="500" /> <img src="https://github.com/kirmanak/Mealient/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png?raw=true" width="236" height="500" /> <img src="https://github.com/kirmanak/Mealient/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png?raw=true" width="236" height="500" />
## How to install ## How to install
There are three ways: Download the latest apk from the releases page.
1. Install it with Google Play using the badge above.
2. Install it with F-droid using the badge above.
3. Download the latest apk from the releases page.
## Contribution ## Contribution

View File

@@ -4,18 +4,18 @@ import java.io.FileInputStream
import java.util.Properties import java.util.Properties
plugins { plugins {
id("gq.kirmanak.mealient.application") id("com.atridad.mealient.application")
id("dagger.hilt.android.plugin") id("dagger.hilt.android.plugin")
alias(libs.plugins.ksp) alias(libs.plugins.ksp)
id("gq.kirmanak.mealient.compose.app") id("com.atridad.mealient.compose.app")
} }
android { android {
defaultConfig { defaultConfig {
applicationId = "gq.kirmanak.mealient" applicationId = "com.atridad.mealient"
versionCode = 37 versionCode = 38
versionName = "0.4.8" versionName = "0.5.1"
testInstrumentationRunner = "gq.kirmanak.mealient.MealientTestRunner" testInstrumentationRunner = "com.atridad.mealient.MealientTestRunner"
testInstrumentationRunnerArguments += mapOf("clearPackageData" to "true") testInstrumentationRunnerArguments += mapOf("clearPackageData" to "true")
resourceConfigurations += listOf("en", "es", "ru", "fr", "nl", "pt", "de") resourceConfigurations += listOf("en", "es", "ru", "fr", "nl", "pt", "de")
} }
@@ -50,7 +50,7 @@ android {
} }
} }
namespace = "gq.kirmanak.mealient" namespace = "com.atridad.mealient"
packaging { packaging {
resources.excludes += "DebugProbesKt.bin" resources.excludes += "DebugProbesKt.bin"
@@ -145,25 +145,25 @@ kover {
filters { filters {
excludes { excludes {
classes( classes(
"gq.kirmanak.mealient.datastore.recipe.AddRecipeInput*", // generated by data store "com.atridad.mealient.datastore.recipe.AddRecipeInput*", // generated by data store
"*ComposableSingletons*", // generated by Compose "*ComposableSingletons*", // generated by Compose
"gq.kirmanak.mealient.database.AppDb_Impl*", // generated by Room "com.atridad.mealient.database.AppDb_Impl*", // generated by Room
"*Dao_Impl*", // generated by Room "*Dao_Impl*", // generated by Room
"*Hilt_*", // generated by Hilt "*Hilt_*", // generated by Hilt
) )
packages( packages(
"gq.kirmanak.mealient*.destinations", // generated by Compose destinations "com.atridad.mealient*.destinations", // generated by Compose destinations
) )
annotatedBy( annotatedBy(
"androidx.compose.ui.tooling.preview.Preview", "androidx.compose.ui.tooling.preview.Preview",
"gq.kirmanak.mealient.ui.preview.ColorSchemePreview", "com.atridad.mealient.ui.preview.ColorSchemePreview",
"androidx.compose.runtime.Composable", "androidx.compose.runtime.Composable",
"dagger.Module", "dagger.Module",
"dagger.internal.DaggerGenerated", "dagger.internal.DaggerGenerated",
) )
} }
includes { includes {
packages("gq.kirmanak.mealient") packages("com.atridad.mealient")
} }
} }
variant("release") { variant("release") {

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,37 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.atridad.mealient",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 38,
"versionName": "0.5.1",
"outputFile": "app-release.apk"
}
],
"elementType": "File",
"baselineProfiles": [
{
"minApi": 28,
"maxApi": 30,
"baselineProfiles": [
"baselineProfiles/1/app-release.dm"
]
},
{
"minApi": 31,
"maxApi": 2147483647,
"baselineProfiles": [
"baselineProfiles/0/app-release.dm"
]
}
],
"minSdkVersionForDexing": 26
}

View File

@@ -1,11 +1,11 @@
package gq.kirmanak.mealient package com.atridad.mealient
import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.junit4.createAndroidComposeRule
import com.kaspersky.components.composesupport.config.withComposeSupport import com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.kaspresso.kaspresso.Kaspresso import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidRule
import gq.kirmanak.mealient.ui.activity.MainActivity import com.atridad.mealient.ui.activity.MainActivity
import okhttp3.mockwebserver.MockWebServer import okhttp3.mockwebserver.MockWebServer
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before

View File

@@ -1,11 +1,11 @@
package gq.kirmanak.mealient package com.atridad.mealient
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import gq.kirmanak.mealient.screen.AuthenticationScreen import com.atridad.mealient.screen.AuthenticationScreen
import gq.kirmanak.mealient.screen.BaseUrlScreen import com.atridad.mealient.screen.BaseUrlScreen
import gq.kirmanak.mealient.screen.DisclaimerScreen import com.atridad.mealient.screen.DisclaimerScreen
import gq.kirmanak.mealient.screen.RecipesListScreen import com.atridad.mealient.screen.RecipesListScreen
import gq.kirmanak.mealient.ui.disclaimer.DisclaimerViewModel import com.atridad.mealient.ui.disclaimer.DisclaimerViewModel
import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen
import io.github.kakaocup.kakao.common.utilities.getResourceString import io.github.kakaocup.kakao.common.utilities.getResourceString
import org.junit.Before import org.junit.Before

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient package com.atridad.mealient
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient package com.atridad.mealient
import android.util.Log import android.util.Log
import okhttp3.mockwebserver.Dispatcher import okhttp3.mockwebserver.Dispatcher

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.screen package com.atridad.mealient.screen
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import io.github.kakaocup.compose.node.element.ComposeScreen import io.github.kakaocup.compose.node.element.ComposeScreen

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.screen package com.atridad.mealient.screen
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import io.github.kakaocup.compose.node.element.ComposeScreen import io.github.kakaocup.compose.node.element.ComposeScreen

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.screen package com.atridad.mealient.screen
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import io.github.kakaocup.compose.node.element.ComposeScreen import io.github.kakaocup.compose.node.element.ComposeScreen

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.screen package com.atridad.mealient.screen
import io.github.kakaocup.compose.node.builder.ViewBuilder import io.github.kakaocup.compose.node.builder.ViewBuilder
import io.github.kakaocup.compose.node.core.BaseNode import io.github.kakaocup.compose.node.core.BaseNode

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.screen package com.atridad.mealient.screen
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import io.github.kakaocup.compose.node.element.ComposeScreen import io.github.kakaocup.compose.node.element.ComposeScreen

View File

@@ -6,7 +6,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application <application
android:name="gq.kirmanak.mealient.App" android:name="com.atridad.mealient.App"
android:allowBackup="false" android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/full_backup_rules" android:fullBackupContent="@xml/full_backup_rules"

View File

@@ -1,13 +1,13 @@
package gq.kirmanak.mealient package com.atridad.mealient
import android.app.Application import android.app.Application
import coil.Coil import coil.Coil
import coil.ImageLoader import coil.ImageLoader
import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColors
import dagger.hilt.android.HiltAndroidApp import dagger.hilt.android.HiltAndroidApp
import gq.kirmanak.mealient.architecture.configuration.BuildConfiguration import com.atridad.mealient.architecture.configuration.BuildConfiguration
import gq.kirmanak.mealient.data.migration.MigrationDetector import com.atridad.mealient.data.migration.MigrationDetector
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job

View File

@@ -0,0 +1,8 @@
package com.atridad.mealient.data.add
import com.atridad.mealient.datasource.models.AddRecipeInfo
interface AddRecipeDataSource {
suspend fun addRecipe(recipe: AddRecipeInfo): String
}

View File

@@ -1,6 +1,6 @@
package gq.kirmanak.mealient.data.add package com.atridad.mealient.data.add
import gq.kirmanak.mealient.datasource.models.AddRecipeInfo import com.atridad.mealient.datasource.models.AddRecipeInfo
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
interface AddRecipeRepo { interface AddRecipeRepo {

View File

@@ -1,11 +1,11 @@
package gq.kirmanak.mealient.data.add.impl package com.atridad.mealient.data.add.impl
import gq.kirmanak.mealient.data.add.AddRecipeDataSource import com.atridad.mealient.data.add.AddRecipeDataSource
import gq.kirmanak.mealient.data.add.AddRecipeRepo import com.atridad.mealient.data.add.AddRecipeRepo
import gq.kirmanak.mealient.datasource.models.AddRecipeInfo import com.atridad.mealient.datasource.models.AddRecipeInfo
import gq.kirmanak.mealient.datastore.recipe.AddRecipeStorage import com.atridad.mealient.datastore.recipe.AddRecipeStorage
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import gq.kirmanak.mealient.model_mapper.ModelMapper import com.atridad.mealient.model_mapper.ModelMapper
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.auth package com.atridad.mealient.data.auth
interface AuthDataSource { interface AuthDataSource {
/** /**

View File

@@ -1,6 +1,6 @@
package gq.kirmanak.mealient.data.auth package com.atridad.mealient.data.auth
import gq.kirmanak.mealient.shopping_lists.repo.ShoppingListsAuthRepo import com.atridad.mealient.shopping_lists.repo.ShoppingListsAuthRepo
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
interface AuthRepo : ShoppingListsAuthRepo { interface AuthRepo : ShoppingListsAuthRepo {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.auth package com.atridad.mealient.data.auth
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.data.auth.impl package com.atridad.mealient.data.auth.impl
import gq.kirmanak.mealient.data.auth.AuthDataSource import com.atridad.mealient.data.auth.AuthDataSource
import gq.kirmanak.mealient.datasource.MealieDataSource import com.atridad.mealient.datasource.MealieDataSource
import gq.kirmanak.mealient.datasource.models.CreateApiTokenRequest import com.atridad.mealient.datasource.models.CreateApiTokenRequest
import javax.inject.Inject import javax.inject.Inject
class AuthDataSourceImpl @Inject constructor( class AuthDataSourceImpl @Inject constructor(

View File

@@ -1,10 +1,10 @@
package gq.kirmanak.mealient.data.auth.impl package com.atridad.mealient.data.auth.impl
import gq.kirmanak.mealient.data.auth.AuthDataSource import com.atridad.mealient.data.auth.AuthDataSource
import gq.kirmanak.mealient.data.auth.AuthRepo import com.atridad.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.auth.AuthStorage import com.atridad.mealient.data.auth.AuthStorage
import gq.kirmanak.mealient.datasource.AuthenticationProvider import com.atridad.mealient.datasource.AuthenticationProvider
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import javax.inject.Inject import javax.inject.Inject

View File

@@ -1,13 +1,13 @@
package gq.kirmanak.mealient.data.auth.impl package com.atridad.mealient.data.auth.impl
import android.content.SharedPreferences import android.content.SharedPreferences
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.core.content.edit import androidx.core.content.edit
import gq.kirmanak.mealient.data.auth.AuthStorage import com.atridad.mealient.data.auth.AuthStorage
import gq.kirmanak.mealient.datasource.TokenChangeListener import com.atridad.mealient.datasource.TokenChangeListener
import gq.kirmanak.mealient.datastore.DataStoreModule.Companion.ENCRYPTED import com.atridad.mealient.datastore.DataStoreModule.Companion.ENCRYPTED
import gq.kirmanak.mealient.extensions.prefsChangeFlow import com.atridad.mealient.extensions.prefsChangeFlow
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged

View File

@@ -1,6 +1,6 @@
package gq.kirmanak.mealient.data.auth.impl package com.atridad.mealient.data.auth.impl
import gq.kirmanak.mealient.logging.LogRedactor import com.atridad.mealient.logging.LogRedactor
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import java.net.URLEncoder import java.net.URLEncoder
import javax.inject.Inject import javax.inject.Inject

View File

@@ -1,6 +1,6 @@
package gq.kirmanak.mealient.data.baseurl package com.atridad.mealient.data.baseurl
import gq.kirmanak.mealient.datasource.models.VersionResponse import com.atridad.mealient.datasource.models.VersionResponse
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
interface ServerInfoRepo { interface ServerInfoRepo {

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.data.baseurl package com.atridad.mealient.data.baseurl
import gq.kirmanak.mealient.datasource.ServerUrlProvider import com.atridad.mealient.datasource.ServerUrlProvider
import gq.kirmanak.mealient.datasource.models.VersionResponse import com.atridad.mealient.datasource.models.VersionResponse
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import javax.inject.Inject import javax.inject.Inject

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.baseurl package com.atridad.mealient.data.baseurl
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -0,0 +1,8 @@
package com.atridad.mealient.data.baseurl
import com.atridad.mealient.datasource.models.VersionResponse
interface VersionDataSource {
suspend fun requestVersion(baseURL: String): VersionResponse
}

View File

@@ -1,7 +1,7 @@
package gq.kirmanak.mealient.data.baseurl package com.atridad.mealient.data.baseurl
import gq.kirmanak.mealient.datasource.MealieDataSource import com.atridad.mealient.datasource.MealieDataSource
import gq.kirmanak.mealient.datasource.models.VersionResponse import com.atridad.mealient.datasource.models.VersionResponse
import javax.inject.Inject import javax.inject.Inject
class VersionDataSourceImpl @Inject constructor( class VersionDataSourceImpl @Inject constructor(

View File

@@ -1,9 +1,9 @@
package gq.kirmanak.mealient.data.baseurl.impl package com.atridad.mealient.data.baseurl.impl
import androidx.core.net.toUri import androidx.core.net.toUri
import gq.kirmanak.mealient.architecture.configuration.AppDispatchers import com.atridad.mealient.architecture.configuration.AppDispatchers
import gq.kirmanak.mealient.data.storage.PreferencesStorage import com.atridad.mealient.data.storage.PreferencesStorage
import gq.kirmanak.mealient.logging.LogRedactor import com.atridad.mealient.logging.LogRedactor
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.data.baseurl.impl package com.atridad.mealient.data.baseurl.impl
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
import gq.kirmanak.mealient.data.baseurl.ServerInfoStorage import com.atridad.mealient.data.baseurl.ServerInfoStorage
import gq.kirmanak.mealient.data.storage.PreferencesStorage import com.atridad.mealient.data.storage.PreferencesStorage
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import javax.inject.Inject import javax.inject.Inject

View File

@@ -1,7 +1,7 @@
package gq.kirmanak.mealient.data.configuration package com.atridad.mealient.data.configuration
import gq.kirmanak.mealient.BuildConfig import com.atridad.mealient.BuildConfig
import gq.kirmanak.mealient.architecture.configuration.BuildConfiguration import com.atridad.mealient.architecture.configuration.BuildConfiguration
import javax.inject.Inject import javax.inject.Inject
class BuildConfigurationImpl @Inject constructor() : BuildConfiguration { class BuildConfigurationImpl @Inject constructor() : BuildConfiguration {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.disclaimer package com.atridad.mealient.data.disclaimer
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.data.disclaimer package com.atridad.mealient.data.disclaimer
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
import gq.kirmanak.mealient.data.storage.PreferencesStorage import com.atridad.mealient.data.storage.PreferencesStorage
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import javax.inject.Inject import javax.inject.Inject

View File

@@ -1,11 +1,11 @@
package gq.kirmanak.mealient.data.migration package com.atridad.mealient.data.migration
import android.content.SharedPreferences import android.content.SharedPreferences
import androidx.core.content.edit import androidx.core.content.edit
import gq.kirmanak.mealient.data.auth.AuthRepo import com.atridad.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel import com.atridad.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.datastore.DataStoreModule.Companion.ENCRYPTED import com.atridad.mealient.datastore.DataStoreModule.Companion.ENCRYPTED
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.migration package com.atridad.mealient.data.migration
import android.content.SharedPreferences import android.content.SharedPreferences
import androidx.core.content.edit import androidx.core.content.edit
@@ -6,7 +6,7 @@ import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey
import gq.kirmanak.mealient.datastore.DataStoreModule import com.atridad.mealient.datastore.DataStoreModule
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.migration package com.atridad.mealient.data.migration
interface MigrationDetector { interface MigrationDetector {

View File

@@ -1,9 +1,9 @@
package gq.kirmanak.mealient.data.migration package com.atridad.mealient.data.migration
import gq.kirmanak.mealient.architecture.configuration.BuildConfiguration import com.atridad.mealient.architecture.configuration.BuildConfiguration
import gq.kirmanak.mealient.data.storage.PreferencesStorage import com.atridad.mealient.data.storage.PreferencesStorage
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel import com.atridad.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import javax.inject.Inject import javax.inject.Inject
class MigrationDetectorImpl @Inject constructor( class MigrationDetectorImpl @Inject constructor(

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.migration package com.atridad.mealient.data.migration
interface MigrationExecutor { interface MigrationExecutor {

View File

@@ -0,0 +1,81 @@
package com.atridad.mealient.data.network
import com.atridad.mealient.data.add.AddRecipeDataSource
import com.atridad.mealient.data.recipes.network.RecipeDataSource
import com.atridad.mealient.data.share.ParseRecipeDataSource
import com.atridad.mealient.datasource.MealieDataSource
import com.atridad.mealient.datasource.models.AddRecipeInfo
import com.atridad.mealient.datasource.models.GetRecipeResponse
import com.atridad.mealient.datasource.models.GetRecipeSummaryResponse
import com.atridad.mealient.datasource.models.ParseRecipeURLRequest
import com.atridad.mealient.model_mapper.ModelMapper
import javax.inject.Inject
class MealieDataSourceWrapper
@Inject
constructor(
private val dataSource: MealieDataSource,
private val modelMapper: ModelMapper,
) : AddRecipeDataSource, RecipeDataSource, ParseRecipeDataSource {
override suspend fun addRecipe(recipe: AddRecipeInfo): String {
val slug = dataSource.createRecipe(modelMapper.toCreateRequest(recipe))
dataSource.updateRecipe(slug, modelMapper.toUpdateRequest(recipe))
return slug
}
override suspend fun requestRecipes(
start: Int,
limit: Int,
): List<GetRecipeSummaryResponse> {
// Imagine start is 30 and limit is 15. It means that we already have page 1 and 2, now we
// need page 3
val page = start / limit + 1
return dataSource.requestRecipes(page, limit)
}
override suspend fun requestRecipe(slug: String): GetRecipeResponse {
return dataSource.requestRecipeInfo(slug)
}
override suspend fun parseRecipeFromURL(parseRecipeURLInfo: ParseRecipeURLRequest): String {
return dataSource.parseRecipeFromURL(parseRecipeURLInfo)
}
override suspend fun getFavoriteRecipes(): List<String> {
val userInfo = dataSource.requestUserInfo()
// Use the correct favorites endpoint that actually works
return try {
val favoritesResponse = dataSource.getUserFavoritesAlternative(userInfo.id)
val favoriteRecipeIds =
favoritesResponse.ratings.filter { it.isFavorite }.map { it.recipeId }
// Get all recipes to create UUID-to-slug mapping
val allRecipes = dataSource.requestRecipes(1, -1) // Get all recipes
val uuidToSlugMap = allRecipes.associate { it.remoteId to it.slug }
// Map favorite UUIDs to slugs
val favoriteSlugs = favoriteRecipeIds.mapNotNull { uuid -> uuidToSlugMap[uuid] }
favoriteSlugs
} catch (e: Exception) {
emptyList()
}
}
override suspend fun updateIsRecipeFavorite(recipeSlug: String, isFavorite: Boolean) {
val userInfo = dataSource.requestUserInfo()
val userId = userInfo.id
if (isFavorite) {
dataSource.addFavoriteRecipe(userId, recipeSlug)
} else {
dataSource.removeFavoriteRecipe(userId, recipeSlug)
}
}
override suspend fun deleteRecipe(recipeSlug: String) {
dataSource.deleteRecipe(recipeSlug)
}
}

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.data.recipes package com.atridad.mealient.data.recipes
import androidx.paging.Pager import androidx.paging.Pager
import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeWithSummaryAndIngredientsAndInstructions import com.atridad.mealient.database.recipe.entity.RecipeWithSummaryAndIngredientsAndInstructions
interface RecipeRepo { interface RecipeRepo {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.recipes.impl package com.atridad.mealient.data.recipes.impl
interface RecipeImageUrlProvider { interface RecipeImageUrlProvider {

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.data.recipes.impl package com.atridad.mealient.data.recipes.impl
import android.net.Uri import android.net.Uri
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo import com.atridad.mealient.data.baseurl.ServerInfoRepo
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import javax.inject.Inject import javax.inject.Inject
class RecipeImageUrlProviderImpl @Inject constructor( class RecipeImageUrlProviderImpl @Inject constructor(

View File

@@ -1,7 +1,7 @@
package gq.kirmanak.mealient.data.recipes.impl package com.atridad.mealient.data.recipes.impl
import androidx.paging.PagingSource import androidx.paging.PagingSource
import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
interface RecipePagingSourceFactory : () -> PagingSource<Int, RecipeSummaryEntity> { interface RecipePagingSourceFactory : () -> PagingSource<Int, RecipeSummaryEntity> {
fun setQuery(newQuery: String?) fun setQuery(newQuery: String?)

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.data.recipes.impl package com.atridad.mealient.data.recipes.impl
import androidx.paging.InvalidatingPagingSourceFactory import androidx.paging.InvalidatingPagingSourceFactory
import gq.kirmanak.mealient.database.recipe.RecipeStorage import com.atridad.mealient.database.recipe.RecipeStorage
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.atomic.AtomicReference
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton

View File

@@ -1,17 +1,17 @@
package gq.kirmanak.mealient.data.recipes.impl package com.atridad.mealient.data.recipes.impl
import androidx.paging.ExperimentalPagingApi import androidx.paging.ExperimentalPagingApi
import androidx.paging.Pager import androidx.paging.Pager
import androidx.paging.PagingConfig import androidx.paging.PagingConfig
import gq.kirmanak.mealient.data.recipes.RecipeRepo import com.atridad.mealient.data.recipes.RecipeRepo
import gq.kirmanak.mealient.data.recipes.network.RecipeDataSource import com.atridad.mealient.data.recipes.network.RecipeDataSource
import gq.kirmanak.mealient.database.recipe.RecipeStorage import com.atridad.mealient.database.recipe.RecipeStorage
import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientToInstructionEntity import com.atridad.mealient.database.recipe.entity.RecipeIngredientToInstructionEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeWithSummaryAndIngredientsAndInstructions import com.atridad.mealient.database.recipe.entity.RecipeWithSummaryAndIngredientsAndInstructions
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel import com.atridad.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import gq.kirmanak.mealient.model_mapper.ModelMapper import com.atridad.mealient.model_mapper.ModelMapper
import javax.inject.Inject import javax.inject.Inject
@OptIn(ExperimentalPagingApi::class) @OptIn(ExperimentalPagingApi::class)

View File

@@ -0,0 +1,96 @@
package com.atridad.mealient.data.recipes.impl
import androidx.annotation.VisibleForTesting
import androidx.paging.*
import androidx.paging.LoadType.PREPEND
import androidx.paging.LoadType.REFRESH
import com.atridad.mealient.architecture.configuration.AppDispatchers
import com.atridad.mealient.data.recipes.network.RecipeDataSource
import com.atridad.mealient.database.recipe.RecipeStorage
import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
import com.atridad.mealient.datasource.runCatchingExceptCancel
import com.atridad.mealient.logging.Logger
import com.atridad.mealient.model_mapper.ModelMapper
import javax.inject.Inject
import javax.inject.Singleton
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.withContext
@OptIn(ExperimentalPagingApi::class)
@Singleton
class RecipesRemoteMediator
@Inject
constructor(
private val storage: RecipeStorage,
private val network: RecipeDataSource,
private val pagingSourceFactory: RecipePagingSourceFactory,
private val logger: Logger,
private val modelMapper: ModelMapper,
private val dispatchers: AppDispatchers,
) : RemoteMediator<Int, RecipeSummaryEntity>() {
@VisibleForTesting var lastRequestEnd: Int = 0
override suspend fun load(
loadType: LoadType,
state: PagingState<Int, RecipeSummaryEntity>
): MediatorResult {
logger.v {
"load() called with: lastRequestEnd = $lastRequestEnd, loadType = $loadType, state = $state"
}
if (loadType == PREPEND) {
logger.i { "load: early exit, PREPEND isn't supported" }
return MediatorResult.Success(endOfPaginationReached = true)
}
val start = if (loadType == REFRESH) 0 else lastRequestEnd
val limit = if (loadType == REFRESH) state.config.initialLoadSize else state.config.pageSize
val count: Int =
runCatchingExceptCancel { updateRecipes(start, limit, loadType) }.getOrElse {
logger.e(it) { "load: can't load recipes" }
return MediatorResult.Error(it)
}
// After something is inserted into DB the paging sources have to be invalidated
// But for some reason Room/Paging library don't do it automatically
// Here we invalidate them manually.
// Read that trick here
// https://github.com/android/architecture-components-samples/issues/889#issuecomment-880847858
pagingSourceFactory.invalidate()
logger.d { "load: expectedCount = $limit, received $count" }
lastRequestEnd = start + count
return MediatorResult.Success(endOfPaginationReached = count < limit)
}
suspend fun updateRecipes(
start: Int,
limit: Int,
loadType: LoadType = REFRESH,
): Int = coroutineScope {
logger.v {
"updateRecipes() called with: start = $start, limit = $limit, loadType = $loadType"
}
val deferredRecipes = async { network.requestRecipes(start, limit) }
val favorites =
runCatchingExceptCancel { network.getFavoriteRecipes() }
.getOrDefault(emptyList())
.toHashSet()
val recipes = deferredRecipes.await()
val entities =
withContext(dispatchers.default) {
recipes.map { recipe ->
val isFavorite = favorites.contains(recipe.slug)
modelMapper.toRecipeSummaryEntity(recipe, isFavorite)
}
}
if (loadType == REFRESH) storage.refreshAll(entities) else storage.saveRecipes(entities)
recipes.size
}
}

View File

@@ -1,7 +1,7 @@
package gq.kirmanak.mealient.data.recipes.network package com.atridad.mealient.data.recipes.network
import gq.kirmanak.mealient.datasource.models.GetRecipeResponse import com.atridad.mealient.datasource.models.GetRecipeResponse
import gq.kirmanak.mealient.datasource.models.GetRecipeSummaryResponse import com.atridad.mealient.datasource.models.GetRecipeSummaryResponse
interface RecipeDataSource { interface RecipeDataSource {
suspend fun requestRecipes(start: Int, limit: Int): List<GetRecipeSummaryResponse> suspend fun requestRecipes(start: Int, limit: Int): List<GetRecipeSummaryResponse>

View File

@@ -1,6 +1,6 @@
package gq.kirmanak.mealient.data.share package com.atridad.mealient.data.share
import gq.kirmanak.mealient.datasource.models.ParseRecipeURLRequest import com.atridad.mealient.datasource.models.ParseRecipeURLRequest
interface ParseRecipeDataSource { interface ParseRecipeDataSource {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.share package com.atridad.mealient.data.share
interface ShareRecipeRepo { interface ShareRecipeRepo {

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.data.share package com.atridad.mealient.data.share
import androidx.core.util.PatternsCompat import androidx.core.util.PatternsCompat
import gq.kirmanak.mealient.datasource.models.ParseRecipeURLRequest import com.atridad.mealient.datasource.models.ParseRecipeURLRequest
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import javax.inject.Inject import javax.inject.Inject
class ShareRecipeRepoImpl @Inject constructor( class ShareRecipeRepoImpl @Inject constructor(

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.storage package com.atridad.mealient.data.storage
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.storage package com.atridad.mealient.data.storage
import androidx.datastore.core.DataStore import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
@@ -6,7 +6,7 @@ import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first

View File

@@ -1,15 +1,15 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.data.add.AddRecipeDataSource import com.atridad.mealient.data.add.AddRecipeDataSource
import gq.kirmanak.mealient.data.add.AddRecipeRepo import com.atridad.mealient.data.add.AddRecipeRepo
import gq.kirmanak.mealient.data.add.impl.AddRecipeRepoImpl import com.atridad.mealient.data.add.impl.AddRecipeRepoImpl
import gq.kirmanak.mealient.data.network.MealieDataSourceWrapper import com.atridad.mealient.data.network.MealieDataSourceWrapper
import gq.kirmanak.mealient.datastore.recipe.AddRecipeStorage import com.atridad.mealient.datastore.recipe.AddRecipeStorage
import gq.kirmanak.mealient.datastore.recipe.AddRecipeStorageImpl import com.atridad.mealient.datastore.recipe.AddRecipeStorageImpl
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import android.content.Context import android.content.Context
import androidx.datastore.core.DataStore import androidx.datastore.core.DataStore
@@ -12,8 +12,8 @@ import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.data.storage.PreferencesStorage import com.atridad.mealient.data.storage.PreferencesStorage
import gq.kirmanak.mealient.data.storage.PreferencesStorageImpl import com.atridad.mealient.data.storage.PreferencesStorageImpl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import javax.inject.Singleton import javax.inject.Singleton

View File

@@ -1,11 +1,11 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.architecture.configuration.BuildConfiguration import com.atridad.mealient.architecture.configuration.BuildConfiguration
import gq.kirmanak.mealient.data.configuration.BuildConfigurationImpl import com.atridad.mealient.data.configuration.BuildConfigurationImpl
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,20 +1,20 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet import dagger.multibindings.IntoSet
import gq.kirmanak.mealient.data.auth.AuthDataSource import com.atridad.mealient.data.auth.AuthDataSource
import gq.kirmanak.mealient.data.auth.AuthRepo import com.atridad.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.auth.AuthStorage import com.atridad.mealient.data.auth.AuthStorage
import gq.kirmanak.mealient.data.auth.impl.AuthDataSourceImpl import com.atridad.mealient.data.auth.impl.AuthDataSourceImpl
import gq.kirmanak.mealient.data.auth.impl.AuthRepoImpl import com.atridad.mealient.data.auth.impl.AuthRepoImpl
import gq.kirmanak.mealient.data.auth.impl.AuthStorageImpl import com.atridad.mealient.data.auth.impl.AuthStorageImpl
import gq.kirmanak.mealient.data.auth.impl.CredentialsLogRedactor import com.atridad.mealient.data.auth.impl.CredentialsLogRedactor
import gq.kirmanak.mealient.datasource.AuthenticationProvider import com.atridad.mealient.datasource.AuthenticationProvider
import gq.kirmanak.mealient.logging.LogRedactor import com.atridad.mealient.logging.LogRedactor
import gq.kirmanak.mealient.shopping_lists.repo.ShoppingListsAuthRepo import com.atridad.mealient.shopping_lists.repo.ShoppingListsAuthRepo
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,15 +1,15 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet import dagger.multibindings.IntoSet
import gq.kirmanak.mealient.data.baseurl.* import com.atridad.mealient.data.baseurl.*
import gq.kirmanak.mealient.data.baseurl.impl.BaseUrlLogRedactor import com.atridad.mealient.data.baseurl.impl.BaseUrlLogRedactor
import gq.kirmanak.mealient.data.baseurl.impl.ServerInfoStorageImpl import com.atridad.mealient.data.baseurl.impl.ServerInfoStorageImpl
import gq.kirmanak.mealient.datasource.ServerUrlProvider import com.atridad.mealient.datasource.ServerUrlProvider
import gq.kirmanak.mealient.logging.LogRedactor import com.atridad.mealient.logging.LogRedactor
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,11 +1,11 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage import com.atridad.mealient.data.disclaimer.DisclaimerStorage
import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorageImpl import com.atridad.mealient.data.disclaimer.DisclaimerStorageImpl
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,15 +1,15 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet import dagger.multibindings.IntoSet
import gq.kirmanak.mealient.data.migration.From24AuthMigrationExecutor import com.atridad.mealient.data.migration.From24AuthMigrationExecutor
import gq.kirmanak.mealient.data.migration.From30MigrationExecutor import com.atridad.mealient.data.migration.From30MigrationExecutor
import gq.kirmanak.mealient.data.migration.MigrationDetector import com.atridad.mealient.data.migration.MigrationDetector
import gq.kirmanak.mealient.data.migration.MigrationDetectorImpl import com.atridad.mealient.data.migration.MigrationDetectorImpl
import gq.kirmanak.mealient.data.migration.MigrationExecutor import com.atridad.mealient.data.migration.MigrationExecutor
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,13 +1,13 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.data.network.MealieDataSourceWrapper import com.atridad.mealient.data.network.MealieDataSourceWrapper
import gq.kirmanak.mealient.data.recipes.RecipeRepo import com.atridad.mealient.data.recipes.RecipeRepo
import gq.kirmanak.mealient.data.recipes.impl.* import com.atridad.mealient.data.recipes.impl.*
import gq.kirmanak.mealient.data.recipes.network.RecipeDataSource import com.atridad.mealient.data.recipes.network.RecipeDataSource
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,13 +1,13 @@
package gq.kirmanak.mealient.di package com.atridad.mealient.di
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.data.network.MealieDataSourceWrapper import com.atridad.mealient.data.network.MealieDataSourceWrapper
import gq.kirmanak.mealient.data.share.ParseRecipeDataSource import com.atridad.mealient.data.share.ParseRecipeDataSource
import gq.kirmanak.mealient.data.share.ShareRecipeRepo import com.atridad.mealient.data.share.ShareRecipeRepo
import gq.kirmanak.mealient.data.share.ShareRecipeRepoImpl import com.atridad.mealient.data.share.ShareRecipeRepoImpl
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.extensions package com.atridad.mealient.extensions
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.extensions package com.atridad.mealient.extensions
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
@@ -7,7 +7,7 @@ import android.content.res.Configuration.UI_MODE_NIGHT_YES
import android.os.Build import android.os.Build
import android.widget.Toast import android.widget.Toast
import androidx.annotation.StringRes import androidx.annotation.StringRes
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.channels.ChannelResult import kotlinx.coroutines.channels.ChannelResult
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.channels.onClosed import kotlinx.coroutines.channels.onClosed

View File

@@ -1,16 +1,16 @@
package gq.kirmanak.mealient.ui package com.atridad.mealient.ui
import com.ramcosta.composedestinations.spec.DestinationSpec import com.ramcosta.composedestinations.spec.DestinationSpec
import com.ramcosta.composedestinations.spec.NavGraphSpec import com.ramcosta.composedestinations.spec.NavGraphSpec
import com.ramcosta.composedestinations.spec.Route import com.ramcosta.composedestinations.spec.Route
import gq.kirmanak.mealient.shopping_lists.ui.destinations.ShoppingListScreenDestination import com.atridad.mealient.shopping_lists.ui.destinations.ShoppingListScreenDestination
import gq.kirmanak.mealient.shopping_lists.ui.destinations.ShoppingListsScreenDestination import com.atridad.mealient.shopping_lists.ui.destinations.ShoppingListsScreenDestination
import gq.kirmanak.mealient.ui.destinations.AddRecipeScreenDestination import com.atridad.mealient.ui.destinations.AddRecipeScreenDestination
import gq.kirmanak.mealient.ui.destinations.AuthenticationScreenDestination import com.atridad.mealient.ui.destinations.AuthenticationScreenDestination
import gq.kirmanak.mealient.ui.destinations.BaseURLScreenDestination import com.atridad.mealient.ui.destinations.BaseURLScreenDestination
import gq.kirmanak.mealient.ui.destinations.DisclaimerScreenDestination import com.atridad.mealient.ui.destinations.DisclaimerScreenDestination
import gq.kirmanak.mealient.ui.destinations.RecipeScreenDestination import com.atridad.mealient.ui.destinations.RecipeScreenDestination
import gq.kirmanak.mealient.ui.destinations.RecipesListDestination import com.atridad.mealient.ui.destinations.RecipesListDestination
internal object NavGraphs { internal object NavGraphs {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.activity package com.atridad.mealient.ui.activity
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -22,12 +22,12 @@ import com.ramcosta.composedestinations.spec.Direction
import com.ramcosta.composedestinations.spec.NavGraphSpec import com.ramcosta.composedestinations.spec.NavGraphSpec
import com.ramcosta.composedestinations.utils.contains import com.ramcosta.composedestinations.utils.contains
import com.ramcosta.composedestinations.utils.currentDestinationAsState import com.ramcosta.composedestinations.utils.currentDestinationAsState
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.ui.NavGraphs import com.atridad.mealient.ui.NavGraphs
import gq.kirmanak.mealient.ui.components.DrawerItem import com.atridad.mealient.ui.components.DrawerItem
import gq.kirmanak.mealient.ui.destinations.AddRecipeScreenDestination import com.atridad.mealient.ui.destinations.AddRecipeScreenDestination
import gq.kirmanak.mealient.ui.destinations.BaseURLScreenDestination import com.atridad.mealient.ui.destinations.BaseURLScreenDestination
import gq.kirmanak.mealient.ui.destinations.RecipesListDestination import com.atridad.mealient.ui.destinations.RecipesListDestination
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.activity package com.atridad.mealient.ui.activity
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
@@ -7,9 +7,9 @@ import androidx.activity.viewModels
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.extensions.isDarkThemeOn import com.atridad.mealient.extensions.isDarkThemeOn
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import gq.kirmanak.mealient.ui.AppTheme import com.atridad.mealient.ui.AppTheme
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.activity package com.atridad.mealient.ui.activity
import android.app.Application import android.app.Application
import android.content.Intent import android.content.Intent
@@ -7,16 +7,16 @@ import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.data.auth.AuthRepo import com.atridad.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo import com.atridad.mealient.data.baseurl.ServerInfoRepo
import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage import com.atridad.mealient.data.disclaimer.DisclaimerStorage
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import gq.kirmanak.mealient.logging.getLogFile import com.atridad.mealient.logging.getLogFile
import gq.kirmanak.mealient.ui.destinations.AuthenticationScreenDestination import com.atridad.mealient.ui.destinations.AuthenticationScreenDestination
import gq.kirmanak.mealient.ui.destinations.BaseURLScreenDestination import com.atridad.mealient.ui.destinations.BaseURLScreenDestination
import gq.kirmanak.mealient.ui.destinations.DirectionDestination import com.atridad.mealient.ui.destinations.DirectionDestination
import gq.kirmanak.mealient.ui.destinations.DisclaimerScreenDestination import com.atridad.mealient.ui.destinations.DisclaimerScreenDestination
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.activity package com.atridad.mealient.ui.activity
import android.content.Intent import android.content.Intent
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
@@ -21,8 +21,8 @@ import com.ramcosta.composedestinations.spec.DestinationSpec
import com.ramcosta.composedestinations.spec.NavHostEngine import com.ramcosta.composedestinations.spec.NavHostEngine
import com.ramcosta.composedestinations.spec.Route import com.ramcosta.composedestinations.spec.Route
import com.ramcosta.composedestinations.utils.currentDestinationAsState import com.ramcosta.composedestinations.utils.currentDestinationAsState
import gq.kirmanak.mealient.ui.NavGraphs import com.atridad.mealient.ui.NavGraphs
import gq.kirmanak.mealient.ui.components.rememberBaseScreenState import com.atridad.mealient.ui.components.rememberBaseScreenState
@Composable @Composable
internal fun MealientApp( internal fun MealientApp(

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.add package com.atridad.mealient.ui.add
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@@ -29,14 +29,14 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.ui.AppTheme import com.atridad.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.Dimens import com.atridad.mealient.ui.Dimens
import gq.kirmanak.mealient.ui.components.BaseScreenState import com.atridad.mealient.ui.components.BaseScreenState
import gq.kirmanak.mealient.ui.components.BaseScreenWithNavigation import com.atridad.mealient.ui.components.BaseScreenWithNavigation
import gq.kirmanak.mealient.ui.components.TopProgressIndicator import com.atridad.mealient.ui.components.TopProgressIndicator
import gq.kirmanak.mealient.ui.components.previewBaseScreenState import com.atridad.mealient.ui.components.previewBaseScreenState
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview import com.atridad.mealient.ui.preview.ColorSchemePreview
@Destination @Destination
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.add package com.atridad.mealient.ui.add
internal sealed interface AddRecipeScreenEvent { internal sealed interface AddRecipeScreenEvent {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.add package com.atridad.mealient.ui.add
internal data class AddRecipeScreenState( internal data class AddRecipeScreenState(
val snackbarMessage: AddRecipeSnackbarMessage? = null, val snackbarMessage: AddRecipeSnackbarMessage? = null,

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.add package com.atridad.mealient.ui.add
internal sealed interface AddRecipeSnackbarMessage { internal sealed interface AddRecipeSnackbarMessage {

View File

@@ -1,16 +1,16 @@
package gq.kirmanak.mealient.ui.add package com.atridad.mealient.ui.add
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.add.AddRecipeRepo import com.atridad.mealient.data.add.AddRecipeRepo
import gq.kirmanak.mealient.datasource.models.AddRecipeInfo import com.atridad.mealient.datasource.models.AddRecipeInfo
import gq.kirmanak.mealient.datasource.models.AddRecipeIngredientInfo import com.atridad.mealient.datasource.models.AddRecipeIngredientInfo
import gq.kirmanak.mealient.datasource.models.AddRecipeInstructionInfo import com.atridad.mealient.datasource.models.AddRecipeInstructionInfo
import gq.kirmanak.mealient.datasource.models.AddRecipeSettingsInfo import com.atridad.mealient.datasource.models.AddRecipeSettingsInfo
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel import com.atridad.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.auth package com.atridad.mealient.ui.auth
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -25,12 +25,12 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController import androidx.navigation.NavController
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.ui.AppTheme import com.atridad.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.Dimens import com.atridad.mealient.ui.Dimens
import gq.kirmanak.mealient.ui.components.BaseScreen import com.atridad.mealient.ui.components.BaseScreen
import gq.kirmanak.mealient.ui.components.TopProgressIndicator import com.atridad.mealient.ui.components.TopProgressIndicator
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview import com.atridad.mealient.ui.preview.ColorSchemePreview
@Destination @Destination
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.auth package com.atridad.mealient.ui.auth
internal sealed interface AuthenticationScreenEvent { internal sealed interface AuthenticationScreenEvent {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.auth package com.atridad.mealient.ui.auth
internal data class AuthenticationScreenState( internal data class AuthenticationScreenState(
val isLoading: Boolean = false, val isLoading: Boolean = false,

View File

@@ -1,14 +1,14 @@
package gq.kirmanak.mealient.ui.auth package com.atridad.mealient.ui.auth
import android.app.Application import android.app.Application
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.data.auth.AuthRepo import com.atridad.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.datasource.NetworkError import com.atridad.mealient.datasource.NetworkError
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel import com.atridad.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.auth package com.atridad.mealient.ui.auth
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.auth package com.atridad.mealient.ui.auth
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
@@ -21,7 +21,7 @@ import androidx.compose.ui.semantics.testTag
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.input.VisualTransformation
import gq.kirmanak.mealient.R import com.atridad.mealient.R
@OptIn(ExperimentalComposeUiApi::class) @OptIn(ExperimentalComposeUiApi::class)
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.baseurl package com.atridad.mealient.ui.baseurl
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -27,15 +27,15 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController import androidx.navigation.NavController
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.ui.AppTheme import com.atridad.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.Dimens import com.atridad.mealient.ui.Dimens
import gq.kirmanak.mealient.ui.components.BaseScreen import com.atridad.mealient.ui.components.BaseScreen
import gq.kirmanak.mealient.ui.components.BaseScreenState import com.atridad.mealient.ui.components.BaseScreenState
import gq.kirmanak.mealient.ui.components.BaseScreenWithNavigation import com.atridad.mealient.ui.components.BaseScreenWithNavigation
import gq.kirmanak.mealient.ui.components.TopProgressIndicator import com.atridad.mealient.ui.components.TopProgressIndicator
import gq.kirmanak.mealient.ui.components.previewBaseScreenState import com.atridad.mealient.ui.components.previewBaseScreenState
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview import com.atridad.mealient.ui.preview.ColorSchemePreview
@Destination @Destination
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.baseurl package com.atridad.mealient.ui.baseurl
import java.security.cert.X509Certificate import java.security.cert.X509Certificate

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.baseurl package com.atridad.mealient.ui.baseurl
internal data class BaseURLScreenState( internal data class BaseURLScreenState(
val isConfigured: Boolean = false, val isConfigured: Boolean = false,

View File

@@ -1,19 +1,19 @@
package gq.kirmanak.mealient.ui.baseurl package com.atridad.mealient.ui.baseurl
import android.app.Application import android.app.Application
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.data.auth.AuthRepo import com.atridad.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo import com.atridad.mealient.data.baseurl.ServerInfoRepo
import gq.kirmanak.mealient.data.baseurl.impl.BaseUrlLogRedactor import com.atridad.mealient.data.baseurl.impl.BaseUrlLogRedactor
import gq.kirmanak.mealient.data.recipes.RecipeRepo import com.atridad.mealient.data.recipes.RecipeRepo
import gq.kirmanak.mealient.datasource.CertificateCombinedException import com.atridad.mealient.datasource.CertificateCombinedException
import gq.kirmanak.mealient.datasource.NetworkError import com.atridad.mealient.datasource.NetworkError
import gq.kirmanak.mealient.datasource.TrustedCertificatesStore import com.atridad.mealient.datasource.TrustedCertificatesStore
import gq.kirmanak.mealient.datasource.findCauseAsInstanceOf import com.atridad.mealient.datasource.findCauseAsInstanceOf
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update

View File

@@ -1,13 +1,13 @@
package gq.kirmanak.mealient.ui.baseurl package com.atridad.mealient.ui.baseurl
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.ui.AppTheme import com.atridad.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview import com.atridad.mealient.ui.preview.ColorSchemePreview
@Composable @Composable
internal fun InvalidCertificateDialog( internal fun InvalidCertificateDialog(

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.disclaimer package com.atridad.mealient.ui.disclaimer
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -20,11 +20,11 @@ import androidx.compose.ui.semantics.testTag
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController import androidx.navigation.NavController
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.ui.AppTheme import com.atridad.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.Dimens import com.atridad.mealient.ui.Dimens
import gq.kirmanak.mealient.ui.components.BaseScreen import com.atridad.mealient.ui.components.BaseScreen
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview import com.atridad.mealient.ui.preview.ColorSchemePreview
@Destination @Destination
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.disclaimer package com.atridad.mealient.ui.disclaimer
internal data class DisclaimerScreenState( internal data class DisclaimerScreenState(
val isCountDownOver: Boolean, val isCountDownOver: Boolean,

View File

@@ -1,11 +1,11 @@
package gq.kirmanak.mealient.ui.disclaimer package com.atridad.mealient.ui.disclaimer
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage import com.atridad.mealient.data.disclaimer.DisclaimerStorage
import gq.kirmanak.mealient.logging.Logger import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.recipes.info package com.atridad.mealient.ui.recipes.info
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -17,8 +17,8 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage import coil.compose.AsyncImage
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.ui.Dimens import com.atridad.mealient.ui.Dimens
@Composable @Composable
internal fun HeaderSection( internal fun HeaderSection(

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.recipes.info package com.atridad.mealient.ui.recipes.info
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -19,9 +19,9 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientEntity import com.atridad.mealient.database.recipe.entity.RecipeIngredientEntity
import gq.kirmanak.mealient.ui.Dimens import com.atridad.mealient.ui.Dimens
@Composable @Composable
internal fun IngredientsSection( internal fun IngredientsSection(

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.recipes.info package com.atridad.mealient.ui.recipes.info
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -13,10 +13,10 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import gq.kirmanak.mealient.R import com.atridad.mealient.R
import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientEntity import com.atridad.mealient.database.recipe.entity.RecipeIngredientEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeInstructionEntity import com.atridad.mealient.database.recipe.entity.RecipeInstructionEntity
import gq.kirmanak.mealient.ui.Dimens import com.atridad.mealient.ui.Dimens
@Composable @Composable
internal fun InstructionsSection( internal fun InstructionsSection(

View File

@@ -1,10 +1,10 @@
package gq.kirmanak.mealient.ui.recipes.info package com.atridad.mealient.ui.recipes.info
import android.view.WindowManager import android.view.WindowManager
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import gq.kirmanak.mealient.extensions.findActivity import com.atridad.mealient.extensions.findActivity
@Composable @Composable
fun KeepScreenOn() { fun KeepScreenOn() {

View File

@@ -1,8 +1,8 @@
package gq.kirmanak.mealient.ui.recipes.info package com.atridad.mealient.ui.recipes.info
import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientEntity import com.atridad.mealient.database.recipe.entity.RecipeIngredientEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeInstructionEntity import com.atridad.mealient.database.recipe.entity.RecipeInstructionEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDate
internal val INGREDIENT_TWO = RecipeIngredientEntity( internal val INGREDIENT_TWO = RecipeIngredientEntity(

Some files were not shown because too many files have changed in this diff Show More