Update the number of columns on config change in share sheet

mMaxTargetsPerRow wasn't updated in the chooser
multi profile pager adapter, this adapter sets
the number of columns in the grid layout manager.
This led to incorrect number of columns when display
size changes in runtime.

Bug: 235572712
Test: open share sheet, fold the device =>
 check that the number of columns is updated
Change-Id: I1f3f3bff8a4d23909ccd4c00b74091183c28821b
This commit is contained in:
Nick Chameyev
2022-06-10 11:10:50 +00:00
parent 4316f70825
commit 9f3eb8d046
3 changed files with 88 additions and 0 deletions

View File

@@ -1002,6 +1002,7 @@ public class ChooserActivity extends ResolverActivity implements
mShouldDisplayLandscape = shouldDisplayLandscape(newConfig.orientation);
mMaxTargetsPerRow = getResources().getInteger(R.integer.config_chooser_max_targets_per_row);
mChooserMultiProfilePagerAdapter.setMaxTargetsPerRow(mMaxTargetsPerRow);
adjustPreviewWidth(newConfig.orientation, null);
updateStickyContentPreview();
updateTabPadding();

View File

@@ -93,6 +93,10 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd
return profileDescriptor;
}
public void setMaxTargetsPerRow(int maxTargetsPerRow) {
mMaxTargetsPerRow = maxTargetsPerRow;
}
RecyclerView getListViewForIndex(int index) {
return getItem(index).recyclerView;
}

View File

@@ -84,17 +84,23 @@ import android.service.chooser.ChooserTarget;
import android.view.View;
import androidx.annotation.CallSuper;
import androidx.test.espresso.matcher.BoundedDiagnosingMatcher;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.android.internal.R;
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
import com.android.internal.app.chooser.DisplayResolveInfo;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.widget.GridLayoutManager;
import com.android.internal.widget.RecyclerView;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
@@ -1680,6 +1686,25 @@ public class ChooserActivityTest {
wrapper.getAdapter().getItem(1).getDisplayLabel(), is("testTitle1"));
}
@Test
public void testUpdateMaxTargetsPerRow_columnCountIsUpdated() throws InterruptedException {
updateMaxTargetsPerRowResource(/* targetsPerRow= */ 4);
givenAppTargets(/* appCount= */ 16);
Intent sendIntent = createSendTextIntent();
final ChooserActivity activity =
mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
updateMaxTargetsPerRowResource(/* targetsPerRow= */ 6);
InstrumentationRegistry.getInstrumentation()
.runOnMainSync(() -> activity.onConfigurationChanged(
InstrumentationRegistry.getInstrumentation()
.getContext().getResources().getConfiguration()));
waitForIdle();
onView(withIdFromRuntimeResource("resolver_list"))
.check(matches(withGridColumnCount(6)));
}
// This test is too long and too slow and should not be taken as an example for future tests.
@Test @Ignore
public void testDirectTargetLoggingWithAppTargetNotRankedPortrait()
@@ -3063,6 +3088,64 @@ public class ChooserActivityTest {
return withText(getRuntimeResourceId(id, "string"));
}
private static GridRecyclerSpanCountMatcher withGridColumnCount(int columnCount) {
return new GridRecyclerSpanCountMatcher(Matchers.is(columnCount));
}
private static class GridRecyclerSpanCountMatcher extends
BoundedDiagnosingMatcher<View, RecyclerView> {
private final Matcher<Integer> mIntegerMatcher;
private GridRecyclerSpanCountMatcher(Matcher<Integer> integerMatcher) {
super(RecyclerView.class);
this.mIntegerMatcher = integerMatcher;
}
@Override
protected void describeMoreTo(Description description) {
description.appendText("RecyclerView grid layout span count to match: ");
this.mIntegerMatcher.describeTo(description);
}
@Override
protected boolean matchesSafely(RecyclerView view, Description mismatchDescription) {
int spanCount = ((GridLayoutManager) view.getLayoutManager()).getSpanCount();
if (this.mIntegerMatcher.matches(spanCount)) {
return true;
} else {
mismatchDescription.appendText("RecyclerView grid layout span count was ")
.appendValue(spanCount);
return false;
}
}
}
private void givenAppTargets(int appCount) {
List<ResolvedComponentInfo> resolvedComponentInfos =
createResolvedComponentsForTest(appCount);
when(
ChooserActivityOverrideData
.getInstance()
.resolverListController
.getResolversForIntent(
Mockito.anyBoolean(),
Mockito.anyBoolean(),
Mockito.isA(List.class)))
.thenReturn(resolvedComponentInfos);
}
private void updateMaxTargetsPerRowResource(int targetsPerRow) {
ChooserActivityOverrideData.getInstance().resources = Mockito.spy(
InstrumentationRegistry.getInstrumentation().getContext().getResources());
when(
ChooserActivityOverrideData
.getInstance()
.resources
.getInteger(R.integer.config_chooser_max_targets_per_row))
.thenReturn(targetsPerRow);
}
// ChooserWrapperActivity inherits from the framework ChooserActivity, so if the framework
// resources have been updated since the framework was last built/pushed, the inherited behavior
// (which is the focus of our testing) will still be implemented in terms of the old resource