Merge changes Ia1de8afb,I0cd64d15
* changes: Add background protection to clipboard UI Add attribution to clipboard text editing
This commit is contained in:
committed by
Android (Google) Code Review
commit
d54ccef7cb
@@ -14,126 +14,137 @@
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
<com.android.systemui.clipboardoverlay.DraggableConstraintLayout
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:theme="@style/FloatingOverlay"
|
||||
android:alpha="0"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<ImageView
|
||||
android:id="@+id/actions_container_background"
|
||||
android:visibility="gone"
|
||||
android:layout_height="0dp"
|
||||
android:layout_width="0dp"
|
||||
android:elevation="1dp"
|
||||
android:background="@drawable/action_chip_container_background"
|
||||
android:layout_marginStart="@dimen/overlay_action_container_margin_horizontal"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/actions_container"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@+id/actions_container"
|
||||
app:layout_constraintEnd_toEndOf="@+id/actions_container"/>
|
||||
<HorizontalScrollView
|
||||
android:id="@+id/actions_container"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/overlay_action_container_margin_horizontal"
|
||||
android:paddingEnd="@dimen/overlay_action_container_padding_right"
|
||||
android:paddingVertical="@dimen/overlay_action_container_padding_vertical"
|
||||
android:elevation="1dp"
|
||||
android:scrollbars="none"
|
||||
app:layout_constraintHorizontal_bias="0"
|
||||
app:layout_constraintWidth_percent="1.0"
|
||||
app:layout_constraintWidth_max="wrap"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/preview_border"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
<LinearLayout
|
||||
android:id="@+id/actions"
|
||||
android:id="@+id/background_protection"
|
||||
android:layout_height="@dimen/overlay_bg_protection_height"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_gravity="bottom"
|
||||
android:src="@drawable/overlay_actions_background_protection"/>
|
||||
<com.android.systemui.clipboardoverlay.DraggableConstraintLayout
|
||||
android:id="@+id/clipboard_ui"
|
||||
android:theme="@style/FloatingOverlay"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<ImageView
|
||||
android:id="@+id/actions_container_background"
|
||||
android:visibility="gone"
|
||||
android:layout_height="0dp"
|
||||
android:layout_width="0dp"
|
||||
android:elevation="1dp"
|
||||
android:background="@drawable/action_chip_container_background"
|
||||
android:layout_marginStart="@dimen/overlay_action_container_margin_horizontal"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/actions_container"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@+id/actions_container"
|
||||
app:layout_constraintEnd_toEndOf="@+id/actions_container"/>
|
||||
<HorizontalScrollView
|
||||
android:id="@+id/actions_container"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/overlay_action_container_margin_horizontal"
|
||||
android:paddingEnd="@dimen/overlay_action_container_padding_right"
|
||||
android:paddingVertical="@dimen/overlay_action_container_padding_vertical"
|
||||
android:elevation="1dp"
|
||||
android:scrollbars="none"
|
||||
app:layout_constraintHorizontal_bias="0"
|
||||
app:layout_constraintWidth_percent="1.0"
|
||||
app:layout_constraintWidth_max="wrap"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/preview_border"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
<LinearLayout
|
||||
android:id="@+id/actions"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:animateLayoutChanges="true">
|
||||
<include layout="@layout/overlay_action_chip"
|
||||
android:id="@+id/remote_copy_chip"/>
|
||||
<include layout="@layout/overlay_action_chip"
|
||||
android:id="@+id/edit_chip"/>
|
||||
</LinearLayout>
|
||||
</HorizontalScrollView>
|
||||
<View
|
||||
android:id="@+id/preview_border"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginStart="@dimen/overlay_offset_x"
|
||||
android:layout_marginBottom="@dimen/overlay_offset_y"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/actions_container_background"
|
||||
android:elevation="@dimen/overlay_preview_elevation"
|
||||
app:layout_constraintEnd_toEndOf="@id/clipboard_preview_end"
|
||||
app:layout_constraintTop_toTopOf="@id/clipboard_preview_top"
|
||||
android:background="@drawable/overlay_border"/>
|
||||
<androidx.constraintlayout.widget.Barrier
|
||||
android:id="@+id/clipboard_preview_end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:animateLayoutChanges="true">
|
||||
<include layout="@layout/overlay_action_chip"
|
||||
android:id="@+id/remote_copy_chip"/>
|
||||
<include layout="@layout/overlay_action_chip"
|
||||
android:id="@+id/edit_chip"/>
|
||||
</LinearLayout>
|
||||
</HorizontalScrollView>
|
||||
<View
|
||||
android:id="@+id/preview_border"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginStart="@dimen/overlay_offset_x"
|
||||
android:layout_marginBottom="@dimen/overlay_offset_y"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="@id/actions_container_background"
|
||||
android:elevation="@dimen/overlay_preview_elevation"
|
||||
app:layout_constraintEnd_toEndOf="@id/clipboard_preview_end"
|
||||
app:layout_constraintTop_toTopOf="@id/clipboard_preview_top"
|
||||
android:background="@drawable/overlay_border"/>
|
||||
<androidx.constraintlayout.widget.Barrier
|
||||
android:id="@+id/clipboard_preview_end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:barrierMargin="@dimen/overlay_border_width"
|
||||
app:barrierDirection="end"
|
||||
app:constraint_referenced_ids="clipboard_preview"/>
|
||||
<androidx.constraintlayout.widget.Barrier
|
||||
android:id="@+id/clipboard_preview_top"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:barrierDirection="top"
|
||||
app:barrierMargin="@dimen/overlay_border_width_neg"
|
||||
app:constraint_referenced_ids="clipboard_preview"/>
|
||||
<FrameLayout
|
||||
android:id="@+id/clipboard_preview"
|
||||
android:elevation="@dimen/overlay_preview_elevation"
|
||||
android:background="@drawable/overlay_preview_background"
|
||||
android:clipChildren="true"
|
||||
android:clipToOutline="true"
|
||||
android:clipToPadding="true"
|
||||
android:layout_width="@dimen/clipboard_preview_size"
|
||||
android:layout_margin="@dimen/overlay_border_width"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
app:layout_constraintBottom_toBottomOf="@id/preview_border"
|
||||
app:layout_constraintStart_toStartOf="@id/preview_border"
|
||||
app:layout_constraintEnd_toEndOf="@id/preview_border"
|
||||
app:layout_constraintTop_toTopOf="@id/preview_border">
|
||||
<TextView android:id="@+id/text_preview"
|
||||
android:textFontWeight="500"
|
||||
android:padding="8dp"
|
||||
android:gravity="center|start"
|
||||
android:ellipsize="end"
|
||||
android:autoSizeTextType="uniform"
|
||||
android:autoSizeMinTextSize="10sp"
|
||||
android:autoSizeMaxTextSize="200sp"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:layout_width="@dimen/clipboard_preview_size"
|
||||
android:layout_height="@dimen/clipboard_preview_size"/>
|
||||
<ImageView
|
||||
android:id="@+id/image_preview"
|
||||
android:scaleType="fitCenter"
|
||||
android:adjustViewBounds="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
</FrameLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/dismiss_button"
|
||||
android:layout_width="@dimen/overlay_dismiss_button_tappable_size"
|
||||
android:layout_height="@dimen/overlay_dismiss_button_tappable_size"
|
||||
android:elevation="@dimen/overlay_dismiss_button_elevation"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintStart_toEndOf="@id/clipboard_preview"
|
||||
app:layout_constraintEnd_toEndOf="@id/clipboard_preview"
|
||||
app:layout_constraintTop_toTopOf="@id/clipboard_preview"
|
||||
app:layout_constraintBottom_toTopOf="@id/clipboard_preview"
|
||||
android:contentDescription="@string/clipboard_dismiss_description">
|
||||
<ImageView
|
||||
android:id="@+id/dismiss_image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_margin="@dimen/overlay_dismiss_button_margin"
|
||||
android:src="@drawable/overlay_cancel"/>
|
||||
</FrameLayout>
|
||||
</com.android.systemui.clipboardoverlay.DraggableConstraintLayout>
|
||||
app:barrierMargin="@dimen/overlay_border_width"
|
||||
app:barrierDirection="end"
|
||||
app:constraint_referenced_ids="clipboard_preview"/>
|
||||
<androidx.constraintlayout.widget.Barrier
|
||||
android:id="@+id/clipboard_preview_top"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:barrierDirection="top"
|
||||
app:barrierMargin="@dimen/overlay_border_width_neg"
|
||||
app:constraint_referenced_ids="clipboard_preview"/>
|
||||
<FrameLayout
|
||||
android:id="@+id/clipboard_preview"
|
||||
android:elevation="@dimen/overlay_preview_elevation"
|
||||
android:background="@drawable/overlay_preview_background"
|
||||
android:clipChildren="true"
|
||||
android:clipToOutline="true"
|
||||
android:clipToPadding="true"
|
||||
android:layout_width="@dimen/clipboard_preview_size"
|
||||
android:layout_margin="@dimen/overlay_border_width"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
app:layout_constraintBottom_toBottomOf="@id/preview_border"
|
||||
app:layout_constraintStart_toStartOf="@id/preview_border"
|
||||
app:layout_constraintEnd_toEndOf="@id/preview_border"
|
||||
app:layout_constraintTop_toTopOf="@id/preview_border">
|
||||
<TextView android:id="@+id/text_preview"
|
||||
android:textFontWeight="500"
|
||||
android:padding="8dp"
|
||||
android:gravity="center|start"
|
||||
android:ellipsize="end"
|
||||
android:autoSizeTextType="uniform"
|
||||
android:autoSizeMinTextSize="10sp"
|
||||
android:autoSizeMaxTextSize="200sp"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:layout_width="@dimen/clipboard_preview_size"
|
||||
android:layout_height="@dimen/clipboard_preview_size"/>
|
||||
<ImageView
|
||||
android:id="@+id/image_preview"
|
||||
android:scaleType="fitCenter"
|
||||
android:adjustViewBounds="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
</FrameLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/dismiss_button"
|
||||
android:layout_width="@dimen/overlay_dismiss_button_tappable_size"
|
||||
android:layout_height="@dimen/overlay_dismiss_button_tappable_size"
|
||||
android:elevation="@dimen/overlay_dismiss_button_elevation"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintStart_toEndOf="@id/clipboard_preview"
|
||||
app:layout_constraintEnd_toEndOf="@id/clipboard_preview"
|
||||
app:layout_constraintTop_toTopOf="@id/clipboard_preview"
|
||||
app:layout_constraintBottom_toTopOf="@id/clipboard_preview"
|
||||
android:contentDescription="@string/clipboard_dismiss_description">
|
||||
<ImageView
|
||||
android:id="@+id/dismiss_image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_margin="@dimen/overlay_dismiss_button_margin"
|
||||
android:src="@drawable/overlay_cancel"/>
|
||||
</FrameLayout>
|
||||
</com.android.systemui.clipboardoverlay.DraggableConstraintLayout>
|
||||
</FrameLayout>
|
||||
@@ -2384,6 +2384,8 @@
|
||||
<string name="clipboard_edit_text_copy">Copy</string>
|
||||
<!-- Text informing user that content has been copied to the system clipboard [CHAR LIMIT=NONE] -->
|
||||
<string name="clipboard_overlay_text_copied">Copied</string>
|
||||
<!-- Text informing user where text being edited was copied from [CHAR LIMIT=NONE] -->
|
||||
<string name="clipboard_edit_source">From <xliff:g id="appName" example="Gmail">%1$s</xliff:g></string>
|
||||
<!-- Label for button to dismiss clipboard overlay [CHAR LIMIT=NONE] -->
|
||||
<string name="clipboard_dismiss_description">Dismiss copy UI</string>
|
||||
</resources>
|
||||
|
||||
@@ -103,6 +103,7 @@ public class ClipboardOverlayController {
|
||||
private final AccessibilityManager mAccessibilityManager;
|
||||
private final TextClassifier mTextClassifier;
|
||||
|
||||
private final FrameLayout mContainer;
|
||||
private final DraggableConstraintLayout mView;
|
||||
private final ImageView mImagePreview;
|
||||
private final TextView mTextPreview;
|
||||
@@ -147,8 +148,9 @@ public class ClipboardOverlayController {
|
||||
mWindow = FloatingWindowUtil.getFloatingWindow(mContext);
|
||||
mWindow.setWindowManager(mWindowManager, null, null);
|
||||
|
||||
mView = (DraggableConstraintLayout)
|
||||
mContainer = (FrameLayout)
|
||||
LayoutInflater.from(mContext).inflate(R.layout.clipboard_overlay, null);
|
||||
mView = requireNonNull(mContainer.findViewById(R.id.clipboard_ui));
|
||||
mActionContainerBackground =
|
||||
requireNonNull(mView.findViewById(R.id.actions_container_background));
|
||||
mActionContainer = requireNonNull(mView.findViewById(R.id.actions));
|
||||
@@ -180,7 +182,7 @@ public class ClipboardOverlayController {
|
||||
|
||||
attachWindow();
|
||||
withWindowAttached(() -> {
|
||||
mWindow.setContentView(mView);
|
||||
mWindow.setContentView(mContainer);
|
||||
updateInsets(mWindowManager.getCurrentWindowMetrics().getWindowInsets());
|
||||
mView.requestLayout();
|
||||
mView.post(this::animateIn);
|
||||
@@ -371,7 +373,7 @@ public class ClipboardOverlayController {
|
||||
private ValueAnimator getEnterAnimation() {
|
||||
ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
|
||||
|
||||
mView.setAlpha(0);
|
||||
mContainer.setAlpha(0);
|
||||
mDismissButton.setVisibility(View.GONE);
|
||||
final View previewBorder = requireNonNull(mView.findViewById(R.id.preview_border));
|
||||
final View actionBackground = requireNonNull(
|
||||
@@ -383,7 +385,7 @@ public class ClipboardOverlayController {
|
||||
}
|
||||
|
||||
anim.addUpdateListener(animation -> {
|
||||
mView.setAlpha(animation.getAnimatedFraction());
|
||||
mContainer.setAlpha(animation.getAnimatedFraction());
|
||||
float scale = 0.6f + 0.4f * animation.getAnimatedFraction();
|
||||
mView.setPivotY(mView.getHeight() - previewBorder.getHeight() / 2f);
|
||||
mView.setPivotX(actionBackground.getWidth() / 2f);
|
||||
@@ -394,7 +396,7 @@ public class ClipboardOverlayController {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
super.onAnimationEnd(animation);
|
||||
mView.setAlpha(1);
|
||||
mContainer.setAlpha(1);
|
||||
mTimeoutHandler.resetTimeout();
|
||||
}
|
||||
});
|
||||
@@ -439,7 +441,7 @@ public class ClipboardOverlayController {
|
||||
|
||||
private void reset() {
|
||||
mView.setTranslationX(0);
|
||||
mView.setAlpha(0);
|
||||
mContainer.setAlpha(0);
|
||||
resetActionChips();
|
||||
mTimeoutHandler.cancelTimeout();
|
||||
}
|
||||
|
||||
@@ -22,9 +22,12 @@ import android.app.Activity;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.systemui.R;
|
||||
|
||||
@@ -32,8 +35,11 @@ import com.android.systemui.R;
|
||||
* Lightweight activity for editing text clipboard contents
|
||||
*/
|
||||
public class EditTextActivity extends Activity {
|
||||
private static final String TAG = "EditTextActivity";
|
||||
|
||||
private EditText mEditText;
|
||||
private ClipboardManager mClipboardManager;
|
||||
private TextView mAttribution;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@@ -42,6 +48,7 @@ public class EditTextActivity extends Activity {
|
||||
findViewById(R.id.copy_button).setOnClickListener((v) -> saveToClipboard());
|
||||
findViewById(R.id.share).setOnClickListener((v) -> share());
|
||||
mEditText = findViewById(R.id.edit_text);
|
||||
mAttribution = findViewById(R.id.attribution);
|
||||
mClipboardManager = requireNonNull(getSystemService(ClipboardManager.class));
|
||||
}
|
||||
|
||||
@@ -53,7 +60,15 @@ public class EditTextActivity extends Activity {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
// TODO: put clip attribution in R.id.attribution TextView
|
||||
PackageManager pm = getApplicationContext().getPackageManager();
|
||||
try {
|
||||
CharSequence label = pm.getApplicationLabel(
|
||||
pm.getApplicationInfo(mClipboardManager.getPrimaryClipSource(),
|
||||
PackageManager.ApplicationInfoFlags.of(0)));
|
||||
mAttribution.setText(getResources().getString(R.string.clipboard_edit_source, label));
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.w(TAG, "Package not found: " + mClipboardManager.getPrimaryClipSource(), e);
|
||||
}
|
||||
mEditText.setText(clip.getItemAt(0).getText());
|
||||
mEditText.requestFocus();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user