Implement Gravatar QuickEditor
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
-
Potential unintended areas of impact
- TODO
-
What I did to test those areas of impact (or what existing automated tests I relied on)
- TODO
-
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.txtif 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)
| 1 Warning | |
|---|---|
| :warning: | Class GravatarQuickEditorFeatureConfig is missing tests, but unit-tests-exemption label was set to ignore this. |
Generated by :no_entry_sign: Danger
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 (*)
π² You can test the changes from this Pull Request in Jetpack by scanning the QR code below to install the corresponding build.
| App Name | Jetpack |
|
| Flavor | Jalapeno | |
| Build Type | Debug | |
| Version | pr21312-9d32788 | |
| Commit | 9d3278828c1308e30de015148e6d11fc770b1c0e | |
| Direct Download | jetpack-prototype-build-pr21312-9d32788.apk |
π² You can test the changes from this Pull Request in WordPress by scanning the QR code below to install the corresponding build.
| App Name | WordPress |
|
| Flavor | Jalapeno | |
| Build Type | Debug | |
| Version | pr21312-9d32788 | |
| Commit | 9d3278828c1308e30de015148e6d11fc770b1c0e | |
| Direct Download | wordpress-prototype-build-pr21312-9d32788.apk |
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.
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.
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.
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.
The QuickEditor has a "Done" button at the top left which seems odd to me. A standard X button seems better.
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
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
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 :)
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!
@hamorillo When you have time, would you mind reviewing and testing this integration? π
π‘ 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!
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:
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.
π‘ 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 π
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. :(
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?
@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.
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 Thanks! I rerun the build yesterday but it failed again. I guess some external factors were in play.
@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 No need for that. It seems like these were some flaky tests and I no longer need access to Firebase to check them.
Quality Gate passed
Issues
1 New issue
0 Accepted issues
Measures
0 Security Hotspots
0.0% Coverage on New Code
0.0% Duplication on New Code