WordPress-Android icon indicating copy to clipboard operation
WordPress-Android copied to clipboard

Implement Gravatar QuickEditor

Open AdamGrzybkowski opened this issue 1 year ago β€’ 5 comments

This PR implements the QuickEditor from the Gravatar SDK. It fully replaces the Avatar update flow, including uploading already existing photos or new ones from the camera.

A few things worth noting:

  • One of Gravatar's compose dependencies bumps the foundation library. This caused the WP build to fail because a few things got deprecated. These issues were fixed in https://github.com/wordpress-mobile/WordPress-Android/commit/5b1adac3c25f43908889e1c99c3603e47a6db8d1. If you would prefer, I can update the compose BOM (only this specific artifact) and apply those changes in a separate PR.
  • Gravatar uses UCrop like the WP app. We found an issue though, where the cropped image size (file size) is not changed. We've tried to fix that in UCrop (PR) but things aren't moving fast there, so we released the Automattic fork with the fix applied. I had to update WP to the Automattic version to not cause conflicts.

Here's how the QuickEditor looks like in WP

https://github.com/user-attachments/assets/f4488cf1-76d9-4e2b-815b-37dbb2528a64


To Test:


Regression Notes

  1. Potential unintended areas of impact

    • TODO
  2. What I did to test those areas of impact (or what existing automated tests I relied on)

    • TODO
  3. What automated tests I added (or what prevented me from doing so)

    • TODO

PR Submission Checklist:

  • [ ] I have completed the Regression Notes.
  • [ ] I have considered adding accessibility improvements for my changes.
  • [ ] I have considered if this change warrants user-facing release notes and have added them to RELEASE-NOTES.txt if necessary.

Testing Checklist (strike-out the not-applying and unnecessary ones):

  • [ ] WordPress.com sites and self-hosted Jetpack sites.
  • [ ] Portrait and landscape orientations.
  • [ ] Light and dark modes.
  • [ ] Fonts: Larger, smaller and bold text.
  • [ ] High contrast.
  • [ ] Talkback.
  • [ ] Languages with large words or with letters/accents not frequently used in English.
  • [ ] Right-to-left languages. (Even if translation isn’t complete, formatting should still respect the right-to-left layout)
  • [ ] Large and small screen sizes. (Tablet and smaller phones)
  • [ ] Multi-tasking: Split screen and Pop-up view. (Android 10 or higher)

AdamGrzybkowski avatar Oct 18 '24 12:10 AdamGrzybkowski

1 Warning
:warning: Class GravatarQuickEditorFeatureConfig is missing tests, but unit-tests-exemption label was set to ignore this.

Generated by :no_entry_sign: Danger

dangermattic avatar Oct 18 '24 12:10 dangermattic

Project dependencies changes

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

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.datastore:datastore:1.1.1
androidx.datastore:datastore-android:1.1.1
androidx.datastore:datastore-core:1.1.1
androidx.datastore:datastore-core-android:1.1.1
androidx.datastore:datastore-core-okio:1.1.1
androidx.datastore:datastore-core-okio-jvm:1.1.1
androidx.datastore:datastore-preferences:1.1.1
androidx.datastore:datastore-preferences-android:1.1.1
androidx.datastore:datastore-preferences-core:1.1.1
androidx.datastore:datastore-preferences-core-jvm:1.1.1
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.gravatar:gravatar-quickeditor:2.0.1
com.gravatar:gravatar-ui:2.0.1
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
org.jetbrains.compose.foundation:foundation:1.6.11

Removed Dependencies
com.github.yalantis:ucrop:2.2.9

Upgraded Dependencies
androidx.window:window:1.3.0, (changed from 1.0.0)
com.google.crypto.tink:tink-android:1.13.0, (changed from 1.5.0)
tree
 +--- androidx.navigation:navigation-compose:2.8.4
-|    +--- androidx.activity:activity-compose:1.8.0 -> 1.9.3
-|    |    \--- androidx.compose.runtime:runtime:1.0.1 -> 1.7.5
-|    |         \--- androidx.compose.runtime:runtime-android:1.7.5
-|    |              \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.21
-|    |                   \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 (*)
 |    +--- androidx.navigation:navigation-runtime-ktx:2.8.4
 |    |    \--- androidx.navigation:navigation-common-ktx:2.8.4
 |    |         \--- androidx.navigation:navigation-common:2.8.4
 |    |              \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3
 |    |                   \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3
-|    |                        \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22 -> 2.0.21 (*)
+|    |                        \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22 -> 2.0.21
+|    |                             \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 (*)
 +--- project :libs:analytics
 |    \--- 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.0.21 (*)
-|                   +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.8.1 (*)
-|                   +--- 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.0.21 (*)
+|                   +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
+|                   +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*)
+|                   \--- androidx.window:window-core:1.3.0 (c)
 +--- project :libs:image-editor
+|    \--- 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.annotation:annotation:1.2.0 -> 1.9.1 (*)
+|         +--- androidx.transition:transition:1.4.1 -> 1.5.0 (*)
+|         \--- com.squareup.okhttp3:okhttp:3.12.13 -> 4.12.0 (*)
-|    \--- com.github.yalantis:ucrop:2.2.9
-|         +--- androidx.exifinterface:exifinterface:1.3.6 -> 1.3.7
-|         |    \--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*)
-|         +--- androidx.transition:transition:1.4.1 -> 1.5.0 (*)
-|         \--- com.squareup.okhttp3:okhttp:3.12.13 -> 4.12.0 (*)
 +--- project :libs:fluxc
 |    \--- androidx.security:security-crypto:1.0.0
-|         \--- com.google.crypto.tink:tink-android:1.5.0
+|         \--- com.google.crypto.tink:tink-android:1.5.0 -> 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 -> 2.11.0 (*)
+|              \--- com.google.errorprone:error_prone_annotations:2.22.0 -> 2.27.0
-+--- com.github.yalantis:ucrop:2.2.9 (*)
-+--- androidx.compose:compose-bom:2024.11.00
-|    +--- androidx.compose.animation:animation:1.7.5 (c)
-|    +--- androidx.compose.foundation:foundation:1.7.5 (c)
-|    +--- androidx.compose.foundation:foundation-layout:1.7.5 (c)
-|    +--- androidx.compose.material:material:1.7.5 (c)
-|    +--- androidx.compose.material3:material3:1.3.1 (c)
-|    +--- androidx.compose.runtime:runtime:1.7.5 (c)
-|    +--- androidx.compose.runtime:runtime-livedata:1.7.5 (c)
-|    +--- androidx.compose.runtime:runtime-saveable:1.7.5 (c)
-|    +--- androidx.compose.ui:ui:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-graphics:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-text:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-tooling:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-tooling-preview:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-unit:1.7.5 (c)
-|    +--- androidx.compose.material3:material3-android:1.3.1 (c)
-|    +--- androidx.compose.animation:animation-android:1.7.5 (c)
-|    +--- androidx.compose.foundation:foundation-android:1.7.5 (c)
-|    +--- androidx.compose.foundation:foundation-layout-android:1.7.5 (c)
-|    +--- androidx.compose.material:material-android:1.7.5 (c)
-|    +--- androidx.compose.runtime:runtime-android:1.7.5 (c)
-|    +--- androidx.compose.runtime:runtime-saveable-android:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-android:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-graphics-android:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-text-android:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-tooling-android:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-tooling-preview-android:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-unit-android:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-util:1.7.5 (c)
-|    +--- androidx.compose.animation:animation-core:1.7.5 (c)
-|    +--- androidx.compose.material:material-icons-core:1.7.5 (c)
-|    +--- androidx.compose.material:material-ripple:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-geometry:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-tooling-data:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-util-android:1.7.5 (c)
-|    +--- androidx.compose.animation:animation-core-android:1.7.5 (c)
-|    +--- androidx.compose.material:material-icons-core-android:1.7.5 (c)
-|    +--- androidx.compose.material:material-ripple-android:1.7.5 (c)
-|    +--- androidx.compose.ui:ui-geometry-android:1.7.5 (c)
-|    \--- androidx.compose.ui:ui-tooling-data-android:1.7.5 (c)
++--- com.gravatar:gravatar-quickeditor:2.0.1
+|    +--- com.gravatar:gravatar:2.0.1 (*)
+|    +--- com.gravatar:gravatar-ui:2.0.1
+|    |    +--- 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-compose-base:2.7.0
+|    |    |    |    +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*)
+|    |    |    |    +--- com.google.accompanist:accompanist-drawablepainter:0.32.0 (*)
+|    |    |    |    +--- io.coil-kt:coil-base:2.7.0
+|    |    |    |    |    +--- androidx.annotation:annotation:1.7.1 -> 1.9.1 (*)
+|    |    |    |    |    +--- androidx.appcompat:appcompat-resources:1.6.1 -> 1.7.0 (*)
+|    |    |    |    |    +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*)
+|    |    |    |    |    +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*)
+|    |    |    |    |    +--- androidx.exifinterface:exifinterface:1.3.7 (*)
+|    |    |    |    |    +--- androidx.profileinstaller:profileinstaller:1.3.1 -> 1.4.0 (*)
+|    |    |    |    |    +--- androidx.lifecycle:lifecycle-runtime:2.7.0 -> 2.8.7 (*)
+|    |    |    |    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1 (*)
+|    |    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.0.21 (*)
+|    |    |    |    |    +--- com.squareup.okhttp3:okhttp:4.12.0 (*)
+|    |    |    |    |    \--- com.squareup.okio:okio:3.9.0 (*)
+|    |    |    |    +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.5 (*)
+|    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.0.21 (*)
+|    |    |    +--- io.coil-kt:coil:2.7.0
+|    |    |    |    +--- io.coil-kt:coil-base:2.7.0 (*)
+|    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.0.21 (*)
+|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.0.21 (*)
+|    |    +--- 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.0.21 (*)
+|    |    +--- com.gravatar:gravatar:2.0.1 (*)
+|    |    +--- androidx.compose:compose-bom:2024.02.00 -> 2024.11.00
+|    |    |    +--- androidx.compose.animation:animation:1.7.5 (c)
+|    |    |    +--- androidx.compose.foundation:foundation:1.7.5 (c)
+|    |    |    +--- androidx.compose.foundation:foundation-layout:1.7.5 (c)
+|    |    |    +--- androidx.compose.material:material:1.7.5 (c)
+|    |    |    +--- androidx.compose.material3:material3:1.3.1 (c)
+|    |    |    +--- androidx.compose.material3.adaptive:adaptive:1.0.0 (c)
+|    |    |    +--- androidx.compose.runtime:runtime:1.7.5 (c)
+|    |    |    +--- androidx.compose.runtime:runtime-livedata:1.7.5 (c)
+|    |    |    +--- androidx.compose.runtime:runtime-saveable:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-graphics:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-text:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-tooling:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-tooling-preview:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-unit:1.7.5 (c)
+|    |    |    +--- androidx.compose.material3:material3-android:1.3.1 (c)
+|    |    |    +--- androidx.compose.material3.adaptive:adaptive-android:1.0.0 (c)
+|    |    |    +--- androidx.compose.animation:animation-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.foundation:foundation-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.foundation:foundation-layout-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.material:material-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.runtime:runtime-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.runtime:runtime-saveable-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-graphics-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-text-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-tooling-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-tooling-preview-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-unit-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-util:1.7.5 (c)
+|    |    |    +--- androidx.compose.animation:animation-core:1.7.5 (c)
+|    |    |    +--- androidx.compose.material:material-icons-core:1.7.5 (c)
+|    |    |    +--- androidx.compose.material:material-ripple:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-geometry:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-tooling-data:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-util-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.animation:animation-core-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.material:material-icons-core-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.material:material-ripple-android:1.7.5 (c)
+|    |    |    +--- androidx.compose.ui:ui-geometry-android:1.7.5 (c)
+|    |    |    \--- androidx.compose.ui:ui-tooling-data-android:1.7.5 (c)
+|    |    +--- androidx.compose.ui:ui -> 1.7.5 (*)
+|    |    +--- androidx.compose.ui:ui-tooling-preview -> 1.7.5 (*)
+|    |    +--- androidx.compose.material3:material3 -> 1.3.1
+|    |    |    \--- androidx.compose.material3:material3-android:1.3.1
+|    |    |         +--- androidx.activity:activity-compose:1.8.2 -> 1.9.3 (*)
+|    |    |         +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
+|    |    |         +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+|    |    |         +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*)
+|    |    |         +--- androidx.compose.animation:animation-core:1.6.0 -> 1.7.5 (*)
+|    |    |         +--- androidx.compose.foundation:foundation:1.7.0 -> 1.7.5 (*)
+|    |    |         +--- androidx.compose.foundation:foundation-layout:1.7.0 -> 1.7.5 (*)
+|    |    |         +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.7.5
+|    |    |         |    \--- androidx.compose.material:material-icons-core-android:1.7.5
+|    |    |         |         +--- androidx.compose.ui:ui:1.6.0 -> 1.7.5 (*)
+|    |    |         |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
+|    |    |         |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.21 (*)
+|    |    |         +--- androidx.compose.material:material-ripple:1.7.0 -> 1.7.5 (*)
+|    |    |         +--- androidx.compose.runtime:runtime:1.7.0 -> 1.7.5 (*)
+|    |    |         +--- androidx.compose.ui:ui:1.6.0 -> 1.7.5 (*)
+|    |    |         +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.5 (*)
+|    |    |         +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.5 (*)
+|    |    |         +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.7 (*)
+|    |    |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.21 (*)
+|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.25 -> 2.0.21 (*)
+|    +--- 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.1 -> 2.8.4 (*)
+|    +--- 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-preferences:1.1.1 (c)
+|    |    |    |    +--- io.github.osipxd:encrypted-datastore:1.1.1-beta03 (c)
+|    |    |    |    +--- androidx.datastore:datastore-preferences-core:1.1.1 (c)
+|    |    |    |    +--- androidx.datastore:datastore:1.1.1 (c)
+|    |    |    |    \--- androidx.datastore:datastore-core:1.1.1 (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.0.21 (*)
+|    |    |    |    +--- androidx.datastore:datastore-core:1.1.1
+|    |    |    |    |    \--- androidx.datastore:datastore-core-android:1.1.1
+|    |    |    |    |         +--- androidx.annotation:annotation:1.7.0 -> 1.9.1 (*)
+|    |    |    |    |         +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.22 -> 2.0.21 (*)
+|    |    |    |    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
+|    |    |    |    |         +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*)
+|    |    |    |    |         +--- androidx.datastore:datastore:1.1.1 (c)
+|    |    |    |    |         +--- androidx.datastore:datastore-core-okio:1.1.1 (c)
+|    |    |    |    |         +--- androidx.datastore:datastore-preferences:1.1.1 (c)
+|    |    |    |    |         \--- androidx.datastore:datastore-preferences-core:1.1.1 (c)
+|    |    |    |    \--- com.google.crypto.tink:tink-android:1.13.0 (*)
+|    |    |    +--- androidx.datastore:datastore-preferences-core:1.1.1
+|    |    |    |    \--- androidx.datastore:datastore-preferences-core-jvm:1.1.1
+|    |    |    |         +--- androidx.datastore:datastore-core:1.1.1 (*)
+|    |    |    |         +--- androidx.datastore:datastore-core-okio:1.1.1
+|    |    |    |         |    \--- androidx.datastore:datastore-core-okio-jvm:1.1.1
+|    |    |    |         |         +--- androidx.datastore:datastore-core:1.1.1 (*)
+|    |    |    |         |         +--- com.squareup.okio:okio:3.4.0 -> 3.9.0 (*)
+|    |    |    |         |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
+|    |    |    |         |         +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*)
+|    |    |    |         |         +--- 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)
+|    |    |    |         +--- com.squareup.okio:okio:3.4.0 -> 3.9.0 (*)
+|    |    |    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
+|    |    |    |         +--- androidx.datastore:datastore:1.1.1 (c)
+|    |    |    |         +--- androidx.datastore:datastore-core:1.1.1 (c)
+|    |    |    |         +--- androidx.datastore:datastore-core-okio:1.1.1 (c)
+|    |    |    |         \--- androidx.datastore:datastore-preferences:1.1.1 (c)
+|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.0.21 (*)
+|    |    +--- 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.datastore:datastore-android:1.1.1
+|    |    |    |         +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*)
+|    |    |    |         +--- androidx.datastore:datastore-core:1.1.1 (*)
+|    |    |    |         +--- androidx.datastore:datastore-core-okio:1.1.1 (*)
+|    |    |    |         +--- com.squareup.okio:okio:3.4.0 -> 3.9.0 (*)
+|    |    |    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
+|    |    |    |         +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*)
+|    |    |    |         +--- androidx.datastore:datastore-core:1.1.1 (c)
+|    |    |    |         +--- androidx.datastore:datastore-core-okio:1.1.1 (c)
+|    |    |    |         +--- androidx.datastore:datastore-preferences:1.1.1 (c)
+|    |    |    |         \--- androidx.datastore:datastore-preferences-core:1.1.1 (c)
+|    |    |    +--- androidx.security:security-crypto:1.0.0 (*)
+|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.0.21 (*)
+|    |    +--- androidx.datastore:datastore-preferences:1.1.1
+|    |    |    \--- androidx.datastore:datastore-preferences-android:1.1.1
+|    |    |         +--- androidx.datastore:datastore:1.1.1 (*)
+|    |    |         +--- androidx.datastore:datastore-preferences-core:1.1.1 (*)
+|    |    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
+|    |    |         +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*)
+|    |    |         +--- androidx.datastore:datastore:1.1.1 (c)
+|    |    |         +--- androidx.datastore:datastore-core:1.1.1 (c)
+|    |    |         +--- androidx.datastore:datastore-preferences-core:1.1.1 (c)
+|    |    |         \--- androidx.datastore:datastore-core-okio:1.1.1 (c)
+|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.0.21 (*)
+|    +--- 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.compose:compose-bom:2024.02.00 -> 2024.11.00 (*)
+|    +--- androidx.compose.ui:ui -> 1.7.5 (*)
+|    +--- androidx.compose.ui:ui-tooling-preview -> 1.7.5 (*)
+|    +--- androidx.compose.material3:material3 -> 1.3.1 (*)
+|    +--- 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.5 (*)
+|    |         +--- androidx.compose.ui:ui-geometry:1.6.5 -> 1.7.5 (*)
+|    |         +--- 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.0.21 (*)
+|    |         |         \--- androidx.window:window:1.3.0 (c)
+|    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
+|    |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.21 (*)
+|    +--- 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.0.21 (*)
+|    |         \--- org.jetbrains.compose.foundation:foundation:1.6.11
+|    |              \--- androidx.compose.foundation:foundation:1.6.7 -> 1.7.5 (*)
+|    \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.25 -> 2.0.21 (*)
++--- com.automattic:ucrop:2.2.10 (*)
++--- androidx.compose:compose-bom:2024.11.00 (*)
-+--- io.coil-kt:coil-compose:2.7.0
-|    +--- io.coil-kt:coil-compose-base:2.7.0
-|    |    +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*)
-|    |    +--- com.google.accompanist:accompanist-drawablepainter:0.32.0 (*)
-|    |    +--- io.coil-kt:coil-base:2.7.0
-|    |    |    +--- androidx.annotation:annotation:1.7.1 -> 1.9.1 (*)
-|    |    |    +--- androidx.appcompat:appcompat-resources:1.6.1 -> 1.7.0 (*)
-|    |    |    +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*)
-|    |    |    +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*)
-|    |    |    +--- androidx.exifinterface:exifinterface:1.3.7 (*)
-|    |    |    +--- androidx.profileinstaller:profileinstaller:1.3.1 -> 1.4.0 (*)
-|    |    |    +--- androidx.lifecycle:lifecycle-runtime:2.7.0 -> 2.8.7 (*)
-|    |    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1 (*)
-|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.0.21 (*)
-|    |    |    +--- com.squareup.okhttp3:okhttp:4.12.0 (*)
-|    |    |    \--- com.squareup.okio:okio:3.9.0 (*)
-|    |    +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.5 (*)
-|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.0.21 (*)
-|    +--- io.coil-kt:coil:2.7.0
-|    |    +--- io.coil-kt:coil-base:2.7.0 (*)
-|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.0.21 (*)
-|    \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.0.21 (*)
++--- io.coil-kt:coil-compose:2.7.0 (*)
-\--- androidx.compose.material3:material3:1.3.1
-     \--- androidx.compose.material3:material3-android:1.3.1
-          +--- androidx.activity:activity-compose:1.8.2 -> 1.9.3 (*)
-          +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*)
-          +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
-          +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*)
-          +--- androidx.compose.animation:animation-core:1.6.0 -> 1.7.5 (*)
-          +--- androidx.compose.foundation:foundation:1.7.0 -> 1.7.5 (*)
-          +--- androidx.compose.foundation:foundation-layout:1.7.0 -> 1.7.5 (*)
-          +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.7.5
-          |    \--- androidx.compose.material:material-icons-core-android:1.7.5
-          |         +--- androidx.compose.ui:ui:1.6.0 -> 1.7.5 (*)
-          |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.21 (*)
-          |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.21 (*)
-          +--- androidx.compose.material:material-ripple:1.7.0 -> 1.7.5 (*)
-          +--- androidx.compose.runtime:runtime:1.7.0 -> 1.7.5 (*)
-          +--- androidx.compose.ui:ui:1.6.0 -> 1.7.5 (*)
-          +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.5 (*)
-          +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.5 (*)
-          +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.7 (*)
-          \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.21 (*)
+\--- androidx.compose.material3:material3:1.3.1 (*)

wpmobilebot avatar Oct 18 '24 12:10 wpmobilebot

JetpackπŸ“² You can test the changes from this Pull Request in Jetpack by scanning the QR code below to install the corresponding build.
App NameJetpack Jetpack
FlavorJalapeno
Build TypeDebug
Versionpr21312-9d32788
Commit9d3278828c1308e30de015148e6d11fc770b1c0e
Direct Downloadjetpack-prototype-build-pr21312-9d32788.apk
Note: Google Login is not supported on these builds.

wpmobilebot avatar Oct 18 '24 12:10 wpmobilebot

WordPressπŸ“² You can test the changes from this Pull Request in WordPress by scanning the QR code below to install the corresponding build.
App NameWordPress WordPress
FlavorJalapeno
Build TypeDebug
Versionpr21312-9d32788
Commit9d3278828c1308e30de015148e6d11fc770b1c0e
Direct Downloadwordpress-prototype-build-pr21312-9d32788.apk
Note: Google Login is not supported on these builds.

wpmobilebot avatar Oct 18 '24 12:10 wpmobilebot

I added unit-tests-exemption label because Danger was complaining about the lack of tests for GravatarQuickEditorFeatureConfig. From what I've checked, those types of classes are not tested in the WP repo.

AdamGrzybkowski avatar Oct 28 '24 13:10 AdamGrzybkowski

There seems to be some kind of Lint issue with the navigation-compose library from the QuickEditor... I will mark it as a draft until I figure it out.

AdamGrzybkowski avatar Oct 29 '24 10:10 AdamGrzybkowski

Codecov Report

All modified and coverable lines are covered by tests :white_check_mark:

Project coverage is 38.44%. Comparing base (835f19a) to head (9d32788). Report is 65 commits behind head on trunk.

Additional details and impacted files
@@            Coverage Diff             @@
##            trunk   #21312      +/-   ##
==========================================
- Coverage   39.49%   38.44%   -1.05%     
==========================================
  Files        2119      599    -1520     
  Lines       99459    28944   -70515     
  Branches    15285     3729   -11556     
==========================================
- Hits        39277    11128   -28149     
+ Misses      56701    16799   -39902     
+ Partials     3481     1017    -2464     

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

codecov[bot] avatar Oct 30 '24 10:10 codecov[bot]

The QuickEditor is very nice! I have some feedback on it that's separate from this PR.

If I deny camera permission then try to take a photo, I see this dialog. This is fine, but it would be nicer if the dialog enabled the user to go directly to the app settings.

permission

The QuickEditor has a "Done" button at the top left which seems odd to me. A standard X button seems better.

done

After I tap an image to make it my profile photo, there's a two-second delay before I see the toast informing me the photo was updated. Is there a way to provide immediate feedback? Also, the wording "May take a few minutes to appear everywhere" seems clipped. Should that be "It may take a few minutes to appear everywhere"?

https://github.com/user-attachments/assets/674b03ec-ea33-47da-815b-4d0ddce2ca77

nbradbury avatar Oct 30 '24 12:10 nbradbury

If I deny camera permission then try to take a photo, I see this dialog. This is fine, but it would be nicer if the dialog enabled the user to go directly to the app settings.

That makes sense, I will see what can we do here from an SDK perspective. Issue created - https://github.com/Automattic/Gravatar-SDK-Android/issues/422

The QuickEditor has a "Done" button at the top left which seems odd to me. A standard X button seems better.

We followed the designs, but yeah in the Android world an x is more common, I think. Will talk with the team.

After I tap an image to make it my profile photo, there's a two-second delay before I see the toast informing me the photo was updated. I see the toast informing me the photo was updated. Is there a way to provide immediate feedback?

We show the confirmation when the avatar is updated. We could assume a positive result and do that instantly, but we opted for a progress indicator instead. Have you missed it?

Also, the wording "May take a few minutes to appear everywhere" seems clipped. Should that be "It may take a few minutes to appear everywhere"?

Yes, thanks for catching that! Issue - https://github.com/Automattic/Gravatar-SDK-Android/issues/423

AdamGrzybkowski avatar Oct 30 '24 12:10 AdamGrzybkowski

We could assume a positive result and do that instantly, but we opted for a progress indicator instead. Have you missed it?

Oh, yes - I did miss the progress indicator. It's a bit subtle, but I confess to not having super vision so it's likely my fault I missed it :)

nbradbury avatar Oct 30 '24 13:10 nbradbury

Oh, yes - I did miss the progress indicator. It's a bit subtle, but I confess to not having super vision so it's likely my fault I missed it :)

I think we can work on a better contrast there as well. Thanks for the feedback!

AdamGrzybkowski avatar Oct 30 '24 13:10 AdamGrzybkowski

@hamorillo When you have time, would you mind reviewing and testing this integration? πŸ™

AdamGrzybkowski avatar Nov 12 '24 13:11 AdamGrzybkowski

πŸ’‘ I wonder if, after switching avatars, we should keep the forceRefresh enabled after every onResume to avoid the following case:

https://github.com/user-attachments/assets/0c5df3fc-30e2-4c7c-9a7e-550c13b575f4

Appart from that, LGTM!

hamorillo avatar Nov 12 '24 14:11 hamorillo

Another minor detail (which probably is easy to say but more complicated to fix) is that we are not updating the avatar in the bottom bar:

image

hamorillo avatar Nov 12 '24 14:11 hamorillo

Another minor detail (which probably is easy to say but more complicated to fix) is that we are not updating the avatar in the bottom bar:

I know about this, but this issue was there before. So it should be tackled separately as it's not directly tied to the QE.

AdamGrzybkowski avatar Nov 13 '24 09:11 AdamGrzybkowski

πŸ’‘ I wonder if, after switching avatars, we should keep the forceRefresh enabled after every onResume to avoid the following case:

I think we should, it's a bit annoying because the forceRefresh becomes the new default πŸ™„

AdamGrzybkowski avatar Nov 13 '24 09:11 AdamGrzybkowski

I think we should, it's a bit annoying because the forceRefresh becomes the new default πŸ™„

I agree it's a pain. In this case, we can only enable it after switching avatars, which won't be very common. :(

hamorillo avatar Nov 13 '24 10:11 hamorillo

I agree it's a pain. In this case, we can only enable it after switching avatars, which won't be very common. :(

I think I was able to solve this without using the forceRefresh too often. There's this bitmap cache that is used to store the Avatar so I'm now caching a new bitmap for the avatarUrl (without the force refresh random string query part) when a new one was selected.

@hamorillo Can you try it?

AdamGrzybkowski avatar Nov 13 '24 14:11 AdamGrzybkowski

@nbradbury Could you give me access to Firebase or tell me which tests have failed? I'm running tests locally, but those that failed seem to be unrelated to my changes so I wonder if different ones failed on CI.

AdamGrzybkowski avatar Nov 13 '24 16:11 AdamGrzybkowski

Could you give me access to Firebase or tell me which tests have failed?

@AdamGrzybkowski I'm not sure I can give you access to Firebase. @wzieba @ParaskP7 Is this something you can do?

I'm running tests locally, but those that failed seem to be unrelated to my changes so I wonder if different ones failed on CI.

You're right, it's the e2ee tests that are failing, which are unrelated. I'll do a rebuild in CI and see if that fixes the problem.

Update: Rebuilding solved the problem. Apologies for the false alarm!

nbradbury avatar Nov 13 '24 18:11 nbradbury

@nbradbury Thanks! I rerun the build yesterday but it failed again. I guess some external factors were in play.

AdamGrzybkowski avatar Nov 14 '24 08:11 AdamGrzybkowski

@AdamGrzybkowski I'm not sure I can give you access to Firebase. @wzieba @ParaskP7 Is this something you can do?

Hey @AdamGrzybkowski @nbradbury , thanks for the ping, you would need to post a System Request for Firebase access (example: pMz3w-c9y-p2).

ParaskP7 avatar Nov 14 '24 08:11 ParaskP7

@ParaskP7 No need for that. It seems like these were some flaky tests and I no longer need access to Firebase to check them.

AdamGrzybkowski avatar Nov 14 '24 08:11 AdamGrzybkowski