Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gravatar native Quick Editor #3055

Draft
wants to merge 16 commits into
base: main
Choose a base branch
from
Draft

Gravatar native Quick Editor #3055

wants to merge 16 commits into from

Conversation

hamorillo
Copy link
Contributor

@hamorillo hamorillo commented Oct 21, 2024

Description

With the new Gravatar SDK release, we can use the native Quick Editor (QE), which allows an easy avatar change without needing the browser (except for the OAuth authorization).

Currently, we are using the web version; this PR is replacing it with the native version included within the Gravatar SDK.

Note: The "official" gravatarAppId is already in the secrets, see 3fa232a.

Testing Instructions

To test the OAuth Flow, you need a gravatarAppId in your secret.properties. You can create and configure your test app following this. Let me know if you need help.

  1. Enable GRAVATAR_NATIVE_QUICK_EDITOR feature flag under Profile -> Settings -> Beta features
  2. Tap on the Profile tab
  3. Tap on Change avatar
  4. Verify Gravatar OAuth flow is opened in the browser
  5. Complete the OAuth flow
  6. You should be back on the app, and the QE should show your avatars
  7. Modify your avatar
  8. Close the QE and verify the new avatar is already shown in your account
  9. Tap on Change avatar
  10. OAuth flow should be presented again
  11. Modify/upload your avatar
  12. Close the QE and verify the new avatar is already shown in your account
  13. Sign out from PocketCast
  14. Login again with the same account
  15. Tap on the Profile tab
  16. Tap on Change avatar
  17. OAuth flow should be presented again
  18. Return to PocketCast
  19. Disable GRAVATAR_NATIVE_QUICK_EDITOR feature flag under Profile -> Settings -> Beta features
  20. Tap on the Profile tab
  21. Tap on Change avatar
  22. Browser with the web QE should be opened (previous behavior)

Screenshots or Screencast

imageimage

Checklist

  • If this is a user-facing change, I have added an entry in CHANGELOG.md
  • Ensure the linter passes (./gradlew spotlessApply to automatically apply formatting/linting)
  • I have considered whether it makes sense to add tests for my changes
  • All strings that need to be localized are in modules/services/localization/src/main/res/values/strings.xml
  • Any jetpack compose components I added or changed are covered by compose previews
  • I have updated (or requested that someone edit) the spreadsheet to reflect any new or changed analytics.

I have tested any UI changes...

  • with different themes
  • with a landscape orientation
  • with the device set to have a large display and font size
  • for accessibility with TalkBack

@wpmobilebot
Copy link
Collaborator

wpmobilebot commented Oct 21, 2024

📲 You can test the changes from this Pull Request in 📱 Mobile by scanning the QR code below to install the corresponding build.
App Name 📱 Mobile
Build TypedebugProd
Commitea0c2f9
Direct Downloadpocketcasts-app-prototype-build-pr3055-ea0c2f9.apk
📲 You can test the changes from this Pull Request in 🚗 Automotive by scanning the QR code below to install the corresponding build.
App Name 🚗 Automotive
Build TypedebugProd
Commitea0c2f9
Direct Downloadpocketcasts-automotive-prototype-build-pr3055-ea0c2f9.apk
📲 You can test the changes from this Pull Request in ⌚ Wear by scanning the QR code below to install the corresponding build.
App Name ⌚ Wear
Build TypedebugProd
Commitea0c2f9
Direct Downloadpocketcasts-wear-prototype-build-pr3055-ea0c2f9.apk

@wpmobilebot
Copy link
Collaborator

wpmobilebot commented Oct 21, 2024

Project dependencies changes

The following changes in project dependencies were detected (configuration releaseRuntimeClasspath):

list
New Dependencies
androidx.browser:browser:1.8.0
androidx.compose.material3.adaptive:adaptive:1.0.0
androidx.compose.material3.adaptive:adaptive-android:1.0.0
androidx.security:security-crypto:1.0.0
androidx.window.extensions.core:core:1.0.0
androidx.window:window-core:1.3.0
androidx.window:window-core-android:1.3.0
com.automattic:ucrop:2.2.10
com.caverock:androidsvg-aar:1.4
com.composables:core:1.15.0
com.composables:core-android:1.15.0
com.google.code.gson:gson:2.10.1
com.google.crypto.tink:tink-android:1.13.0
com.gravatar:gravatar:2.2.0
com.gravatar:gravatar-quickeditor:2.2.0
com.gravatar:gravatar-ui:2.2.0
io.coil-kt:coil-svg:2.7.0
io.github.osipxd:encrypted-datastore:1.1.1-beta03
io.github.osipxd:encrypted-datastore-bom:1.1.1-beta03
io.github.osipxd:encrypted-datastore-preferences:1.1.1-beta03
io.github.osipxd:security-crypto-datastore:1.1.1-beta03
io.github.osipxd:security-crypto-datastore-preferences:1.1.1-beta03

Upgraded Dependencies
androidx.navigation:navigation-common:2.8.3, (changed from 2.7.7)
androidx.navigation:navigation-common-ktx:2.8.3, (changed from 2.7.7)
androidx.navigation:navigation-compose:2.8.3, (changed from 2.7.7)
androidx.navigation:navigation-fragment:2.8.3, (changed from 2.7.7)
androidx.navigation:navigation-fragment-ktx:2.8.3, (changed from 2.7.7)
androidx.navigation:navigation-runtime:2.8.3, (changed from 2.7.7)
androidx.navigation:navigation-runtime-ktx:2.8.3, (changed from 2.7.7)
androidx.navigation:navigation-ui:2.8.3, (changed from 2.7.7)
androidx.navigation:navigation-ui-ktx:2.8.3, (changed from 2.7.7)
androidx.transition:transition:1.5.0, (changed from 1.4.1)
androidx.window:window:1.3.0, (changed from 1.0.0)
com.google.android.material:material:1.12.0, (changed from 1.11.0)
tree
++--- androidx.compose:compose-bom:2024.10.00
+|    +--- androidx.compose.material3.adaptive:adaptive:1.0.0 (c)
+|    \--- androidx.compose.material3.adaptive:adaptive-android:1.0.0 (c)
 +--- com.automattic:encryptedlogging:0.0.1
 |    \--- org.wordpress:utils:3.14.0
-|         \--- com.google.android.material:material:1.2.1 -> 1.11.0
-|              +--- org.jetbrains.kotlin:kotlin-bom:1.8.22
-|              |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (c)
-|              |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 -> 2.1.0 (c)
-|              |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 2.1.0 (c)
-|              |    \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.1.0 (c)
-|              +--- com.google.errorprone:error_prone_annotations:2.15.0 -> 2.28.0
-|              +--- androidx.activity:activity:1.8.0 -> 1.9.3 (*)
-|              +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*)
-|              +--- androidx.appcompat:appcompat:1.6.1 -> 1.7.0 (*)
-|              +--- androidx.cardview:cardview:1.0.0
-|              |    \--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*)
-|              +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0
-|              |    +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
-|              |    +--- androidx.core:core:1.1.0 -> 1.13.1 (*)
-|              |    +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*)
-|              |    \--- androidx.collection:collection:1.0.0 -> 1.4.4 (*)
-|              +--- androidx.constraintlayout:constraintlayout:2.0.1 -> 2.1.4
-|              |    +--- androidx.appcompat:appcompat:1.2.0 -> 1.7.0 (*)
-|              |    +--- androidx.core:core:1.3.2 -> 1.13.1 (*)
-|              |    \--- androidx.constraintlayout:constraintlayout-core:1.0.4
-|              +--- androidx.core:core:1.6.0 -> 1.13.1 (*)
-|              +--- androidx.drawerlayout:drawerlayout:1.1.1 (*)
-|              +--- androidx.dynamicanimation:dynamicanimation:1.0.0
-|              |    +--- androidx.core:core:1.0.0 -> 1.13.1 (*)
-|              |    +--- androidx.collection:collection:1.0.0 -> 1.4.4 (*)
-|              |    \--- androidx.legacy:legacy-support-core-utils:1.0.0 (*)
-|              +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.4.1 (*)
-|              +--- androidx.fragment:fragment:1.2.5 -> 1.8.5 (*)
-|              +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.8.7 (*)
-|              +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.3.2 (*)
-|              +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 (*)
-|              +--- androidx.transition:transition:1.2.0 -> 1.4.1
-|              |    +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
-|              |    +--- androidx.core:core:1.1.0 -> 1.13.1 (*)
-|              |    \--- androidx.collection:collection:1.1.0 -> 1.4.4 (*)
-|              +--- androidx.vectordrawable:vectordrawable:1.1.0 (*)
-|              \--- androidx.viewpager2:viewpager2:1.0.0 -> 1.1.0
-|                   +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
-|                   +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
-|                   +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*)
-|                   +--- androidx.core:core:1.3.2 -> 1.13.1 (*)
-|                   +--- androidx.fragment:fragment:1.1.0 -> 1.8.5 (*)
-|                   \--- androidx.recyclerview:recyclerview:1.3.1 -> 1.3.2 (*)
+|         \--- com.google.android.material:material:1.2.1 -> 1.12.0
+|              +--- org.jetbrains.kotlin:kotlin-bom:1.8.22
+|              |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (c)
+|              |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 -> 2.1.0 (c)
+|              |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 2.1.0 (c)
+|              |    \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.1.0 (c)
+|              +--- com.google.errorprone:error_prone_annotations:2.15.0 -> 2.28.0
+|              +--- androidx.activity:activity:1.8.0 -> 1.9.3 (*)
+|              +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*)
+|              +--- androidx.appcompat:appcompat:1.6.1 -> 1.7.0 (*)
+|              +--- androidx.cardview:cardview:1.0.0
+|              |    \--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*)
+|              +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0
+|              |    +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
+|              |    +--- androidx.core:core:1.1.0 -> 1.13.1 (*)
+|              |    +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*)
+|              |    \--- androidx.collection:collection:1.0.0 -> 1.4.4 (*)
+|              +--- androidx.constraintlayout:constraintlayout:2.0.1 -> 2.1.4
+|              |    +--- androidx.appcompat:appcompat:1.2.0 -> 1.7.0 (*)
+|              |    +--- androidx.core:core:1.3.2 -> 1.13.1 (*)
+|              |    \--- androidx.constraintlayout:constraintlayout-core:1.0.4
+|              +--- androidx.core:core:1.6.0 -> 1.13.1 (*)
+|              +--- androidx.drawerlayout:drawerlayout:1.1.1 (*)
+|              +--- androidx.dynamicanimation:dynamicanimation:1.0.0
+|              |    +--- androidx.core:core:1.0.0 -> 1.13.1 (*)
+|              |    +--- androidx.collection:collection:1.0.0 -> 1.4.4 (*)
+|              |    \--- androidx.legacy:legacy-support-core-utils:1.0.0 (*)
+|              +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.4.1 (*)
+|              +--- androidx.fragment:fragment:1.2.5 -> 1.8.5 (*)
+|              +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.8.7 (*)
+|              +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.3.2 (*)
+|              +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 (*)
+|              +--- androidx.transition:transition:1.5.0
+|              |    +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*)
+|              |    +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*)
+|              |    +--- androidx.core:core:1.13.0 -> 1.13.1 (*)
+|              |    \--- androidx.dynamicanimation:dynamicanimation:1.0.0 (*)
+|              +--- androidx.vectordrawable:vectordrawable:1.1.0 (*)
+|              \--- androidx.viewpager2:viewpager2:1.0.0 -> 1.1.0
+|                   +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
+|                   +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+|                   +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*)
+|                   +--- androidx.core:core:1.3.2 -> 1.13.1 (*)
+|                   +--- androidx.fragment:fragment:1.1.0 -> 1.8.5 (*)
+|                   \--- androidx.recyclerview:recyclerview:1.3.1 -> 1.3.2 (*)
-+--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
++--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 +--- project :modules:features:account
-|    +--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    +--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
-|    +--- androidx.navigation:navigation-runtime:2.7.7
-|    |    +--- androidx.activity:activity-ktx:1.7.1 -> 1.9.3 (*)
-|    |    +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.4.1 (*)
-|    |    +--- androidx.collection:collection:1.0.0 -> 1.4.4 (*)
-|    |    +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.7 (*)
-|    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.7 (*)
-|    |    +--- androidx.navigation:navigation-common:2.7.7
-|    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
-|    |    |    +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.4 (*)
-|    |    |    +--- androidx.core:core-ktx:1.1.0 -> 1.13.1 (*)
-|    |    |    +--- androidx.lifecycle:lifecycle-common:2.6.2 -> 2.8.7 (*)
-|    |    |    +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.7 (*)
-|    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.7 (*)
-|    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 -> 2.8.7 (*)
-|    |    |    +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
-|    |    |    +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
-|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
-|    |    |    +--- androidx.navigation:navigation-compose:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-fragment:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-fragment-ktx:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-runtime:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-ui:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-ui-ktx:2.7.7 (c)
-|    |    |    \--- androidx.navigation:navigation-common-ktx:2.7.7 (c)
-|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
-|    |    +--- androidx.navigation:navigation-common:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-compose:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-fragment-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-ui-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-fragment:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-ui:2.7.7 (c)
-|    |    \--- androidx.navigation:navigation-common-ktx:2.7.7 (c)
+|    +--- androidx.navigation:navigation-runtime:2.7.7 -> 2.8.3
+|    |    +--- androidx.activity:activity-ktx:1.7.1 -> 1.9.3 (*)
+|    |    +--- androidx.annotation:annotation-experimental:1.4.1 (*)
+|    |    +--- androidx.collection:collection:1.4.2 -> 1.4.4 (*)
+|    |    +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.7 (*)
+|    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.7 (*)
+|    |    +--- androidx.navigation:navigation-common:2.8.3
+|    |    |    +--- androidx.annotation:annotation:1.8.1 -> 1.9.1 (*)
+|    |    |    +--- androidx.collection:collection-ktx:1.4.2 -> 1.4.4 (*)
+|    |    |    +--- androidx.core:core-ktx:1.1.0 -> 1.13.1 (*)
+|    |    |    +--- androidx.lifecycle:lifecycle-common:2.6.2 -> 2.8.7 (*)
+|    |    |    +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.7 (*)
+|    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.7 (*)
+|    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 -> 2.8.7 (*)
+|    |    |    +--- androidx.profileinstaller:profileinstaller:1.3.1 (*)
+|    |    |    +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
+|    |    |    +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.1
+|    |    |    |    \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.1
+|    |    |    |         +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*)
+|    |    |    |         \--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.1
+|    |    |    |              +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.1 (c)
+|    |    |    |              +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.1 (c)
+|    |    |    |              +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1 (c)
+|    |    |    |              \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.1 (c)
+|    |    |    +--- androidx.navigation:navigation-common-ktx:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-compose:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-fragment:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-fragment-ktx:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-runtime:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-ui:2.8.3 (c)
+|    |    |    \--- androidx.navigation:navigation-ui-ktx:2.8.3 (c)
+|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
+|    |    +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.1 (*)
+|    |    +--- androidx.navigation:navigation-common:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-common-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-compose:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-fragment:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-fragment-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-ui-ktx:2.8.3 (c)
+|    |    \--- androidx.navigation:navigation-ui:2.8.3 (c)
 |    +--- com.airbnb.android:showkase:1.0.3
-|    |    \--- androidx.navigation:navigation-compose:2.5.1 -> 2.7.7
-|    |         +--- androidx.activity:activity-compose:1.7.0 -> 1.9.3 (*)
-|    |         +--- androidx.compose.animation:animation:1.5.1 -> 1.7.4 (*)
-|    |         +--- androidx.compose.foundation:foundation-layout:1.5.1 -> 1.7.4 (*)
-|    |         +--- androidx.compose.runtime:runtime:1.5.1 -> 1.7.4 (*)
-|    |         +--- androidx.compose.runtime:runtime-saveable:1.5.1 -> 1.7.4 (*)
-|    |         +--- androidx.compose.ui:ui:1.5.1 -> 1.7.4 (*)
-|    |         +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 -> 2.8.7
-|    |         |    \--- androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7
-|    |         |         +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*)
-|    |         |         +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.4 (*)
-|    |         |         +--- androidx.compose.ui:ui:1.6.0 -> 1.7.4 (*)
-|    |         |         +--- androidx.lifecycle:lifecycle-common:2.8.7 (*)
-|    |         |         +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (*)
-|    |         |         +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (*)
-|    |         |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
-|    |         |         +--- androidx.lifecycle:lifecycle-common:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-process:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-reactivestreams:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-service:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c)
-|    |         |         +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c)
-|    |         |         \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c)
-|    |         +--- androidx.navigation:navigation-runtime-ktx:2.7.7
-|    |         |    +--- androidx.navigation:navigation-common-ktx:2.7.7
-|    |         |    |    +--- androidx.navigation:navigation-common:2.7.7 (*)
-|    |         |    |    +--- androidx.navigation:navigation-common:2.7.7 (c)
-|    |         |    |    +--- androidx.navigation:navigation-compose:2.7.7 (c)
-|    |         |    |    +--- androidx.navigation:navigation-fragment:2.7.7 (c)
-|    |         |    |    +--- androidx.navigation:navigation-fragment-ktx:2.7.7 (c)
-|    |         |    |    +--- androidx.navigation:navigation-runtime:2.7.7 (c)
-|    |         |    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c)
-|    |         |    |    +--- androidx.navigation:navigation-ui:2.7.7 (c)
-|    |         |    |    \--- androidx.navigation:navigation-ui-ktx:2.7.7 (c)
-|    |         |    +--- androidx.navigation:navigation-runtime:2.7.7 (*)
-|    |         |    +--- androidx.navigation:navigation-common:2.7.7 (c)
-|    |         |    +--- androidx.navigation:navigation-common-ktx:2.7.7 (c)
-|    |         |    +--- androidx.navigation:navigation-compose:2.7.7 (c)
-|    |         |    +--- androidx.navigation:navigation-fragment:2.7.7 (c)
-|    |         |    +--- androidx.navigation:navigation-fragment-ktx:2.7.7 (c)
-|    |         |    +--- androidx.navigation:navigation-runtime:2.7.7 (c)
-|    |         |    +--- androidx.navigation:navigation-ui:2.7.7 (c)
-|    |         |    \--- androidx.navigation:navigation-ui-ktx:2.7.7 (c)
-|    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
-|    |         +--- androidx.navigation:navigation-common:2.7.7 (c)
-|    |         +--- androidx.navigation:navigation-fragment-ktx:2.7.7 (c)
-|    |         +--- androidx.navigation:navigation-runtime:2.7.7 (c)
-|    |         +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c)
-|    |         +--- androidx.navigation:navigation-ui-ktx:2.7.7 (c)
-|    |         +--- androidx.navigation:navigation-fragment:2.7.7 (c)
-|    |         +--- androidx.navigation:navigation-ui:2.7.7 (c)
-|    |         \--- androidx.navigation:navigation-common-ktx:2.7.7 (c)
+|    |    \--- androidx.navigation:navigation-compose:2.5.1 -> 2.8.3
+|    |         +--- androidx.activity:activity-compose:1.8.0 -> 1.9.3 (*)
+|    |         +--- androidx.compose.animation:animation:1.7.2 -> 1.7.4 (*)
+|    |         +--- androidx.compose.foundation:foundation-layout:1.7.2 -> 1.7.4 (*)
+|    |         +--- androidx.compose.runtime:runtime:1.7.2 -> 1.7.4 (*)
+|    |         +--- androidx.compose.runtime:runtime-saveable:1.7.2 -> 1.7.4 (*)
+|    |         +--- androidx.compose.ui:ui:1.7.2 -> 1.7.4 (*)
+|    |         +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 -> 2.8.7
+|    |         |    \--- androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7
+|    |         |         +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*)
+|    |         |         +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.4 (*)
+|    |         |         +--- androidx.compose.ui:ui:1.6.0 -> 1.7.4 (*)
+|    |         |         +--- androidx.lifecycle:lifecycle-common:2.8.7 (*)
+|    |         |         +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (*)
+|    |         |         +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (*)
+|    |         |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
+|    |         |         +--- androidx.lifecycle:lifecycle-common:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-process:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-reactivestreams:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-service:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c)
+|    |         |         +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c)
+|    |         |         \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c)
+|    |         +--- androidx.navigation:navigation-runtime-ktx:2.8.3
+|    |         |    +--- androidx.navigation:navigation-common-ktx:2.8.3
+|    |         |    |    +--- androidx.navigation:navigation-common:2.8.3 (*)
+|    |         |    |    +--- androidx.navigation:navigation-common:2.8.3 (c)
+|    |         |    |    +--- androidx.navigation:navigation-compose:2.8.3 (c)
+|    |         |    |    +--- androidx.navigation:navigation-fragment:2.8.3 (c)
+|    |         |    |    +--- androidx.navigation:navigation-fragment-ktx:2.8.3 (c)
+|    |         |    |    +--- androidx.navigation:navigation-runtime:2.8.3 (c)
+|    |         |    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (c)
+|    |         |    |    +--- androidx.navigation:navigation-ui:2.8.3 (c)
+|    |         |    |    \--- androidx.navigation:navigation-ui-ktx:2.8.3 (c)
+|    |         |    +--- androidx.navigation:navigation-runtime:2.8.3 (*)
+|    |         |    +--- androidx.navigation:navigation-common-ktx:2.8.3 (c)
+|    |         |    +--- androidx.navigation:navigation-compose:2.8.3 (c)
+|    |         |    +--- androidx.navigation:navigation-fragment-ktx:2.8.3 (c)
+|    |         |    +--- androidx.navigation:navigation-runtime:2.8.3 (c)
+|    |         |    +--- androidx.navigation:navigation-ui-ktx:2.8.3 (c)
+|    |         |    +--- androidx.navigation:navigation-fragment:2.8.3 (c)
+|    |         |    +--- androidx.navigation:navigation-common:2.8.3 (c)
+|    |         |    \--- androidx.navigation:navigation-ui:2.8.3 (c)
+|    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
+|    |         +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.1 (*)
+|    |         +--- androidx.navigation:navigation-fragment-ktx:2.8.3 (c)
+|    |         +--- androidx.navigation:navigation-runtime:2.8.3 (c)
+|    |         +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (c)
+|    |         +--- androidx.navigation:navigation-ui-ktx:2.8.3 (c)
+|    |         +--- androidx.navigation:navigation-common-ktx:2.8.3 (c)
+|    |         +--- androidx.navigation:navigation-fragment:2.8.3 (c)
+|    |         +--- androidx.navigation:navigation-common:2.8.3 (c)
+|    |         \--- androidx.navigation:navigation-ui:2.8.3 (c)
 |    +--- project :modules:features:search
 |    |    +--- project :modules:services:analytics
 |    |    |    +--- project :modules:services:model
 |    |    |    |    \--- project :modules:services:utils
-|    |    |    |         \--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    |    |    |         \--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 |    |    |    \--- project :modules:services:preferences
 |    |    |         +--- androidx.preference:preference-ktx:1.2.1
 |    |    |         |    \--- androidx.preference:preference:1.2.1
 |    |    |         |         \--- androidx.slidingpanelayout:slidingpanelayout:1.2.0
-|    |    |         |              +--- androidx.window:window:1.0.0
-|    |    |         |              |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 2.1.0 (*)
-|    |    |         |              |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.9.0 (*)
-|    |    |         |              |    +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*)
-|    |    |         |              |    +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*)
-|    |    |         |              |    \--- androidx.core:core:1.3.2 -> 1.13.1 (*)
+|    |    |         |              +--- androidx.window:window:1.0.0 -> 1.3.0
+|    |    |         |              |    +--- androidx.annotation:annotation:1.3.0 -> 1.9.1 (*)
+|    |    |         |              |    +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*)
+|    |    |         |              |    +--- androidx.core:core:1.8.0 -> 1.13.1 (*)
+|    |    |         |              |    +--- androidx.window.extensions.core:core:1.0.0
+|    |    |         |              |    |    +--- androidx.annotation:annotation:1.6.0 -> 1.9.1 (*)
+|    |    |         |              |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 2.1.0 (*)
+|    |    |         |              |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
+|    |    |         |              |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.9.0 (*)
+|    |    |         |              |    \--- androidx.window:window-core:1.3.0 (c)
-|    |    |         |              \--- androidx.transition:transition:1.4.1 (*)
+|    |    |         |              \--- androidx.transition:transition:1.4.1 -> 1.5.0 (*)
 |    |    |         \--- project :modules:services:images
-|    |    |              \--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    |    |              \--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 |    |    +--- project :modules:services:repositories
-|    |    |    \--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    |    |    \--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 |    |    +--- project :modules:services:ui
-|    |    |    \--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    |    |    \--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 |    |    \--- project :modules:services:views
-|    |         +--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    |         +--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
-|    |         \--- androidx.navigation:navigation-runtime:2.7.7 (*)
+|    |         \--- androidx.navigation:navigation-runtime:2.7.7 -> 2.8.3 (*)
 |    +--- project :modules:features:settings
-|    |    +--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    |    +--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 |    |    +--- com.mikepenz:aboutlibraries-compose:11.2.3
 |    |    |    \--- com.mikepenz:aboutlibraries-compose-android:11.2.3
 |    |    |         \--- com.mikepenz:aboutlibraries-core:11.2.3
 |    |    |              \--- com.mikepenz:aboutlibraries-core-android:11.2.3
 |    |    |                   \--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1
 |    |    |                        \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.1
-|    |    |                             +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.1
-|    |    |                             |    +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.1 (c)
-|    |    |                             |    +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1 (c)
-|    |    |                             |    +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.1 (c)
-|    |    |                             |    \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.1 (c)
+|    |    |                             +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.1 (*)
-|    |    |                             \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.1
-|    |    |                                  \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.1
-|    |    |                                       +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*)
-|    |    |                                       \--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.1 (*)
+|    |    |                             \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.1 (*)
 |    |    \--- androidx.hilt:hilt-navigation-compose:1.2.0
 |    |         +--- androidx.hilt:hilt-navigation:1.2.0
-|    |         |    \--- androidx.navigation:navigation-runtime:2.5.1 -> 2.7.7 (*)
+|    |         |    \--- androidx.navigation:navigation-runtime:2.5.1 -> 2.8.3 (*)
-|    |         \--- androidx.navigation:navigation-compose:2.5.1 -> 2.7.7 (*)
+|    |         \--- androidx.navigation:navigation-compose:2.5.1 -> 2.8.3 (*)
-|    +--- androidx.navigation:navigation-compose:2.7.7 (*)
+|    +--- androidx.navigation:navigation-compose:2.7.7 -> 2.8.3 (*)
-|    +--- androidx.navigation:navigation-fragment-ktx:2.7.7
-|    |    +--- androidx.navigation:navigation-fragment:2.7.7
-|    |    |    +--- androidx.fragment:fragment-ktx:1.6.2 -> 1.8.5 (*)
-|    |    |    +--- androidx.navigation:navigation-runtime:2.7.7 (*)
-|    |    |    +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 (*)
-|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
-|    |    |    +--- androidx.navigation:navigation-common:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-common-ktx:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-compose:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-fragment-ktx:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-runtime:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-ui:2.7.7 (c)
-|    |    |    \--- androidx.navigation:navigation-ui-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (*)
-|    |    +--- androidx.navigation:navigation-common:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-compose:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-fragment:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-runtime:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-ui-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-ui:2.7.7 (c)
-|    |    \--- androidx.navigation:navigation-common-ktx:2.7.7 (c)
+|    +--- androidx.navigation:navigation-fragment-ktx:2.7.7 -> 2.8.3
+|    |    +--- androidx.navigation:navigation-fragment:2.8.3
+|    |    |    +--- androidx.fragment:fragment-ktx:1.6.2 -> 1.8.5 (*)
+|    |    |    +--- androidx.navigation:navigation-runtime:2.8.3 (*)
+|    |    |    +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 (*)
+|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
+|    |    |    +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.1 (*)
+|    |    |    +--- androidx.navigation:navigation-common:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-common-ktx:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-compose:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-fragment-ktx:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-runtime:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-ui:2.8.3 (c)
+|    |    |    \--- androidx.navigation:navigation-ui-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (*)
+|    |    +--- androidx.navigation:navigation-common-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-compose:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-fragment:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-runtime:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-ui-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-common:2.8.3 (c)
+|    |    \--- androidx.navigation:navigation-ui:2.8.3 (c)
-|    +--- androidx.navigation:navigation-ui-ktx:2.7.7
-|    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (*)
-|    |    +--- androidx.navigation:navigation-ui:2.7.7
-|    |    |    +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.4.1 (*)
-|    |    |    +--- androidx.customview:customview:1.1.0 (*)
-|    |    |    +--- androidx.drawerlayout:drawerlayout:1.1.1 (*)
-|    |    |    +--- androidx.navigation:navigation-runtime:2.7.7 (*)
-|    |    |    +--- androidx.transition:transition:1.3.0 -> 1.4.1 (*)
-|    |    |    +--- com.google.android.material:material:1.4.0-beta01 -> 1.11.0 (*)
-|    |    |    +--- androidx.navigation:navigation-common:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-common-ktx:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-compose:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-fragment:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-fragment-ktx:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-runtime:2.7.7 (c)
-|    |    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c)
-|    |    |    \--- androidx.navigation:navigation-ui-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-common:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-compose:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-fragment:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-fragment-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-runtime:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c)
-|    |    +--- androidx.navigation:navigation-ui:2.7.7 (c)
-|    |    \--- androidx.navigation:navigation-common-ktx:2.7.7 (c)
+|    +--- androidx.navigation:navigation-ui-ktx:2.7.7 -> 2.8.3
+|    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (*)
+|    |    +--- androidx.navigation:navigation-ui:2.8.3
+|    |    |    +--- androidx.annotation:annotation-experimental:1.4.1 (*)
+|    |    |    +--- androidx.customview:customview:1.1.0 (*)
+|    |    |    +--- androidx.drawerlayout:drawerlayout:1.1.1 (*)
+|    |    |    +--- androidx.navigation:navigation-runtime:2.8.3 (*)
+|    |    |    +--- androidx.transition:transition:1.3.0 -> 1.5.0 (*)
+|    |    |    +--- com.google.android.material:material:1.4.0 -> 1.12.0 (*)
+|    |    |    +--- androidx.navigation:navigation-common:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-common-ktx:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-compose:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-fragment:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-fragment-ktx:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-runtime:2.8.3 (c)
+|    |    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (c)
+|    |    |    \--- androidx.navigation:navigation-ui-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-common:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-common-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-compose:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-fragment:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-fragment-ktx:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-runtime:2.8.3 (c)
+|    |    +--- androidx.navigation:navigation-runtime-ktx:2.8.3 (c)
+|    |    \--- androidx.navigation:navigation-ui:2.8.3 (c)
 |    \--- project :modules:features:cartheme
-|         \--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|         \--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 +--- project :modules:features:discover
-|    +--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    +--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 |    \--- project :modules:features:podcasts
-|         +--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|         +--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 |         +--- project :modules:features:player
-|         |    +--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|         |    +--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 |         |    +--- androidx.compose.material3:material3-window-size-class-android -> 1.3.0
-|         |    |    \--- androidx.window:window:1.0.0 (*)
+|         |    |    \--- androidx.window:window:1.0.0 -> 1.3.0 (*)
 |         |    \--- io.github.kevinnzou:compose-webview:0.33.6
-|         |         \--- com.google.android.material:material:1.11.0 (*)
+|         |         \--- com.google.android.material:material:1.11.0 -> 1.12.0 (*)
-|         \--- androidx.navigation:navigation-compose:2.7.7 (*)
+|         \--- androidx.navigation:navigation-compose:2.7.7 -> 2.8.3 (*)
 +--- project :modules:features:filters
-|    \--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    \--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 +--- project :modules:features:navigation
-|    \--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    \--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
 +--- project :modules:features:profile
-|    \--- com.google.android.material:material:1.9.0 -> 1.11.0 (*)
+|    \--- com.google.android.material:material:1.9.0 -> 1.12.0 (*)
+\--- project :modules:services:gravatar
+     +--- com.google.dagger:hilt-android:2.53 (*)
+     +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*)
+     +--- project :modules:services:utils (*)
+     +--- com.gravatar:gravatar:2.2.0
+     |    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.25 -> 2.1.0 (*)
+     |    +--- com.squareup.retrofit2:retrofit:2.11.0 (*)
+     |    +--- com.squareup.retrofit2:converter-moshi:2.11.0 (*)
+     |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.9.0 (*)
+     |    +--- com.squareup.okhttp3:okhttp:4.12.0 (*)
+     |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.25 -> 2.1.0 (*)
+     \--- com.gravatar:gravatar-quickeditor:2.2.0
+          +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.25 -> 2.1.0 (*)
+          +--- com.gravatar:gravatar:2.2.0 (*)
+          +--- com.gravatar:gravatar-ui:2.2.0
+          |    +--- androidx.core:core-ktx:1.13.1 (*)
+          |    +--- androidx.appcompat:appcompat:1.7.0 (*)
+          |    +--- com.google.android.material:material:1.12.0 (*)
+          |    +--- io.coil-kt:coil-compose:2.7.0 (*)
+          |    +--- io.coil-kt:coil-svg:2.7.0
+          |    |    +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*)
+          |    |    +--- com.caverock:androidsvg-aar:1.4
+          |    |    +--- io.coil-kt:coil-base:2.7.0 (*)
+          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*)
+          |    +--- com.gravatar:gravatar:2.2.0 (*)
+          |    +--- androidx.compose:compose-bom:2024.02.00 -> 2024.10.00 (*)
+          |    +--- androidx.compose.ui:ui -> 1.7.4 (*)
+          |    +--- androidx.compose.ui:ui-tooling-preview -> 1.7.4 (*)
+          |    +--- androidx.compose.material3:material3 -> 1.3.0 (*)
+          |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.25 -> 2.1.0 (*)
+          +--- androidx.browser:browser:1.8.0
+          |    +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*)
+          |    +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+          |    +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*)
+          |    +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*)
+          |    +--- androidx.core:core:1.1.0 -> 1.13.1 (*)
+          |    +--- androidx.interpolator:interpolator:1.0.0 (*)
+          |    \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+          +--- androidx.appcompat:appcompat:1.7.0 (*)
+          +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3 -> 2.8.7 (*)
+          +--- androidx.navigation:navigation-compose:2.8.3 (*)
+          +--- io.github.osipxd:security-crypto-datastore-preferences:1.1.1-beta03
+          |    +--- io.github.osipxd:encrypted-datastore-preferences:1.1.1-beta03
+          |    |    +--- io.github.osipxd:encrypted-datastore-bom:1.1.1-beta03
+          |    |    |    +--- io.github.osipxd:encrypted-datastore-preferences:1.1.1-beta03 (c)
+          |    |    |    +--- io.github.osipxd:security-crypto-datastore:1.1.1-beta03 (c)
+          |    |    |    +--- io.github.osipxd:security-crypto-datastore-preferences:1.1.1-beta03 (c)
+          |    |    |    +--- androidx.datastore:datastore:1.1.1 (c)
+          |    |    |    +--- androidx.datastore:datastore-core:1.1.1 (c)
+          |    |    |    +--- androidx.datastore:datastore-preferences:1.1.1 (c)
+          |    |    |    +--- androidx.datastore:datastore-preferences-core:1.1.1 (c)
+          |    |    |    \--- io.github.osipxd:encrypted-datastore:1.1.1-beta03 (c)
+          |    |    +--- io.github.osipxd:encrypted-datastore:1.1.1-beta03
+          |    |    |    +--- io.github.osipxd:encrypted-datastore-bom:1.1.1-beta03 (*)
+          |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*)
+          |    |    |    +--- androidx.datastore:datastore-core:1.1.1 (*)
+          |    |    |    \--- com.google.crypto.tink:tink-android:1.13.0
+          |    |    |         +--- androidx.annotation:annotation:1.5.0 -> 1.9.1 (*)
+          |    |    |         +--- com.google.code.findbugs:jsr305:3.0.2
+          |    |    |         +--- com.google.code.gson:gson:2.10.1
+          |    |    |         \--- com.google.errorprone:error_prone_annotations:2.22.0 -> 2.28.0
+          |    |    +--- androidx.datastore:datastore-preferences-core:1.1.1 (*)
+          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*)
+          |    +--- io.github.osipxd:encrypted-datastore-bom:1.1.1-beta03 (*)
+          |    +--- io.github.osipxd:security-crypto-datastore:1.1.1-beta03
+          |    |    +--- io.github.osipxd:encrypted-datastore:1.1.1-beta03 (*)
+          |    |    +--- io.github.osipxd:encrypted-datastore-bom:1.1.1-beta03 (*)
+          |    |    +--- androidx.datastore:datastore:1.1.1 (*)
+          |    |    +--- androidx.security:security-crypto:1.0.0
+          |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
+          |    |    |    \--- com.google.crypto.tink:tink-android:1.5.0 -> 1.13.0 (*)
+          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*)
+          |    +--- androidx.datastore:datastore-preferences:1.1.1 (*)
+          |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*)
+          +--- androidx.startup:startup-runtime:1.1.1 (*)
+          +--- io.coil-kt:coil-compose:2.7.0 (*)
+          +--- com.squareup.retrofit2:retrofit:2.11.0 (*)
+          +--- com.squareup.retrofit2:converter-moshi:2.11.0 (*)
+          +--- com.automattic:ucrop:2.2.10
+          |    +--- androidx.appcompat:appcompat:1.6.1 -> 1.7.0 (*)
+          |    +--- androidx.exifinterface:exifinterface:1.3.6 -> 1.3.7 (*)
+          |    +--- androidx.transition:transition:1.4.1 -> 1.5.0 (*)
+          |    \--- com.squareup.okhttp3:okhttp:3.12.13 -> 4.12.0 (*)
+          +--- androidx.compose:compose-bom:2024.02.00 -> 2024.10.00 (*)
+          +--- androidx.compose.ui:ui -> 1.7.4 (*)
+          +--- androidx.compose.ui:ui-tooling-preview -> 1.7.4 (*)
+          +--- androidx.compose.material3:material3 -> 1.3.0 (*)
+          +--- androidx.activity:activity-compose:1.9.2 -> 1.9.3 (*)
+          +--- androidx.compose.material3.adaptive:adaptive:1.0.0
+          |    \--- androidx.compose.material3.adaptive:adaptive-android:1.0.0
+          |         +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
+          |         +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+          |         +--- androidx.compose.foundation:foundation:1.6.5 -> 1.7.4 (*)
+          |         +--- androidx.compose.ui:ui-geometry:1.6.5 -> 1.7.4 (*)
+          |         +--- androidx.window:window:1.3.0 (*)
+          |         +--- androidx.window:window-core:1.3.0
+          |         |    \--- androidx.window:window-core-android:1.3.0
+          |         |         +--- androidx.annotation:annotation:1.7.0 -> 1.9.1 (*)
+          |         |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
+          |         |         \--- androidx.window:window:1.3.0 (c)
+          |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*)
+          |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.1.0 (*)
+          +--- com.composables:core:1.15.0
+          |    \--- com.composables:core-android:1.15.0
+          |         +--- androidx.activity:activity:1.9.0 -> 1.9.3 (*)
+          |         +--- androidx.activity:activity-compose:1.9.0 -> 1.9.3 (*)
+          |         +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.10 -> 2.1.0 (*)
+          |         \--- org.jetbrains.compose.foundation:foundation:1.6.11 -> 1.7.0 (*)
+          \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.25 -> 2.1.0 (*)

@mebarbosa mebarbosa modified the milestones: 7.76, 7.77 Oct 28, 2024
@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch 4 times, most recently from 8754114 to 88239cd Compare October 31, 2024 15:11
@geekygecko geekygecko modified the milestones: 7.77, 7.78 Nov 11, 2024
@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch from ba5c2ad to 52e04d7 Compare November 13, 2024 14:14
app/src/main/AndroidManifest.xml Fixed Show fixed Hide fixed
app/src/main/AndroidManifest.xml Fixed Show fixed Hide fixed
app/src/main/AndroidManifest.xml Dismissed Show dismissed Hide dismissed
@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch from 52e04d7 to 3544c49 Compare November 19, 2024 10:07
@MiSikora MiSikora modified the milestones: 7.78, 7.79 Nov 25, 2024
@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch 3 times, most recently from 2cc5183 to be90fff Compare November 27, 2024 15:45
@hamorillo hamorillo marked this pull request as ready for review November 27, 2024 16:47
@hamorillo hamorillo requested a review from a team as a code owner November 27, 2024 16:47
@hamorillo hamorillo requested review from MiSikora and removed request for a team November 27, 2024 16:47
@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch 2 times, most recently from 687759a to 3fc5f31 Compare November 28, 2024 15:30
@hamorillo hamorillo added the [Type] Feature Adding a new feature. label Nov 28, 2024
@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch from 3fc5f31 to 3fa232a Compare November 29, 2024 07:24
@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch from 3fa232a to 7cdacf0 Compare November 29, 2024 15:16
@geekygecko
Copy link
Member

geekygecko commented Nov 29, 2024

Would the Gravatar integration work better as a separate application? Keeping it within the Pocket Casts app could lead to long-term maintenance challenges. Other apps using this library are likely to face similar issues. Could we explore an alternative where we open a URL, and if the Gravatar app is installed, it launches instead of the website?

@hamorillo
Copy link
Contributor Author

hamorillo commented Dec 2, 2024

Thanks for your comments @MiSikora, @geekygecko.

Could we explore an alternative where we open a URL, and if the Gravatar app is installed

We don't have a Gravatar app (yet), so at the moment, we can't follow this approach. We can continue with the browser option, already implemented in PocketCast, but that's all.

The technical comments directly related to this PR have already been fixed. However, you have several concerns about the Gravatar SDK's design/architectural perspective. This is great insight for us as your point of view is the same that a third-party developer can have.

Some of the points you've mentioned (ex, Theming and Browser Navigation) have been made that way on purpose, but instead of giving my personal opinion or the reasons why we did that, I prefer to move this discussion to the whole Gravatar team. At the same time, we'll analyze your size/dependency concerns.

I'll keep you updated.

@mebarbosa mebarbosa modified the milestones: 7.79, 7.80 Dec 9, 2024
@mebarbosa
Copy link
Contributor

Version 7.79 has now entered code-freeze, so the milestone of this PR has been updated to 7.80.

@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch 2 times, most recently from aa41cad to 8c38274 Compare December 11, 2024 15:11
@hamorillo
Copy link
Contributor Author

I've just found out that we are holding off on this integration for now. As I was about to ask for a second review, I'll explain the changes for the sake of history.

  • Gravatar SDK version has been updated to 2.2.0-rc1 (we haven't found any issue with the RC, so this PR would only require the bump to 2.2.0.
    With the new SDK, we solve the Drop Moshi-Kotlin and Theming. The QuickEditor bottom sheet is customized based on the light/dark attribute of the current PocketCast theme.

  • About excluding the Gravatar SDK for Wear/Automotive. As you suggested, I've followed the ffmpeg approach. I've created two modules, gravatar and gravatar-noop. The first one contains the code and the dependencies with the Gravatar SDK, and it's injected only into the App build. The noop doesn't have dependencies and is injected in Wear/Automotive builds. Gravatar SDK doesn't land in those builds right now.

The last SDK release did not address the Browser Navigation point. We are considering it, but I would say it is a lower priority than the previous ones.

Said that. I'm moving this PR to a draft. Feel free to drop any comments or suggestions about the latest changes / Gravatar SDK. I'm looking forward to it. I'll keep updating this PR with your feedback. On the other hand, if you think the current state adds value to PocketCast and makes sense to merge it, please let me know.

@hamorillo hamorillo marked this pull request as draft December 12, 2024 08:58
Copy link
Contributor

@MiSikora MiSikora left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't tested the code yet, as I'll wait until we clarify the integration status. However, after reviewing the code, I recommend redesigning the GravatarService to avoid relying on AssistedInject and to ensure it doesn't throw errors when null values are passed. A design like this could work:

interface GravatarService {
    fun registerLauncher(fragment: Fragment,  onAvatarSelected: () -> Unit): Launcher

    suspend fun logout(email: String)
    
    interface Launcher {
        fun launchQuickEditor(email: String, isLightTheme: Boolean)
        fun launchExternalQuickEditor(email: String)
    }
}

class GravatarSdkService : GravatarService {
    override fun registerLauncher(fragment: Fragment, onAvatarSelected: () -> Unit) = object : GravatarService.Launcher {
        private val nativeEditorLauncher = fragment.registerForActivityResult(GetQuickEditorResult()) { quickEditorResult ->
            when (quickEditorResult) {
                GravatarQuickEditorResult.AVATAR_SELECTED -> onAvatarSelected()
                GravatarQuickEditorResult.DISMISSED, null -> Unit
            }
        }
        private val externalEditorLauncher = fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { _ ->
            onAvatarSelected()
        }

        override fun launchQuickEditor(email: String, isLightTheme: Boolean) {
            nativeEditorLauncher.launch(
                GravatarEditorActivityArguments(
                    gravatarQuickEditorParams = GravatarQuickEditorParams {
                        this.email = Email(email)
                        avatarPickerContentLayout = AvatarPickerContentLayout.Horizontal
                        uiMode = if (isLightTheme) GravatarUiMode.LIGHT else GravatarUiMode.DARK
                    },
                    authenticationMethod = AuthenticationMethod.OAuth(
                        OAuthParams {
                            clientId = GRAVATAR_APP_ID
                            redirectUri = Gravatar.GRAVATAR_QE_REDIRECT_URL
                        },
                    ),
                ),
            )
        }

        override fun launchExternalQuickEditor(email: String) {
            externalEditorLauncher.launch(Intent(Intent.ACTION_VIEW, Uri.parse(Gravatar.getGravatarChangeAvatarUrl(email))))
        }
    }

    override suspend fun logout(email: String) = withContext(Dispatchers.IO) {
        GravatarQuickEditor.logout(email = Email(email))
    }
}

class NoOpGravatarServvice : GravatarService {
    override fun registerLauncher(fragment: Fragment, onAvatarSelected: () -> Unit) = object : GravatarService.Launcher {
        override fun launchQuickEditor(email: String, isLightTheme: Boolean) = Unit

        override fun launchExternalQuickEditor(email: String) = Unit
    }

    override suspend fun logout(email: String) = Unit
}

There’s also a broader point that requires discussion, either here or in a call. I mentioned it earlier:

Justification: Why add this SDK? The low traffic for avatar changes doesn’t seem to justify the complexity introduced by these dependencies. What are the tangible benefits?

I’d still like to understand the benefits. I wouldn’t mind adding the SDK if it were a lightweight library. However, this SDK essentially behaves as a mini-application with many dependencies, which could lead to long-term maintenance issues for us. I'm especially concerned about the presence of Compose in it.

@hamorillo
Copy link
Contributor Author

hamorillo commented Dec 12, 2024

As always, thanks for your insight @MiSikora, I'll review your technical suggestions.

As I said before, the SDK justification is a fair question; I understand your concerns. However, in my opinion, that discussion should wait until we clarify how this integration should work (that's why we converted the PR to a draft). I know people are trying to find the best way to make the integration interesting for both products.

When the user taps over "Change Avatar" the Gravatar Native QE will be shown. If it needs authorization, the OAuth screen will be opened automatically.
As it is not viable to modify the activity to use `singleTask`, we need to implement the recently added GravatarQuickEditorActivity to handle the OAuth authorization.
We were using a blocking call when it was unnecessary.
We don't want the Gravatar SDK to land in the wear/automotive builds. The Gravatar module will be the only one that depends on the Gravatar SDK so that we can inject it only in the "app" build. Similar to what we are doing with "media-ffmpeg" and "media-noop" modules.

In this commit, "wear" and "automotive" builds are broken. We need to add the "gravatar-noop" module and inject it into those modules.
Injecting the "gravatar-noop" we prevent the Gravatar SDK from landing in those builds.
@hamorillo hamorillo force-pushed the hamorillo/gravatar-qe branch from c7f8faa to ea0c2f9 Compare December 16, 2024 11:16
@dangermattic
Copy link
Collaborator

1 Message
📖 This PR is still a Draft: some checks will be skipped.

Generated by 🚫 Danger

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants