Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16ded755 authored by Miranda Kephart's avatar Miranda Kephart Committed by Android (Google) Code Review
Browse files

Merge "Separate clipboard classes into View/Controller to facilitate testing"

parents cf2ea325 0dcca7eb
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<com.android.systemui.screenshot.DraggableConstraintLayout
<com.android.systemui.clipboardoverlay.ClipboardOverlayView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
@@ -157,4 +157,4 @@
            android:layout_margin="@dimen/overlay_dismiss_button_margin"
            android:src="@drawable/overlay_cancel"/>
    </FrameLayout>
</com.android.systemui.screenshot.DraggableConstraintLayout>
 No newline at end of file
</com.android.systemui.clipboardoverlay.ClipboardOverlayView>
 No newline at end of file
+160 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2021 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.
  -->
<com.android.systemui.screenshot.DraggableConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/clipboard_ui"
    android:theme="@style/FloatingOverlay"
    android:alpha="0"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:contentDescription="@string/clipboard_overlay_window_name">
    <ImageView
        android:id="@+id/actions_container_background"
        android:visibility="gone"
        android:layout_height="0dp"
        android:layout_width="0dp"
        android:elevation="4dp"
        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="4dp"
        android:scrollbars="none"
        android:layout_marginBottom="4dp"
        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/share_chip"/>
            <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="12dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:elevation="7dp"
        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="7dp"
        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="@dimen/clipboard_overlay_min_font"
                  android:autoSizeMaxTextSize="@dimen/clipboard_overlay_max_font"
                  android:textColor="?attr/overlayButtonTextColor"
                  android:textColorLink="?attr/overlayButtonTextColor"
                  android:background="?androidprv:attr/colorAccentSecondary"
                  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:contentDescription="@string/clipboard_image_preview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/hidden_preview"
            android:visibility="gone"
            android:textFontWeight="500"
            android:padding="8dp"
            android:gravity="center"
            android:textSize="14sp"
            android:textColor="?attr/overlayButtonTextColor"
            android:background="?androidprv:attr/colorAccentSecondary"
            android:layout_width="@dimen/clipboard_preview_size"
            android:layout_height="@dimen/clipboard_preview_size"/>
    </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="10dp"
        android:visibility="gone"
        android:alpha="0"
        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.screenshot.DraggableConstraintLayout>
 No newline at end of file
+34 −9
Original line number Diff line number Diff line
@@ -31,9 +31,12 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.util.DeviceConfigProxy;

import javax.inject.Inject;
import javax.inject.Provider;

/**
 * ClipboardListener brings up a clipboard overlay when something is copied to the clipboard.
@@ -51,20 +54,30 @@ public class ClipboardListener implements

    private final Context mContext;
    private final DeviceConfigProxy mDeviceConfig;
    private final ClipboardOverlayControllerFactory mOverlayFactory;
    private final Provider<ClipboardOverlayController> mOverlayProvider;
    private final ClipboardOverlayControllerLegacyFactory mOverlayFactory;
    private final ClipboardManager mClipboardManager;
    private final UiEventLogger mUiEventLogger;
    private ClipboardOverlayController mClipboardOverlayController;
    private final FeatureFlags mFeatureFlags;
    private boolean mUsingNewOverlay;
    private ClipboardOverlay mClipboardOverlay;

    @Inject
    public ClipboardListener(Context context, DeviceConfigProxy deviceConfigProxy,
            ClipboardOverlayControllerFactory overlayFactory, ClipboardManager clipboardManager,
            UiEventLogger uiEventLogger) {
            Provider<ClipboardOverlayController> clipboardOverlayControllerProvider,
            ClipboardOverlayControllerLegacyFactory overlayFactory,
            ClipboardManager clipboardManager,
            UiEventLogger uiEventLogger,
            FeatureFlags featureFlags) {
        mContext = context;
        mDeviceConfig = deviceConfigProxy;
        mOverlayProvider = clipboardOverlayControllerProvider;
        mOverlayFactory = overlayFactory;
        mClipboardManager = clipboardManager;
        mUiEventLogger = uiEventLogger;
        mFeatureFlags = featureFlags;

        mUsingNewOverlay = mFeatureFlags.isEnabled(Flags.CLIPBOARD_OVERLAY_REFACTOR);
    }

    @Override
@@ -89,16 +102,22 @@ public class ClipboardListener implements
            return;
        }

        if (mClipboardOverlayController == null) {
            mClipboardOverlayController = mOverlayFactory.create(mContext);
        boolean enabled = mFeatureFlags.isEnabled(Flags.CLIPBOARD_OVERLAY_REFACTOR);
        if (mClipboardOverlay == null || enabled != mUsingNewOverlay) {
            mUsingNewOverlay = enabled;
            if (enabled) {
                mClipboardOverlay = mOverlayProvider.get();
            } else {
                mClipboardOverlay = mOverlayFactory.create(mContext);
            }
            mUiEventLogger.log(CLIPBOARD_OVERLAY_ENTERED, 0, clipSource);
        } else {
            mUiEventLogger.log(CLIPBOARD_OVERLAY_UPDATED, 0, clipSource);
        }
        mClipboardOverlayController.setClipData(clipData, clipSource);
        mClipboardOverlayController.setOnSessionCompleteListener(() -> {
        mClipboardOverlay.setClipData(clipData, clipSource);
        mClipboardOverlay.setOnSessionCompleteListener(() -> {
            // Session is complete, free memory until it's needed again.
            mClipboardOverlayController = null;
            mClipboardOverlay = null;
        });
    }

@@ -120,4 +139,10 @@ public class ClipboardListener implements
    private static boolean isEmulator() {
        return SystemProperties.getBoolean("ro.boot.qemu", false);
    }

    interface ClipboardOverlay {
        void setClipData(ClipData clipData, String clipSource);

        void setOnSessionCompleteListener(Runnable runnable);
    }
}
+145 −582

File changed.

Preview size limit exceeded, changes collapsed.

+963 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading