Merge "Import translations. DO NOT MERGE ANYWHERE" into tm-qpr-dev
diff --git a/go/quickstep/res/values-or/strings.xml b/go/quickstep/res/values-or/strings.xml
index 2e76e2d..36de437 100644
--- a/go/quickstep/res/values-or/strings.xml
+++ b/go/quickstep/res/values-or/strings.xml
@@ -6,7 +6,7 @@
<string name="action_translate" msgid="8028378961867277746">"ଅନୁବାଦ କରନ୍ତୁ"</string>
<string name="action_search" msgid="6269564710943755464">"Lens"</string>
<string name="dialog_acknowledge" msgid="2804025517675853172">"ବୁଝିଗଲି"</string>
- <string name="dialog_cancel" msgid="6464336969134856366">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="dialog_cancel" msgid="6464336969134856366">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="dialog_settings" msgid="6564397136021186148">"ସେଟିଂସ"</string>
<string name="niu_actions_confirmation_title" msgid="3863451714863526143">"ସ୍କିନରେ ଥିବା ଟେକ୍ସଟକୁ ଅନୁବାଦ କରନ୍ତୁ କିମ୍ବା ଶୁଣନ୍ତୁ"</string>
<string name="niu_actions_confirmation_text" msgid="2105271481950866089">"ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଟେକ୍ସଟ, ୱେବ ଠିକଣା ଏବଂ ସ୍କ୍ରିନସଟଗୁଡ଼ିକ ପରି ସୂଚନାକୁ Google ସହ ସେୟାର କରାଯାଇପାରେ।\n\nଆପଣ କେଉଁ ସୂଚନାକୁ ସେୟାର କରନ୍ତି ତାହା ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, "<b>"ସେଟିଂସ > ଆପ୍ସ > ଡିଫଲ୍ଟ ଆପ୍ସ > Digital assistant ଆପ"</b>"କୁ ଯାଆନ୍ତୁ।"</string>
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
index dc5c22d..48fde8f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
@@ -22,6 +22,7 @@
import android.view.InsetsState
import android.view.WindowManager
import android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD
+import android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION
import com.android.launcher3.AbstractFloatingView
import com.android.launcher3.AbstractFloatingView.TYPE_TASKBAR_ALL_APPS
import com.android.launcher3.DeviceProfile
@@ -88,11 +89,17 @@
}
}
- var imeInsetsSize = Insets.of(0, 0, 0, taskbarHeightForIme)
- var insetsSizeOverride = arrayOf(
+ val imeInsetsSize = Insets.of(0, 0, 0, taskbarHeightForIme)
+ // Use 0 insets for the VoiceInteractionWindow (assistant) when gesture nav is enabled.
+ val visInsetsSize = Insets.of(0, 0, 0, if (context.isGestureNav) 0 else tappableHeight)
+ val insetsSizeOverride = arrayOf(
InsetsFrameProvider.InsetsSizeOverride(
TYPE_INPUT_METHOD,
imeInsetsSize
+ ),
+ InsetsFrameProvider.InsetsSizeOverride(
+ TYPE_VOICE_INTERACTION,
+ visInsetsSize
)
)
for (provider in windowLayoutParams.providedInsets) {
@@ -153,7 +160,8 @@
+ " insetsSize=" + provider.insetsSize)
if (provider.insetsSizeOverrides != null) {
pw.print(" insetsSizeOverrides={")
- for (overrideSize in provider.insetsSizeOverrides) {
+ for ((i, overrideSize) in provider.insetsSizeOverrides.withIndex()) {
+ if (i > 0) pw.print(", ")
pw.print(overrideSize)
}
pw.print("})")
diff --git a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
index 871ddc6..7166a3e 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
@@ -120,8 +120,9 @@
setter.setFloat(mRecentsView, RECENTS_GRID_PROGRESS, showAsGrid ? 1f : 0f,
showAsGrid ? INSTANT : FINAL_FRAME);
- setter.setFloat(mRecentsView, OVERVIEW_PROGRESS,
- toState == LauncherState.OVERVIEW ? 1f : 0f, INSTANT);
+ boolean toOverview = toState == LauncherState.OVERVIEW;
+ setter.setFloat(mRecentsView, OVERVIEW_PROGRESS, toOverview ? 1f : 0f,
+ toOverview ? INSTANT : FINAL_FRAME);
}
abstract FloatProperty getTaskModalnessProperty();
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index d7fea37..8f1872b 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -1629,7 +1629,8 @@
// Cleanup when switching handlers
mInputConsumerProxy.unregisterCallback();
mActivityInitListener.unregister();
- ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mActivityRestartListener);
+ TaskStackChangeListeners.getInstance().unregisterTaskStackListener(
+ mActivityRestartListener);
mTaskSnapshot = null;
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 583d097..cf93857 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -2234,6 +2234,11 @@
}
}
}
+ if (animatorSet == null) {
+ setOverviewProgress(1);
+ } else {
+ animatorSet.play(ObjectAnimator.ofFloat(this, OVERVIEW_PROGRESS, 1));
+ }
}
/**
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
index 727504a..f4b3d98 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
@@ -221,7 +221,7 @@
* Sets the alpha of the splash view.
*/
public void setSplashAlpha(float splashAlpha) {
- mSplashAlpha = (int) (splashAlpha * 255);
+ mSplashAlpha = (int) (Utilities.boundToRange(splashAlpha, 0f, 1f) * 255);
if (mSplashViewDrawable != null) {
mSplashViewDrawable.setAlpha(mSplashAlpha);
}
diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java
index 4b4a017..fbb0a57 100644
--- a/src/com/android/launcher3/AppWidgetResizeFrame.java
+++ b/src/com/android/launcher3/AppWidgetResizeFrame.java
@@ -24,6 +24,7 @@
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
@@ -68,22 +69,6 @@
private final View[] mDragHandles = new View[HANDLE_COUNT];
private final List<Rect> mSystemGestureExclusionRects = new ArrayList<>(HANDLE_COUNT);
- private final OnAttachStateChangeListener mWidgetViewAttachStateChangeListener =
- new OnAttachStateChangeListener() {
- @Override
- public void onViewAttachedToWindow(View view) {
- // Do nothing
- }
-
- @Override
- public void onViewDetachedFromWindow(View view) {
- // When the app widget view is detached, we should close the resize frame.
- // An example is when the dragging starts, the widget view is detached from
- // CellLayout and then reattached to DragLayout.
- close(false);
- }
- };
-
private LauncherAppWidgetHostView mWidgetView;
private CellLayout mCellLayout;
@@ -221,11 +206,7 @@
private void setupForWidget(LauncherAppWidgetHostView widgetView, CellLayout cellLayout,
DragLayer dragLayer) {
mCellLayout = cellLayout;
- if (mWidgetView != null) {
- mWidgetView.removeOnAttachStateChangeListener(mWidgetViewAttachStateChangeListener);
- }
mWidgetView = widgetView;
- mWidgetView.addOnAttachStateChangeListener(mWidgetViewAttachStateChangeListener);
LauncherAppWidgetProviderInfo info = (LauncherAppWidgetProviderInfo)
widgetView.getAppWidgetInfo();
mDragLayer = dragLayer;
@@ -423,6 +404,10 @@
* Based on the current deltas, we determine if and how to resize the widget.
*/
private void resizeWidgetIfNeeded(boolean onDismiss) {
+ ViewGroup.LayoutParams wlp = mWidgetView.getLayoutParams();
+ if (!(wlp instanceof CellLayout.LayoutParams)) {
+ return;
+ }
DeviceProfile dp = mLauncher.getDeviceProfile();
float xThreshold = mCellLayout.getCellWidth() + dp.cellLayoutBorderSpacePx.x;
float yThreshold = mCellLayout.getCellHeight() + dp.cellLayoutBorderSpacePx.y;
@@ -435,7 +420,7 @@
mDirectionVector[0] = 0;
mDirectionVector[1] = 0;
- CellLayout.LayoutParams lp = (CellLayout.LayoutParams) mWidgetView.getLayoutParams();
+ CellLayout.LayoutParams lp = (CellLayout.LayoutParams) wlp;
int spanX = lp.cellHSpan;
int spanY = lp.cellVSpan;
@@ -687,9 +672,6 @@
@Override
protected void handleClose(boolean animate) {
mDragLayer.removeView(this);
- if (mWidgetView != null) {
- mWidgetView.removeOnAttachStateChangeListener(mWidgetViewAttachStateChangeListener);
- }
}
private void updateInvalidResizeEffect(CellLayout cellLayout, CellLayout pairedCellLayout,
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 52dfcd4..52960a9 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -829,8 +829,8 @@
final int hStartPadding = getPaddingLeft();
final int vStartPadding = getPaddingTop();
- result[0] = (x - hStartPadding) / mCellWidth;
- result[1] = (y - vStartPadding) / mCellHeight;
+ result[0] = (x - hStartPadding) / (mCellWidth + mBorderSpace.x);
+ result[1] = (y - vStartPadding) / (mCellHeight + mBorderSpace.y);
final int xAxis = mCountX;
final int yAxis = mCountY;
@@ -842,16 +842,6 @@
}
/**
- * Given a point, return the cell that most closely encloses that point
- * @param x X coordinate of the point
- * @param y Y coordinate of the point
- * @param result Array of 2 ints to hold the x and y coordinate of the cell
- */
- void pointToCellRounded(int x, int y, int[] result) {
- pointToCellExact(x + (mCellWidth / 2), y + (mCellHeight / 2), result);
- }
-
- /**
* Given a cell coordinate, return the point that represents the upper left corner of that cell
*
* @param cellX X coordinate of the cell
@@ -1240,7 +1230,7 @@
*/
int[] findNearestVacantArea(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX,
int spanY, int[] result, int[] resultSpan) {
- return findNearestArea(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, true,
+ return findNearestArea(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, false,
result, resultSpan);
}
@@ -1262,9 +1252,10 @@
/**
* Find a vacant area that will fit the given bounds nearest the requested
* cell location. Uses Euclidean distance to score multiple vacant areas.
- *
- * @param pixelX The X location at which you want to search for a vacant area.
- * @param pixelY The Y location at which you want to search for a vacant area.
+ * @param relativeXPos The X location relative to the Cell layout at which you want to search
+ * for a vacant area.
+ * @param relativeYPos The Y location relative to the Cell layout at which you want to search
+ * for a vacant area.
* @param minSpanX The minimum horizontal span required
* @param minSpanY The minimum vertical span required
* @param spanX Horizontal span of the object.
@@ -1275,15 +1266,15 @@
* @return The X, Y cell of a vacant area that can contain this object,
* nearest the requested location.
*/
- private int[] findNearestArea(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX,
- int spanY, boolean ignoreOccupied, int[] result, int[] resultSpan) {
+ private int[] findNearestArea(int relativeXPos, int relativeYPos, int minSpanX, int minSpanY,
+ int spanX, int spanY, boolean ignoreOccupied, int[] result, int[] resultSpan) {
lazyInitTempRectStack();
- // For items with a spanX / spanY > 1, the passed in point (pixelX, pixelY) corresponds
- // to the center of the item, but we are searching based on the top-left cell, so
- // we translate the point over to correspond to the top-left.
- pixelX -= mCellWidth * (spanX - 1) / 2f;
- pixelY -= mCellHeight * (spanY - 1) / 2f;
+ // For items with a spanX / spanY > 1, the passed in point (relativeXPos, relativeYPos)
+ // corresponds to the center of the item, but we are searching based on the top-left cell,
+ // so we translate the point over to correspond to the top-left.
+ relativeXPos = (int) (relativeXPos - (mCellWidth + mBorderSpace.x) * (spanX - 1) / 2f);
+ relativeYPos = (int) (relativeYPos - (mCellHeight + mBorderSpace.y) * (spanY - 1) / 2f);
// Keep track of best-scoring drop area
final int[] bestXY = result != null ? result : new int[2];
@@ -1304,7 +1295,7 @@
for (int x = 0; x < countX - (minSpanX - 1); x++) {
int ySize = -1;
int xSize = -1;
- if (ignoreOccupied) {
+ if (!ignoreOccupied) {
// First, let's see if this thing fits anywhere
for (int i = 0; i < minSpanX; i++) {
for (int j = 0; j < minSpanY; j++) {
@@ -1368,7 +1359,7 @@
}
}
validRegions.push(currentRect);
- double distance = Math.hypot(cellXY[0] - pixelX, cellXY[1] - pixelY);
+ double distance = Math.hypot(cellXY[0] - relativeXPos, cellXY[1] - relativeYPos);
if ((distance <= bestDistance && !contained) ||
currentRect.contains(bestRect)) {
@@ -2629,7 +2620,7 @@
* nearest the requested location.
*/
public int[] findNearestArea(int pixelX, int pixelY, int spanX, int spanY, int[] result) {
- return findNearestArea(pixelX, pixelY, spanX, spanY, spanX, spanY, false, result, null);
+ return findNearestArea(pixelX, pixelY, spanX, spanY, spanX, spanY, true, result, null);
}
boolean existsEmptyCell() {
diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
index d5bcb0c..a8546e8 100644
--- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
+++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
@@ -43,6 +43,8 @@
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
+import android.util.Size;
+import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
@@ -53,6 +55,8 @@
import android.view.WindowManager;
import android.widget.TextClock;
+import androidx.annotation.Nullable;
+
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.CellLayout;
import com.android.launcher3.DeviceProfile;
@@ -177,10 +181,12 @@
private final Map<Integer, CellLayout> mWorkspaceScreens = new HashMap<>();
private final AppWidgetHost mAppWidgetHost;
private final SparseIntArray mWallpaperColorResources;
+ private final SparseArray<Size> mLauncherWidgetSpanInfo;
public LauncherPreviewRenderer(Context context,
InvariantDeviceProfile idp,
- WallpaperColors wallpaperColorsOverride) {
+ WallpaperColors wallpaperColorsOverride,
+ @Nullable final SparseArray<Size> launcherWidgetSpanInfo) {
super(context);
mUiHandler = new Handler(Looper.getMainLooper());
@@ -224,6 +230,9 @@
mHotseat = mRootView.findViewById(R.id.hotseat);
mHotseat.resetLayout(false);
+ mLauncherWidgetSpanInfo = launcherWidgetSpanInfo == null ? new SparseArray<>() :
+ launcherWidgetSpanInfo;
+
CellLayout firstScreen = mRootView.findViewById(R.id.workspace);
firstScreen.setPadding(mDp.workspacePadding.left + mDp.cellLayoutPaddingPx.left,
mDp.workspacePadding.top + mDp.cellLayoutPaddingPx.top,
diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
index fd11b37..287b976 100644
--- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
+++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
@@ -22,10 +22,13 @@
import android.app.WallpaperColors;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
+import android.database.Cursor;
import android.hardware.display.DisplayManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
+import android.util.Size;
+import android.util.SparseArray;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.SurfaceControlViewHost;
@@ -34,6 +37,8 @@
import android.view.WindowManager.LayoutParams;
import android.view.animation.AccelerateDecelerateInterpolator;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import androidx.annotation.WorkerThread;
@@ -124,6 +129,45 @@
}
/**
+ * A function that queries for the launcher app widget span info
+ *
+ * @param context The context to get the content resolver from, should be related to launcher
+ * @return A SparseArray with the app widget id being the key and the span info being the values
+ */
+ @WorkerThread
+ @Nullable
+ public SparseArray<Size> getLoadedLauncherWidgetInfo(
+ @NonNull final Context context) {
+ final SparseArray<Size> widgetInfo = new SparseArray<>();
+ final String query = LauncherSettings.Favorites.ITEM_TYPE + " = "
+ + LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET;
+
+ try (Cursor c = context.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI,
+ new String[] {
+ LauncherSettings.Favorites.APPWIDGET_ID,
+ LauncherSettings.Favorites.SPANX,
+ LauncherSettings.Favorites.SPANY
+ }, query, null, null)) {
+ final int appWidgetIdIndex = c.getColumnIndexOrThrow(
+ LauncherSettings.Favorites.APPWIDGET_ID);
+ final int spanXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANX);
+ final int spanYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANY);
+ while (c.moveToNext()) {
+ final int appWidgetId = c.getInt(appWidgetIdIndex);
+ final int spanX = c.getInt(spanXIndex);
+ final int spanY = c.getInt(spanYIndex);
+
+ widgetInfo.append(appWidgetId, new Size(spanX, spanY));
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Error querying for launcher widget info", e);
+ return null;
+ }
+
+ return widgetInfo;
+ }
+
+ /**
* Generates the preview in background
*/
public void loadAsync() {
@@ -174,8 +218,11 @@
loadWorkspace(new ArrayList<>(), LauncherSettings.Favorites.PREVIEW_CONTENT_URI,
query);
+ final SparseArray<Size> spanInfo =
+ getLoadedLauncherWidgetInfo(previewContext.getBaseContext());
+
MAIN_EXECUTOR.execute(() -> {
- renderView(previewContext, mBgDataModel, mWidgetProvidersMap);
+ renderView(previewContext, mBgDataModel, mWidgetProvidersMap, spanInfo);
mOnDestroyCallbacks.add(previewContext::onDestroy);
});
}
@@ -183,7 +230,8 @@
} else {
LauncherAppState.getInstance(inflationContext).getModel().loadAsync(dataModel -> {
if (dataModel != null) {
- MAIN_EXECUTOR.execute(() -> renderView(inflationContext, dataModel, null));
+ MAIN_EXECUTOR.execute(() -> renderView(inflationContext, dataModel, null,
+ null));
} else {
Log.e(TAG, "Model loading failed");
}
@@ -201,12 +249,13 @@
@UiThread
private void renderView(Context inflationContext, BgDataModel dataModel,
- Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap) {
+ Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap,
+ @Nullable final SparseArray<Size> launcherWidgetSpanInfo) {
if (mDestroyed) {
return;
}
- View view = new LauncherPreviewRenderer(inflationContext, mIdp, mWallpaperColors)
- .getRenderedView(dataModel, widgetProviderInfoMap);
+ View view = new LauncherPreviewRenderer(inflationContext, mIdp, mWallpaperColors,
+ launcherWidgetSpanInfo).getRenderedView(dataModel, widgetProviderInfoMap);
// This aspect scales the view to fit in the surface and centers it
final float scale = Math.min(mWidth / (float) view.getMeasuredWidth(),
mHeight / (float) view.getMeasuredHeight());