From 3826f464817b94d988e37ee81912665fd93d8bed Mon Sep 17 00:00:00 2001 From: Govinda Wasserman Date: Fri, 13 Dec 2024 19:34:20 -0500 Subject: Fix Shareousel crash when recomposing Recomposition could cause a crash when initial position was no longer in the LazyRow. This fixes it by encapsulating the problematic array indexing within the remember block so that it is only performed on the first composition when it is guaranteed to be a valid index position. Test: Manual test using ShareTest BUG: 383852288 Flag: EXEMPT Bugfix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5fd6cf8ddc2025504e322b3bb1174556a200d33b) Merged-In: Ie6b322d449ddc5c83d9d4e481967c2511b165290 Change-Id: Ie6b322d449ddc5c83d9d4e481967c2511b165290 --- .../payloadtoggle/ui/composable/ShareouselComposable.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt index 5b368084..c51021a8 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt @@ -33,9 +33,9 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.selection.toggleable import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.systemGestureExclusion @@ -130,15 +130,17 @@ private fun PreviewCarousel(previews: PreviewsModel, viewModel: ShareouselViewMo // Do not compose the list until we have measured values if (measurements == PreviewCarouselMeasurements.UNMEASURED) return@Box - val carouselState = - rememberLazyListState( - prefetchStrategy = remember { ShareouselLazyListPrefetchStrategy() }, - initialFirstVisibleItemIndex = previews.startIdx, - initialFirstVisibleItemScrollOffset = + val prefetchStrategy = remember { ShareouselLazyListPrefetchStrategy() } + val carouselState = remember { + LazyListState( + prefetchStrategy = prefetchStrategy, + firstVisibleItemIndex = previews.startIdx, + firstVisibleItemScrollOffset = measurements.scrollOffsetToCenter( previewModel = previews.previewModels[previews.startIdx] ), ) + } LazyRow( state = carouselState, -- cgit v1.2.3-59-g8ed1b From 7cf3fdd7321f8ae5d3075049068ccafe1d8c9874 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 21 Jan 2025 10:58:32 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Bug: 391337100 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:0805d58faaae95a726b6bc02ac0d3023220fca51) Merged-In: Ie7dcacfe3a27f4f29627ff2493c0661cbe739711 Change-Id: Ie7dcacfe3a27f4f29627ff2493c0661cbe739711 --- java/res/values-es/strings.xml | 2 +- java/res/values-iw/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index f7c3c0b0..7cb07c61 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -55,7 +55,7 @@ "Editar" "{count,plural, =1{+ # archivo}many{+ # archivos}other{+ # archivos}}" "{count,plural, =1{y # archivo más}many{y # archivos más}other{y # archivos más}}" - "Compartiendo texto" + "Compartir texto" "Compartiendo enlace" "{count,plural, =1{Compartiendo imagen}many{Compartiendo # imágenes}other{Compartiendo # imágenes}}" "{count,plural, =1{Compartiendo vídeo}many{Compartiendo # vídeos}other{Compartiendo # vídeos}}" diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index 3c1be527..43921c78 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/strings.xml @@ -106,5 +106,5 @@ "תמונה שניתן לבחור" "סרטון שניתן לבחור" "פריט שניתן לבחור" - "לחצן" + "כפתור" -- cgit v1.2.3-59-g8ed1b From 01fcd69f17c3a26d82ded6a24b2c7714ebaa2c38 Mon Sep 17 00:00:00 2001 From: Matt Casey Date: Thu, 6 Mar 2025 19:54:00 +0000 Subject: Fix ChooserActivityWorkProfileTest for HSUM Bug: 396877163 Test: atest ChooserActivityWorkProfileTest Flag: EXEMPT test only Change-Id: I41511b2ed722ef0864ec82e3fef21c8eab8a2206 --- .../src/com/android/intentresolver/ChooserActivityWorkProfileTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/activity/src/com/android/intentresolver/ChooserActivityWorkProfileTest.java b/tests/activity/src/com/android/intentresolver/ChooserActivityWorkProfileTest.java index 022ae2e1..5400ac6d 100644 --- a/tests/activity/src/com/android/intentresolver/ChooserActivityWorkProfileTest.java +++ b/tests/activity/src/com/android/intentresolver/ChooserActivityWorkProfileTest.java @@ -83,7 +83,8 @@ public class ChooserActivityWorkProfileTest { private static final UserHandle PERSONAL_USER_HANDLE = InstrumentationRegistry .getInstrumentation().getTargetContext().getUser(); - private static final UserHandle WORK_USER_HANDLE = UserHandle.of(10); + private static final UserHandle WORK_USER_HANDLE = + UserHandle.of(PERSONAL_USER_HANDLE.getIdentifier() + 1); @Rule(order = 0) public HiltAndroidRule mHiltAndroidRule = new HiltAndroidRule(this); -- cgit v1.2.3-59-g8ed1b From a243817683f6f5d55ad04b01e04db9c74b322df4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 6 Mar 2025 12:45:58 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I45bdb8bd0445832ec1659a75a463123f1a0210ef --- java/res/values-az/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/res/values-az/strings.xml b/java/res/values-az/strings.xml index 4bf78453..46baccee 100644 --- a/java/res/values-az/strings.xml +++ b/java/res/values-az/strings.xml @@ -111,6 +111,6 @@ "Birbaşa paylaşım hədəfləri" "Tətbiq təklifləri" "Tətbiq siyahısı" - "Mətni kopiyalayın" - "Keçidi kopiyalayın" + "Mətni kopyalayın" + "Keçidi kopyalayın" -- cgit v1.2.3-59-g8ed1b From d26c8de265a0c438a3795811cc87db61e00dd46e Mon Sep 17 00:00:00 2001 From: Matt Casey Date: Fri, 7 Mar 2025 18:29:31 +0000 Subject: HSUM fixes for IR's ResolverActivityTest Bug: 401381978 Bug: 401381771 Test: atest com.android.intentresolver.ResolverActivityTest Flag: EXEMPT test only Change-Id: If6042126b0da5b3406b24ad41f17c9928eb6877d --- .../intentresolver/ResolverActivityTest.java | 31 ++++++++++++---------- .../intentresolver/ResolverWrapperActivity.java | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/tests/activity/src/com/android/intentresolver/ResolverActivityTest.java b/tests/activity/src/com/android/intentresolver/ResolverActivityTest.java index b44f4f91..003e64fe 100644 --- a/tests/activity/src/com/android/intentresolver/ResolverActivityTest.java +++ b/tests/activity/src/com/android/intentresolver/ResolverActivityTest.java @@ -91,8 +91,11 @@ public class ResolverActivityTest { private static final UserHandle PERSONAL_USER_HANDLE = getInstrumentation().getTargetContext().getUser(); - private static final UserHandle WORK_PROFILE_USER_HANDLE = UserHandle.of(10); - private static final UserHandle CLONE_PROFILE_USER_HANDLE = UserHandle.of(11); + private static final int WORK_PROFILE_USER_ID = PERSONAL_USER_HANDLE.getIdentifier() + 1; + private static final UserHandle WORK_PROFILE_USER_HANDLE = + UserHandle.of(WORK_PROFILE_USER_ID); + private static final UserHandle CLONE_PROFILE_USER_HANDLE = + UserHandle.of(PERSONAL_USER_HANDLE.getIdentifier() + 2); private static final User WORK_PROFILE_USER = new User(WORK_PROFILE_USER_HANDLE.getIdentifier(), User.Role.WORK); @@ -267,7 +270,7 @@ public class ResolverActivityTest { @Test public void hasOtherProfileOneOption() throws Exception { List personalResolvedComponentInfos = - createResolvedComponentsForTestWithOtherProfile(2, /* userId */ 10, + createResolvedComponentsForTestWithOtherProfile(2, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false); List workResolvedComponentInfos = createResolvedComponentsForTest(4, @@ -290,7 +293,7 @@ public class ResolverActivityTest { }; // Make a stable copy of the components as the original list may be modified List stableCopy = - createResolvedComponentsForTestWithOtherProfile(2, /* userId= */ 10, + createResolvedComponentsForTestWithOtherProfile(2, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); // We pick the first one as there is another one in the work profile side onView(first(withText(stableCopy.get(1).getResolveInfoAt(0).activityInfo.name))) @@ -402,7 +405,7 @@ public class ResolverActivityTest { @Test public void testWorkTab_workTabListPopulatedBeforeGoingToTab() throws InterruptedException { List personalResolvedComponentInfos = - createResolvedComponentsForTestWithOtherProfile(3, /* userId = */ 10, + createResolvedComponentsForTestWithOtherProfile(3, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false); List workResolvedComponentInfos = createResolvedComponentsForTest(4, @@ -414,7 +417,7 @@ public class ResolverActivityTest { final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); waitForIdle(); - assertThat(activity.getCurrentUserHandle().getIdentifier(), is(0)); + assertThat(activity.getCurrentUserHandle(), is(PERSONAL_USER_HANDLE)); // The work list adapter must be populated in advance before tapping the other tab assertThat(activity.getWorkListAdapter().getCount(), is(4)); } @@ -423,7 +426,7 @@ public class ResolverActivityTest { public void testWorkTab_workTabUsesExpectedAdapter() { markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false); List personalResolvedComponentInfos = - createResolvedComponentsForTestWithOtherProfile(3, /* userId */ 10, + createResolvedComponentsForTestWithOtherProfile(3, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); List workResolvedComponentInfos = createResolvedComponentsForTest(4, WORK_PROFILE_USER_HANDLE); @@ -434,7 +437,7 @@ public class ResolverActivityTest { waitForIdle(); onView(withText(R.string.resolver_work_tab)).perform(click()); - assertThat(activity.getCurrentUserHandle().getIdentifier(), is(10)); + assertThat(activity.getCurrentUserHandle().getIdentifier(), is(WORK_PROFILE_USER_ID)); assertThat(activity.getWorkListAdapter().getCount(), is(4)); } @@ -452,7 +455,7 @@ public class ResolverActivityTest { waitForIdle(); onView(withText(R.string.resolver_work_tab)).perform(click()); - assertThat(activity.getCurrentUserHandle().getIdentifier(), is(10)); + assertThat(activity.getCurrentUserHandle().getIdentifier(), is(WORK_PROFILE_USER_ID)); assertThat(activity.getPersonalListAdapter().getCount(), is(2)); } @@ -460,7 +463,7 @@ public class ResolverActivityTest { public void testWorkTab_workProfileHasExpectedNumberOfTargets() throws InterruptedException { markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false); List personalResolvedComponentInfos = - createResolvedComponentsForTestWithOtherProfile(3, /* userId */ 10, + createResolvedComponentsForTestWithOtherProfile(3, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); List workResolvedComponentInfos = createResolvedComponentsForTest(4, WORK_PROFILE_USER_HANDLE); @@ -576,7 +579,7 @@ public class ResolverActivityTest { throws InterruptedException { markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false); List personalResolvedComponentInfos = - createResolvedComponentsForTestWithOtherProfile(3, /* userId= */ 10, + createResolvedComponentsForTestWithOtherProfile(3, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); List workResolvedComponentInfos = createResolvedComponentsForTest(4, WORK_PROFILE_USER_HANDLE); @@ -610,7 +613,7 @@ public class ResolverActivityTest { markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false); int workProfileTargets = 4; List personalResolvedComponentInfos = - createResolvedComponentsForTestWithOtherProfile(3, /* userId */ 10, + createResolvedComponentsForTestWithOtherProfile(3, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); List workResolvedComponentInfos = createResolvedComponentsForTest(workProfileTargets, WORK_PROFILE_USER_HANDLE); @@ -635,7 +638,7 @@ public class ResolverActivityTest { markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false); int workProfileTargets = 4; List personalResolvedComponentInfos = - createResolvedComponentsForTestWithOtherProfile(3, /* userId */ 10, + createResolvedComponentsForTestWithOtherProfile(3, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); List workResolvedComponentInfos = createResolvedComponentsForTest(workProfileTargets, WORK_PROFILE_USER_HANDLE); @@ -775,7 +778,7 @@ public class ResolverActivityTest { markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false); int workProfileTargets = 4; List personalResolvedComponentInfos = - createResolvedComponentsForTestWithOtherProfile(2, /* userId */ 10, + createResolvedComponentsForTestWithOtherProfile(2, WORK_PROFILE_USER_ID, PERSONAL_USER_HANDLE); List workResolvedComponentInfos = createResolvedComponentsForTest(workProfileTargets, WORK_PROFILE_USER_HANDLE); diff --git a/tests/activity/src/com/android/intentresolver/ResolverWrapperActivity.java b/tests/activity/src/com/android/intentresolver/ResolverWrapperActivity.java index 0d317dc3..169c44b0 100644 --- a/tests/activity/src/com/android/intentresolver/ResolverWrapperActivity.java +++ b/tests/activity/src/com/android/intentresolver/ResolverWrapperActivity.java @@ -119,7 +119,7 @@ public class ResolverWrapperActivity extends ResolverActivity { @Override protected ResolverListController createListController(UserHandle userHandle) { - if (userHandle == UserHandle.SYSTEM) { + if (userHandle == getUser()) { return sOverrides.resolverListController; } return sOverrides.workResolverListController; -- cgit v1.2.3-59-g8ed1b