Merge "Ensure app widget ids are restored after database is sanitized." into ub-launcher3-qt-dev
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/QuickSwitchState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/QuickSwitchState.java
index fa07e27..c26a1d0 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/QuickSwitchState.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/QuickSwitchState.java
@@ -17,13 +17,10 @@
import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS;
-import android.graphics.Rect;
-
import com.android.launcher3.Launcher;
import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.quickstep.util.ClipAnimationHelper;
import com.android.quickstep.views.RecentsView;
-import com.android.quickstep.views.TaskThumbnailView;
import com.android.quickstep.views.TaskView;
/**
@@ -45,18 +42,9 @@
if (recentsView.getTaskViewCount() == 0) {
return super.getOverviewScaleAndTranslation(launcher);
}
- // Compute scale and translation y such that the most recent task view fills the screen.
- TaskThumbnailView dummyThumbnail = recentsView.getTaskViewAt(0).getThumbnail();
+ TaskView dummyTask = recentsView.getTaskViewAt(0);
ClipAnimationHelper clipAnimationHelper = new ClipAnimationHelper(launcher);
- clipAnimationHelper.fromTaskThumbnailView(dummyThumbnail, recentsView);
- Rect targetRect = new Rect();
- recentsView.getTaskSize(targetRect);
- clipAnimationHelper.updateTargetRect(targetRect);
- float toScale = clipAnimationHelper.getSourceRect().width()
- / clipAnimationHelper.getTargetRect().width();
- float toTranslationY = clipAnimationHelper.getSourceRect().centerY()
- - clipAnimationHelper.getTargetRect().centerY();
- return new ScaleAndTranslation(toScale, 0, toTranslationY);
+ return clipAnimationHelper.getOverviewFullscreenScaleAndTranslation(dummyTask);
}
@Override
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
index 3b664b7..a1a790c 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
@@ -124,7 +124,7 @@
@Override
protected void updateProgress(float progress) {
super.updateProgress(progress);
- updateFullscreenProgress(progress);
+ updateFullscreenProgress(Utilities.boundToRange(progress, 0, 1));
}
private void updateFullscreenProgress(float progress) {
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
index e932452..c33d25c 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
@@ -301,34 +301,19 @@
return;
}
- // Setup the clip animation helper source/target rects in the final transformed state
- // of the recents view (a scale/translationY may be applied prior to this animation
- // starting to line up the side pages during swipe up)
- float prevRvScale = recentsView.getScaleX();
- float prevRvTransY = recentsView.getTranslationY();
- float targetRvScale = endState.getOverviewScaleAndTranslation(launcher).scale;
- SCALE_PROPERTY.set(recentsView, targetRvScale);
- recentsView.setTranslationY(0);
ClipAnimationHelper clipHelper = new ClipAnimationHelper(launcher);
- float tmpCurveScale = v.getCurveScale();
- v.setCurveScale(1f);
- clipHelper.fromTaskThumbnailView(v.getThumbnail(), (RecentsView) v.getParent(), null);
- v.setCurveScale(tmpCurveScale);
- SCALE_PROPERTY.set(recentsView, prevRvScale);
- recentsView.setTranslationY(prevRvTransY);
+ LauncherState.ScaleAndTranslation fromScaleAndTranslation
+ = clipHelper.getOverviewFullscreenScaleAndTranslation(v);
+ LauncherState.ScaleAndTranslation endScaleAndTranslation
+ = endState.getOverviewScaleAndTranslation(launcher);
- if (!clipHelper.getSourceRect().isEmpty() && !clipHelper.getTargetRect().isEmpty()) {
- float fromScale = clipHelper.getSourceRect().width()
- / clipHelper.getTargetRect().width();
- float fromTranslationY = clipHelper.getSourceRect().centerY()
- - clipHelper.getTargetRect().centerY();
- Animator scale = ObjectAnimator.ofFloat(recentsView, SCALE_PROPERTY, fromScale, 1);
- Animator translateY = ObjectAnimator.ofFloat(recentsView, TRANSLATION_Y,
- fromTranslationY, 0);
- scale.setInterpolator(LINEAR);
- translateY.setInterpolator(LINEAR);
- anim.playTogether(scale, translateY);
- }
+ Animator scale = ObjectAnimator.ofFloat(recentsView, SCALE_PROPERTY,
+ fromScaleAndTranslation.scale, endScaleAndTranslation.scale);
+ Animator translateY = ObjectAnimator.ofFloat(recentsView, TRANSLATION_Y,
+ fromScaleAndTranslation.translationY, endScaleAndTranslation.translationY);
+ scale.setInterpolator(LINEAR);
+ translateY.setInterpolator(LINEAR);
+ anim.playTogether(scale, translateY);
}
@Override
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/ClipAnimationHelper.java
index 3109921..a650113 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/ClipAnimationHelper.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/ClipAnimationHelper.java
@@ -35,12 +35,14 @@
import com.android.launcher3.BaseDraggingActivity;
import com.android.launcher3.DeviceProfile;
+import com.android.launcher3.LauncherState;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskThumbnailView;
+import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.recents.utilities.RectFEvaluator;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
@@ -280,6 +282,21 @@
}
}
+ /**
+ * Compute scale and translation y such that the specified task view fills the screen.
+ */
+ public LauncherState.ScaleAndTranslation getOverviewFullscreenScaleAndTranslation(TaskView v) {
+ TaskThumbnailView thumbnailView = v.getThumbnail();
+ RecentsView recentsView = v.getRecentsView();
+ fromTaskThumbnailView(thumbnailView, recentsView);
+ Rect taskSize = new Rect();
+ recentsView.getTaskSize(taskSize);
+ updateTargetRect(taskSize);
+ float scale = mSourceRect.width() / mTargetRect.width();
+ float translationY = mSourceRect.centerY() - mSourceRect.top - mTargetRect.centerY();
+ return new LauncherState.ScaleAndTranslation(scale, 0, translationY);
+ }
+
private void updateStackBoundsToMultiWindowTaskSize(BaseDraggingActivity activity) {
ISystemUiProxy sysUiProxy = RecentsModel.INSTANCE.get(activity).getSystemUiProxy();
if (sysUiProxy != null) {
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java
index 7e15d52..a9184ec 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java
@@ -33,6 +33,7 @@
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.util.FloatProperty;
@@ -59,7 +60,7 @@
private final static ColorMatrix COLOR_MATRIX = new ColorMatrix();
private final static ColorMatrix SATURATION_COLOR_MATRIX = new ColorMatrix();
- private final static Rect EMPTY_RECT = new Rect();
+ private final static RectF EMPTY_RECT_F = new RectF();
public static final Property<TaskThumbnailView, Float> DIM_ALPHA =
new FloatProperty<TaskThumbnailView>("dimAlpha") {
@@ -87,10 +88,9 @@
private final Matrix mMatrix = new Matrix();
private float mClipBottom = -1;
- private Rect mScaledInsets = new Rect();
- private Rect mCurrentDrawnInsets = new Rect();
- private float mCurrentDrawnCornerRadius;
- private boolean mIsRotated;
+ // Contains the portion of the thumbnail that is clipped when fullscreen progress = 0.
+ private RectF mClippedInsets = new RectF();
+ private TaskView.FullscreenDrawParams mFullscreenParams;
private Task mTask;
private ThumbnailData mThumbnailData;
@@ -118,7 +118,7 @@
mDimmingPaintAfterClearing.setColor(Color.BLACK);
mActivity = BaseActivity.fromContext(context);
mIsDarkTextTheme = Themes.getAttrBoolean(mActivity, R.attr.isWorkspaceDarkText);
- setCurrentDrawnInsetsAndRadius(EMPTY_RECT, mCornerRadius);
+ mFullscreenParams = new TaskView.FullscreenDrawParams(mCornerRadius);
}
public void bind(Task task) {
@@ -201,23 +201,27 @@
@Override
protected void onDraw(Canvas canvas) {
+ RectF currentDrawnInsets = mFullscreenParams.mCurrentDrawnInsets;
+ canvas.save();
+ canvas.translate(currentDrawnInsets.left, currentDrawnInsets.top);
+ canvas.scale(mFullscreenParams.mScale, mFullscreenParams.mScale);
// Draw the insets if we're being drawn fullscreen (we do this for quick switch).
drawOnCanvas(canvas,
- -mCurrentDrawnInsets.left,
- -mCurrentDrawnInsets.top,
- getMeasuredWidth() + mCurrentDrawnInsets.right,
- getMeasuredHeight() + mCurrentDrawnInsets.bottom,
- mCurrentDrawnCornerRadius);
+ -currentDrawnInsets.left,
+ -currentDrawnInsets.top,
+ getMeasuredWidth() + currentDrawnInsets.right,
+ getMeasuredHeight() + currentDrawnInsets.bottom,
+ mFullscreenParams.mCurrentDrawnCornerRadius);
+ canvas.restore();
}
- public Rect getInsetsToDrawInFullscreen(boolean isMultiWindowMode) {
- // Don't show insets in the wrong orientation or in multi window mode.
- return mIsRotated || isMultiWindowMode ? EMPTY_RECT : mScaledInsets;
+ public RectF getInsetsToDrawInFullscreen(boolean isMultiWindowMode) {
+ // Don't show insets in multi window mode.
+ return isMultiWindowMode ? EMPTY_RECT_F : mClippedInsets;
}
- public void setCurrentDrawnInsetsAndRadius(Rect insets, float radius) {
- mCurrentDrawnInsets.set(insets);
- mCurrentDrawnCornerRadius = radius;
+ public void setFullscreenParams(TaskView.FullscreenDrawParams fullscreenParams) {
+ mFullscreenParams = fullscreenParams;
invalidate();
}
@@ -275,7 +279,7 @@
}
private void updateThumbnailMatrix() {
- mIsRotated = false;
+ boolean isRotated = false;
mClipBottom = -1;
if (mBitmapShader != null && mThumbnailData != null) {
float scale = mThumbnailData.scale;
@@ -296,30 +300,28 @@
final Configuration configuration =
getContext().getResources().getConfiguration();
// Rotate the screenshot if not in multi-window mode
- mIsRotated = FeatureFlags.OVERVIEW_USE_SCREENSHOT_ORIENTATION &&
+ isRotated = FeatureFlags.OVERVIEW_USE_SCREENSHOT_ORIENTATION &&
configuration.orientation != mThumbnailData.orientation &&
!mActivity.isInMultiWindowMode() &&
mThumbnailData.windowingMode == WINDOWING_MODE_FULLSCREEN;
// Scale the screenshot to always fit the width of the card.
- thumbnailScale = mIsRotated
+ thumbnailScale = isRotated
? getMeasuredWidth() / thumbnailHeight
: getMeasuredWidth() / thumbnailWidth;
}
- mScaledInsets.set(thumbnailInsets);
- Utilities.scaleRect(mScaledInsets, thumbnailScale);
-
- if (mIsRotated) {
+ if (isRotated) {
int rotationDir = profile.isVerticalBarLayout() && !profile.isSeascape() ? -1 : 1;
mMatrix.setRotate(90 * rotationDir);
int newLeftInset = rotationDir == 1 ? thumbnailInsets.bottom : thumbnailInsets.top;
int newTopInset = rotationDir == 1 ? thumbnailInsets.left : thumbnailInsets.right;
- mMatrix.postTranslate(-newLeftInset * scale, -newTopInset * scale);
+ mClippedInsets.offsetTo(newLeftInset * scale, newTopInset * scale);
if (rotationDir == -1) {
// Crop the right/bottom side of the screenshot rather than left/top
float excessHeight = thumbnailWidth * thumbnailScale - getMeasuredHeight();
- mMatrix.postTranslate(0, -excessHeight);
+ mClippedInsets.offset(0, excessHeight);
}
+ mMatrix.postTranslate(-mClippedInsets.left, -mClippedInsets.top);
// Move the screenshot to the thumbnail window (rotation moved it out).
if (rotationDir == 1) {
mMatrix.postTranslate(mThumbnailData.thumbnail.getHeight(), 0);
@@ -327,13 +329,28 @@
mMatrix.postTranslate(0, mThumbnailData.thumbnail.getWidth());
}
} else {
- mMatrix.setTranslate(-mThumbnailData.insets.left * scale,
- -mThumbnailData.insets.top * scale);
+ mClippedInsets.offsetTo(thumbnailInsets.left * scale, thumbnailInsets.top * scale);
+ mMatrix.setTranslate(-mClippedInsets.left, -mClippedInsets.top);
}
+
+ final float widthWithInsets;
+ final float heightWithInsets;
+ if (isRotated) {
+ widthWithInsets = mThumbnailData.thumbnail.getHeight() * thumbnailScale;
+ heightWithInsets = mThumbnailData.thumbnail.getWidth() * thumbnailScale;
+ } else {
+ widthWithInsets = mThumbnailData.thumbnail.getWidth() * thumbnailScale;
+ heightWithInsets = mThumbnailData.thumbnail.getHeight() * thumbnailScale;
+ }
+ mClippedInsets.left *= thumbnailScale;
+ mClippedInsets.top *= thumbnailScale;
+ mClippedInsets.right = widthWithInsets - mClippedInsets.left - getMeasuredWidth();
+ mClippedInsets.bottom = heightWithInsets - mClippedInsets.top - getMeasuredHeight();
+
mMatrix.postScale(thumbnailScale, thumbnailScale);
mBitmapShader.setLocalMatrix(mMatrix);
- float bitmapHeight = Math.max((mIsRotated ? thumbnailWidth : thumbnailHeight)
+ float bitmapHeight = Math.max((isRotated ? thumbnailWidth : thumbnailHeight)
* thumbnailScale, 0);
if (Math.round(bitmapHeight) < getMeasuredHeight()) {
mClipBottom = bitmapHeight;
@@ -341,7 +358,7 @@
mPaint.setShader(mBitmapShader);
}
- if (mIsRotated) {
+ if (isRotated) {
// The overlay doesn't really work when the screenshot is rotated, so don't add it.
mOverlay.reset();
} else {
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
index 6cd46d9..2b86f5e 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
@@ -32,6 +32,7 @@
import android.content.res.Resources;
import android.graphics.Outline;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
@@ -166,7 +167,7 @@
private float mCurveScale;
private float mZoomScale;
private float mFullscreenProgress;
- private final Rect mCurrentDrawnInsets = new Rect();
+ private final FullscreenDrawParams mCurrentFullscreenParams;
private final float mCornerRadius;
private final float mWindowCornerRadius;
private final BaseDraggingActivity mActivity;
@@ -214,7 +215,8 @@
});
mCornerRadius = TaskCornerRadius.get(context);
mWindowCornerRadius = QuickStepContract.getWindowCornerRadius(context.getResources());
- mOutlineProvider = new TaskOutlineProvider(getResources(), mCornerRadius);
+ mCurrentFullscreenParams = new FullscreenDrawParams(mCornerRadius);
+ mOutlineProvider = new TaskOutlineProvider(getResources(), mCurrentFullscreenParams);
setOutlineProvider(mOutlineProvider);
}
@@ -540,26 +542,26 @@
private static final class TaskOutlineProvider extends ViewOutlineProvider {
private final int mMarginTop;
- private final Rect mInsets = new Rect();
- private float mRadius;
+ private FullscreenDrawParams mFullscreenParams;
- TaskOutlineProvider(Resources res, float radius) {
+ TaskOutlineProvider(Resources res, FullscreenDrawParams fullscreenParams) {
mMarginTop = res.getDimensionPixelSize(R.dimen.task_thumbnail_top_margin);
- mRadius = radius;
+ mFullscreenParams = fullscreenParams;
}
- public void setCurrentDrawnInsetsAndRadius(Rect insets, float radius) {
- mInsets.set(insets);
- mRadius = radius;
+ public void setFullscreenParams(FullscreenDrawParams params) {
+ mFullscreenParams = params;
}
@Override
public void getOutline(View view, Outline outline) {
- outline.setRoundRect(-mInsets.left,
- mMarginTop - mInsets.top,
- view.getWidth() + mInsets.right,
- view.getHeight() + mInsets.bottom,
- mRadius);
+ RectF insets = mFullscreenParams.mCurrentDrawnInsets;
+ float scale = mFullscreenParams.mScale;
+ outline.setRoundRect(0,
+ (int) (mMarginTop * scale),
+ (int) ((insets.left + view.getWidth() + insets.right) * scale),
+ (int) ((insets.top + view.getHeight() + insets.bottom) * scale),
+ mFullscreenParams.mCurrentDrawnCornerRadius);
}
}
@@ -658,17 +660,25 @@
TaskThumbnailView thumbnail = getThumbnail();
boolean isMultiWindowMode = mActivity.getDeviceProfile().isMultiWindowMode;
- Rect insets = thumbnail.getInsetsToDrawInFullscreen(isMultiWindowMode);
- mCurrentDrawnInsets.set((int) (insets.left * mFullscreenProgress),
- (int) (insets.top * mFullscreenProgress),
- (int) (insets.right * mFullscreenProgress),
- (int) (insets.bottom * mFullscreenProgress));
+ RectF insets = thumbnail.getInsetsToDrawInFullscreen(isMultiWindowMode);
+ float currentInsetsLeft = insets.left * mFullscreenProgress;
+ float currentInsetsRight = insets.right * mFullscreenProgress;
+ mCurrentFullscreenParams.setInsets(currentInsetsLeft,
+ insets.top * mFullscreenProgress,
+ currentInsetsRight,
+ insets.bottom * mFullscreenProgress);
float fullscreenCornerRadius = isMultiWindowMode ? 0 : mWindowCornerRadius;
- float cornerRadius = Utilities.mapRange(mFullscreenProgress, mCornerRadius,
- fullscreenCornerRadius) / getRecentsView().getScaleX();
+ mCurrentFullscreenParams.setCornerRadius(Utilities.mapRange(mFullscreenProgress,
+ mCornerRadius, fullscreenCornerRadius) / getRecentsView().getScaleX());
+ // We scaled the thumbnail to fit the content (excluding insets) within task view width.
+ // Now that we are drawing left/right insets again, we need to scale down to fit them.
+ if (getWidth() > 0) {
+ mCurrentFullscreenParams.setScale(getWidth()
+ / (getWidth() + currentInsetsLeft + currentInsetsRight));
+ }
- thumbnail.setCurrentDrawnInsetsAndRadius(mCurrentDrawnInsets, cornerRadius);
- mOutlineProvider.setCurrentDrawnInsetsAndRadius(mCurrentDrawnInsets, cornerRadius);
+ thumbnail.setFullscreenParams(mCurrentFullscreenParams);
+ mOutlineProvider.setFullscreenParams(mCurrentFullscreenParams);
invalidateOutline();
}
@@ -686,4 +696,30 @@
}
return mShowScreenshot;
}
+
+ /**
+ * We update and subsequently draw these in {@link #setFullscreenProgress(float)}.
+ */
+ static class FullscreenDrawParams {
+ RectF mCurrentDrawnInsets = new RectF();
+ float mCurrentDrawnCornerRadius;
+ /** The current scale we apply to the thumbnail to adjust for new left/right insets. */
+ float mScale = 1;
+
+ public FullscreenDrawParams(float cornerRadius) {
+ setCornerRadius(cornerRadius);
+ }
+
+ public void setInsets(float left, float top, float right, float bottom) {
+ mCurrentDrawnInsets.set(left, top, right, bottom);
+ }
+
+ public void setCornerRadius(float cornerRadius) {
+ mCurrentDrawnCornerRadius = cornerRadius;
+ }
+
+ public void setScale(float scale) {
+ mScale = scale;
+ }
+ }
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
index 4f50cdb..77ac35c 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
@@ -194,7 +194,7 @@
public static ScaleAndTranslation getOverviewScaleAndTranslationForNormalState(Launcher l) {
if (SysUINavigationMode.getMode(l) == Mode.NO_BUTTON) {
- float offscreenTranslationX = l.getDragLayer().getWidth()
+ float offscreenTranslationX = l.getDeviceProfile().widthPx
- l.getOverviewPanel().getPaddingStart();
return new ScaleAndTranslation(1f, offscreenTranslationX, 0f);
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/WallpaperColorInfo.java b/quickstep/src/com/android/launcher3/uioverrides/WallpaperColorInfo.java
index 8218517..711e59a 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/WallpaperColorInfo.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/WallpaperColorInfo.java
@@ -35,6 +35,10 @@
@TargetApi(Build.VERSION_CODES.P)
public class WallpaperColorInfo implements OnColorsChangedListener {
+ private static final int MAIN_COLOR_LIGHT = 0xffdadce0;
+ private static final int MAIN_COLOR_DARK = 0xff202124;
+ private static final int MAIN_COLOR_REGULAR = 0xff000000;
+
private static final Object sInstanceLock = new Object();
private static WallpaperColorInfo sInstance;
@@ -79,6 +83,10 @@
return mExtractionInfo.supportsDarkText;
}
+ public boolean isMainColorDark() {
+ return mExtractionInfo.mainColor == MAIN_COLOR_DARK;
+ }
+
@Override
public void onColorsChanged(WallpaperColors colors, int which) {
if ((which & FLAG_SYSTEM) != 0) {
diff --git a/res/drawable-v28/round_rect_folder.xml b/res/drawable-v28/round_rect_folder.xml
new file mode 100644
index 0000000..0403be0
--- /dev/null
+++ b/res/drawable-v28/round_rect_folder.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="?attr/folderFillColor" />
+ <corners android:radius="?android:attr/dialogCornerRadius" />
+</shape>
diff --git a/res/drawable/round_rect_folder.xml b/res/drawable/round_rect_folder.xml
new file mode 100644
index 0000000..8b3d06c
--- /dev/null
+++ b/res/drawable/round_rect_folder.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="?attr/folderFillColor" />
+ <corners android:radius="@dimen/bg_round_rect_radius" />
+</shape>
diff --git a/res/layout/folder_application.xml b/res/layout/folder_application.xml
index de861a0..c156e11 100644
--- a/res/layout/folder_application.xml
+++ b/res/layout/folder_application.xml
@@ -18,5 +18,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto"
style="@style/BaseIcon"
+ android:textColor="?attr/folderTextColor"
android:includeFontPadding="false"
launcher:iconDisplay="folder" />
diff --git a/res/layout/user_folder_icon_normalized.xml b/res/layout/user_folder_icon_normalized.xml
index 2e6ce94..835fee2 100644
--- a/res/layout/user_folder_icon_normalized.xml
+++ b/res/layout/user_folder_icon_normalized.xml
@@ -18,7 +18,7 @@
xmlns:launcher="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/round_rect_primary"
+ android:background="@drawable/round_rect_folder"
android:elevation="5dp"
android:orientation="vertical" >
diff --git a/res/values-v28/styles.xml b/res/values-v28/styles.xml
new file mode 100644
index 0000000..7df9ce5
--- /dev/null
+++ b/res/values-v28/styles.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright (C) 2019 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+<resources>
+ <style name="TextHeadline" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle" >
+ <item name="android:textFontWeight">400</item>
+ </style>
+</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 43194d5..69b8c8a 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -36,8 +36,10 @@
<attr name="loadingIconColor" format="color" />
<attr name="folderDotColor" format="color" />
+ <attr name="folderFillColor" format="color" />
<attr name="folderIconRadius" format="float" />
<attr name="folderIconBorderColor" format="color" />
+ <attr name="folderTextColor" format="color" />
<!-- BubbleTextView specific attributes. -->
<declare-styleable name="BubbleTextView">
@@ -55,7 +57,7 @@
<!-- BubbleTextView specific attributes. -->
<declare-styleable name="FolderIconPreview">
- <attr name="android:colorPrimary" />
+ <attr name="folderFillColor" />
<attr name="folderIconBorderColor" />
<attr name="folderDotColor" />
</declare-styleable>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 7932c6d..8116e30 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -26,6 +26,7 @@
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowShowWallpaper">true</item>
+ <item name="folderTextColor">?attr/workspaceTextColor</item>
</style>
<style name="LauncherTheme" parent="@style/BaseLauncherTheme">
@@ -44,7 +45,9 @@
<item name="workspaceStatusBarScrim">@drawable/workspace_bg</item>
<item name="widgetsTheme">@style/WidgetContainerTheme</item>
<item name="folderDotColor">?android:attr/colorPrimary</item>
+ <item name="folderFillColor">#CDFFFFFF</item>
<item name="folderIconBorderColor">?android:attr/colorPrimary</item>
+ <item name="folderTextColor">#FF212121</item>
<item name="loadingIconColor">#CCFFFFFF</item>
<item name="android:windowTranslucentStatus">false</item>
@@ -54,6 +57,11 @@
<item name="android:navigationBarColor">#00000000</item>
</style>
+ <style name="LauncherTheme.DarkMainColor" parent="@style/LauncherTheme">
+ <item name="folderFillColor">#FF3C4043</item> <!-- 100% GM2 800 -->
+ <item name="folderTextColor">?attr/workspaceTextColor</item>
+ </style>
+
<style name="LauncherTheme.DarkText" parent="@style/LauncherTheme">
<item name="workspaceTextColor">#FF212121</item>
<item name="allAppsInterimScrimAlpha">128</item>
@@ -63,7 +71,9 @@
<item name="isWorkspaceDarkText">true</item>
<item name="workspaceStatusBarScrim">@null</item>
<item name="folderDotColor">#FF464646</item>
+ <item name="folderFillColor">#CDFFFFFF</item>
<item name="folderIconBorderColor">#FF80868B</item>
+ <item name="folderTextColor">?attr/workspaceTextColor</item>
</style>
<style name="LauncherTheme.Dark" parent="@style/LauncherTheme">
@@ -81,13 +91,22 @@
<item name="popupColorTertiary">#757575</item> <!-- Gray 600 -->
<item name="widgetsTheme">@style/WidgetContainerTheme.Dark</item>
<item name="folderDotColor">#FF464646</item>
+ <item name="folderFillColor">#DD3C4043</item> <!-- 87% GM2 800 -->
<item name="folderIconBorderColor">#FF80868B</item>
+ <item name="folderTextColor">@android:color/white</item>
<item name="isMainColorDark">true</item>
<item name="loadingIconColor">#99FFFFFF</item>
</style>
+ <style name="LauncherTheme.Dark.DarkMainColor" parent="@style/LauncherTheme.Dark">
+ <item name="folderFillColor">#FF3C4043</item> <!-- 100% GM2 800 -->
+ <item name="folderTextColor">@android:color/white</item>
+ </style>
+
<style name="LauncherTheme.Dark.DarkText" parent="@style/LauncherTheme.Dark">
<item name="allAppsInterimScrimAlpha">25</item>
+ <item name="folderFillColor">#CDFFFFFF</item>
+ <item name="folderTextColor">?attr/workspaceTextColor</item>
<item name="workspaceTextColor">#FF212121</item>
<item name="workspaceShadowColor">@android:color/transparent</item>
<item name="workspaceAmbientShadowColor">@android:color/transparent</item>
@@ -99,8 +118,11 @@
<!-- A derivative project can extend these themes to customize the application theme without
affecting the base theme -->
<style name="AppTheme" parent="@style/LauncherTheme" />
+ <style name="AppTheme.DarkMainColor" parent="@style/LauncherTheme.DarkMainColor" />
<style name="AppTheme.DarkText" parent="@style/LauncherTheme.DarkText" />
+
<style name="AppTheme.Dark" parent="@style/LauncherTheme.Dark" />
+ <style name="AppTheme.Dark.DarkMainColor" parent="@style/LauncherTheme.Dark.DarkMainColor" />
<style name="AppTheme.Dark.DarkText" parent="@style/LauncherTheme.Dark.DarkText" />
<style name="AppItemActivityTheme" parent="@android:style/Theme.Material.Light.Dialog.Alert">
@@ -157,7 +179,7 @@
<item name="android:shadowRadius">0</item>
</style>
- <!-- Icon displayed on the worksapce -->
+ <!-- Icon displayed on the workspace -->
<style name="BaseIcon.Workspace" >
<item name="android:shadowRadius">2.0</item>
<item name="android:shadowColor">?attr/workspaceShadowColor</item>
diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java
index 0e2ddd4..9373976 100644
--- a/src/com/android/launcher3/folder/FolderAnimationManager.java
+++ b/src/com/android/launcher3/folder/FolderAnimationManager.java
@@ -152,7 +152,7 @@
final float yDistance = initialY - lp.y;
// Set up the Folder background.
- final int finalColor = Themes.getAttrColor(mContext, android.R.attr.colorPrimary);
+ final int finalColor = Themes.getAttrColor(mContext, R.attr.folderFillColor);
final int initialColor = setColorAlphaBound(
finalColor, mPreviewBackground.getBackgroundAlpha());
mFolderBackground.mutate();
diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java
index 09e8276..b2c0ca7 100644
--- a/src/com/android/launcher3/folder/PreviewBackground.java
+++ b/src/com/android/launcher3/folder/PreviewBackground.java
@@ -131,7 +131,7 @@
TypedArray ta = context.getTheme().obtainStyledAttributes(R.styleable.FolderIconPreview);
mDotColor = ta.getColor(R.styleable.FolderIconPreview_folderDotColor, 0);
mStrokeColor = ta.getColor(R.styleable.FolderIconPreview_folderIconBorderColor, 0);
- mBgColor = ta.getColor(R.styleable.FolderIconPreview_android_colorPrimary, 0);
+ mBgColor = ta.getColor(R.styleable.FolderIconPreview_folderFillColor, 0);
ta.recycle();
DeviceProfile grid = activity.getWallpaperDeviceProfile();
diff --git a/src/com/android/launcher3/util/Themes.java b/src/com/android/launcher3/util/Themes.java
index 0c44012..0d02715 100644
--- a/src/com/android/launcher3/util/Themes.java
+++ b/src/com/android/launcher3/util/Themes.java
@@ -48,10 +48,12 @@
if (darkTheme) {
return wallpaperColorInfo.supportsDarkText() ?
- R.style.AppTheme_Dark_DarkText : R.style.AppTheme_Dark;
+ R.style.AppTheme_Dark_DarkText : wallpaperColorInfo.isMainColorDark() ?
+ R.style.AppTheme_Dark_DarkMainColor : R.style.AppTheme_Dark;
} else {
return wallpaperColorInfo.supportsDarkText() ?
- R.style.AppTheme_DarkText : R.style.AppTheme;
+ R.style.AppTheme_DarkText : wallpaperColorInfo.isMainColorDark() ?
+ R.style.AppTheme_DarkMainColor : R.style.AppTheme;
}
}
diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java b/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java
index 56e3260..b05e125 100644
--- a/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java
+++ b/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java
@@ -30,6 +30,10 @@
public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChangedListenerCompat {
+ private static final int MAIN_COLOR_LIGHT = 0xffdadce0;
+ private static final int MAIN_COLOR_DARK = 0xff202124;
+ private static final int MAIN_COLOR_REGULAR = 0xff000000;
+
private static final int FALLBACK_COLOR = Color.WHITE;
private static final Object sInstanceLock = new Object();
private static WallpaperColorInfo sInstance;
@@ -76,6 +80,10 @@
return mSupportsDarkText;
}
+ public boolean isMainColorDark() {
+ return mMainColor == MAIN_COLOR_DARK;
+ }
+
@Override
public void onColorsChanged(WallpaperColorsCompat colors, int which) {
if ((which & FLAG_SYSTEM) != 0) {
diff --git a/tests/src/com/android/launcher3/ui/TestViewHelpers.java b/tests/src/com/android/launcher3/ui/TestViewHelpers.java
index 2116f5e..a73bde0 100644
--- a/tests/src/com/android/launcher3/ui/TestViewHelpers.java
+++ b/tests/src/com/android/launcher3/ui/TestViewHelpers.java
@@ -27,6 +27,7 @@
import android.os.Process;
import android.os.SystemClock;
import android.util.Log;
+import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -186,10 +187,8 @@
*/
public static UiObject2 openWidgetsTray() {
final UiDevice device = getDevice();
- device.pressMenu(); // Enter overview mode.
- device.wait(Until.findObject(
- By.text(getTargetContext().getString(R.string.widget_button_text))),
- AbstractLauncherUiTest.DEFAULT_UI_TIMEOUT).click();
+ device.pressKeyCode(KeyEvent.KEYCODE_W, KeyEvent.META_CTRL_ON);
+ device.waitForIdle();
return findViewById(R.id.widgets_list_view);
}