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
Copyright (c) 2022, Kirill Kamakin
Copyright (c) 2025, Atridad Lahiji
Permission is hereby granted, free of charge, to any person obtaining a copy
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,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
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
SOFTWARE.

View File

@@ -2,7 +2,7 @@
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.
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).
Yours sincerely,
Kirill Kamakin.
Stockholm, Sweden
mealient@gmail.com
Kirill Kamakin and Atridad Lahiji

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
## DISCLAIMER
## DISCLAIMERS
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
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?
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!
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
There are three ways:
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.
Download the latest apk from the releases page.
## Contribution

View File

@@ -4,18 +4,18 @@ import java.io.FileInputStream
import java.util.Properties
plugins {
id("gq.kirmanak.mealient.application")
id("com.atridad.mealient.application")
id("dagger.hilt.android.plugin")
alias(libs.plugins.ksp)
id("gq.kirmanak.mealient.compose.app")
id("com.atridad.mealient.compose.app")
}
android {
defaultConfig {
applicationId = "gq.kirmanak.mealient"
versionCode = 37
versionName = "0.4.8"
testInstrumentationRunner = "gq.kirmanak.mealient.MealientTestRunner"
applicationId = "com.atridad.mealient"
versionCode = 38
versionName = "0.5.1"
testInstrumentationRunner = "com.atridad.mealient.MealientTestRunner"
testInstrumentationRunnerArguments += mapOf("clearPackageData" to "true")
resourceConfigurations += listOf("en", "es", "ru", "fr", "nl", "pt", "de")
}
@@ -50,7 +50,7 @@ android {
}
}
namespace = "gq.kirmanak.mealient"
namespace = "com.atridad.mealient"
packaging {
resources.excludes += "DebugProbesKt.bin"
@@ -145,25 +145,25 @@ kover {
filters {
excludes {
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
"gq.kirmanak.mealient.database.AppDb_Impl*", // generated by Room
"com.atridad.mealient.database.AppDb_Impl*", // generated by Room
"*Dao_Impl*", // generated by Room
"*Hilt_*", // generated by Hilt
)
packages(
"gq.kirmanak.mealient*.destinations", // generated by Compose destinations
"com.atridad.mealient*.destinations", // generated by Compose destinations
)
annotatedBy(
"androidx.compose.ui.tooling.preview.Preview",
"gq.kirmanak.mealient.ui.preview.ColorSchemePreview",
"com.atridad.mealient.ui.preview.ColorSchemePreview",
"androidx.compose.runtime.Composable",
"dagger.Module",
"dagger.internal.DaggerGenerated",
)
}
includes {
packages("gq.kirmanak.mealient")
packages("com.atridad.mealient")
}
}
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 com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
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 org.junit.After
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 gq.kirmanak.mealient.screen.AuthenticationScreen
import gq.kirmanak.mealient.screen.BaseUrlScreen
import gq.kirmanak.mealient.screen.DisclaimerScreen
import gq.kirmanak.mealient.screen.RecipesListScreen
import gq.kirmanak.mealient.ui.disclaimer.DisclaimerViewModel
import com.atridad.mealient.screen.AuthenticationScreen
import com.atridad.mealient.screen.BaseUrlScreen
import com.atridad.mealient.screen.DisclaimerScreen
import com.atridad.mealient.screen.RecipesListScreen
import com.atridad.mealient.ui.disclaimer.DisclaimerViewModel
import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen
import io.github.kakaocup.kakao.common.utilities.getResourceString
import org.junit.Before

View File

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

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient
package com.atridad.mealient
import android.util.Log
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 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 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 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.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 io.github.kakaocup.compose.node.element.ComposeScreen

View File

@@ -6,7 +6,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name="gq.kirmanak.mealient.App"
android:name="com.atridad.mealient.App"
android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_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 coil.Coil
import coil.ImageLoader
import com.google.android.material.color.DynamicColors
import dagger.hilt.android.HiltAndroidApp
import gq.kirmanak.mealient.architecture.configuration.BuildConfiguration
import gq.kirmanak.mealient.data.migration.MigrationDetector
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.architecture.configuration.BuildConfiguration
import com.atridad.mealient.data.migration.MigrationDetector
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
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
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 gq.kirmanak.mealient.data.add.AddRecipeRepo
import gq.kirmanak.mealient.datasource.models.AddRecipeInfo
import gq.kirmanak.mealient.datastore.recipe.AddRecipeStorage
import gq.kirmanak.mealient.logging.Logger
import gq.kirmanak.mealient.model_mapper.ModelMapper
import com.atridad.mealient.data.add.AddRecipeDataSource
import com.atridad.mealient.data.add.AddRecipeRepo
import com.atridad.mealient.datasource.models.AddRecipeInfo
import com.atridad.mealient.datastore.recipe.AddRecipeStorage
import com.atridad.mealient.logging.Logger
import com.atridad.mealient.model_mapper.ModelMapper
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
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 {
/**

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
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

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 gq.kirmanak.mealient.datasource.MealieDataSource
import gq.kirmanak.mealient.datasource.models.CreateApiTokenRequest
import com.atridad.mealient.data.auth.AuthDataSource
import com.atridad.mealient.datasource.MealieDataSource
import com.atridad.mealient.datasource.models.CreateApiTokenRequest
import javax.inject.Inject
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 gq.kirmanak.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.auth.AuthStorage
import gq.kirmanak.mealient.datasource.AuthenticationProvider
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.data.auth.AuthDataSource
import com.atridad.mealient.data.auth.AuthRepo
import com.atridad.mealient.data.auth.AuthStorage
import com.atridad.mealient.datasource.AuthenticationProvider
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
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 androidx.annotation.VisibleForTesting
import androidx.core.content.edit
import gq.kirmanak.mealient.data.auth.AuthStorage
import gq.kirmanak.mealient.datasource.TokenChangeListener
import gq.kirmanak.mealient.datastore.DataStoreModule.Companion.ENCRYPTED
import gq.kirmanak.mealient.extensions.prefsChangeFlow
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.data.auth.AuthStorage
import com.atridad.mealient.datasource.TokenChangeListener
import com.atridad.mealient.datastore.DataStoreModule.Companion.ENCRYPTED
import com.atridad.mealient.extensions.prefsChangeFlow
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.flow.Flow
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 java.net.URLEncoder
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
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 gq.kirmanak.mealient.datasource.models.VersionResponse
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.datasource.ServerUrlProvider
import com.atridad.mealient.datasource.models.VersionResponse
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.Flow
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

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 gq.kirmanak.mealient.datasource.models.VersionResponse
import com.atridad.mealient.datasource.MealieDataSource
import com.atridad.mealient.datasource.models.VersionResponse
import javax.inject.Inject
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 gq.kirmanak.mealient.architecture.configuration.AppDispatchers
import gq.kirmanak.mealient.data.storage.PreferencesStorage
import gq.kirmanak.mealient.logging.LogRedactor
import com.atridad.mealient.architecture.configuration.AppDispatchers
import com.atridad.mealient.data.storage.PreferencesStorage
import com.atridad.mealient.logging.LogRedactor
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
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 gq.kirmanak.mealient.data.baseurl.ServerInfoStorage
import gq.kirmanak.mealient.data.storage.PreferencesStorage
import com.atridad.mealient.data.baseurl.ServerInfoStorage
import com.atridad.mealient.data.storage.PreferencesStorage
import kotlinx.coroutines.flow.Flow
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 gq.kirmanak.mealient.architecture.configuration.BuildConfiguration
import com.atridad.mealient.BuildConfig
import com.atridad.mealient.architecture.configuration.BuildConfiguration
import javax.inject.Inject
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

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 gq.kirmanak.mealient.data.storage.PreferencesStorage
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.data.storage.PreferencesStorage
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
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 androidx.core.content.edit
import gq.kirmanak.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.datastore.DataStoreModule.Companion.ENCRYPTED
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.data.auth.AuthRepo
import com.atridad.mealient.datasource.runCatchingExceptCancel
import com.atridad.mealient.datastore.DataStoreModule.Companion.ENCRYPTED
import com.atridad.mealient.logging.Logger
import javax.inject.Inject
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 androidx.core.content.edit
@@ -6,7 +6,7 @@ import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
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.Named

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.migration
package com.atridad.mealient.data.migration
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 gq.kirmanak.mealient.data.storage.PreferencesStorage
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.architecture.configuration.BuildConfiguration
import com.atridad.mealient.data.storage.PreferencesStorage
import com.atridad.mealient.datasource.runCatchingExceptCancel
import com.atridad.mealient.logging.Logger
import javax.inject.Inject
class MigrationDetectorImpl @Inject constructor(

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.migration
package com.atridad.mealient.data.migration
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 gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeWithSummaryAndIngredientsAndInstructions
import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
import com.atridad.mealient.database.recipe.entity.RecipeWithSummaryAndIngredientsAndInstructions
interface RecipeRepo {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.recipes.impl
package com.atridad.mealient.data.recipes.impl
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 gq.kirmanak.mealient.data.baseurl.ServerInfoRepo
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.data.baseurl.ServerInfoRepo
import com.atridad.mealient.logging.Logger
import javax.inject.Inject
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 gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity
import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
interface RecipePagingSourceFactory : () -> PagingSource<Int, RecipeSummaryEntity> {
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 gq.kirmanak.mealient.database.recipe.RecipeStorage
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.database.recipe.RecipeStorage
import com.atridad.mealient.logging.Logger
import java.util.concurrent.atomic.AtomicReference
import javax.inject.Inject
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.Pager
import androidx.paging.PagingConfig
import gq.kirmanak.mealient.data.recipes.RecipeRepo
import gq.kirmanak.mealient.data.recipes.network.RecipeDataSource
import gq.kirmanak.mealient.database.recipe.RecipeStorage
import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientToInstructionEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeWithSummaryAndIngredientsAndInstructions
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.logging.Logger
import gq.kirmanak.mealient.model_mapper.ModelMapper
import com.atridad.mealient.data.recipes.RecipeRepo
import com.atridad.mealient.data.recipes.network.RecipeDataSource
import com.atridad.mealient.database.recipe.RecipeStorage
import com.atridad.mealient.database.recipe.entity.RecipeIngredientToInstructionEntity
import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
import com.atridad.mealient.database.recipe.entity.RecipeWithSummaryAndIngredientsAndInstructions
import com.atridad.mealient.datasource.runCatchingExceptCancel
import com.atridad.mealient.logging.Logger
import com.atridad.mealient.model_mapper.ModelMapper
import javax.inject.Inject
@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 gq.kirmanak.mealient.datasource.models.GetRecipeSummaryResponse
import com.atridad.mealient.datasource.models.GetRecipeResponse
import com.atridad.mealient.datasource.models.GetRecipeSummaryResponse
interface RecipeDataSource {
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 {

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.data.share
package com.atridad.mealient.data.share
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 gq.kirmanak.mealient.datasource.models.ParseRecipeURLRequest
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.datasource.models.ParseRecipeURLRequest
import com.atridad.mealient.logging.Logger
import javax.inject.Inject
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 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.preferences.core.Preferences
@@ -6,7 +6,7 @@ import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
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.distinctUntilChanged
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.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.data.add.AddRecipeDataSource
import gq.kirmanak.mealient.data.add.AddRecipeRepo
import gq.kirmanak.mealient.data.add.impl.AddRecipeRepoImpl
import gq.kirmanak.mealient.data.network.MealieDataSourceWrapper
import gq.kirmanak.mealient.datastore.recipe.AddRecipeStorage
import gq.kirmanak.mealient.datastore.recipe.AddRecipeStorageImpl
import com.atridad.mealient.data.add.AddRecipeDataSource
import com.atridad.mealient.data.add.AddRecipeRepo
import com.atridad.mealient.data.add.impl.AddRecipeRepoImpl
import com.atridad.mealient.data.network.MealieDataSourceWrapper
import com.atridad.mealient.datastore.recipe.AddRecipeStorage
import com.atridad.mealient.datastore.recipe.AddRecipeStorageImpl
@Module
@InstallIn(SingletonComponent::class)

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.di
package com.atridad.mealient.di
import android.content.Context
import androidx.datastore.core.DataStore
@@ -12,8 +12,8 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.data.storage.PreferencesStorage
import gq.kirmanak.mealient.data.storage.PreferencesStorageImpl
import com.atridad.mealient.data.storage.PreferencesStorage
import com.atridad.mealient.data.storage.PreferencesStorageImpl
import okhttp3.OkHttpClient
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.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.architecture.configuration.BuildConfiguration
import gq.kirmanak.mealient.data.configuration.BuildConfigurationImpl
import com.atridad.mealient.architecture.configuration.BuildConfiguration
import com.atridad.mealient.data.configuration.BuildConfigurationImpl
@Module
@InstallIn(SingletonComponent::class)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,13 +1,13 @@
package gq.kirmanak.mealient.di
package com.atridad.mealient.di
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import gq.kirmanak.mealient.data.network.MealieDataSourceWrapper
import gq.kirmanak.mealient.data.share.ParseRecipeDataSource
import gq.kirmanak.mealient.data.share.ShareRecipeRepo
import gq.kirmanak.mealient.data.share.ShareRecipeRepoImpl
import com.atridad.mealient.data.network.MealieDataSourceWrapper
import com.atridad.mealient.data.share.ParseRecipeDataSource
import com.atridad.mealient.data.share.ShareRecipeRepo
import com.atridad.mealient.data.share.ShareRecipeRepoImpl
@Module
@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.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.SharedPreferences
@@ -7,7 +7,7 @@ import android.content.res.Configuration.UI_MODE_NIGHT_YES
import android.os.Build
import android.widget.Toast
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.awaitClose
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.NavGraphSpec
import com.ramcosta.composedestinations.spec.Route
import gq.kirmanak.mealient.shopping_lists.ui.destinations.ShoppingListScreenDestination
import gq.kirmanak.mealient.shopping_lists.ui.destinations.ShoppingListsScreenDestination
import gq.kirmanak.mealient.ui.destinations.AddRecipeScreenDestination
import gq.kirmanak.mealient.ui.destinations.AuthenticationScreenDestination
import gq.kirmanak.mealient.ui.destinations.BaseURLScreenDestination
import gq.kirmanak.mealient.ui.destinations.DisclaimerScreenDestination
import gq.kirmanak.mealient.ui.destinations.RecipeScreenDestination
import gq.kirmanak.mealient.ui.destinations.RecipesListDestination
import com.atridad.mealient.shopping_lists.ui.destinations.ShoppingListScreenDestination
import com.atridad.mealient.shopping_lists.ui.destinations.ShoppingListsScreenDestination
import com.atridad.mealient.ui.destinations.AddRecipeScreenDestination
import com.atridad.mealient.ui.destinations.AuthenticationScreenDestination
import com.atridad.mealient.ui.destinations.BaseURLScreenDestination
import com.atridad.mealient.ui.destinations.DisclaimerScreenDestination
import com.atridad.mealient.ui.destinations.RecipeScreenDestination
import com.atridad.mealient.ui.destinations.RecipesListDestination
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.compose.material.icons.Icons
@@ -22,12 +22,12 @@ import com.ramcosta.composedestinations.spec.Direction
import com.ramcosta.composedestinations.spec.NavGraphSpec
import com.ramcosta.composedestinations.utils.contains
import com.ramcosta.composedestinations.utils.currentDestinationAsState
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.NavGraphs
import gq.kirmanak.mealient.ui.components.DrawerItem
import gq.kirmanak.mealient.ui.destinations.AddRecipeScreenDestination
import gq.kirmanak.mealient.ui.destinations.BaseURLScreenDestination
import gq.kirmanak.mealient.ui.destinations.RecipesListDestination
import com.atridad.mealient.R
import com.atridad.mealient.ui.NavGraphs
import com.atridad.mealient.ui.components.DrawerItem
import com.atridad.mealient.ui.destinations.AddRecipeScreenDestination
import com.atridad.mealient.ui.destinations.BaseURLScreenDestination
import com.atridad.mealient.ui.destinations.RecipesListDestination
import kotlinx.coroutines.launch
@Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.activity
package com.atridad.mealient.ui.activity
import android.os.Bundle
import androidx.activity.ComponentActivity
@@ -7,9 +7,9 @@ import androidx.activity.viewModels
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowInsetsControllerCompat
import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.extensions.isDarkThemeOn
import gq.kirmanak.mealient.logging.Logger
import gq.kirmanak.mealient.ui.AppTheme
import com.atridad.mealient.extensions.isDarkThemeOn
import com.atridad.mealient.logging.Logger
import com.atridad.mealient.ui.AppTheme
import javax.inject.Inject
@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.content.Intent
@@ -7,16 +7,16 @@ import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo
import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage
import gq.kirmanak.mealient.logging.Logger
import gq.kirmanak.mealient.logging.getLogFile
import gq.kirmanak.mealient.ui.destinations.AuthenticationScreenDestination
import gq.kirmanak.mealient.ui.destinations.BaseURLScreenDestination
import gq.kirmanak.mealient.ui.destinations.DirectionDestination
import gq.kirmanak.mealient.ui.destinations.DisclaimerScreenDestination
import com.atridad.mealient.R
import com.atridad.mealient.data.auth.AuthRepo
import com.atridad.mealient.data.baseurl.ServerInfoRepo
import com.atridad.mealient.data.disclaimer.DisclaimerStorage
import com.atridad.mealient.logging.Logger
import com.atridad.mealient.logging.getLogFile
import com.atridad.mealient.ui.destinations.AuthenticationScreenDestination
import com.atridad.mealient.ui.destinations.BaseURLScreenDestination
import com.atridad.mealient.ui.destinations.DirectionDestination
import com.atridad.mealient.ui.destinations.DisclaimerScreenDestination
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
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 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.Route
import com.ramcosta.composedestinations.utils.currentDestinationAsState
import gq.kirmanak.mealient.ui.NavGraphs
import gq.kirmanak.mealient.ui.components.rememberBaseScreenState
import com.atridad.mealient.ui.NavGraphs
import com.atridad.mealient.ui.components.rememberBaseScreenState
@Composable
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.compose.foundation.layout.Arrangement
@@ -29,14 +29,14 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.hilt.navigation.compose.hiltViewModel
import com.ramcosta.composedestinations.annotation.Destination
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.Dimens
import gq.kirmanak.mealient.ui.components.BaseScreenState
import gq.kirmanak.mealient.ui.components.BaseScreenWithNavigation
import gq.kirmanak.mealient.ui.components.TopProgressIndicator
import gq.kirmanak.mealient.ui.components.previewBaseScreenState
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview
import com.atridad.mealient.R
import com.atridad.mealient.ui.AppTheme
import com.atridad.mealient.ui.Dimens
import com.atridad.mealient.ui.components.BaseScreenState
import com.atridad.mealient.ui.components.BaseScreenWithNavigation
import com.atridad.mealient.ui.components.TopProgressIndicator
import com.atridad.mealient.ui.components.previewBaseScreenState
import com.atridad.mealient.ui.preview.ColorSchemePreview
@Destination
@Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.add
package com.atridad.mealient.ui.add
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(
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 {

View File

@@ -1,16 +1,16 @@
package gq.kirmanak.mealient.ui.add
package com.atridad.mealient.ui.add
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.add.AddRecipeRepo
import gq.kirmanak.mealient.datasource.models.AddRecipeInfo
import gq.kirmanak.mealient.datasource.models.AddRecipeIngredientInfo
import gq.kirmanak.mealient.datasource.models.AddRecipeInstructionInfo
import gq.kirmanak.mealient.datasource.models.AddRecipeSettingsInfo
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.data.add.AddRecipeRepo
import com.atridad.mealient.datasource.models.AddRecipeInfo
import com.atridad.mealient.datasource.models.AddRecipeIngredientInfo
import com.atridad.mealient.datasource.models.AddRecipeInstructionInfo
import com.atridad.mealient.datasource.models.AddRecipeSettingsInfo
import com.atridad.mealient.datasource.runCatchingExceptCancel
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
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.Column
@@ -25,12 +25,12 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.ramcosta.composedestinations.annotation.Destination
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.Dimens
import gq.kirmanak.mealient.ui.components.BaseScreen
import gq.kirmanak.mealient.ui.components.TopProgressIndicator
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview
import com.atridad.mealient.R
import com.atridad.mealient.ui.AppTheme
import com.atridad.mealient.ui.Dimens
import com.atridad.mealient.ui.components.BaseScreen
import com.atridad.mealient.ui.components.TopProgressIndicator
import com.atridad.mealient.ui.preview.ColorSchemePreview
@Destination
@Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.auth
package com.atridad.mealient.ui.auth
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(
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 androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.datasource.NetworkError
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.R
import com.atridad.mealient.data.auth.AuthRepo
import com.atridad.mealient.datasource.NetworkError
import com.atridad.mealient.datasource.runCatchingExceptCancel
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
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.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.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.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import gq.kirmanak.mealient.R
import com.atridad.mealient.R
@OptIn(ExperimentalComposeUiApi::class)
@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.Column
@@ -27,15 +27,15 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.ramcosta.composedestinations.annotation.Destination
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.Dimens
import gq.kirmanak.mealient.ui.components.BaseScreen
import gq.kirmanak.mealient.ui.components.BaseScreenState
import gq.kirmanak.mealient.ui.components.BaseScreenWithNavigation
import gq.kirmanak.mealient.ui.components.TopProgressIndicator
import gq.kirmanak.mealient.ui.components.previewBaseScreenState
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview
import com.atridad.mealient.R
import com.atridad.mealient.ui.AppTheme
import com.atridad.mealient.ui.Dimens
import com.atridad.mealient.ui.components.BaseScreen
import com.atridad.mealient.ui.components.BaseScreenState
import com.atridad.mealient.ui.components.BaseScreenWithNavigation
import com.atridad.mealient.ui.components.TopProgressIndicator
import com.atridad.mealient.ui.components.previewBaseScreenState
import com.atridad.mealient.ui.preview.ColorSchemePreview
@Destination
@Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.baseurl
package com.atridad.mealient.ui.baseurl
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(
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 androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo
import gq.kirmanak.mealient.data.baseurl.impl.BaseUrlLogRedactor
import gq.kirmanak.mealient.data.recipes.RecipeRepo
import gq.kirmanak.mealient.datasource.CertificateCombinedException
import gq.kirmanak.mealient.datasource.NetworkError
import gq.kirmanak.mealient.datasource.TrustedCertificatesStore
import gq.kirmanak.mealient.datasource.findCauseAsInstanceOf
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.R
import com.atridad.mealient.data.auth.AuthRepo
import com.atridad.mealient.data.baseurl.ServerInfoRepo
import com.atridad.mealient.data.baseurl.impl.BaseUrlLogRedactor
import com.atridad.mealient.data.recipes.RecipeRepo
import com.atridad.mealient.datasource.CertificateCombinedException
import com.atridad.mealient.datasource.NetworkError
import com.atridad.mealient.datasource.TrustedCertificatesStore
import com.atridad.mealient.datasource.findCauseAsInstanceOf
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
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.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview
import com.atridad.mealient.R
import com.atridad.mealient.ui.AppTheme
import com.atridad.mealient.ui.preview.ColorSchemePreview
@Composable
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.Column
@@ -20,11 +20,11 @@ import androidx.compose.ui.semantics.testTag
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.ramcosta.composedestinations.annotation.Destination
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.AppTheme
import gq.kirmanak.mealient.ui.Dimens
import gq.kirmanak.mealient.ui.components.BaseScreen
import gq.kirmanak.mealient.ui.preview.ColorSchemePreview
import com.atridad.mealient.R
import com.atridad.mealient.ui.AppTheme
import com.atridad.mealient.ui.Dimens
import com.atridad.mealient.ui.components.BaseScreen
import com.atridad.mealient.ui.preview.ColorSchemePreview
@Destination
@Composable

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui.disclaimer
package com.atridad.mealient.ui.disclaimer
internal data class DisclaimerScreenState(
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.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage
import gq.kirmanak.mealient.logging.Logger
import com.atridad.mealient.data.disclaimer.DisclaimerStorage
import com.atridad.mealient.logging.Logger
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
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.Column
@@ -17,8 +17,8 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.Dimens
import com.atridad.mealient.R
import com.atridad.mealient.ui.Dimens
@Composable
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.Column
@@ -19,9 +19,9 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientEntity
import gq.kirmanak.mealient.ui.Dimens
import com.atridad.mealient.R
import com.atridad.mealient.database.recipe.entity.RecipeIngredientEntity
import com.atridad.mealient.ui.Dimens
@Composable
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.Column
@@ -13,10 +13,10 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeInstructionEntity
import gq.kirmanak.mealient.ui.Dimens
import com.atridad.mealient.R
import com.atridad.mealient.database.recipe.entity.RecipeIngredientEntity
import com.atridad.mealient.database.recipe.entity.RecipeInstructionEntity
import com.atridad.mealient.ui.Dimens
@Composable
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 androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalContext
import gq.kirmanak.mealient.extensions.findActivity
import com.atridad.mealient.extensions.findActivity
@Composable
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 gq.kirmanak.mealient.database.recipe.entity.RecipeInstructionEntity
import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity
import com.atridad.mealient.database.recipe.entity.RecipeIngredientEntity
import com.atridad.mealient.database.recipe.entity.RecipeInstructionEntity
import com.atridad.mealient.database.recipe.entity.RecipeSummaryEntity
import kotlinx.datetime.LocalDate
internal val INGREDIENT_TWO = RecipeIngredientEntity(

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