Sharesheet - Edge to edge support
Support edge-to-edge sharesheet to align with support for new gesture navigation. Use top inset to prevent sharesheet from scrolling under. Use bottom inset to give the listview space for scrolling all items into view. Bug: 132114008 Test: Visual inspection Change-Id: Ie96d19f187d32d477eaf0515463d1adf335f80ce
This commit is contained in:
@@ -235,7 +235,6 @@ public class ChooserActivity extends ResolverActivity {
|
||||
|
||||
private boolean mListViewDataChanged = false;
|
||||
|
||||
|
||||
@Retention(SOURCE)
|
||||
@IntDef({CONTENT_PREVIEW_FILE, CONTENT_PREVIEW_IMAGE, CONTENT_PREVIEW_TEXT})
|
||||
private @interface ContentPreviewType {
|
||||
@@ -2035,7 +2034,8 @@ public class ChooserActivity extends ResolverActivity {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mChooserRowAdapter.calculateChooserTargetWidth(right - left)
|
||||
int availableWidth = right - left - v.getPaddingLeft() - v.getPaddingRight();
|
||||
if (mChooserRowAdapter.calculateChooserTargetWidth(availableWidth)
|
||||
|| mAdapterView.getAdapter() == null) {
|
||||
mAdapterView.setAdapter(mChooserRowAdapter);
|
||||
|
||||
@@ -2044,7 +2044,9 @@ public class ChooserActivity extends ResolverActivity {
|
||||
return;
|
||||
}
|
||||
|
||||
int offset = 0;
|
||||
final int bottomInset = mSystemWindowInsets != null
|
||||
? mSystemWindowInsets.bottom : 0;
|
||||
int offset = bottomInset;
|
||||
int rowsToShow = mChooserRowAdapter.getContentPreviewRowCount()
|
||||
+ mChooserRowAdapter.getProfileRowCount()
|
||||
+ mChooserRowAdapter.getServiceTargetRowCount()
|
||||
@@ -2059,7 +2061,7 @@ public class ChooserActivity extends ResolverActivity {
|
||||
// still zero? then use a default height and leave, which
|
||||
// can happen when there are no targets to show
|
||||
if (rowsToShow == 0) {
|
||||
offset = getResources().getDimensionPixelSize(
|
||||
offset += getResources().getDimensionPixelSize(
|
||||
R.dimen.chooser_max_collapsed_height);
|
||||
mResolverDrawerLayout.setCollapsibleHeightReserved(offset);
|
||||
return;
|
||||
@@ -2084,8 +2086,9 @@ public class ChooserActivity extends ResolverActivity {
|
||||
// make sure to leave room for direct share 4->8 expansion
|
||||
int requiredExpansionHeight =
|
||||
(int) (directShareHeight / DIRECT_SHARE_EXPANSION_RATE);
|
||||
int topInset = mSystemWindowInsets != null ? mSystemWindowInsets.top : 0;
|
||||
int minHeight = bottom - top - mResolverDrawerLayout.getAlwaysShowHeight()
|
||||
- requiredExpansionHeight;
|
||||
- requiredExpansionHeight - topInset - bottomInset;
|
||||
|
||||
offset = Math.min(offset, minHeight);
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.ColorMatrix;
|
||||
import android.graphics.ColorMatrixColorFilter;
|
||||
import android.graphics.Insets;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
@@ -67,12 +68,15 @@ import android.util.Slog;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewGroup.LayoutParams;
|
||||
import android.view.WindowInsets;
|
||||
import android.widget.AbsListView;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ListView;
|
||||
import android.widget.Space;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
@@ -136,6 +140,9 @@ public class ResolverActivity extends Activity {
|
||||
|
||||
private ColorMatrixColorFilter mSuspendedMatrixColorFilter;
|
||||
|
||||
protected Insets mSystemWindowInsets = null;
|
||||
private Space mFooterSpacer = null;
|
||||
|
||||
/** See {@link #setRetainInOnStop}. */
|
||||
private boolean mRetainInOnStop;
|
||||
|
||||
@@ -329,6 +336,11 @@ public class ResolverActivity extends Activity {
|
||||
if (isVoiceInteraction()) {
|
||||
rdl.setCollapsed(false);
|
||||
}
|
||||
|
||||
rdl.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
||||
rdl.setOnApplyWindowInsetsListener(this::onApplyWindowInsets);
|
||||
|
||||
mResolverDrawerLayout = rdl;
|
||||
}
|
||||
|
||||
@@ -364,10 +376,38 @@ public class ResolverActivity extends Activity {
|
||||
finish();
|
||||
}
|
||||
|
||||
protected WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
|
||||
mSystemWindowInsets = insets.getSystemWindowInsets();
|
||||
|
||||
mResolverDrawerLayout.setPadding(mSystemWindowInsets.left, mSystemWindowInsets.top,
|
||||
mSystemWindowInsets.right, 0);
|
||||
|
||||
View emptyView = findViewById(R.id.empty);
|
||||
emptyView.setPadding(0, 0, 0, mSystemWindowInsets.bottom
|
||||
+ getResources().getDimensionPixelSize(
|
||||
R.dimen.chooser_edge_margin_normal) * 2);
|
||||
|
||||
if (mFooterSpacer == null) {
|
||||
mFooterSpacer = new Space(getApplicationContext());
|
||||
} else {
|
||||
((ListView) mAdapterView).removeFooterView(mFooterSpacer);
|
||||
}
|
||||
mFooterSpacer.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,
|
||||
mSystemWindowInsets.bottom));
|
||||
((ListView) mAdapterView).addFooterView(mFooterSpacer);
|
||||
|
||||
return insets.consumeSystemWindowInsets();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
mAdapter.handlePackagesChanged();
|
||||
|
||||
if (mSystemWindowInsets != null) {
|
||||
mResolverDrawerLayout.setPadding(mSystemWindowInsets.left, mSystemWindowInsets.top,
|
||||
mSystemWindowInsets.right, 0);
|
||||
}
|
||||
}
|
||||
|
||||
private void initSuspendedColorMatrix() {
|
||||
@@ -1277,6 +1317,10 @@ public class ResolverActivity extends Activity {
|
||||
final ViewGroup buttonLayout = findViewById(R.id.button_bar);
|
||||
if (buttonLayout != null) {
|
||||
buttonLayout.setVisibility(View.VISIBLE);
|
||||
int inset = mSystemWindowInsets != null ? mSystemWindowInsets.bottom : 0;
|
||||
buttonLayout.setPadding(buttonLayout.getPaddingLeft(), buttonLayout.getPaddingTop(),
|
||||
buttonLayout.getPaddingRight(), buttonLayout.getPaddingBottom() + inset);
|
||||
|
||||
mOnceButton = (Button) buttonLayout.findViewById(R.id.button_once);
|
||||
mSettingsButton = (Button) buttonLayout.findViewById(R.id.button_app_settings);
|
||||
mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always);
|
||||
|
||||
@@ -854,12 +854,11 @@ public class ResolverDrawerLayout extends ViewGroup {
|
||||
|
||||
final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
|
||||
final int heightSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY);
|
||||
final int widthPadding = getPaddingLeft() + getPaddingRight();
|
||||
|
||||
// Currently we allot more height than is really needed so that the entirety of the
|
||||
// sheet may be pulled up.
|
||||
// TODO: Restrict the height here to be the right value.
|
||||
int heightUsed = getPaddingTop() + getPaddingBottom();
|
||||
int heightUsed = 0;
|
||||
|
||||
// Measure always-show children first.
|
||||
final int childCount = getChildCount();
|
||||
@@ -869,11 +868,11 @@ public class ResolverDrawerLayout extends ViewGroup {
|
||||
if (lp.alwaysShow && child.getVisibility() != GONE) {
|
||||
if (lp.maxHeight != -1) {
|
||||
final int remainingHeight = heightSize - heightUsed;
|
||||
measureChildWithMargins(child, widthSpec, widthPadding,
|
||||
measureChildWithMargins(child, widthSpec, 0,
|
||||
MeasureSpec.makeMeasureSpec(lp.maxHeight, MeasureSpec.AT_MOST),
|
||||
lp.maxHeight > remainingHeight ? lp.maxHeight - remainingHeight : 0);
|
||||
} else {
|
||||
measureChildWithMargins(child, widthSpec, widthPadding, heightSpec, heightUsed);
|
||||
measureChildWithMargins(child, widthSpec, 0, heightSpec, heightUsed);
|
||||
}
|
||||
heightUsed += child.getMeasuredHeight();
|
||||
}
|
||||
@@ -889,11 +888,11 @@ public class ResolverDrawerLayout extends ViewGroup {
|
||||
if (!lp.alwaysShow && child.getVisibility() != GONE) {
|
||||
if (lp.maxHeight != -1) {
|
||||
final int remainingHeight = heightSize - heightUsed;
|
||||
measureChildWithMargins(child, widthSpec, widthPadding,
|
||||
measureChildWithMargins(child, widthSpec, 0,
|
||||
MeasureSpec.makeMeasureSpec(lp.maxHeight, MeasureSpec.AT_MOST),
|
||||
lp.maxHeight > remainingHeight ? lp.maxHeight - remainingHeight : 0);
|
||||
} else {
|
||||
measureChildWithMargins(child, widthSpec, widthPadding, heightSpec, heightUsed);
|
||||
measureChildWithMargins(child, widthSpec, 0, heightSpec, heightUsed);
|
||||
}
|
||||
heightUsed += child.getMeasuredHeight();
|
||||
}
|
||||
|
||||
@@ -86,5 +86,4 @@ easier.
|
||||
<style name="Theme.DeviceDefault.Resolver" parent="Theme.DeviceDefault.ResolverCommon">
|
||||
<item name="windowLightNavigationBar">false</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1677,8 +1677,11 @@ easier.
|
||||
<item name="colorControlActivated">?attr/colorControlHighlight</item>
|
||||
<item name="listPreferredItemPaddingStart">?attr/dialogPreferredPadding</item>
|
||||
<item name="listPreferredItemPaddingEnd">?attr/dialogPreferredPadding</item>
|
||||
<item name="navigationBarColor">?attr/colorBackgroundFloating</item>
|
||||
<item name="navigationBarDividerColor">@color/chooser_row_divider</item>
|
||||
<item name="navigationBarColor">@android:color/transparent</item>
|
||||
</style>
|
||||
|
||||
<style name="Theme.DeviceDefault.Resolver" parent="Theme.DeviceDefault.ResolverCommon">
|
||||
<item name="windowLightNavigationBar">true</item>
|
||||
</style>
|
||||
|
||||
<style name="Animation.DeviceDefault.Activity.Resolver" parent="Animation.DeviceDefault.Activity">
|
||||
@@ -1689,10 +1692,6 @@ easier.
|
||||
<item name="taskOpenExitAnimation">@anim/resolver_close_anim</item>
|
||||
</style>
|
||||
|
||||
<style name="Theme.DeviceDefault.Resolver" parent="Theme.DeviceDefault.ResolverCommon">
|
||||
<item name="windowLightNavigationBar">true</item>
|
||||
</style>
|
||||
|
||||
<!-- @hide DeviceDefault themes for the autofill FillUi -->
|
||||
<style name="Theme.DeviceDefault.Autofill" />
|
||||
<style name="Theme.DeviceDefault.Light.Autofill" />
|
||||
|
||||
Reference in New Issue
Block a user