Loading core/java/com/android/internal/app/ChooserActivity.java +70 −23 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.app.prediction.AppTarget; import android.app.prediction.AppTargetEvent; import android.app.prediction.AppTargetId; import android.content.ClipData; import android.content.ClipboardManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; Loading Loading @@ -80,11 +81,13 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Space; import android.widget.TextView; import android.widget.Toast; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -350,6 +353,50 @@ public class ChooserActivity extends ResolverActivity { super.onCreate(savedInstanceState, target, title, defaultTitleRes, initialIntents, null, false); Button copyButton = findViewById(R.id.copy_button); copyButton.setOnClickListener(view -> { Intent targetIntent = getTargetIntent(); if (targetIntent == null) { finish(); } else { final String action = targetIntent.getAction(); ClipData clipData = null; if (Intent.ACTION_SEND.equals(action)) { String extraText = targetIntent.getStringExtra(Intent.EXTRA_TEXT); Uri extraStream = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM); if (extraText != null) { clipData = ClipData.newPlainText(null, extraText); } else if (extraStream != null) { clipData = ClipData.newUri(getContentResolver(), null, extraStream); } else { Log.w(TAG, "No data available to copy to clipboard"); return; } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) { final ArrayList<Uri> streams = targetIntent.getParcelableArrayListExtra( Intent.EXTRA_STREAM); clipData = ClipData.newUri(getContentResolver(), null, streams.get(0)); for (int i = 1; i < streams.size(); i++) { clipData.addItem(getContentResolver(), new ClipData.Item(streams.get(i))); } } else { // expected to only be visible with ACTION_SEND or ACTION_SEND_MULTIPLE // so warn about unexpected action Log.w(TAG, "Action (" + action + ") not supported for copying to clipboard"); return; } ClipboardManager clipboardManager = (ClipboardManager) getSystemService( Context.CLIPBOARD_SERVICE); clipboardManager.setPrimaryClip(clipData); Toast.makeText(getApplicationContext(), R.string.copied, Toast.LENGTH_SHORT).show(); finish(); } }); MetricsLogger.action(this, MetricsEvent.ACTION_ACTIVITY_CHOOSER_SHOWN); mChooserShownTime = System.currentTimeMillis(); Loading Loading @@ -414,20 +461,19 @@ public class ChooserActivity extends ResolverActivity { private void showDefaultContentPreview(final ViewGroup parentLayout, final Intent targetIntent) { CharSequence sharingText = targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT); TextView previewTextView = findViewById(R.id.content_preview_text); if (sharingText == null) { previewTextView.setVisibility(View.GONE); findViewById(R.id.content_preview_text_layout).setVisibility(View.GONE); } else { previewTextView.setText(sharingText); TextView textView = findViewById(R.id.content_preview_text); textView.setText(sharingText); } String previewTitle = targetIntent.getStringExtra(Intent.EXTRA_TITLE); TextView previewTitleView = findViewById(R.id.content_preview_title); if (previewTitle == null) { previewTitleView.setVisibility(View.GONE); if (previewTitle == null || previewTitle.trim().isEmpty()) { findViewById(R.id.content_preview_title_layout).setVisibility(View.GONE); } else { TextView previewTitleView = findViewById(R.id.content_preview_title); previewTitleView.setText(previewTitle); } ClipData previewData = targetIntent.getClipData(); Uri previewThumbnail = null; Loading @@ -442,7 +488,7 @@ public class ChooserActivity extends ResolverActivity { if (previewThumbnail == null) { previewThumbnailView.setVisibility(View.GONE); } else { Bitmap bmp = loadThumbnail(previewThumbnail, new Size(200, 200)); Bitmap bmp = loadThumbnail(previewThumbnail, new Size(100, 100)); if (bmp == null) { previewThumbnailView.setVisibility(View.GONE); } else { Loading @@ -450,6 +496,7 @@ public class ChooserActivity extends ResolverActivity { } } } } static SharedPreferences getPinnedSharedPrefs(Context context) { // The code below is because in the android:ui process, no one can hear you scream. Loading Loading @@ -2020,8 +2067,8 @@ public class ChooserActivity extends ResolverActivity { private void updatePath(int width, int height) { mPath.reset(); int imageWidth = width - getPaddingLeft() - getPaddingRight(); int imageHeight = height - getPaddingTop() - getPaddingBottom(); int imageWidth = width - getPaddingRight(); int imageHeight = height - getPaddingBottom(); mPath.addRoundRect(getPaddingLeft(), getPaddingTop(), imageWidth, imageHeight, mRadius, mRadius, Path.Direction.CW); } Loading core/res/res/drawable/chooser_content_preview_rounded.xml 0 → 100644 +31 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2019 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="1dp" android:color="#ccc" /> <corners android:radius="@dimen/chooser_corner_radius" /> <padding android:left="16dp" android:top="12dp" android:right="16dp" android:bottom="12dp"/> </shape> core/res/res/drawable/ic_content_copy_gm2.xml 0 → 100644 +25 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2019 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="#F999" android:pathData="M18,21L4,21L4,7L2,7v14c0,1.1 0.9,2 2,2h14v-2zM21,17L21,3c0,-1.1 -0.9,-2 -2,-2L8,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2zM19,17L8,17L8,3h11v14z"/> </vector> core/res/res/layout/chooser_grid.xml +91 −66 Original line number Diff line number Diff line Loading @@ -51,60 +51,85 @@ android:textAppearance="?attr/textAppearanceMedium" android:textSize="20sp" android:gravity="center" android:paddingEnd="?attr/dialogPreferredPadding" android:paddingTop="12dp" android:paddingBottom="6dp" android:paddingTop="18dp" android:paddingBottom="18dp" android:paddingLeft="24dp" android:paddingRight="24dp" android:layout_below="@id/profile_button" android:layout_centerHorizontal="true"/> </RelativeLayout> <RelativeLayout <LinearLayout android:id="@+id/content_preview" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingBottom="@dimen/chooser_view_spacing" android:background="?attr/colorBackgroundFloating"> <view class="com.android.internal.app.ChooserActivity$RoundedRectImageView" android:id="@+id/content_preview_thumbnail" android:layout_alignParentTop="true" android:layout_width="100dp" <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="@dimen/chooser_edge_margin_normal" android:paddingRight="@dimen/chooser_edge_margin_normal" android:layout_marginBottom="@dimen/chooser_view_spacing" android:id="@+id/content_preview_text_layout"> <TextView android:id="@+id/content_preview_text" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_gravity="center_vertical" android:ellipsize="end" android:gravity="start|top" android:paddingRight="24dp" android:maxLines="2"/> <Button android:id="@+id/copy_button" android:layout_width="24dp" android:layout_height="24dp" android:gravity="center" android:adjustViewBounds="true" android:maxWidth="90dp" android:maxHeight="90dp" android:scaleType="fitCenter" android:padding="5dp"/> android:layout_gravity="center_vertical" android:background="@drawable/ic_content_copy_gm2"/> </LinearLayout> <TextView android:id="@+id/content_preview_title" android:layout_alignParentTop="true" android:layout_toEndOf="@id/content_preview_thumbnail" <!-- Required sub-layout so we can get the nice rounded corners--> <!-- around this section --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="start|top" android:textAppearance="?attr/textAppearanceMedium" android:maxLines="2" android:ellipsize="end" android:paddingStart="15dp" android:paddingEnd="15dp" android:paddingTop="10dp" /> android:orientation="horizontal" android:layout_marginLeft="@dimen/chooser_edge_margin_thin" android:layout_marginRight="@dimen/chooser_edge_margin_thin" android:minHeight="80dp" android:background="@drawable/chooser_content_preview_rounded" android:id="@+id/content_preview_title_layout"> <view class="com.android.internal.app.ChooserActivity$RoundedRectImageView" android:id="@+id/content_preview_thumbnail" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginRight="12dp" android:adjustViewBounds="true" android:layout_gravity="center_vertical" android:gravity="center" android:maxWidth="70dp" android:maxHeight="70dp" android:padding="5dp" android:scaleType="centerCrop"/> <TextView android:id="@+id/content_preview_text" android:layout_width="match_parent" android:id="@+id/content_preview_title" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:layout_below="@id/content_preview_title" android:layout_toEndOf="@id/content_preview_thumbnail" android:gravity="start|top" android:maxLines="2" android:layout_gravity="center_vertical" android:ellipsize="end" android:paddingStart="15dp" android:paddingEnd="15dp" android:paddingTop="10dp" android:paddingBottom="5dp"/> </RelativeLayout> android:maxLines="2" android:textAppearance="?attr/textAppearanceMedium"/> </LinearLayout> </LinearLayout> <ListView android:layout_width="match_parent" Loading core/res/res/values/dimens.xml +5 −2 Original line number Diff line number Diff line Loading @@ -715,6 +715,9 @@ <!-- Line spacing modifier for the message field of the harmful app dialog --> <item name="harmful_app_message_line_spacing_modifier" type="dimen">1.22</item> <!-- chooser corner radius --> <dimen name="chooser_corner_radius">4dp</dimen> <!-- chooser (sharesheet) spacing --> <dimen name="chooser_corner_radius">8dp</dimen> <dimen name="chooser_view_spacing">18dp</dimen> <dimen name="chooser_edge_margin_thin">16dp</dimen> <dimen name="chooser_edge_margin_normal">24dp</dimen> </resources> Loading
core/java/com/android/internal/app/ChooserActivity.java +70 −23 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.app.prediction.AppTarget; import android.app.prediction.AppTargetEvent; import android.app.prediction.AppTargetId; import android.content.ClipData; import android.content.ClipboardManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; Loading Loading @@ -80,11 +81,13 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Space; import android.widget.TextView; import android.widget.Toast; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -350,6 +353,50 @@ public class ChooserActivity extends ResolverActivity { super.onCreate(savedInstanceState, target, title, defaultTitleRes, initialIntents, null, false); Button copyButton = findViewById(R.id.copy_button); copyButton.setOnClickListener(view -> { Intent targetIntent = getTargetIntent(); if (targetIntent == null) { finish(); } else { final String action = targetIntent.getAction(); ClipData clipData = null; if (Intent.ACTION_SEND.equals(action)) { String extraText = targetIntent.getStringExtra(Intent.EXTRA_TEXT); Uri extraStream = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM); if (extraText != null) { clipData = ClipData.newPlainText(null, extraText); } else if (extraStream != null) { clipData = ClipData.newUri(getContentResolver(), null, extraStream); } else { Log.w(TAG, "No data available to copy to clipboard"); return; } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) { final ArrayList<Uri> streams = targetIntent.getParcelableArrayListExtra( Intent.EXTRA_STREAM); clipData = ClipData.newUri(getContentResolver(), null, streams.get(0)); for (int i = 1; i < streams.size(); i++) { clipData.addItem(getContentResolver(), new ClipData.Item(streams.get(i))); } } else { // expected to only be visible with ACTION_SEND or ACTION_SEND_MULTIPLE // so warn about unexpected action Log.w(TAG, "Action (" + action + ") not supported for copying to clipboard"); return; } ClipboardManager clipboardManager = (ClipboardManager) getSystemService( Context.CLIPBOARD_SERVICE); clipboardManager.setPrimaryClip(clipData); Toast.makeText(getApplicationContext(), R.string.copied, Toast.LENGTH_SHORT).show(); finish(); } }); MetricsLogger.action(this, MetricsEvent.ACTION_ACTIVITY_CHOOSER_SHOWN); mChooserShownTime = System.currentTimeMillis(); Loading Loading @@ -414,20 +461,19 @@ public class ChooserActivity extends ResolverActivity { private void showDefaultContentPreview(final ViewGroup parentLayout, final Intent targetIntent) { CharSequence sharingText = targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT); TextView previewTextView = findViewById(R.id.content_preview_text); if (sharingText == null) { previewTextView.setVisibility(View.GONE); findViewById(R.id.content_preview_text_layout).setVisibility(View.GONE); } else { previewTextView.setText(sharingText); TextView textView = findViewById(R.id.content_preview_text); textView.setText(sharingText); } String previewTitle = targetIntent.getStringExtra(Intent.EXTRA_TITLE); TextView previewTitleView = findViewById(R.id.content_preview_title); if (previewTitle == null) { previewTitleView.setVisibility(View.GONE); if (previewTitle == null || previewTitle.trim().isEmpty()) { findViewById(R.id.content_preview_title_layout).setVisibility(View.GONE); } else { TextView previewTitleView = findViewById(R.id.content_preview_title); previewTitleView.setText(previewTitle); } ClipData previewData = targetIntent.getClipData(); Uri previewThumbnail = null; Loading @@ -442,7 +488,7 @@ public class ChooserActivity extends ResolverActivity { if (previewThumbnail == null) { previewThumbnailView.setVisibility(View.GONE); } else { Bitmap bmp = loadThumbnail(previewThumbnail, new Size(200, 200)); Bitmap bmp = loadThumbnail(previewThumbnail, new Size(100, 100)); if (bmp == null) { previewThumbnailView.setVisibility(View.GONE); } else { Loading @@ -450,6 +496,7 @@ public class ChooserActivity extends ResolverActivity { } } } } static SharedPreferences getPinnedSharedPrefs(Context context) { // The code below is because in the android:ui process, no one can hear you scream. Loading Loading @@ -2020,8 +2067,8 @@ public class ChooserActivity extends ResolverActivity { private void updatePath(int width, int height) { mPath.reset(); int imageWidth = width - getPaddingLeft() - getPaddingRight(); int imageHeight = height - getPaddingTop() - getPaddingBottom(); int imageWidth = width - getPaddingRight(); int imageHeight = height - getPaddingBottom(); mPath.addRoundRect(getPaddingLeft(), getPaddingTop(), imageWidth, imageHeight, mRadius, mRadius, Path.Direction.CW); } Loading
core/res/res/drawable/chooser_content_preview_rounded.xml 0 → 100644 +31 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2019 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="1dp" android:color="#ccc" /> <corners android:radius="@dimen/chooser_corner_radius" /> <padding android:left="16dp" android:top="12dp" android:right="16dp" android:bottom="12dp"/> </shape>
core/res/res/drawable/ic_content_copy_gm2.xml 0 → 100644 +25 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2019 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="#F999" android:pathData="M18,21L4,21L4,7L2,7v14c0,1.1 0.9,2 2,2h14v-2zM21,17L21,3c0,-1.1 -0.9,-2 -2,-2L8,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2zM19,17L8,17L8,3h11v14z"/> </vector>
core/res/res/layout/chooser_grid.xml +91 −66 Original line number Diff line number Diff line Loading @@ -51,60 +51,85 @@ android:textAppearance="?attr/textAppearanceMedium" android:textSize="20sp" android:gravity="center" android:paddingEnd="?attr/dialogPreferredPadding" android:paddingTop="12dp" android:paddingBottom="6dp" android:paddingTop="18dp" android:paddingBottom="18dp" android:paddingLeft="24dp" android:paddingRight="24dp" android:layout_below="@id/profile_button" android:layout_centerHorizontal="true"/> </RelativeLayout> <RelativeLayout <LinearLayout android:id="@+id/content_preview" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingBottom="@dimen/chooser_view_spacing" android:background="?attr/colorBackgroundFloating"> <view class="com.android.internal.app.ChooserActivity$RoundedRectImageView" android:id="@+id/content_preview_thumbnail" android:layout_alignParentTop="true" android:layout_width="100dp" <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="@dimen/chooser_edge_margin_normal" android:paddingRight="@dimen/chooser_edge_margin_normal" android:layout_marginBottom="@dimen/chooser_view_spacing" android:id="@+id/content_preview_text_layout"> <TextView android:id="@+id/content_preview_text" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_gravity="center_vertical" android:ellipsize="end" android:gravity="start|top" android:paddingRight="24dp" android:maxLines="2"/> <Button android:id="@+id/copy_button" android:layout_width="24dp" android:layout_height="24dp" android:gravity="center" android:adjustViewBounds="true" android:maxWidth="90dp" android:maxHeight="90dp" android:scaleType="fitCenter" android:padding="5dp"/> android:layout_gravity="center_vertical" android:background="@drawable/ic_content_copy_gm2"/> </LinearLayout> <TextView android:id="@+id/content_preview_title" android:layout_alignParentTop="true" android:layout_toEndOf="@id/content_preview_thumbnail" <!-- Required sub-layout so we can get the nice rounded corners--> <!-- around this section --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="start|top" android:textAppearance="?attr/textAppearanceMedium" android:maxLines="2" android:ellipsize="end" android:paddingStart="15dp" android:paddingEnd="15dp" android:paddingTop="10dp" /> android:orientation="horizontal" android:layout_marginLeft="@dimen/chooser_edge_margin_thin" android:layout_marginRight="@dimen/chooser_edge_margin_thin" android:minHeight="80dp" android:background="@drawable/chooser_content_preview_rounded" android:id="@+id/content_preview_title_layout"> <view class="com.android.internal.app.ChooserActivity$RoundedRectImageView" android:id="@+id/content_preview_thumbnail" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginRight="12dp" android:adjustViewBounds="true" android:layout_gravity="center_vertical" android:gravity="center" android:maxWidth="70dp" android:maxHeight="70dp" android:padding="5dp" android:scaleType="centerCrop"/> <TextView android:id="@+id/content_preview_text" android:layout_width="match_parent" android:id="@+id/content_preview_title" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:layout_below="@id/content_preview_title" android:layout_toEndOf="@id/content_preview_thumbnail" android:gravity="start|top" android:maxLines="2" android:layout_gravity="center_vertical" android:ellipsize="end" android:paddingStart="15dp" android:paddingEnd="15dp" android:paddingTop="10dp" android:paddingBottom="5dp"/> </RelativeLayout> android:maxLines="2" android:textAppearance="?attr/textAppearanceMedium"/> </LinearLayout> </LinearLayout> <ListView android:layout_width="match_parent" Loading
core/res/res/values/dimens.xml +5 −2 Original line number Diff line number Diff line Loading @@ -715,6 +715,9 @@ <!-- Line spacing modifier for the message field of the harmful app dialog --> <item name="harmful_app_message_line_spacing_modifier" type="dimen">1.22</item> <!-- chooser corner radius --> <dimen name="chooser_corner_radius">4dp</dimen> <!-- chooser (sharesheet) spacing --> <dimen name="chooser_corner_radius">8dp</dimen> <dimen name="chooser_view_spacing">18dp</dimen> <dimen name="chooser_edge_margin_thin">16dp</dimen> <dimen name="chooser_edge_margin_normal">24dp</dimen> </resources>