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

Photo picker #10141

Merged
merged 31 commits into from
Nov 14, 2023
Merged

Photo picker #10141

merged 31 commits into from
Nov 14, 2023

Conversation

0nko
Copy link
Contributor

@0nko 0nko commented Nov 9, 2023

This PR replaces local device picker with Android photo picker. This is a remedy for Google's media policy update: Photo and Video Permissions policy (READ_MEDIA_IMAGES and READ_MEDIA_VIDEO).

The PR relies on the changes in wordpress-mobile/WordPress-MediaPicker-Android#73.

photopicker.webm

To test:
The media picker is used in 4 places:

  1. Product detail (adding an image)
  2. Product creation with AI (tapping on Use package photo)
  3. Changing of package photo in the 2nd step of using the package photo flow
  4. Adding downloadable files for a virtual product

Simply trying adding a photo using the new photo picker, camera and WP media library as a media source is enough.

@wpmobilebot
Copy link
Collaborator

wpmobilebot commented Nov 9, 2023

📲 You can test the changes from this Pull Request in WooCommerce Android by scanning the QR code below to install the corresponding build.

App Name WooCommerce Android
FlavorJalapeno
Build TypeDebug
Commit878bb05
Direct Downloadwoocommerce-prototype-build-pr10141-878bb05.apk

WooCommerce/build.gradle Outdated Show resolved Hide resolved
@@ -60,3 +60,13 @@ fun <T : Any> LiveData<T?>.filterNotNull(): LiveData<T> {
}
return mediator
}

fun <T> LiveData<T>.filter(predicate: (T) -> Boolean): LiveData<T> {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This was originally a part of the MediaPicker library and was removed.

@0nko 0nko added the feature: product details Related to adding or editing products, includes product settings. label Nov 10, 2023
@0nko 0nko added this to the 16.3 milestone Nov 10, 2023
@0nko 0nko added the type: enhancement A request for an enhancement. label Nov 10, 2023
@hichamboushaba
Copy link
Member

hichamboushaba commented Nov 10, 2023

Thanks for working on this @0nko, before starting the review, do you know what triggered the many library updates in this PR? it seems it will update Compose to version 1.5.1 and navigation to 2.7.5 and other androidx libraries.

@0nko 0nko modified the milestones: 16.3, 16.2 ❄️ Nov 13, 2023
@0nko 0nko changed the base branch from trunk to release/16.2 November 13, 2023 18:49
@peril-woocommerce
Copy link

peril-woocommerce bot commented Nov 13, 2023

Warnings
⚠️ This PR is assigned to a milestone which is closing in less than 2 days Please, make sure to get it merged by then or assign it to a later expiring milestone

Generated by 🚫 dangerJS

@0nko 0nko marked this pull request as ready for review November 14, 2023 09:00
@0nko
Copy link
Contributor Author

0nko commented Nov 14, 2023

Hey @hichamboushaba, I've downgraded the dependencies to limit the amount of changes. I decided not to go with the catalogue in the MP since it's a bigger endeavour, which would be better for the infra team to handle. Plus, I looked at the versions in there and the versions are much older, so most of them would need to get overridden anyway..

@wpmobilebot
Copy link
Collaborator

Found 1 violations:

The PR caused the following dependency changes:

expand

 +--- androidx.navigation:navigation-dynamic-features-fragment:2.5.3
 |    +--- androidx.navigation:navigation-dynamic-features-runtime:2.5.3
 |    |    \--- androidx.navigation:navigation-runtime:2.5.3
 |    |         +--- androidx.activity:activity-ktx:1.5.1 -> 1.8.0
 |    |         |    +--- androidx.activity:activity:1.8.0
-|    |         |    |    +--- androidx.core:core:1.8.0 -> 1.10.1
-|    |         |    |    |    +--- androidx.annotation:annotation:1.6.0 (*)
-|    |         |    |    |    +--- androidx.annotation:annotation-experimental:1.3.0
-|    |         |    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.8.22 (*)
-|    |         |    |    |    +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
-|    |         |    |    |    +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0
-|    |         |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |    |    |    \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
-|    |         |    |    |    +--- androidx.interpolator:interpolator:1.0.0
-|    |         |    |    |    |    \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*)
-|    |         |    |    |    +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.6.2
-|    |         |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |    |    |    +--- androidx.arch.core:core-common:2.2.0
-|    |         |    |    |    |    |    \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |    |    |    +--- androidx.arch.core:core-runtime:2.2.0
-|    |         |    |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |    |    |    |    \--- androidx.arch.core:core-common:2.2.0 (*)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-common:2.6.2
-|    |         |    |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.22 (*)
-|    |         |    |    |    |    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4
-|    |         |    |    |    |    |    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
-|    |         |    |    |    |    |    |    |    \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
-|    |         |    |    |    |    |    |    |         +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
-|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
-|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
-|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
-|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4 (c)
-|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-rx3:1.6.4 (c)
-|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-reactive:1.6.4 (c)
-|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.6.4 (c)
-|    |         |    |    |    |    |    |    |         |    \--- org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.6.4 (c)
-|    |         |    |    |    |    |    |    |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.8.22
-|    |         |    |    |    |    |    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
-|    |         |    |    |    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.8.21
-|    |         |    |    |    |    |    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.8.22 (*)
-|    |         |    |    |    |    |    |         \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21
-|    |         |    |    |    |    |    |              \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.8.22 (*)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-core:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-ktx:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-process:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-runtime:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-service:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 (c)
-|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 (c)
-|    |         |    |    |    |    |    \--- androidx.lifecycle:lifecycle-common-java8:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.profileinstaller:profileinstaller:1.3.0
-|    |         |    |    |    |    |    +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*)
-|    |         |    |    |    |    |    +--- androidx.concurrent:concurrent-futures:1.1.0 (*)
-|    |         |    |    |    |    |    +--- androidx.startup:startup-runtime:1.1.1
-|    |         |    |    |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |    |    |    |    |    \--- androidx.tracing:tracing:1.0.0
-|    |         |    |    |    |    |    |         \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |    |    |    |    \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
-|    |         |    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.22 (*)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-common:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-core:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-ktx:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-process:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-service:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 (c)
-|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 (c)
-|    |         |    |    |    |    \--- androidx.lifecycle:lifecycle-common-java8:2.6.2 (c)
-|    |         |    |    |    +--- androidx.versionedparcelable:versionedparcelable:1.1.1
-|    |         |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |    |    |    \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
-|    |         |    |    |    \--- androidx.core:core-ktx:1.10.1 (c)
+|    |         |    |    +--- androidx.core:core:1.8.0 -> 1.12.0
+|    |         |    |    |    +--- androidx.annotation:annotation:1.6.0 (*)
+|    |         |    |    |    +--- androidx.annotation:annotation-experimental:1.3.0
+|    |         |    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.8.22 (*)
+|    |         |    |    |    +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+|    |         |    |    |    +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0
+|    |         |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |    |    |    \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+|    |         |    |    |    +--- androidx.interpolator:interpolator:1.0.0
+|    |         |    |    |    |    \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*)
+|    |         |    |    |    +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.6.2
+|    |         |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |    |    |    +--- androidx.arch.core:core-common:2.2.0
+|    |         |    |    |    |    |    \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |    |    |    +--- androidx.arch.core:core-runtime:2.2.0
+|    |         |    |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |    |    |    |    \--- androidx.arch.core:core-common:2.2.0 (*)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-common:2.6.2
+|    |         |    |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.22 (*)
+|    |         |    |    |    |    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4
+|    |         |    |    |    |    |    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+|    |         |    |    |    |    |    |    |    \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+|    |         |    |    |    |    |    |    |         +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4 (c)
+|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-rx3:1.6.4 (c)
+|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-reactive:1.6.4 (c)
+|    |         |    |    |    |    |    |    |         |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.6.4 (c)
+|    |         |    |    |    |    |    |    |         |    \--- org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.6.4 (c)
+|    |         |    |    |    |    |    |    |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.8.22
+|    |         |    |    |    |    |    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+|    |         |    |    |    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.8.21
+|    |         |    |    |    |    |    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.8.22 (*)
+|    |         |    |    |    |    |    |         \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21
+|    |         |    |    |    |    |    |              \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.8.22 (*)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-core:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-ktx:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-process:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-runtime:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-service:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 (c)
+|    |         |    |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 (c)
+|    |         |    |    |    |    |    \--- androidx.lifecycle:lifecycle-common-java8:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.profileinstaller:profileinstaller:1.3.0
+|    |         |    |    |    |    |    +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*)
+|    |         |    |    |    |    |    +--- androidx.concurrent:concurrent-futures:1.1.0 (*)
+|    |         |    |    |    |    |    +--- androidx.startup:startup-runtime:1.1.1
+|    |         |    |    |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |    |    |    |    |    \--- androidx.tracing:tracing:1.0.0
+|    |         |    |    |    |    |    |         \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |    |    |    |    \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+|    |         |    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.22 (*)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-common:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-core:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-livedata-ktx:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-process:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-service:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 (c)
+|    |         |    |    |    |    +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 (c)
+|    |         |    |    |    |    \--- androidx.lifecycle:lifecycle-common-java8:2.6.2 (c)
+|    |         |    |    |    +--- androidx.versionedparcelable:versionedparcelable:1.1.1
+|    |         |    |    |    |    +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |    |    |    \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+|    |         |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 (*)
+|    |         |    |    |    \--- androidx.core:core-ktx:1.12.0 (c)
 |    |         |    |    \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.6.2
-|    |         |    |         \--- androidx.core:core-ktx:1.2.0 -> 1.10.1
-|    |         |    |              +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
-|    |         |    |              +--- androidx.core:core:1.10.1 (*)
-|    |         |    |              +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.22 (*)
-|    |         |    |              \--- androidx.core:core:1.10.1 (c)
+|    |         |    |         \--- androidx.core:core-ktx:1.2.0 -> 1.12.0
+|    |         |    |              +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+|    |         |    |              +--- androidx.core:core:1.12.0 (*)
+|    |         |    |              +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 (*)
+|    |         |    |              \--- androidx.core:core:1.12.0 (c)
-|    |         |    \--- androidx.core:core-ktx:1.9.0 -> 1.10.1 (*)
+|    |         |    \--- androidx.core:core-ktx:1.9.0 -> 1.12.0 (*)
 |    |         \--- androidx.navigation:navigation-common:2.5.3
-|    |              \--- androidx.core:core-ktx:1.1.0 -> 1.10.1 (*)
+|    |              \--- androidx.core:core-ktx:1.1.0 -> 1.12.0 (*)
 |    \--- androidx.navigation:navigation-fragment:2.5.3
 |         +--- androidx.fragment:fragment-ktx:1.5.4 -> 1.6.1
-|         |    +--- androidx.core:core-ktx:1.2.0 -> 1.10.1 (*)
+|         |    +--- androidx.core:core-ktx:1.2.0 -> 1.12.0 (*)
 |         |    \--- androidx.fragment:fragment:1.6.1
-|         |         +--- androidx.core:core-ktx:1.2.0 -> 1.10.1 (*)
+|         |         +--- androidx.core:core-ktx:1.2.0 -> 1.12.0 (*)
 |         |         +--- androidx.loader:loader:1.0.0
-|         |         |    \--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|         |         |    \--- androidx.core:core:1.0.0 -> 1.12.0 (*)
 |         |         \--- androidx.viewpager:viewpager:1.0.0
-|         |              +--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|         |              +--- androidx.core:core:1.0.0 -> 1.12.0 (*)
 |         |              \--- androidx.customview:customview:1.0.0 -> 1.1.0
-|         |                   \--- androidx.core:core:1.3.0 -> 1.10.1 (*)
+|         |                   \--- androidx.core:core:1.3.0 -> 1.12.0 (*)
 |         \--- androidx.slidingpanelayout:slidingpanelayout:1.2.0
-|              +--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|              +--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 |              +--- androidx.window:window:1.0.0
-|              |    \--- androidx.core:core:1.3.2 -> 1.10.1 (*)
+|              |    \--- androidx.core:core:1.3.2 -> 1.12.0 (*)
 |              \--- androidx.transition:transition:1.4.1
-|                   \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|                   \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 +--- com.google.firebase:firebase-messaging-ktx -> 23.0.6
 |    +--- com.google.android.gms:play-services-basement:18.0.0 -> 18.1.0
-|    |    \--- androidx.core:core:1.2.0 -> 1.10.1 (*)
+|    |    \--- androidx.core:core:1.2.0 -> 1.12.0 (*)
 |    \--- com.google.firebase:firebase-messaging:23.0.6
 |         +--- com.google.android.gms:play-services-base:18.0.1 -> 18.1.0
-|         |    \--- androidx.core:core:1.2.0 -> 1.10.1 (*)
+|         |    \--- androidx.core:core:1.2.0 -> 1.12.0 (*)
 |         \--- com.google.android.gms:play-services-stats:17.0.2
 |              \--- androidx.legacy:legacy-support-core-utils:1.0.0
-|                   \--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|                   \--- androidx.core:core:1.0.0 -> 1.12.0 (*)
 +--- com.google.firebase:firebase-analytics-ktx -> 21.1.0
 |    \--- com.google.firebase:firebase-analytics:21.1.0
 |         \--- com.google.android.gms:play-services-measurement:21.1.0
 |              \--- com.google.android.gms:play-services-measurement-impl:21.1.0
-|                   \--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|                   \--- androidx.core:core:1.0.0 -> 1.12.0 (*)
-+--- androidx.core:core-ktx:1.8.0 -> 1.10.1 (*)
++--- androidx.core:core-ktx:1.8.0 -> 1.12.0 (*)
 +--- androidx.constraintlayout:constraintlayout:2.1.4
 |    +--- androidx.appcompat:appcompat:1.2.0 -> 1.4.2
-|    |    +--- androidx.core:core:1.7.0 -> 1.10.1 (*)
+|    |    +--- androidx.core:core:1.7.0 -> 1.12.0 (*)
 |    |    +--- androidx.appcompat:appcompat-resources:1.4.2
-|    |    |    +--- androidx.core:core:1.0.1 -> 1.10.1 (*)
+|    |    |    +--- androidx.core:core:1.0.1 -> 1.12.0 (*)
 |    |    |    \--- androidx.vectordrawable:vectordrawable:1.1.0
-|    |    |         \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    |    |         \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 |    |    +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1
-|    |    |    \--- androidx.core:core:1.2.0 -> 1.10.1 (*)
+|    |    |    \--- androidx.core:core:1.2.0 -> 1.12.0 (*)
 |    |    +--- androidx.emoji2:emoji2:1.0.0 -> 1.3.0
-|    |    |    \--- androidx.core:core:1.3.0 -> 1.10.1 (*)
+|    |    |    \--- androidx.core:core:1.3.0 -> 1.12.0 (*)
 |    |    \--- androidx.emoji2:emoji2-views-helper:1.0.0 -> 1.3.0
-|    |         \--- androidx.core:core:1.3.0 -> 1.10.1 (*)
+|    |         \--- androidx.core:core:1.3.0 -> 1.12.0 (*)
-|    \--- androidx.core:core:1.3.2 -> 1.10.1 (*)
+|    \--- androidx.core:core:1.3.2 -> 1.12.0 (*)
 +--- androidx.recyclerview:recyclerview:1.2.1
-|    \--- androidx.core:core:1.3.2 -> 1.10.1 (*)
+|    \--- androidx.core:core:1.3.2 -> 1.12.0 (*)
 +--- androidx.recyclerview:recyclerview-selection:1.1.0
-|    \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 +--- com.google.android.material:material:1.6.1
 |    +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0
-|    |    \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    |    \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
-|    +--- androidx.core:core:1.5.0 -> 1.10.1 (*)
+|    +--- androidx.core:core:1.5.0 -> 1.12.0 (*)
 |    +--- androidx.dynamicanimation:dynamicanimation:1.0.0
-|    |    \--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|    |    \--- androidx.core:core:1.0.0 -> 1.12.0 (*)
 |    \--- androidx.viewpager2:viewpager2:1.0.0
-|         \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|         \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 +--- androidx.browser:browser:1.5.0
-|    \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 +--- androidx.preference:preference:1.2.0
-|    \--- androidx.core:core:1.6.0 -> 1.10.1 (*)
+|    \--- androidx.core:core:1.6.0 -> 1.12.0 (*)
 +--- androidx.work:work-runtime-ktx:2.7.1
 |    \--- androidx.work:work-runtime:2.7.1
-|         +--- androidx.core:core:1.6.0 -> 1.10.1 (*)
+|         +--- androidx.core:core:1.6.0 -> 1.12.0 (*)
-|         \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|         \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 +--- org.wordpress:utils:3.5.0
 |    +--- androidx.swiperefreshlayout:swiperefreshlayout:1.1.0
-|    |    \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    |    \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
-|    \--- androidx.core:core-ktx:1.5.0 -> 1.10.1 (*)
+|    \--- androidx.core:core-ktx:1.5.0 -> 1.12.0 (*)
 +--- com.automattic:Automattic-Tracks-Android:3.2.0
 |    \--- io.sentry:sentry-android -> 6.18.1
 |         \--- io.sentry:sentry-android-core:6.18.1
-|              \--- androidx.core:core:1.3.2 -> 1.10.1 (*)
+|              \--- androidx.core:core:1.3.2 -> 1.12.0 (*)
 +--- org.wordpress:login:1.8.0
 |    +--- androidx.media:media:1.2.1
-|    |    \--- androidx.core:core:1.3.0 -> 1.10.1 (*)
+|    |    \--- androidx.core:core:1.3.0 -> 1.12.0 (*)
 |    +--- androidx.legacy:legacy-support-v13:1.0.0
 |    |    \--- androidx.legacy:legacy-support-v4:1.0.0
-|    |         +--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|    |         +--- androidx.core:core:1.0.0 -> 1.12.0 (*)
 |    |         \--- androidx.legacy:legacy-support-core-ui:1.0.0
-|    |              +--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|    |              +--- androidx.core:core:1.0.0 -> 1.12.0 (*)
 |    |              \--- androidx.asynclayoutinflater:asynclayoutinflater:1.0.0
-|    |                   \--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|    |                   \--- androidx.core:core:1.0.0 -> 1.12.0 (*)
 |    +--- androidx.gridlayout:gridlayout:1.0.0
-|    |    \--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|    |    \--- androidx.core:core:1.0.0 -> 1.12.0 (*)
-|    \--- androidx.core:core-ktx:1.3.2 -> 1.10.1 (*)
+|    \--- androidx.core:core-ktx:1.3.2 -> 1.12.0 (*)
 +--- project :libs:cardreader
 |    \--- com.stripe:stripeterminal-localmobile:2.21.1
-|         \--- androidx.core:core-ktx:1.10.1 (*)
+|         \--- androidx.core:core-ktx:1.10.1 -> 1.12.0 (*)
 +--- com.automattic:about:0.0.6
-|    +--- androidx.core:core-ktx:1.7.0 -> 1.10.1 (*)
+|    +--- androidx.core:core-ktx:1.7.0 -> 1.12.0 (*)
 |    +--- androidx.compose.ui:ui:1.0.5 -> 1.4.3
 |    |    +--- androidx.autofill:autofill:1.0.0
-|    |    |    \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    |    |    \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 |    |    +--- androidx.compose.ui:ui-text:1.4.3
-|    |    |    \--- androidx.core:core:1.7.0 -> 1.10.1 (*)
+|    |    |    \--- androidx.core:core:1.7.0 -> 1.12.0 (*)
-|    |    +--- androidx.core:core:1.9.0 -> 1.10.1 (*)
+|    |    +--- androidx.core:core:1.9.0 -> 1.12.0 (*)
 |    |    \--- androidx.customview:customview-poolingcontainer:1.0.0
-|    |         \--- androidx.core:core-ktx:1.5.0 -> 1.10.1 (*)
+|    |         \--- androidx.core:core-ktx:1.5.0 -> 1.12.0 (*)
 |    +--- androidx.compose.ui:ui-tooling:1.0.5 -> 1.4.3
 |    |    \--- androidx.compose.animation:animation:1.4.3
 |    |         \--- androidx.compose.foundation:foundation-layout:1.2.1 -> 1.4.3
-|    |              \--- androidx.core:core:1.7.0 -> 1.10.1 (*)
+|    |              \--- androidx.core:core:1.7.0 -> 1.12.0 (*)
 |    \--- com.google.android.material:compose-theme-adapter:1.1.1
-|         \--- androidx.core:core-ktx:1.3.1 -> 1.10.1 (*)
+|         \--- androidx.core:core-ktx:1.3.1 -> 1.12.0 (*)
 +--- com.google.android.gms:play-services-code-scanner:16.0.0-beta3
 |    \--- com.google.mlkit:barcode-scanning-common:17.0.0
 |         \--- com.google.mlkit:vision-common:17.0.0 -> 17.3.0
 |              \--- com.google.mlkit:common:18.6.0 -> 18.9.0
-|                   \--- androidx.core:core:1.0.0 -> 1.10.1 (*)
+|                   \--- androidx.core:core:1.0.0 -> 1.12.0 (*)
 +--- com.zendesk:support:5.0.8
 |    \--- com.zendesk:guide:1.0.7
 |         \--- com.zendesk:messaging:5.2.3
 |              \--- com.zendesk:common-ui:4.0.3
 |                   \--- com.zendesk.belvedere2:belvedere:3.0.0-RC
 |                        +--- com.zendesk.belvedere2:belvedere-core:3.0.0-RC
-|                        |    \--- androidx.core:core:1.3.1 -> 1.10.1 (*)
+|                        |    \--- androidx.core:core:1.3.1 -> 1.12.0 (*)
-|                        \--- androidx.core:core:1.3.1 -> 1.10.1 (*)
+|                        \--- androidx.core:core:1.3.1 -> 1.12.0 (*)
-+--- org.wordpress:mediapicker:0.2
-|    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.6.10 -> 1.8.21 (*)
-|    +--- org.wordpress.mediapicker:domain:0.2
-|    |    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.6.10 -> 1.8.21 (*)
-|    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.8.21 (*)
-|    |    +--- androidx.core:core-ktx:1.7.0 -> 1.10.1 (*)
-|    |    \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.4 (*)
-|    +--- androidx.databinding:viewbinding:8.1.0 (*)
-|    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.8.21 (*)
-|    +--- com.google.android.material:material:1.5.0 -> 1.6.1 (*)
-|    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.4 (*)
-|    +--- androidx.navigation:navigation-fragment-ktx:2.3.5 -> 2.5.3 (*)
-|    +--- androidx.core:core-ktx:1.7.0 -> 1.10.1 (*)
-|    +--- androidx.appcompat:appcompat:1.4.1 -> 1.4.2 (*)
-|    +--- androidx.constraintlayout:constraintlayout:2.1.1 -> 2.1.4 (*)
-|    +--- androidx.swiperefreshlayout:swiperefreshlayout:1.1.0 (*)
-|    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0 -> 2.6.2 (*)
-|    +--- androidx.datastore:datastore-preferences:1.0.0 (*)
-|    +--- com.github.bumptech.glide:glide:4.12.0 -> 4.13.2 (*)
-|    +--- com.google.dagger:hilt-android:2.42 -> 2.45 (*)
-|    +--- com.google.dagger:hilt-android-compiler:2.42
-|    |    +--- com.google.dagger:dagger:2.42 -> 2.46.1 (*)
-|    |    +--- com.google.dagger:dagger-compiler:2.42
-|    |    |    +--- com.google.dagger:dagger:2.42 -> 2.46.1 (*)
-|    |    |    +--- com.google.dagger:dagger-producers:2.42
-|    |    |    |    +--- com.google.dagger:dagger:2.42 -> 2.46.1 (*)
-|    |    |    |    +--- com.google.guava:failureaccess:1.0.1
-|    |    |    |    +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*)
-|    |    |    |    +--- javax.inject:javax.inject:1
-|    |    |    |    \--- org.checkerframework:checker-compat-qual:2.5.5
-|    |    |    +--- com.google.dagger:dagger-spi:2.42
-|    |    |    |    +--- com.google.dagger:dagger:2.42 -> 2.46.1 (*)
-|    |    |    |    +--- com.google.dagger:dagger-producers:2.42 (*)
-|    |    |    |    +--- com.google.code.findbugs:jsr305:3.0.2
-|    |    |    |    +--- com.google.devtools.ksp:symbol-processing-api:1.5.30-1.0.0
-|    |    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.30 -> 1.8.21 (*)
-|    |    |    |    +--- com.google.guava:failureaccess:1.0.1
-|    |    |    |    +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*)
-|    |    |    |    +--- com.squareup:javapoet:1.13.0
-|    |    |    |    +--- javax.inject:javax.inject:1
-|    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.8.22 (*)
-|    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.32 -> 1.8.21 (*)
-|    |    |    +--- com.google.code.findbugs:jsr305:3.0.2
-|    |    |    +--- com.google.googlejavaformat:google-java-format:1.5
-|    |    |    |    +--- com.google.guava:guava:22.0 -> 31.1-android (*)
-|    |    |    |    \--- com.google.errorprone:javac-shaded:9-dev-r4023-3
-|    |    |    +--- com.google.guava:failureaccess:1.0.1
-|    |    |    +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*)
-|    |    |    +--- com.squareup:javapoet:1.13.0
-|    |    |    +--- javax.inject:javax.inject:1
-|    |    |    +--- net.ltgt.gradle.incap:incap:0.2
-|    |    |    +--- org.checkerframework:checker-compat-qual:2.5.5
-|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.8.22 (*)
-|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.32 -> 1.8.21 (*)
-|    |    |    \--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.4.2
-|    |    |         \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.8.22 (*)
-|    |    +--- com.google.dagger:dagger-spi:2.42 (*)
-|    |    +--- com.google.code.findbugs:jsr305:3.0.2
-|    |    +--- com.google.guava:failureaccess:1.0.1
-|    |    +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*)
-|    |    +--- com.squareup:javapoet:1.13.0
-|    |    +--- javax.annotation:jsr250-api:1.0
-|    |    +--- javax.inject:javax.inject:1
-|    |    +--- net.ltgt.gradle.incap:incap:0.2
-|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.8.22 (*)
-|    |    \--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.4.2 (*)
-|    \--- com.github.chrisbanes:PhotoView:2.3.0 (*)
++--- org.wordpress:mediapicker:trunk-10f3b7d3aeb31bb0bacacde3d9fc2456c09105a9
+|    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.8.21 (*)
+|    +--- com.google.android.material:material:1.6.1 (*)
+|    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+|    +--- androidx.navigation:navigation-fragment-ktx:2.5.3 (*)
+|    +--- androidx.core:core-ktx:1.12.0 (*)
+|    +--- androidx.appcompat:appcompat:1.4.2 (*)
+|    +--- androidx.constraintlayout:constraintlayout:2.1.4 (*)
+|    +--- androidx.swiperefreshlayout:swiperefreshlayout:1.1.0 (*)
+|    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 (*)
+|    +--- androidx.datastore:datastore-preferences:1.0.0 (*)
+|    +--- com.github.bumptech.glide:glide:4.13.2 (*)
+|    +--- com.google.dagger:hilt-android:2.45 (*)
+|    +--- com.google.dagger:hilt-android-compiler:2.45
+|    |    +--- com.google.dagger:dagger:2.45 -> 2.46.1 (*)
+|    |    +--- com.google.dagger:dagger-compiler:2.45
+|    |    |    +--- com.google.dagger:dagger:2.45 -> 2.46.1 (*)
+|    |    |    +--- com.google.dagger:dagger-producers:2.45
+|    |    |    |    +--- com.google.dagger:dagger:2.45 -> 2.46.1 (*)
+|    |    |    |    +--- com.google.guava:failureaccess:1.0.1
+|    |    |    |    +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*)
+|    |    |    |    +--- javax.inject:javax.inject:1
+|    |    |    |    \--- org.checkerframework:checker-compat-qual:2.5.5
+|    |    |    +--- com.google.dagger:dagger-spi:2.45
+|    |    |    |    +--- com.google.dagger:dagger:2.45 -> 2.46.1 (*)
+|    |    |    |    +--- com.google.dagger:dagger-producers:2.45 (*)
+|    |    |    |    +--- com.google.code.findbugs:jsr305:3.0.2
+|    |    |    |    +--- com.google.devtools.ksp:symbol-processing-api:1.7.0-1.0.6
+|    |    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.8.22 (*)
+|    |    |    |    +--- com.google.guava:failureaccess:1.0.1
+|    |    |    |    +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*)
+|    |    |    |    +--- com.squareup:javapoet:1.13.0
+|    |    |    |    +--- com.squareup:kotlinpoet:1.11.0
+|    |    |    |    |    +--- org.jetbrains.kotlin:kotlin-reflect:1.6.10
+|    |    |    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.8.22 (*)
+|    |    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.8.21 (*)
+|    |    |    |    +--- javax.inject:javax.inject:1
+|    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.8.22 (*)
+|    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0 -> 1.8.21 (*)
+|    |    |    +--- com.google.code.findbugs:jsr305:3.0.2
+|    |    |    +--- com.google.devtools.ksp:symbol-processing-api:1.7.0-1.0.6 (*)
+|    |    |    +--- com.google.googlejavaformat:google-java-format:1.5
+|    |    |    |    +--- com.google.guava:guava:22.0 -> 31.1-android (*)
+|    |    |    |    \--- com.google.errorprone:javac-shaded:9-dev-r4023-3
+|    |    |    +--- com.google.guava:failureaccess:1.0.1
+|    |    |    +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*)
+|    |    |    +--- com.squareup:javapoet:1.13.0
+|    |    |    +--- javax.inject:javax.inject:1
+|    |    |    +--- net.ltgt.gradle.incap:incap:0.2
+|    |    |    +--- org.checkerframework:checker-compat-qual:2.5.5
+|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.8.22 (*)
+|    |    |    \--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0
+|    |    |         \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.8.22 (*)
+|    |    +--- com.google.dagger:dagger-spi:2.45 (*)
+|    |    +--- com.google.code.findbugs:jsr305:3.0.2
+|    |    +--- com.google.guava:failureaccess:1.0.1
+|    |    +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*)
+|    |    +--- com.squareup:javapoet:1.13.0
+|    |    +--- javax.annotation:javax.annotation-api:1.3.2
+|    |    +--- javax.inject:javax.inject:1
+|    |    +--- net.ltgt.gradle.incap:incap:0.2
+|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.8.22 (*)
+|    |    \--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0 (*)
+|    +--- com.github.chrisbanes:PhotoView:2.3.0 (*)
+|    +--- org.wordpress:utils:2.6.0 -> 3.5.0 (*)
+|    +--- org.wordpress.mediapicker:domain:trunk-10f3b7d3aeb31bb0bacacde3d9fc2456c09105a9
+|    |    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.8.21 (*)
+|    |    +--- androidx.core:core-ktx:1.12.0 (*)
+|    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+|    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 (*)
+|    +--- androidx.databinding:viewbinding:8.1.0 (*)
+|    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 (*)
++--- org.wordpress.mediapicker:source-camera:trunk-10f3b7d3aeb31bb0bacacde3d9fc2456c09105a9
+|    +--- org.wordpress.mediapicker:domain:trunk-10f3b7d3aeb31bb0bacacde3d9fc2456c09105a9 (*)
+|    +--- androidx.core:core-ktx:1.12.0 (*)
+|    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 (*)
-+--- org.wordpress.mediapicker:source-device:0.2
-|    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.6.10 -> 1.8.21 (*)
-|    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.8.21 (*)
-|    +--- org.wordpress.mediapicker:domain:0.2 (*)
-|    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.4 (*)
-|    +--- com.google.dagger:hilt-android:2.42 -> 2.45 (*)
-|    \--- com.google.dagger:hilt-android-compiler:2.42 (*)
-+--- org.wordpress.mediapicker:source-wordpress:0.2
-|    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.6.10 -> 1.8.21 (*)
-|    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.8.21 (*)
-|    +--- org.wordpress.mediapicker:domain:0.2 (*)
-|    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.4 (*)
-|    +--- com.google.dagger:hilt-android:2.42 -> 2.45 (*)
-|    \--- com.google.dagger:hilt-android-compiler:2.42 (*)
++--- org.wordpress.mediapicker:source-wordpress:trunk-10f3b7d3aeb31bb0bacacde3d9fc2456c09105a9
+|    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.8.21 (*)
+|    +--- org.wordpress.mediapicker:domain:trunk-10f3b7d3aeb31bb0bacacde3d9fc2456c09105a9 (*)
+|    +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+|    +--- com.google.dagger:hilt-android:2.45 (*)
+|    +--- com.google.dagger:hilt-android-compiler:2.45 (*)
+|    +--- org.wordpress:utils:2.6.0 -> 3.5.0 (*)
+|    +--- org.wordpress:fluxc:trunk-7ea7465680431fa4df5f0433d4c8b8395055b997 -> 2.55.0 (*)
+|    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 (*)
 +--- androidx.compose.ui:ui-text-google-fonts -> 1.4.3
-|    \--- androidx.core:core:1.8.0 -> 1.10.1 (*)
+|    \--- androidx.core:core:1.8.0 -> 1.12.0 (*)
 +--- com.google.accompanist:accompanist-systemuicontroller:0.23.1
-|    \--- androidx.core:core-ktx:1.7.0 -> 1.10.1 (*)
+|    \--- androidx.core:core-ktx:1.7.0 -> 1.12.0 (*)
 +--- io.coil-kt:coil-compose:2.1.0
 |    \--- io.coil-kt:coil-compose-base:2.1.0
 |         +--- io.coil-kt:coil-base:2.1.0
-|         |    \--- androidx.core:core-ktx:1.7.0 -> 1.10.1 (*)
+|         |    \--- androidx.core:core-ktx:1.7.0 -> 1.12.0 (*)
-|         \--- androidx.core:core-ktx:1.7.0 -> 1.10.1 (*)
+|         \--- androidx.core:core-ktx:1.7.0 -> 1.12.0 (*)
 +--- io.coil-kt:coil-svg:2.1.0
-|    \--- androidx.core:core-ktx:1.7.0 -> 1.10.1 (*)
+|    \--- androidx.core:core-ktx:1.7.0 -> 1.12.0 (*)
 +--- androidx.camera:camera-camera2:1.2.3
 |    +--- androidx.camera:camera-core:1.2.3
-|    |    \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    |    \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
-|    \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 +--- androidx.camera:camera-lifecycle:1.2.3
-|    \--- androidx.core:core:1.1.0 -> 1.10.1 (*)
+|    \--- androidx.core:core:1.1.0 -> 1.12.0 (*)
 \--- androidx.camera:camera-view:1.2.3
-     \--- androidx.core:core:1.3.2 -> 1.10.1 (*)
+     \--- androidx.core:core:1.3.2 -> 1.12.0 (*)

Please review and act accordingly

@JorgeMucientes JorgeMucientes self-assigned this Nov 14, 2023
@@ -94,9 +94,9 @@ data class Product(
@Parcelize
data class Image(
val id: Long,
val name: String,
val name: String?,
Copy link
Member

Choose a reason for hiding this comment

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

What's the cause of this change and the similar one below @0nko?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

An update in the FluxC library: wordpress-mobile/WordPress-FluxC-Android#2886

Copy link
Member

Choose a reason for hiding this comment

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

Thanks @0nko for the clariffication, I was confused because we updated the repo to align with this FluxC change a while ago #10078, but now I understand, this is caused by this commit wordpress-mobile/WordPress-MediaPicker-Android@9629167

@@ -112,7 +112,7 @@ ext {
materialVersion = '1.6.1'
hiltJetpackVersion = '1.0.0'
wordPressUtilsVersion = '3.5.0'
mediapickerVersion = '0.2'
mediapickerVersion = 'trunk-10f3b7d3aeb31bb0bacacde3d9fc2456c09105a9'
Copy link
Contributor

@JorgeMucientes JorgeMucientes Nov 14, 2023

Choose a reason for hiding this comment

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

I'm getting a crash when runnning the app from trunk and then switching to this PR branch and launching the app:

java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number. Expected identity hash: 1e3ad3f4fb750ae397a8fee0c724ed14, found: 46e29ce7aa2fba81c03063031e265024
	at androidx.room.RoomOpenHelper.checkIdentity(RoomOpenHelper.kt:147)
	at androidx.room.RoomOpenHelper.onOpen(RoomOpenHelper.kt:128)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onOpen(FrameworkSQLiteOpenHelper.kt:287)
	at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:427)
	at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:316)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableOrReadableDatabase(FrameworkSQLiteOpenHelper.kt:232)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.innerGetDatabase(FrameworkSQLiteOpenHelper.kt:190)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getSupportDatabase(FrameworkSQLiteOpenHelper.kt:151)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.kt:104)
	at androidx.room.RoomDatabase.inTransaction(RoomDatabase.kt:638)
	at androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.kt:457)
	at androidx.room.RoomDatabase.query(RoomDatabase.kt:486)
	at androidx.room.util.DBUtil.query(DBUtil.kt:75)
	at org.wordpress.android.fluxc.persistence.dao.TopPerformerProductsDao_Impl$5.call(TopPerformerProductsDao_Impl.java:190)
	at org.wordpress.android.fluxc.persistence.dao.TopPerformerProductsDao_Impl$5.call(TopPerformerProductsDao_Impl.java:187)

Unsure if it might be related to the fact that media picker latest version is relying on a different version of FluxC than the app? It's also weird that the crash is related to TopPerformerProductsDao as it seems that class hasn't been updated recently.

  • Media pickas FluxC: wordPressFluxCVersion = 'trunk-7ea7465680431fa4df5f0433d4c8b8395055b997'
  • App FluxC: fluxCVersion = '2.55.0'

Never mind I don't think that is the reason for the crash. However I'm still unsure what the reason is as the DB version (30) doesn't change when swtiching between trunk branch and feature/android-photo-picker

Copy link
Contributor Author

@0nko 0nko Nov 14, 2023

Choose a reason for hiding this comment

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

I saw this too. It seems like the WCAndroidDatabase schema (30.json) was updated multiple times. So you'd get this crash if you already had a previous modification of the same version installed. However, the users won't see it so it should be fine.

Copy link
Member

@hichamboushaba hichamboushaba Nov 14, 2023

Choose a reason for hiding this comment

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

@JorgeMucientes I think this is still safe, this could be because FluxC in trunk points to a PR commit and not trunk

fluxCVersion = '2874-591479f60ddcf1aad966a6711fcafcb4aee8f849'

This PR was based on an old branch, and the DB version on it is still 28 https://github.com/wordpress-mobile/WordPress-FluxC-Android/blob/7b8facfecb23bae16146ca31d008054828940e0d/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/persistence/WCAndroidDatabase.kt#L60

Since the version was updated in the release branch, this should be safe now, but we need to ask the developers to pay attention to this, it happened multiple times recently.

The commit I linked above was the wrong one, it seems it's still version 30 in the correct one https://github.com/wordpress-mobile/WordPress-FluxC-Android/blob/591479f60ddcf1aad966a6711fcafcb4aee8f849/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/persistence/WCAndroidDatabase.kt#L66

This invalidates my theory above, I'm not sure what's the cause of the crash.

For additional information, the crash happened to me too, but it doesn't occur when updating from 16.1 to 16.2.

Copy link
Member

Choose a reason for hiding this comment

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

I missed @0nko's comment before posting my reply above, I agree that the changes to the schema are the cause, and this happened because a PR was merged to trunk that points to a FluxC PR instead of trunk (so same as the above theory) #10094, so in between of the next update to trunk, we were using a non final schema version.

@JorgeMucientes
Copy link
Contributor

Hey @0nko thanks for tackling this! Great job! I've tested all the media picker use cases from a clean install and everything works well.
There's a crash that's happening when upgrading the app from trunk build to building the app from feature/android-photo-picker. I left a comment. However, I'm still unsure why it's happening because it seems the DB schema from the FluxC version used in trunk -> 2874-591479f60ddcf1aad966a6711fcafcb4aee8f849 and the one used in feature/android-photo-picker -> 2.55.0 has not changed.

@wpmobilebot
Copy link
Collaborator

2 Warnings
⚠️ This PR is larger than 300 lines of changes. Please consider splitting it into smaller PRs for easier and faster reviews.
⚠️ This PR is assigned to the milestone 16.2 ❄️. The due date for this milestone has already passed.
Please make sure to get it merged by then or assign it to a milestone with a later deadline.

Generated by 🚫 Danger

@0nko
Copy link
Contributor Author

0nko commented Nov 14, 2023

@JorgeMucientes Thanks for the review! I just added one more use case that I forgot about - the downloads for a virtual product.

@JorgeMucientes JorgeMucientes merged commit c90cd66 into release/16.2 Nov 14, 2023
2 checks passed
@JorgeMucientes JorgeMucientes deleted the feature/android-photo-picker branch November 14, 2023 12:22
mediaTypes = EVERYTHING
)
is PickMediaFileFromDevice -> mediaPickerHelper.showMediaPicker(
source = SYSTEM_PICKER,
Copy link
Member

Choose a reason for hiding this comment

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

@0nko can't we use the Photo picker here? I think it would work and would offer a better change of success, then the Documents event will use the default system picker, WDYT?

In the event the Photo Picker won't work, it would be better to stop splitting the two entries here, and just offer one entry for picking any file type from the device, as both of them use the SYSTEM_PICKER.

For context: the split was needed just to keep using the internal media picker for media files.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The photo picker doesn't support audio files (MEDIA = IMAGES + VIDEOS + AUDIO). So I chose the system picker instead.

Copy link
Member

Choose a reason for hiding this comment

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

Good point, I still it would be still great to use the Photo picker fro images and videos, so maybe we can include Audio files as part of the Documents option, WDYT?

@@ -17,6 +17,10 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission
Copy link
Member

Choose a reason for hiding this comment

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

Sorry I missed this, I think we need to move this to be specific to release builds (in a separate PR), otherwise it might break automated screenshots that rely on the permission

<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature: product details Related to adding or editing products, includes product settings. type: enhancement A request for an enhancement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants