App chip refactor
- Adds background outline replacing 2 circles + rect approach. This enables easier shadow drawing code. - Simplify structure of AppChipView. - Adds an anchor View to simplify laying out of menu around app chip Bug: 313644427 Bug: 317007147 Fix: 322760765 Flag: ACONFIG com.android.launcher3.enable_grid_only_overview TEAMFOOD Flag: ACONFIG com.android.launcher3.enable_overview_icon_menu TEAMFOOD Test: OverviewImageTest Change-Id: I56c2644779863c083ae475a740a84321b1d0c396
This commit is contained in:
@@ -17,45 +17,41 @@
|
||||
<com.android.quickstep.views.IconAppChipView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_expanded_width"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_expanded_height"
|
||||
android:clipToOutline="true"
|
||||
android:focusable="false"
|
||||
android:importantForAccessibility="no"
|
||||
android:autoMirrored="true"
|
||||
android:background="@drawable/icon_menu_elevation_background"
|
||||
android:elevation="@dimen/task_thumbnail_icon_menu_elevation" >
|
||||
android:elevation="@dimen/task_thumbnail_icon_menu_elevation"
|
||||
android:background="?androidprv:attr/materialColorSurfaceBright">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/icon_view_background_corners_start"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_corner_width"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_min_height"
|
||||
android:src="@drawable/icon_menu_background_corners"
|
||||
android:importantForAccessibility="no" />
|
||||
<ImageView
|
||||
android:id="@+id/icon_view_background"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_background_min_width"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_min_height"
|
||||
android:src="@drawable/icon_menu_background"
|
||||
android:importantForAccessibility="no" />
|
||||
<ImageView
|
||||
android:id="@+id/icon_view_background_corners_end"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_corner_width"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_min_height"
|
||||
android:src="@drawable/icon_menu_background_corners"
|
||||
android:importantForAccessibility="no" />
|
||||
<!-- ignoring warning because the user of the anchor is a Rect where RTL is not needed -->
|
||||
<!-- This anchor's bounds is in the expected location after rotations and translations are
|
||||
applied to the parent. The same is not true of the parent so an anchor is used. -->
|
||||
<!-- marginTop is applied in java to get the gap between chip and menu -->
|
||||
<View
|
||||
android:id="@+id/icon_view_menu_anchor"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="left|top"
|
||||
android:focusable="false"
|
||||
android:importantForAccessibility="no"
|
||||
tools:ignore="RtlHardcoded" />
|
||||
|
||||
<com.android.quickstep.views.IconView
|
||||
android:id="@+id/icon_view"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_size"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_size"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_app_icon_collapsed_size"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_app_icon_collapsed_size"
|
||||
android:focusable="false"
|
||||
android:importantForAccessibility="no" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/icon_text_collapsed"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_text_width"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_drawable_size"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_text_collapsed_max_width"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_app_icon_collapsed_size"
|
||||
android:gravity="start|center_vertical"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
@@ -65,8 +61,8 @@
|
||||
|
||||
<TextView
|
||||
android:id="@+id/icon_text_expanded"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_text_max_width"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_drawable_size"
|
||||
android:layout_width="@dimen/task_thumbnail_icon_menu_text_expanded_max_width"
|
||||
android:layout_height="@dimen/task_thumbnail_icon_menu_app_icon_collapsed_size"
|
||||
android:gravity="start|center_vertical"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
|
||||
@@ -44,48 +44,38 @@
|
||||
<dimen name="overview_task_margin">16dp</dimen>
|
||||
<!-- The horizontal space between tasks -->
|
||||
<dimen name="overview_page_spacing">16dp</dimen>
|
||||
<!-- The min width of the thumbnail icon menu for non-split tasks -->
|
||||
<dimen name="task_thumbnail_icon_menu_min_width">156dp</dimen>
|
||||
<!-- The max width of the thumbnail icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_max_width">216dp</dimen>
|
||||
<!-- The width of the thumbnail icon menu background -->
|
||||
<dimen name="task_thumbnail_icon_menu_background_min_width">120dp</dimen>
|
||||
<!-- The width of the icon menu text -->
|
||||
<dimen name="task_thumbnail_icon_menu_text_width">86dp</dimen>
|
||||
<!-- The max width of the icon menu text -->
|
||||
<dimen name="task_thumbnail_icon_menu_text_max_width">118dp</dimen>
|
||||
<!-- The collapsed max width of the icon menu text -->
|
||||
<dimen name="task_thumbnail_icon_menu_text_collapsed_max_width">86dp</dimen>
|
||||
<!-- The expanded max width of the icon menu text -->
|
||||
<dimen name="task_thumbnail_icon_menu_text_expanded_max_width">118dp</dimen>
|
||||
<!-- The size of the icon menu text -->
|
||||
<dimen name="task_thumbnail_icon_menu_text_size">14sp</dimen>
|
||||
<!-- The max width of the thumbnail icon menu background -->
|
||||
<dimen name="task_thumbnail_icon_menu_background_max_width">164dp</dimen>
|
||||
<!-- The height of the thumbnail icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_min_height">36dp</dimen>
|
||||
<!-- The corner radius of the thumbnail icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_corner_radius">28dp</dimen>
|
||||
<!-- The width of the thumbnail icon menu backgorund's corners when collapsed -->
|
||||
<dimen name="task_thumbnail_icon_menu_corner_width">36dp</dimen>
|
||||
<!-- The max height of the thumbnail icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_max_height">52dp</dimen>
|
||||
<!-- The size of the icon menu arrow -->
|
||||
<dimen name="task_thumbnail_icon_menu_arrow_size">24dp</dimen>
|
||||
<!-- The size of the icon menu arrow drawable -->
|
||||
<dimen name="task_thumbnail_icon_menu_arrow_drawable_size">16dp</dimen>
|
||||
<!-- The margin at the start of the task icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_start_margin">12dp</dimen>
|
||||
<!-- The margin at the top of the task icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_top_margin">12dp</dimen>
|
||||
<!-- The width of the thumbnail icon menu when collapsed (for non-split tasks) -->
|
||||
<dimen name="task_thumbnail_icon_menu_collapsed_width">156dp</dimen>
|
||||
<!-- The width of the thumbnail icon menu when expanded -->
|
||||
<dimen name="task_thumbnail_icon_menu_expanded_width">216dp</dimen>
|
||||
<!-- The height of the thumbnail icon menu when collapsed -->
|
||||
<dimen name="task_thumbnail_icon_menu_collapsed_height">36dp</dimen>
|
||||
<!-- The height of the thumbnail icon menu when expanded -->
|
||||
<dimen name="task_thumbnail_icon_menu_expanded_height">52dp</dimen>
|
||||
<!-- The margin at the top/start of the task icon menu when expanded -->
|
||||
<dimen name="task_thumbnail_icon_menu_expanded_top_start_margin">4dp</dimen>
|
||||
<!-- The margin at the start of the background when collapsed -->
|
||||
<dimen name="task_thumbnail_icon_menu_background_margin_top_start">8dp</dimen>
|
||||
<!-- The margin between the app name + app icon and app name + arrow icon when collapsed -->
|
||||
<dimen name="task_thumbnail_icon_menu_app_name_margin_horizontal_collapsed">8dp</dimen>
|
||||
<!-- The gap at the top of the task icon menu when expanded -->
|
||||
<dimen name="task_thumbnail_icon_menu_expanded_gap">6dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_menu_expanded_gap">2dp</dimen>
|
||||
<!-- The margin at the start of the task icon view in the icon menu -->
|
||||
<dimen name="task_thumbnail_icon_view_start_margin">6dp</dimen>
|
||||
<!-- The space around the task icon arrow within the icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_arrow_margin">8dp</dimen>
|
||||
<!-- The max space around the task icon within the icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_touch_max_margin">8dp</dimen>
|
||||
<!-- The icon size for the icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_drawable_size">24dp</dimen>
|
||||
<!-- The icon size for the icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_drawable_max_size">32dp</dimen>
|
||||
<!-- The size for the icon menu arrow -->
|
||||
<dimen name="task_thumbnail_icon_menu_arrow_size">24dp</dimen>
|
||||
<!-- The collapsed size for the icon menu icon -->
|
||||
<dimen name="task_thumbnail_icon_menu_app_icon_collapsed_size">24dp</dimen>
|
||||
<!-- The expanded icon size for the icon menu -->
|
||||
<dimen name="task_thumbnail_icon_menu_app_icon_expanded_size">32dp</dimen>
|
||||
<!-- The size of the icon menu's icon touch target -->
|
||||
<dimen name="task_thumbnail_icon_menu_drawable_touch_size">44dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_menu_elevation">4dp</dimen>
|
||||
|
||||
@@ -274,21 +274,12 @@ public class LandscapePagedViewHandler implements RecentsPagedOrientationHandler
|
||||
@Override
|
||||
public float getTaskMenuX(float x, View thumbnailView,
|
||||
DeviceProfile deviceProfile, float taskInsetMargin, View taskViewIcon) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
return x + (taskInsetMargin / 2f);
|
||||
}
|
||||
return thumbnailView.getMeasuredWidth() + x - taskInsetMargin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getTaskMenuY(float y, View thumbnailView, int stagePosition,
|
||||
View taskMenuView, float taskInsetMargin, View taskViewIcon) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
return y - (thumbnailView.getLayoutDirection() == LAYOUT_DIRECTION_RTL
|
||||
? taskMenuView.getMeasuredHeight() * 2 - (taskInsetMargin / 2f)
|
||||
: taskMenuView.getMeasuredHeight());
|
||||
|
||||
}
|
||||
BaseDragLayer.LayoutParams lp = (BaseDragLayer.LayoutParams) taskMenuView.getLayoutParams();
|
||||
int taskMenuWidth = lp.width;
|
||||
if (stagePosition == STAGE_POSITION_UNDEFINED) {
|
||||
@@ -304,7 +295,7 @@ public class LandscapePagedViewHandler implements RecentsPagedOrientationHandler
|
||||
@StagePosition int stagePosition) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
return thumbnailView.getResources().getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_max_width);
|
||||
R.dimen.task_thumbnail_icon_menu_expanded_width);
|
||||
}
|
||||
if (stagePosition == SplitConfigurationOptions.STAGE_POSITION_UNDEFINED) {
|
||||
return thumbnailView.getMeasuredWidth();
|
||||
@@ -582,11 +573,6 @@ public class LandscapePagedViewHandler implements RecentsPagedOrientationHandler
|
||||
@Override
|
||||
public void setTaskIconParams(FrameLayout.LayoutParams iconParams, int taskIconMargin,
|
||||
int taskIconHeight, int thumbnailTopMargin, boolean isRtl) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
iconParams.gravity = Gravity.START | Gravity.CENTER_VERTICAL;
|
||||
iconParams.topMargin = 0;
|
||||
return;
|
||||
}
|
||||
iconParams.gravity = (isRtl ? START : END) | CENTER_VERTICAL;
|
||||
iconParams.rightMargin = -taskIconHeight - taskIconMargin / 2;
|
||||
iconParams.leftMargin = 0;
|
||||
@@ -594,6 +580,14 @@ public class LandscapePagedViewHandler implements RecentsPagedOrientationHandler
|
||||
iconParams.bottomMargin = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIconAppChipChildrenParams(FrameLayout.LayoutParams iconParams,
|
||||
int chipChildMarginStart) {
|
||||
iconParams.gravity = Gravity.START | Gravity.CENTER_VERTICAL;
|
||||
iconParams.setMarginStart(chipChildMarginStart);
|
||||
iconParams.topMargin = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIconAppChipMenuParams(IconAppChipView iconAppChipView,
|
||||
FrameLayout.LayoutParams iconMenuParams, int iconMenuMargin, int thumbnailTopMargin) {
|
||||
|
||||
@@ -21,7 +21,6 @@ import static android.view.Gravity.CENTER_HORIZONTAL;
|
||||
import static android.view.Gravity.END;
|
||||
import static android.view.Gravity.START;
|
||||
import static android.view.Gravity.TOP;
|
||||
import static android.view.View.LAYOUT_DIRECTION_RTL;
|
||||
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
|
||||
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||
|
||||
@@ -182,12 +181,7 @@ public class PortraitPagedViewHandler extends DefaultPagedViewHandler implements
|
||||
@Override
|
||||
public float getTaskMenuX(float x, View thumbnailView,
|
||||
DeviceProfile deviceProfile, float taskInsetMargin, View taskViewIcon) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
if (thumbnailView.getLayoutDirection() == LAYOUT_DIRECTION_RTL) {
|
||||
return x + taskInsetMargin - taskViewIcon.getHeight() - (taskInsetMargin / 2f);
|
||||
}
|
||||
return x + taskInsetMargin;
|
||||
} else if (deviceProfile.isLandscape) {
|
||||
if (deviceProfile.isLandscape) {
|
||||
return x + taskInsetMargin
|
||||
+ (thumbnailView.getMeasuredWidth() - thumbnailView.getMeasuredHeight()) / 2f;
|
||||
} else {
|
||||
@@ -198,9 +192,6 @@ public class PortraitPagedViewHandler extends DefaultPagedViewHandler implements
|
||||
@Override
|
||||
public float getTaskMenuY(float y, View thumbnailView, int stagePosition,
|
||||
View taskMenuView, float taskInsetMargin, View taskViewIcon) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
return y;
|
||||
}
|
||||
return y + taskInsetMargin;
|
||||
}
|
||||
|
||||
@@ -209,7 +200,7 @@ public class PortraitPagedViewHandler extends DefaultPagedViewHandler implements
|
||||
@StagePosition int stagePosition) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
return thumbnailView.getResources().getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_max_width);
|
||||
R.dimen.task_thumbnail_icon_menu_expanded_width);
|
||||
}
|
||||
int padding = thumbnailView.getResources()
|
||||
.getDimensionPixelSize(R.dimen.task_menu_edge_padding);
|
||||
@@ -623,18 +614,20 @@ public class PortraitPagedViewHandler extends DefaultPagedViewHandler implements
|
||||
@Override
|
||||
public void setTaskIconParams(FrameLayout.LayoutParams iconParams, int taskIconMargin,
|
||||
int taskIconHeight, int thumbnailTopMargin, boolean isRtl) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
iconParams.setMarginStart(taskIconMargin);
|
||||
iconParams.gravity = Gravity.START | Gravity.CENTER_VERTICAL;
|
||||
iconParams.topMargin = 0;
|
||||
return;
|
||||
}
|
||||
iconParams.gravity = TOP | CENTER_HORIZONTAL;
|
||||
// Reset margins, since they may have been set on rotation
|
||||
iconParams.leftMargin = iconParams.rightMargin = 0;
|
||||
iconParams.topMargin = iconParams.bottomMargin = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIconAppChipChildrenParams(FrameLayout.LayoutParams iconParams,
|
||||
int chipChildMarginStart) {
|
||||
iconParams.setMarginStart(chipChildMarginStart);
|
||||
iconParams.gravity = Gravity.START | Gravity.CENTER_VERTICAL;
|
||||
iconParams.topMargin = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIconAppChipMenuParams(IconAppChipView iconAppChipView,
|
||||
FrameLayout.LayoutParams iconMenuParams, int iconMenuMargin, int thumbnailTopMargin) {
|
||||
|
||||
@@ -146,9 +146,16 @@ public interface RecentsPagedOrientationHandler extends PagedOrientationHandler
|
||||
int parentWidth, int parentHeight);
|
||||
|
||||
// Overview TaskMenuView methods
|
||||
/** Sets layout params on a task's app icon. Only use this when app chip is disabled. */
|
||||
void setTaskIconParams(FrameLayout.LayoutParams iconParams,
|
||||
int taskIconMargin, int taskIconHeight, int thumbnailTopMargin, boolean isRtl);
|
||||
|
||||
/**
|
||||
* Sets layout params on the children of an app chip. Only use this when app chip is enabled.
|
||||
*/
|
||||
void setIconAppChipChildrenParams(
|
||||
FrameLayout.LayoutParams iconParams, int chipChildMarginStart);
|
||||
|
||||
void setIconAppChipMenuParams(IconAppChipView iconAppChipView,
|
||||
FrameLayout.LayoutParams iconMenuParams,
|
||||
int iconMenuMargin, int thumbnailTopMargin);
|
||||
|
||||
@@ -94,9 +94,6 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler {
|
||||
@Override
|
||||
public float getTaskMenuX(float x, View thumbnailView,
|
||||
DeviceProfile deviceProfile, float taskInsetMargin, View taskViewIcon) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
return x + (taskViewIcon.getHeight() * 2);
|
||||
}
|
||||
return x + taskInsetMargin;
|
||||
}
|
||||
|
||||
@@ -104,9 +101,7 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler {
|
||||
public float getTaskMenuY(float y, View thumbnailView, int stagePosition,
|
||||
View taskMenuView, float taskInsetMargin, View taskViewIcon) {
|
||||
if (enableOverviewIconMenu()) {
|
||||
return y + taskViewIcon.getWidth() + (
|
||||
thumbnailView.getLayoutDirection() == LAYOUT_DIRECTION_RTL ? taskInsetMargin
|
||||
/ 2f : -taskViewIcon.getHeight());
|
||||
return y;
|
||||
}
|
||||
BaseDragLayer.LayoutParams lp = (BaseDragLayer.LayoutParams) taskMenuView.getLayoutParams();
|
||||
int taskMenuWidth = lp.width;
|
||||
@@ -222,18 +217,16 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler {
|
||||
@Override
|
||||
public void setTaskIconParams(FrameLayout.LayoutParams iconParams,
|
||||
int taskIconMargin, int taskIconHeight, int thumbnailTopMargin, boolean isRtl) {
|
||||
iconParams.rightMargin = 0;
|
||||
iconParams.bottomMargin = 0;
|
||||
if (enableOverviewIconMenu()) {
|
||||
iconParams.setMarginStart(taskIconMargin);
|
||||
iconParams.gravity = Gravity.START | Gravity.CENTER_VERTICAL;
|
||||
iconParams.leftMargin = 0;
|
||||
iconParams.topMargin = 0;
|
||||
} else {
|
||||
iconParams.gravity = (isRtl ? END : START) | CENTER_VERTICAL;
|
||||
iconParams.leftMargin = -taskIconHeight - taskIconMargin / 2;
|
||||
iconParams.topMargin = thumbnailTopMargin / 2;
|
||||
}
|
||||
iconParams.gravity = (isRtl ? END : START) | CENTER_VERTICAL;
|
||||
iconParams.setMargins(-taskIconHeight - taskIconMargin / 2, thumbnailTopMargin / 2, 0, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIconAppChipChildrenParams(FrameLayout.LayoutParams iconParams,
|
||||
int chipChildMarginStart) {
|
||||
iconParams.setMargins(0, 0, 0, 0);
|
||||
iconParams.setMarginStart(chipChildMarginStart);
|
||||
iconParams.gravity = Gravity.START | Gravity.CENTER_VERTICAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -398,8 +398,11 @@ public class GroupedTaskView extends TaskView {
|
||||
layoutParams.width,
|
||||
layoutParams.height
|
||||
);
|
||||
int iconMargins = getResources().getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_start_margin) * 2;
|
||||
int iconViewMarginStart = getResources().getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_expanded_top_start_margin);
|
||||
int iconViewBackgroundMarginStart = getResources().getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_background_margin_top_start);
|
||||
int iconMargins = (iconViewMarginStart + iconViewBackgroundMarginStart) * 2;
|
||||
((IconAppChipView) mIconView).setMaxWidth(groupedTaskViewSizes.first.x - iconMargins);
|
||||
((IconAppChipView) mIconView2).setMaxWidth(groupedTaskViewSizes.second.x - iconMargins);
|
||||
}
|
||||
|
||||
@@ -17,30 +17,32 @@ package com.android.quickstep.views;
|
||||
|
||||
import static com.android.app.animation.Interpolators.EMPHASIZED;
|
||||
import static com.android.app.animation.Interpolators.LINEAR;
|
||||
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.RectEvaluator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Outline;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.AnimatedVectorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewAnimationUtils;
|
||||
import android.view.ViewOutlineProvider;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.util.MultiValueAlpha;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
|
||||
import com.android.quickstep.util.RecentsOrientedState;
|
||||
|
||||
@@ -59,34 +61,28 @@ public class IconAppChipView extends FrameLayout implements TaskViewIcon {
|
||||
|
||||
private final MultiValueAlpha mMultiValueAlpha;
|
||||
|
||||
private View mMenuAnchorView;
|
||||
private IconView mIconView;
|
||||
// Two textview so we can ellipsize the collapsed view and crossfade on expand to the full name.
|
||||
private TextView mIconTextCollapsedView;
|
||||
private TextView mIconTextExpandedView;
|
||||
private ImageView mIconArrowView;
|
||||
private ImageView mIconViewBackground;
|
||||
// Use separate views for the rounded corners so we can scale the background view without
|
||||
// warping the corners.
|
||||
private ImageView mIconViewBackgroundCornersStart;
|
||||
private ImageView mIconViewBackgroundCornersEnd;
|
||||
|
||||
private final int mMinimumMenuSize;
|
||||
private final int mMaxMenuWidth;
|
||||
private final int mIconMenuMarginTop;
|
||||
private final int mIconMenuMarginStart;
|
||||
private final Rect mBackgroundRelativeLtrLocation = new Rect();
|
||||
final RectEvaluator mBackgroundAnimationRectEvaluator =
|
||||
new RectEvaluator(mBackgroundRelativeLtrLocation);
|
||||
private final int mCollapsedMenuDefaultWidth;
|
||||
private final int mExpandedMenuDefaultWidth;
|
||||
private final int mCollapsedMenuDefaultHeight;
|
||||
private final int mExpandedMenuDefaultHeight;
|
||||
private final int mIconMenuMarginTopStart;
|
||||
private final int mMenuToChipGap;
|
||||
private final int mBackgroundMarginTopStart;
|
||||
private final int mAppNameHorizontalMargin;
|
||||
private final int mIconViewMarginStart;
|
||||
private final int mIconViewDrawableSize;
|
||||
private final int mIconViewDrawableMaxSize;
|
||||
private final int mIconTextMinWidth;
|
||||
private final int mIconTextMaxWidth;
|
||||
private final int mTextMaxTranslationX;
|
||||
private final int mInnerMargin;
|
||||
private final float mArrowMaxTranslationX;
|
||||
private final int mMinIconBackgroundWidth;
|
||||
private final int mMaxIconBackgroundHeight;
|
||||
private final int mMinIconBackgroundHeight;
|
||||
private final int mMaxIconBackgroundCornerRadius;
|
||||
private final float mMinIconBackgroundCornerRadius;
|
||||
private final int mAppIconSize;
|
||||
private final int mArrowSize;
|
||||
private final int mIconViewDrawableExpandedSize;
|
||||
private final int mArrowMarginEnd;
|
||||
private AnimatorSet mAnimator;
|
||||
|
||||
private int mMaxWidth = Integer.MAX_VALUE;
|
||||
@@ -111,51 +107,35 @@ public class IconAppChipView extends FrameLayout implements TaskViewIcon {
|
||||
mMultiValueAlpha.setUpdateVisibility(/* updateVisibility= */ true);
|
||||
|
||||
// Menu dimensions
|
||||
mMaxMenuWidth = res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_max_width);
|
||||
mIconMenuMarginTop = res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_top_margin);
|
||||
mIconMenuMarginStart = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_start_margin);
|
||||
mCollapsedMenuDefaultWidth =
|
||||
res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_collapsed_width);
|
||||
mExpandedMenuDefaultWidth =
|
||||
res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_expanded_width);
|
||||
mCollapsedMenuDefaultHeight =
|
||||
res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_collapsed_height);
|
||||
mExpandedMenuDefaultHeight =
|
||||
res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_expanded_height);
|
||||
mIconMenuMarginTopStart = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_expanded_top_start_margin);
|
||||
mMenuToChipGap = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_expanded_gap);
|
||||
|
||||
// Background dimensions
|
||||
mMinIconBackgroundWidth = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_background_min_width);
|
||||
mMaxIconBackgroundHeight = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_max_height);
|
||||
mMinIconBackgroundHeight = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_min_height);
|
||||
mMaxIconBackgroundCornerRadius = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_corner_radius);
|
||||
mBackgroundMarginTopStart = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_background_margin_top_start);
|
||||
|
||||
// TextView dimensions
|
||||
mInnerMargin = (int) res.getDimension(R.dimen.task_thumbnail_icon_menu_arrow_margin);
|
||||
mIconTextMinWidth = res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_text_width);
|
||||
mIconTextMaxWidth = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_text_max_width);
|
||||
|
||||
// IconView dimensions
|
||||
// Contents dimensions
|
||||
mAppNameHorizontalMargin = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_app_name_margin_horizontal_collapsed);
|
||||
mArrowMarginEnd = res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_arrow_margin);
|
||||
mIconViewMarginStart = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_view_start_margin);
|
||||
mIconViewDrawableSize = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_drawable_size);
|
||||
mIconViewDrawableMaxSize = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_drawable_max_size);
|
||||
mTextMaxTranslationX =
|
||||
(mIconViewDrawableMaxSize - mIconViewDrawableSize - mIconViewMarginStart)
|
||||
+ (mInnerMargin / 2);
|
||||
|
||||
// ArrowView dimensions
|
||||
int iconArrowViewWidth = res.getDimensionPixelSize(
|
||||
mAppIconSize = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_app_icon_collapsed_size);
|
||||
mArrowSize = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_arrow_size);
|
||||
mMinIconBackgroundCornerRadius = mMinIconBackgroundHeight / 2f;
|
||||
float maxCornerSize = Math.min(mMaxIconBackgroundHeight / 2f,
|
||||
mMaxIconBackgroundCornerRadius);
|
||||
mArrowMaxTranslationX = (mMaxMenuWidth - maxCornerSize) - (Math.min(mMaxWidth,
|
||||
mMinIconBackgroundWidth + (2 * mMinIconBackgroundCornerRadius)
|
||||
- mMinIconBackgroundCornerRadius)) - mInnerMargin;
|
||||
|
||||
// Menu dimensions
|
||||
mMinimumMenuSize =
|
||||
mIconViewMarginStart + mIconViewDrawableSize + mInnerMargin + iconArrowViewWidth;
|
||||
mIconViewDrawableExpandedSize = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_app_icon_expanded_size);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -165,9 +145,7 @@ public class IconAppChipView extends FrameLayout implements TaskViewIcon {
|
||||
mIconTextCollapsedView = findViewById(R.id.icon_text_collapsed);
|
||||
mIconTextExpandedView = findViewById(R.id.icon_text_expanded);
|
||||
mIconArrowView = findViewById(R.id.icon_arrow);
|
||||
mIconViewBackground = findViewById(R.id.icon_view_background);
|
||||
mIconViewBackgroundCornersStart = findViewById(R.id.icon_view_background_corners_start);
|
||||
mIconViewBackgroundCornersEnd = findViewById(R.id.icon_view_background_corners_end);
|
||||
mMenuAnchorView = findViewById(R.id.icon_view_menu_anchor);
|
||||
}
|
||||
|
||||
protected IconView getIconView() {
|
||||
@@ -204,88 +182,85 @@ public class IconAppChipView extends FrameLayout implements TaskViewIcon {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the maximum width of this Icon Menu.
|
||||
* Sets the maximum width of this Icon Menu. This is usually used when space is limited for
|
||||
* split screen.
|
||||
*/
|
||||
public void setMaxWidth(int maxWidth) {
|
||||
// Only the app icon and caret are visible at its minimum width.
|
||||
mMaxWidth = Math.max(maxWidth, mMinimumMenuSize);
|
||||
// Width showing only the app icon and arrow. Max width should not be set to less than this.
|
||||
int minimumMaxWidth = mIconViewMarginStart + mAppIconSize + mArrowSize + mArrowMarginEnd;
|
||||
mMaxWidth = Math.max(maxWidth, minimumMaxWidth);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIconOrientation(RecentsOrientedState orientationState, boolean isGridTask) {
|
||||
RecentsPagedOrientationHandler orientationHandler =
|
||||
orientationState.getOrientationHandler();
|
||||
boolean isRtl = isLayoutRtl();
|
||||
DeviceProfile deviceProfile =
|
||||
ActivityContext.lookupContext(getContext()).getDeviceProfile();
|
||||
// Layout params for anchor view
|
||||
LayoutParams anchorLayoutParams = (LayoutParams) mMenuAnchorView.getLayoutParams();
|
||||
anchorLayoutParams.topMargin = mExpandedMenuDefaultHeight + mMenuToChipGap;
|
||||
mMenuAnchorView.setLayoutParams(anchorLayoutParams);
|
||||
|
||||
// Layout Params for the Menu View
|
||||
int thumbnailTopMargin =
|
||||
deviceProfile.overviewTaskThumbnailTopMarginPx + mIconMenuMarginTop;
|
||||
// Layout Params for the Menu View (this)
|
||||
LayoutParams iconMenuParams = (LayoutParams) getLayoutParams();
|
||||
orientationHandler.setIconAppChipMenuParams(this, iconMenuParams, mIconMenuMarginStart,
|
||||
thumbnailTopMargin);
|
||||
iconMenuParams.width = Math.min(mMaxWidth,
|
||||
mMinIconBackgroundWidth + (int) (2 * mMinIconBackgroundCornerRadius));
|
||||
iconMenuParams.height = mMinIconBackgroundHeight;
|
||||
iconMenuParams.width = mExpandedMenuDefaultWidth;
|
||||
iconMenuParams.height = mExpandedMenuDefaultHeight;
|
||||
orientationHandler.setIconAppChipMenuParams(this, iconMenuParams, mIconMenuMarginTopStart,
|
||||
mIconMenuMarginTopStart);
|
||||
setLayoutParams(iconMenuParams);
|
||||
|
||||
// Layout params for the background
|
||||
Rect collapsedBackgroundBounds = getCollapsedBackgroundLtrBounds();
|
||||
mBackgroundRelativeLtrLocation.set(collapsedBackgroundBounds);
|
||||
setOutlineProvider(new ViewOutlineProvider() {
|
||||
final Rect mRtlAppliedOutlineBounds = new Rect();
|
||||
@Override
|
||||
public void getOutline(View view, Outline outline) {
|
||||
mRtlAppliedOutlineBounds.set(mBackgroundRelativeLtrLocation);
|
||||
if (isLayoutRtl()) {
|
||||
int width = getWidth();
|
||||
mRtlAppliedOutlineBounds.left = width - mBackgroundRelativeLtrLocation.right;
|
||||
mRtlAppliedOutlineBounds.right = width - mBackgroundRelativeLtrLocation.left;
|
||||
}
|
||||
outline.setRoundRect(
|
||||
mRtlAppliedOutlineBounds, mRtlAppliedOutlineBounds.height() / 2f);
|
||||
}
|
||||
});
|
||||
|
||||
// Layout Params for the Icon View
|
||||
LayoutParams iconParams = (LayoutParams) mIconView.getLayoutParams();
|
||||
orientationHandler.setTaskIconParams(iconParams, mIconViewMarginStart,
|
||||
mIconViewDrawableSize, thumbnailTopMargin, isRtl);
|
||||
iconParams.width = iconParams.height = mIconViewDrawableSize;
|
||||
int iconMarginStartRelativeToParent = mIconViewMarginStart + mBackgroundMarginTopStart;
|
||||
orientationHandler.setIconAppChipChildrenParams(
|
||||
iconParams, iconMarginStartRelativeToParent);
|
||||
|
||||
mIconView.setLayoutParams(iconParams);
|
||||
mIconView.setDrawableSize(mIconViewDrawableSize, mIconViewDrawableSize);
|
||||
mIconView.setDrawableSize(mAppIconSize, mAppIconSize);
|
||||
|
||||
// Layout Params for the collapsed Icon Text View
|
||||
int textMarginStart =
|
||||
iconMarginStartRelativeToParent + mAppIconSize + mAppNameHorizontalMargin;
|
||||
LayoutParams iconTextCollapsedParams =
|
||||
(LayoutParams) mIconTextCollapsedView.getLayoutParams();
|
||||
orientationHandler.setTaskIconParams(iconTextCollapsedParams, 0, mIconViewDrawableSize,
|
||||
thumbnailTopMargin, isRtl);
|
||||
iconTextCollapsedParams.setMarginStart(
|
||||
mIconViewDrawableSize + mIconViewMarginStart + mInnerMargin);
|
||||
iconTextCollapsedParams.topMargin = (mMinIconBackgroundHeight - mIconViewDrawableSize) / 2;
|
||||
iconTextCollapsedParams.gravity = Gravity.TOP | Gravity.START;
|
||||
iconTextCollapsedParams.width = Math.min(
|
||||
Math.max(mMaxWidth - mMinimumMenuSize - (2 * mInnerMargin), 0), mIconTextMinWidth);
|
||||
orientationHandler.setIconAppChipChildrenParams(iconTextCollapsedParams, textMarginStart);
|
||||
int collapsedTextWidth = collapsedBackgroundBounds.width() - mIconViewMarginStart
|
||||
- mAppIconSize - mArrowSize - mAppNameHorizontalMargin - mArrowMarginEnd;
|
||||
iconTextCollapsedParams.width = collapsedTextWidth;
|
||||
mIconTextCollapsedView.setLayoutParams(iconTextCollapsedParams);
|
||||
mIconTextCollapsedView.setAlpha(1f);
|
||||
|
||||
// Layout Params for the expanded Icon Text View
|
||||
LayoutParams iconTextExpandedParams =
|
||||
(LayoutParams) mIconTextExpandedView.getLayoutParams();
|
||||
orientationHandler.setTaskIconParams(iconTextExpandedParams, 0, mIconViewDrawableSize,
|
||||
thumbnailTopMargin, isRtl);
|
||||
iconTextExpandedParams.setMarginStart(
|
||||
mIconViewDrawableSize + mIconViewMarginStart + mInnerMargin);
|
||||
iconTextExpandedParams.topMargin = (mMinIconBackgroundHeight - mIconViewDrawableSize) / 2;
|
||||
iconTextExpandedParams.gravity = Gravity.TOP | Gravity.START;
|
||||
orientationHandler.setIconAppChipChildrenParams(iconTextExpandedParams, textMarginStart);
|
||||
mIconTextExpandedView.setLayoutParams(iconTextExpandedParams);
|
||||
mIconTextExpandedView.setAlpha(0f);
|
||||
mIconTextExpandedView.setRevealClip(true, 0, mIconViewDrawableSize / 2f, mIconTextMinWidth);
|
||||
mIconTextExpandedView.setRevealClip(true, 0, mAppIconSize / 2f, collapsedTextWidth);
|
||||
|
||||
// Layout Params for the Icon Arrow View
|
||||
LayoutParams iconArrowParams = (LayoutParams) mIconArrowView.getLayoutParams();
|
||||
iconArrowParams.gravity = Gravity.CENTER_VERTICAL | Gravity.END;
|
||||
iconArrowParams.setMarginEnd(mInnerMargin);
|
||||
int arrowMarginStart = collapsedBackgroundBounds.right - mArrowMarginEnd - mArrowSize;
|
||||
orientationHandler.setIconAppChipChildrenParams(iconArrowParams, arrowMarginStart);
|
||||
mIconArrowView.setLayoutParams(iconArrowParams);
|
||||
|
||||
// Layout Params for the Icon View Background and its corners
|
||||
int cornerlessBackgroundWidth = (int) Math.min(
|
||||
mMaxWidth - (2 * mMinIconBackgroundCornerRadius), mMinIconBackgroundWidth);
|
||||
LayoutParams backgroundCornerEndParams =
|
||||
(LayoutParams) mIconViewBackgroundCornersEnd.getLayoutParams();
|
||||
backgroundCornerEndParams.setMarginStart(cornerlessBackgroundWidth);
|
||||
mIconViewBackgroundCornersEnd.setLayoutParams(backgroundCornerEndParams);
|
||||
LayoutParams backgroundParams = (LayoutParams) mIconViewBackground.getLayoutParams();
|
||||
backgroundParams.width = cornerlessBackgroundWidth;
|
||||
backgroundParams.height = mMinIconBackgroundHeight;
|
||||
backgroundParams.setMarginStart((int) mMinIconBackgroundCornerRadius);
|
||||
mIconViewBackground.setLayoutParams(backgroundParams);
|
||||
mIconViewBackground.setPivotX(isRtl ? cornerlessBackgroundWidth : 0);
|
||||
mIconViewBackground.setPivotY(mMinIconBackgroundCornerRadius);
|
||||
|
||||
// This method is called twice sometimes (like when rotating split tasks). It is called
|
||||
// once before onMeasure and onLayout, and again after onMeasure but before onLayout with
|
||||
// a new width. This happens because we update widths on rotation and on measure of
|
||||
@@ -324,108 +299,96 @@ public class IconAppChipView extends FrameLayout implements TaskViewIcon {
|
||||
|
||||
protected void revealAnim(boolean isRevealing) {
|
||||
cancelInProgressAnimations();
|
||||
final Rect collapsedBackgroundBounds = getCollapsedBackgroundLtrBounds();
|
||||
final Rect expandedBackgroundBounds = getExpandedBackgroundLtrBounds();
|
||||
final Rect initialBackground = new Rect(mBackgroundRelativeLtrLocation);
|
||||
mAnimator = new AnimatorSet();
|
||||
|
||||
if (isRevealing) {
|
||||
boolean isRtl = isLayoutRtl();
|
||||
bringToFront();
|
||||
((AnimatedVectorDrawable) mIconArrowView.getDrawable()).start();
|
||||
mAnimator = new AnimatorSet();
|
||||
float backgroundScaleY = mMaxIconBackgroundHeight / (float) mMinIconBackgroundHeight;
|
||||
float maxCornerSize = Math.min(mMaxIconBackgroundHeight / 2f,
|
||||
mMaxIconBackgroundCornerRadius);
|
||||
float backgroundScaleX = (mMaxMenuWidth - (2 * maxCornerSize)) / Math.min(
|
||||
mMaxWidth - (2 * mMinIconBackgroundCornerRadius), mMinIconBackgroundWidth);
|
||||
float arrowTranslationX = mArrowMaxTranslationX + (mMinIconBackgroundWidth - Math.min(
|
||||
mMaxWidth - (2 * mMinIconBackgroundCornerRadius), mMinIconBackgroundWidth));
|
||||
// Clip expanded text with reveal animation so it doesn't go beyond the edge of the menu
|
||||
Animator expandedTextRevealAnim = ViewAnimationUtils.createCircularReveal(
|
||||
mIconTextExpandedView, 0, mIconTextExpandedView.getHeight() / 2, 0,
|
||||
mIconTextMaxWidth + maxCornerSize);
|
||||
expandedTextRevealAnim.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
// createCircularReveal removes clip on finish, restore it here to clip text.
|
||||
mIconTextExpandedView.setRevealClip(true, 0,
|
||||
mIconTextExpandedView.getHeight() / 2f,
|
||||
mIconTextMaxWidth + maxCornerSize);
|
||||
}
|
||||
});
|
||||
mIconTextExpandedView, 0, mIconTextExpandedView.getHeight() / 2,
|
||||
mIconTextCollapsedView.getWidth(), mIconTextExpandedView.getWidth());
|
||||
// Animate background clipping
|
||||
ValueAnimator backgroundAnimator = ValueAnimator.ofObject(
|
||||
mBackgroundAnimationRectEvaluator,
|
||||
initialBackground,
|
||||
expandedBackgroundBounds);
|
||||
backgroundAnimator.addUpdateListener(valueAnimator -> invalidateOutline());
|
||||
|
||||
float iconViewScaling = mIconViewDrawableExpandedSize / (float) mAppIconSize;
|
||||
float arrowTranslationX =
|
||||
expandedBackgroundBounds.right - collapsedBackgroundBounds.right;
|
||||
float iconCenterToTextCollapsed = mAppIconSize / 2f + mAppNameHorizontalMargin;
|
||||
float iconCenterToTextExpanded =
|
||||
mIconViewDrawableExpandedSize / 2f + mAppNameHorizontalMargin;
|
||||
float textTranslationX = iconCenterToTextExpanded - iconCenterToTextCollapsed;
|
||||
|
||||
float textTranslationXWithRtl = isRtl ? -textTranslationX : textTranslationX;
|
||||
float arrowTranslationWithRtl = isRtl ? -arrowTranslationX : arrowTranslationX;
|
||||
|
||||
mAnimator.playTogether(
|
||||
expandedTextRevealAnim,
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersStart, SCALE_Y,
|
||||
backgroundScaleY),
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersStart, SCALE_X,
|
||||
backgroundScaleY),
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersEnd, SCALE_Y,
|
||||
backgroundScaleY),
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersEnd, SCALE_X,
|
||||
backgroundScaleY),
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersEnd, TRANSLATION_X,
|
||||
isRtl ? -arrowTranslationX : arrowTranslationX),
|
||||
ObjectAnimator.ofFloat(mIconViewBackground, SCALE_X, backgroundScaleX),
|
||||
ObjectAnimator.ofFloat(mIconViewBackground, SCALE_Y, backgroundScaleY),
|
||||
ObjectAnimator.ofFloat(mIconView, SCALE_X,
|
||||
mIconViewDrawableMaxSize / (float) mIconViewDrawableSize),
|
||||
ObjectAnimator.ofFloat(mIconView, SCALE_Y,
|
||||
mIconViewDrawableMaxSize / (float) mIconViewDrawableSize),
|
||||
backgroundAnimator,
|
||||
ObjectAnimator.ofFloat(mIconView, SCALE_X, iconViewScaling),
|
||||
ObjectAnimator.ofFloat(mIconView, SCALE_Y, iconViewScaling),
|
||||
ObjectAnimator.ofFloat(mIconTextCollapsedView, TRANSLATION_X,
|
||||
isLayoutRtl() ? -mTextMaxTranslationX : mTextMaxTranslationX),
|
||||
textTranslationXWithRtl),
|
||||
ObjectAnimator.ofFloat(mIconTextExpandedView, TRANSLATION_X,
|
||||
isLayoutRtl() ? -mTextMaxTranslationX : mTextMaxTranslationX),
|
||||
textTranslationXWithRtl),
|
||||
ObjectAnimator.ofFloat(mIconTextCollapsedView, ALPHA, 0),
|
||||
ObjectAnimator.ofFloat(mIconTextExpandedView, ALPHA, 1),
|
||||
ObjectAnimator.ofFloat(mIconArrowView, TRANSLATION_X,
|
||||
isRtl ? -arrowTranslationX : arrowTranslationX));
|
||||
ObjectAnimator.ofFloat(mIconArrowView, TRANSLATION_X, arrowTranslationWithRtl));
|
||||
mAnimator.setDuration(MENU_BACKGROUND_REVEAL_DURATION);
|
||||
mAnimator.setInterpolator(EMPHASIZED);
|
||||
mAnimator.start();
|
||||
} else {
|
||||
((AnimatedVectorDrawable) mIconArrowView.getDrawable()).reverse();
|
||||
float maxCornerSize = Math.min(mMaxIconBackgroundHeight / 2f,
|
||||
mMaxIconBackgroundCornerRadius);
|
||||
// Clip expanded text with reveal animation so it doesn't go beyond the edge of the menu
|
||||
Animator expandedTextClipAnim = ViewAnimationUtils.createCircularReveal(
|
||||
mIconTextExpandedView, 0, mIconTextExpandedView.getHeight() / 2,
|
||||
mIconTextMaxWidth + maxCornerSize, 0);
|
||||
expandedTextClipAnim.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
// createCircularReveal removes clip on finish, restore it here to clip text.
|
||||
mIconTextExpandedView.setRevealClip(true, 0,
|
||||
mIconTextExpandedView.getHeight() / 2f, 0);
|
||||
}
|
||||
});
|
||||
mAnimator = new AnimatorSet();
|
||||
mIconTextExpandedView.getWidth(), mIconTextCollapsedView.getWidth());
|
||||
|
||||
// Animate background clipping
|
||||
ValueAnimator backgroundAnimator = ValueAnimator.ofObject(
|
||||
mBackgroundAnimationRectEvaluator,
|
||||
initialBackground,
|
||||
collapsedBackgroundBounds);
|
||||
backgroundAnimator.addUpdateListener(valueAnimator -> invalidateOutline());
|
||||
|
||||
mAnimator.playTogether(
|
||||
expandedTextClipAnim,
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersStart, SCALE_X, 1),
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersStart, SCALE_Y, 1),
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersEnd, SCALE_X, 1),
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersEnd, SCALE_Y, 1),
|
||||
ObjectAnimator.ofFloat(mIconViewBackgroundCornersEnd, TRANSLATION_X, 0),
|
||||
ObjectAnimator.ofFloat(mIconViewBackground, SCALE_X, 1),
|
||||
ObjectAnimator.ofFloat(mIconViewBackground, SCALE_Y, 1),
|
||||
ObjectAnimator.ofFloat(mIconView, SCALE_X, 1),
|
||||
ObjectAnimator.ofFloat(mIconView, SCALE_Y, 1),
|
||||
backgroundAnimator,
|
||||
ObjectAnimator.ofFloat(mIconView, SCALE_PROPERTY, 1),
|
||||
ObjectAnimator.ofFloat(mIconTextCollapsedView, TRANSLATION_X, 0),
|
||||
ObjectAnimator.ofFloat(mIconTextExpandedView, TRANSLATION_X, 0),
|
||||
ObjectAnimator.ofFloat(mIconTextCollapsedView, ALPHA, 1),
|
||||
ObjectAnimator.ofFloat(mIconTextExpandedView, ALPHA, 0),
|
||||
ObjectAnimator.ofFloat(mIconArrowView, TRANSLATION_X, 0));
|
||||
mAnimator.setDuration(MENU_BACKGROUND_HIDE_DURATION);
|
||||
mAnimator.setInterpolator(EMPHASIZED);
|
||||
mAnimator.start();
|
||||
}
|
||||
|
||||
mAnimator.setInterpolator(EMPHASIZED);
|
||||
mAnimator.start();
|
||||
}
|
||||
|
||||
private Rect getCollapsedBackgroundLtrBounds() {
|
||||
Rect bounds = new Rect(
|
||||
0,
|
||||
0,
|
||||
Math.min(mMaxWidth, mCollapsedMenuDefaultWidth),
|
||||
mCollapsedMenuDefaultHeight);
|
||||
bounds.offset(mBackgroundMarginTopStart, mBackgroundMarginTopStart);
|
||||
return bounds;
|
||||
}
|
||||
|
||||
private Rect getExpandedBackgroundLtrBounds() {
|
||||
return new Rect(0, 0, mExpandedMenuDefaultWidth, mExpandedMenuDefaultHeight);
|
||||
}
|
||||
|
||||
protected void reset() {
|
||||
mIconViewBackgroundCornersStart.setScaleX(1);
|
||||
mIconViewBackgroundCornersStart.setScaleY(1);
|
||||
mIconViewBackgroundCornersEnd.setScaleX(1);
|
||||
mIconViewBackgroundCornersEnd.setScaleY(1);
|
||||
mIconViewBackgroundCornersEnd.setTranslationX(0);
|
||||
mIconViewBackground.setScaleX(1);
|
||||
mIconViewBackground.setScaleY(1);
|
||||
mBackgroundRelativeLtrLocation.set(getCollapsedBackgroundLtrBounds());
|
||||
mIconView.setScaleX(1);
|
||||
mIconView.setScaleY(1);
|
||||
mIconTextCollapsedView.setTranslationX(0);
|
||||
|
||||
@@ -15,8 +15,6 @@
|
||||
*/
|
||||
package com.android.quickstep.views;
|
||||
|
||||
import static com.android.launcher3.Flags.enableOverviewIconMenu;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Rect;
|
||||
@@ -196,10 +194,8 @@ public class IconView extends View implements TaskViewIcon {
|
||||
setLayoutParams(iconParams);
|
||||
|
||||
setRotation(orientationHandler.getDegreesRotated());
|
||||
int iconDrawableSize = enableOverviewIconMenu()
|
||||
? deviceProfile.overviewTaskIconAppChipMenuDrawableSizePx
|
||||
: isGridTask ? deviceProfile.overviewTaskIconDrawableSizeGridPx
|
||||
: deviceProfile.overviewTaskIconDrawableSizePx;
|
||||
int iconDrawableSize = isGridTask ? deviceProfile.overviewTaskIconDrawableSizeGridPx
|
||||
: deviceProfile.overviewTaskIconDrawableSizePx;
|
||||
setDrawableSize(iconDrawableSize, iconDrawableSize);
|
||||
}
|
||||
|
||||
|
||||
@@ -225,8 +225,10 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
// Get Position
|
||||
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
|
||||
mActivity.getDragLayer().getDescendantRectRelativeToSelf(
|
||||
enableOverviewIconMenu() ? taskContainer.getIconView().asView()
|
||||
: taskContainer.getThumbnailView(), sTempRect);
|
||||
enableOverviewIconMenu()
|
||||
? getIconView().findViewById(R.id.icon_view_menu_anchor)
|
||||
: taskContainer.getThumbnailView(),
|
||||
sTempRect);
|
||||
Rect insets = mActivity.getDragLayer().getInsets();
|
||||
BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) getLayoutParams();
|
||||
params.width = orientationHandler.getTaskMenuWidth(taskContainer.getThumbnailView(),
|
||||
@@ -246,15 +248,9 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
|
||||
orientationHandler.setTaskOptionsMenuLayoutOrientation(
|
||||
deviceProfile, mOptionLayout, dividerSpacing, divider);
|
||||
float thumbnailAlignedX = sTempRect.left - insets.left + (enableOverviewIconMenu()
|
||||
? -getResources().getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_touch_max_margin)
|
||||
- getResources().getDimension(R.dimen.task_thumbnail_icon_menu_start_margin)
|
||||
: 0);
|
||||
float thumbnailAlignedY = sTempRect.top - insets.top + (enableOverviewIconMenu()
|
||||
? getResources().getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_max_height)
|
||||
- getResources().getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_top_margin) : 0);
|
||||
float thumbnailAlignedX = sTempRect.left - insets.left;
|
||||
float thumbnailAlignedY = sTempRect.top - insets.top;
|
||||
|
||||
// Changing pivot to make computations easier
|
||||
// NOTE: Changing the pivots means the rotated view gets rotated about the new pivots set,
|
||||
// which would render the X and Y position set here incorrect
|
||||
@@ -262,31 +258,35 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
setPivotY(0);
|
||||
setRotation(orientationHandler.getDegreesRotated());
|
||||
|
||||
// Margin that insets the menuView inside the taskView
|
||||
float taskInsetMarginX = enableOverviewIconMenu() ? getResources().getDimension(
|
||||
R.dimen.task_thumbnail_icon_menu_start_margin) : getResources().getDimension(
|
||||
R.dimen.task_card_margin);
|
||||
float taskInsetMarginY = enableOverviewIconMenu() ? getResources().getDimension(
|
||||
R.dimen.task_thumbnail_icon_menu_start_margin) : getResources().getDimension(
|
||||
R.dimen.task_card_margin);
|
||||
setTranslationX(orientationHandler.getTaskMenuX(thumbnailAlignedX,
|
||||
mTaskContainer.getThumbnailView(), deviceProfile, taskInsetMarginX,
|
||||
mTaskContainer.getIconView().asView()));
|
||||
setTranslationY(orientationHandler.getTaskMenuY(
|
||||
thumbnailAlignedY, mTaskContainer.getThumbnailView(),
|
||||
mTaskContainer.getStagePosition(), this, taskInsetMarginY,
|
||||
mTaskContainer.getIconView().asView()));
|
||||
if (enableOverviewIconMenu()) {
|
||||
setTranslationX(thumbnailAlignedX);
|
||||
setTranslationY(thumbnailAlignedY);
|
||||
} else {
|
||||
// Margin that insets the menuView inside the taskView
|
||||
float taskInsetMargin = getResources().getDimension(R.dimen.task_card_margin);
|
||||
setTranslationX(orientationHandler.getTaskMenuX(thumbnailAlignedX,
|
||||
mTaskContainer.getThumbnailView(), deviceProfile, taskInsetMargin,
|
||||
getIconView()));
|
||||
setTranslationY(orientationHandler.getTaskMenuY(
|
||||
thumbnailAlignedY, mTaskContainer.getThumbnailView(),
|
||||
mTaskContainer.getStagePosition(), this, taskInsetMargin,
|
||||
getIconView()));
|
||||
}
|
||||
}
|
||||
|
||||
private void animateOpen() {
|
||||
mMenuTranslationYBeforeOpen = getTranslationY();
|
||||
mMenuTranslationXBeforeOpen = getTranslationX();
|
||||
mIconViewTranslationYBeforeOpen = mTaskContainer.getIconView().asView().getTranslationY();
|
||||
mIconViewTranslationXBeforeOpen = mTaskContainer.getIconView().asView().getTranslationX();
|
||||
mIconViewTranslationYBeforeOpen = getIconView().getTranslationY();
|
||||
mIconViewTranslationXBeforeOpen = getIconView().getTranslationX();
|
||||
animateOpenOrClosed(false);
|
||||
mIsOpen = true;
|
||||
}
|
||||
|
||||
private View getIconView() {
|
||||
return mTaskContainer.getIconView().asView();
|
||||
}
|
||||
|
||||
private void animateClose() {
|
||||
animateOpenOrClosed(true);
|
||||
}
|
||||
@@ -318,17 +318,13 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
float midpoint = (taskBottom + taskbarTop) / 2f;
|
||||
additionalTranslationY = -Math.max(menuBottom - midpoint, 0);
|
||||
}
|
||||
// Translate the menu to account for the expansion of the app chip menu as well.
|
||||
float expandOffsetTranslationY = getResources().getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_expanded_gap);
|
||||
ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(this, TRANSLATION_Y,
|
||||
closing ? mMenuTranslationYBeforeOpen
|
||||
: mMenuTranslationYBeforeOpen + additionalTranslationY
|
||||
+ expandOffsetTranslationY);
|
||||
: mMenuTranslationYBeforeOpen + additionalTranslationY);
|
||||
translationYAnim.setInterpolator(EMPHASIZED);
|
||||
|
||||
ObjectAnimator menuTranslationYAnim = ObjectAnimator.ofFloat(
|
||||
mTaskContainer.getIconView().asView(), TRANSLATION_Y,
|
||||
getIconView(), TRANSLATION_Y,
|
||||
closing ? mIconViewTranslationYBeforeOpen
|
||||
: mIconViewTranslationYBeforeOpen + additionalTranslationY);
|
||||
menuTranslationYAnim.setInterpolator(EMPHASIZED);
|
||||
@@ -349,7 +345,7 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
translationXAnim.setInterpolator(EMPHASIZED);
|
||||
|
||||
ObjectAnimator menuTranslationXAnim = ObjectAnimator.ofFloat(
|
||||
mTaskContainer.getIconView().asView(), TRANSLATION_X,
|
||||
getIconView(), TRANSLATION_X,
|
||||
closing ? mIconViewTranslationXBeforeOpen
|
||||
: mIconViewTranslationXBeforeOpen - additionalTranslationX);
|
||||
menuTranslationXAnim.setInterpolator(EMPHASIZED);
|
||||
@@ -393,7 +389,7 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
if (enableOverviewIconMenu()) {
|
||||
((IconAppChipView) mTaskContainer.getIconView()).reset();
|
||||
setTranslationY(mMenuTranslationYBeforeOpen);
|
||||
mTaskContainer.getIconView().asView().setTranslationY(mIconViewTranslationYBeforeOpen);
|
||||
getIconView().setTranslationY(mIconViewTranslationYBeforeOpen);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2023 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"
|
||||
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="?androidprv:attr/materialColorSurfaceBright" />
|
||||
</shape>
|
||||
@@ -1,22 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2023 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"
|
||||
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="?androidprv:attr/materialColorSurfaceBright" />
|
||||
<corners android:radius="@dimen/task_thumbnail_icon_menu_corner_radius" />
|
||||
</shape>
|
||||
@@ -1,22 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2023 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"
|
||||
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="?androidprv:attr/materialColorSurfaceBright" />
|
||||
<corners android:radius="@dimen/task_thumbnail_icon_menu_corner_radius" />
|
||||
</shape>
|
||||
@@ -414,11 +414,6 @@
|
||||
<dimen name="task_thumbnail_icon_size">0dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_drawable_size">0dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_drawable_size_grid">0dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_menu_max_width">0dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_menu_start_margin">0dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_menu_background_max_width">0dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_menu_corner_radius">0dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_menu_drawable_size">0dp</dimen>
|
||||
<dimen name="task_thumbnail_icon_menu_drawable_touch_size">0dp</dimen>
|
||||
<dimen name="task_menu_edge_padding">0dp</dimen>
|
||||
<dimen name="overview_task_margin">0dp</dimen>
|
||||
|
||||
@@ -260,7 +260,6 @@ public class DeviceProfile {
|
||||
public int overviewTaskIconSizePx;
|
||||
public int overviewTaskIconDrawableSizePx;
|
||||
public int overviewTaskIconDrawableSizeGridPx;
|
||||
public int overviewTaskIconAppChipMenuDrawableSizePx;
|
||||
public int overviewTaskThumbnailTopMarginPx;
|
||||
public final int overviewActionsHeight;
|
||||
public final int overviewActionsTopMarginPx;
|
||||
@@ -686,8 +685,6 @@ public class DeviceProfile {
|
||||
res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_drawable_size);
|
||||
overviewTaskIconDrawableSizeGridPx =
|
||||
res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_drawable_size_grid);
|
||||
overviewTaskIconAppChipMenuDrawableSizePx = res.getDimensionPixelSize(
|
||||
R.dimen.task_thumbnail_icon_menu_drawable_size);
|
||||
overviewTaskThumbnailTopMarginPx =
|
||||
enableOverviewIconMenu() ? 0 : overviewTaskIconSizePx + overviewTaskMarginPx;
|
||||
// Don't add margin with floating search bar to minimize risk of overlapping.
|
||||
@@ -2163,8 +2160,6 @@ public class DeviceProfile {
|
||||
overviewTaskIconDrawableSizePx));
|
||||
writer.println(prefix + pxToDpStr("overviewTaskIconDrawableSizeGridPx",
|
||||
overviewTaskIconDrawableSizeGridPx));
|
||||
writer.println(prefix + pxToDpStr("overviewTaskIconAppChipMenuDrawableSizePx",
|
||||
overviewTaskIconAppChipMenuDrawableSizePx));
|
||||
writer.println(prefix + pxToDpStr("overviewTaskThumbnailTopMarginPx",
|
||||
overviewTaskThumbnailTopMarginPx));
|
||||
writer.println(prefix + pxToDpStr("overviewActionsTopMarginPx",
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
@@ -110,7 +110,6 @@ DeviceProfile:
|
||||
overviewTaskIconSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)
|
||||
overviewTaskIconAppChipMenuDrawableSizePx: 0.0px (0.0dp)
|
||||
overviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsTopMarginPx: 0.0px (0.0dp)
|
||||
overviewActionsHeight: 0.0px (0.0dp)
|
||||
|
||||
Reference in New Issue
Block a user