Snap for 9279354 from b63cc3f113 to tm-qpr2-release
Change-Id: Id077e4133ebd549110adca0675bd28a413b8f098
This commit is contained in:
@@ -1,43 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2022 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.
|
||||
-->
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/navigation_settings"
|
||||
style="@style/TextAppearance.GestureTutorial.LinkText"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="32dp"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:minHeight="48dp"
|
||||
android:text="@string/allset_navigation_settings"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/subtitle" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/hint"
|
||||
style="@style/TextAppearance.GestureTutorial.Feedback.Subtitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/allset_page_margin_bottom"
|
||||
android:text="@string/allset_hint"
|
||||
android:textSize="@dimen/allset_page_swipe_up_text_size"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
</merge>
|
||||
@@ -21,12 +21,11 @@
|
||||
style="@style/TextAppearance.GestureTutorial.LinkText"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="96dp"
|
||||
android:layout_marginTop="24dp"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:minHeight="48dp"
|
||||
android:text="@string/allset_navigation_settings"
|
||||
app:layout_constraintBottom_toTopOf="@id/hint"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/subtitle"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<TextView
|
||||
@@ -34,7 +33,7 @@
|
||||
style="@style/TextAppearance.GestureTutorial.Feedback.Subtitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/allset_page_margin_bottom"
|
||||
android:layout_marginBottom="24dp"
|
||||
android:text="@string/allset_hint"
|
||||
android:textSize="@dimen/allset_page_swipe_up_text_size"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
||||
@@ -20,6 +20,5 @@
|
||||
|
||||
<!-- All Set page -->
|
||||
<dimen name="allset_page_margin_horizontal">48dp</dimen>
|
||||
<dimen name="allset_page_margin_bottom">24dp</dimen>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
|
||||
<!-- All Set page -->
|
||||
<dimen name="allset_page_margin_horizontal">120dp</dimen>
|
||||
<dimen name="allset_page_margin_bottom">24dp</dimen>
|
||||
<dimen name="allset_page_allset_text_size">38sp</dimen>
|
||||
<dimen name="allset_page_swipe_up_text_size">15sp</dimen>
|
||||
|
||||
|
||||
@@ -17,7 +17,4 @@
|
||||
<resources>
|
||||
<!-- Overview actions -->
|
||||
<dimen name="overview_actions_top_margin">20dp</dimen>
|
||||
|
||||
<!-- All Set page-->
|
||||
<dimen name="allset_page_margin_bottom">24dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
<dimen name="overview_grid_side_margin">64dp</dimen>
|
||||
|
||||
<!-- All Set page-->
|
||||
<dimen name="allset_page_margin_bottom">0dp</dimen>
|
||||
<dimen name="allset_page_allset_text_size">42sp</dimen>
|
||||
<dimen name="allset_page_swipe_up_text_size">16sp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -202,7 +202,6 @@
|
||||
|
||||
<!-- All Set page -->
|
||||
<dimen name="allset_page_margin_horizontal">40dp</dimen>
|
||||
<dimen name="allset_page_margin_bottom">0dp</dimen>
|
||||
<dimen name="allset_page_allset_text_size">36sp</dimen>
|
||||
<dimen name="allset_page_swipe_up_text_size">14sp</dimen>
|
||||
|
||||
|
||||
@@ -152,6 +152,8 @@
|
||||
<item name="android:background">@drawable/bg_overview_clear_all_button</item>
|
||||
<item name="android:minWidth">96dp</item>
|
||||
<item name="android:minHeight">48dp</item>
|
||||
<item name="android:paddingStart">12dp</item>
|
||||
<item name="android:paddingEnd">12dp</item>
|
||||
<item name="android:stateListAnimator">@null</item>
|
||||
</style>
|
||||
|
||||
|
||||
@@ -41,8 +41,7 @@ public class FallbackTaskbarUIController extends TaskbarUIController {
|
||||
animateToRecentsState(toState);
|
||||
|
||||
// Handle tapping on live tile.
|
||||
RecentsView recentsView = mRecentsActivity.getOverviewPanel();
|
||||
recentsView.setTaskLaunchListener(toState == RecentsState.DEFAULT
|
||||
getRecentsView().setTaskLaunchListener(toState == RecentsState.DEFAULT
|
||||
? (() -> animateToRecentsState(RecentsState.BACKGROUND_APP)) : null);
|
||||
}
|
||||
};
|
||||
@@ -88,4 +87,9 @@ public class FallbackTaskbarUIController extends TaskbarUIController {
|
||||
anim.start();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecentsView getRecentsView() {
|
||||
return mRecentsActivity.getOverviewPanel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.OnboardingPrefs;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.RecentsAnimationCallbacks;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Arrays;
|
||||
@@ -391,4 +392,9 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
|
||||
|
||||
mTaskbarLauncherStateController.dumpLogs(prefix + "\t", pw);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecentsView getRecentsView() {
|
||||
return mLauncher.getOverviewPanel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,6 +91,7 @@ import com.android.launcher3.util.SettingsCache;
|
||||
import com.android.launcher3.util.TraceHelper;
|
||||
import com.android.launcher3.util.ViewCache;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.rotation.RotationButtonController;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
@@ -133,6 +134,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
private final boolean mIsUserSetupComplete;
|
||||
private final boolean mIsNavBarForceVisible;
|
||||
private final boolean mIsNavBarKidsMode;
|
||||
|
||||
private boolean mIsDestroyed = false;
|
||||
// The flag to know if the window is excluded from magnification region computation.
|
||||
private boolean mIsExcludeFromMagnificationRegion = false;
|
||||
@@ -757,42 +759,63 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
if (info.isDisabled()) {
|
||||
ItemClickHandler.handleDisabledItemClicked(info, this);
|
||||
} else {
|
||||
Intent intent = new Intent(info.getIntent())
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
try {
|
||||
if (mIsSafeModeEnabled && !PackageManagerHelper.isSystemApp(this, intent)) {
|
||||
Toast.makeText(this, R.string.safemode_shortcut_error,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
} else if (info.isPromise()) {
|
||||
TestLogging.recordEvent(
|
||||
TestProtocol.SEQUENCE_MAIN, "start: taskbarPromiseIcon");
|
||||
intent = new PackageManagerHelper(this)
|
||||
.getMarketIntent(info.getTargetPackage())
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
TaskbarUIController taskbarUIController = mControllers.uiController;
|
||||
RecentsView recents = taskbarUIController.getRecentsView();
|
||||
if (recents != null
|
||||
&& taskbarUIController.getRecentsView().isSplitSelectionActive()) {
|
||||
// If we are selecting a second app for split, launch the split tasks
|
||||
taskbarUIController.triggerSecondAppForSplit(info, info.intent, view);
|
||||
} else {
|
||||
// Else launch the selected task
|
||||
Intent intent = new Intent(info.getIntent())
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
try {
|
||||
if (mIsSafeModeEnabled && !PackageManagerHelper.isSystemApp(this, intent)) {
|
||||
Toast.makeText(this, R.string.safemode_shortcut_error,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
} else if (info.isPromise()) {
|
||||
TestLogging.recordEvent(
|
||||
TestProtocol.SEQUENCE_MAIN, "start: taskbarPromiseIcon");
|
||||
intent = new PackageManagerHelper(this)
|
||||
.getMarketIntent(info.getTargetPackage())
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
|
||||
} else if (info.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
|
||||
TestLogging.recordEvent(
|
||||
TestProtocol.SEQUENCE_MAIN, "start: taskbarDeepShortcut");
|
||||
String id = info.getDeepShortcutId();
|
||||
String packageName = intent.getPackage();
|
||||
getSystemService(LauncherApps.class)
|
||||
.startShortcut(packageName, id, null, null, info.user);
|
||||
} else {
|
||||
startItemInfoActivity(info);
|
||||
} else if (info.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
|
||||
TestLogging.recordEvent(
|
||||
TestProtocol.SEQUENCE_MAIN, "start: taskbarDeepShortcut");
|
||||
String id = info.getDeepShortcutId();
|
||||
String packageName = intent.getPackage();
|
||||
getSystemService(LauncherApps.class)
|
||||
.startShortcut(packageName, id, null, null, info.user);
|
||||
} else {
|
||||
startItemInfoActivity(info);
|
||||
}
|
||||
|
||||
mControllers.uiController.onTaskbarIconLaunched(info);
|
||||
} catch (NullPointerException
|
||||
| ActivityNotFoundException
|
||||
| SecurityException e) {
|
||||
Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT)
|
||||
.show();
|
||||
Log.e(TAG, "Unable to launch. tag=" + info + " intent=" + intent, e);
|
||||
}
|
||||
|
||||
mControllers.uiController.onTaskbarIconLaunched(info);
|
||||
mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true);
|
||||
} catch (NullPointerException | ActivityNotFoundException | SecurityException e) {
|
||||
Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT)
|
||||
.show();
|
||||
Log.e(TAG, "Unable to launch. tag=" + info + " intent=" + intent, e);
|
||||
}
|
||||
mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true);
|
||||
}
|
||||
} else if (tag instanceof AppInfo) {
|
||||
startItemInfoActivity((AppInfo) tag);
|
||||
mControllers.uiController.onTaskbarIconLaunched((AppInfo) tag);
|
||||
AppInfo info = (AppInfo) tag;
|
||||
TaskbarUIController taskbarUIController = mControllers.uiController;
|
||||
RecentsView recents = taskbarUIController.getRecentsView();
|
||||
if (recents != null
|
||||
&& taskbarUIController.getRecentsView().isSplitSelectionActive()) {
|
||||
// If we are selecting a second app for split, launch the split tasks
|
||||
taskbarUIController.triggerSecondAppForSplit(info, info.intent, view);
|
||||
} else {
|
||||
// Else launch the selected task
|
||||
startItemInfoActivity((AppInfo) tag);
|
||||
mControllers.uiController.onTaskbarIconLaunched((AppInfo) tag);
|
||||
}
|
||||
mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true);
|
||||
} else {
|
||||
Log.e(TAG, "Unknown type clicked: " + tag);
|
||||
|
||||
@@ -15,13 +15,18 @@
|
||||
*/
|
||||
package com.android.launcher3.taskbar;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.model.data.ItemInfoWithIcon;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.quickstep.views.TaskView;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.stream.Stream;
|
||||
@@ -135,4 +140,38 @@ public class TaskbarUIController {
|
||||
prefix,
|
||||
getClass().getSimpleName()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns RecentsView. Overwritten in LauncherTaskbarUIController and
|
||||
* FallbackTaskbarUIController with Launcher-specific implementations. Returns null for other
|
||||
* UI controllers (like DesktopTaskbarUIController) that don't have a RecentsView.
|
||||
*/
|
||||
public @Nullable RecentsView getRecentsView() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses the clicked Taskbar icon to launch a second app for splitscreen.
|
||||
*/
|
||||
public void triggerSecondAppForSplit(ItemInfoWithIcon info, Intent intent, View startingView) {
|
||||
RecentsView recents = getRecentsView();
|
||||
TaskView foundTaskView = recents.getTaskViewByComponentName(info.getTargetComponent());
|
||||
if (foundTaskView != null) {
|
||||
recents.confirmSplitSelect(
|
||||
foundTaskView,
|
||||
foundTaskView.getTask(),
|
||||
foundTaskView.getIconView().getDrawable(),
|
||||
foundTaskView.getThumbnail(),
|
||||
foundTaskView.getThumbnail().getThumbnail(),
|
||||
/* intent */ null);
|
||||
} else {
|
||||
recents.confirmSplitSelect(
|
||||
/* containerTaskView */ null,
|
||||
/* task */ null,
|
||||
new BitmapDrawable(info.bitmap.icon),
|
||||
startingView,
|
||||
/* thumbnail */ null,
|
||||
intent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -322,7 +322,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
||||
boolean isRtlEnabled = !mIsRecentsRtl;
|
||||
mPositionHelper.updateThumbnailMatrix(
|
||||
mThumbnailPosition, mThumbnailData, mTaskRect.width(), mTaskRect.height(),
|
||||
mDp.widthPx, mDp.taskbarSize, mDp.isTablet,
|
||||
mDp.widthPx, mDp.heightPx, mDp.taskbarSize, mDp.isTablet,
|
||||
mOrientationState.getRecentsActivityRotation(), isRtlEnabled);
|
||||
mPositionHelper.getMatrix().invert(mInversePositionMatrix);
|
||||
if (DEBUG) {
|
||||
|
||||
@@ -74,9 +74,12 @@ import android.animation.ValueAnimator;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.WindowConfiguration;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.LocusId;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BlendMode;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
@@ -662,8 +665,6 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
private TaskView mSecondSplitHiddenView;
|
||||
@Nullable
|
||||
private SplitBounds mSplitBoundsConfig;
|
||||
private final Toast mSplitToast = Toast.makeText(getContext(),
|
||||
R.string.toast_split_select_app, Toast.LENGTH_SHORT);
|
||||
private final Toast mSplitUnsupportedToast = Toast.makeText(getContext(),
|
||||
R.string.toast_split_app_unsupported, Toast.LENGTH_SHORT);
|
||||
|
||||
@@ -1213,6 +1214,21 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@link TaskView} that has ComponentName matching {@code componentName} or null if
|
||||
* no match.
|
||||
*/
|
||||
@Nullable
|
||||
public TaskView getTaskViewByComponentName(ComponentName componentName) {
|
||||
for (int i = 0; i < getTaskViewCount(); i++) {
|
||||
TaskView taskView = requireTaskViewAt(i);
|
||||
if (taskView.getTask().key.sourceComponent.equals(componentName)) {
|
||||
return taskView;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setOverviewStateEnabled(boolean enabled) {
|
||||
mOverviewStateEnabled = enabled;
|
||||
updateTaskStackListenerState();
|
||||
@@ -4237,24 +4253,39 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
* Confirms the selection of the next split task. The extra data is passed through because the
|
||||
* user may be selecting a subtask in a group.
|
||||
*
|
||||
* @param containerTaskView If our second selected app is currently running in Recents, this is
|
||||
* the "container" TaskView from Recents. If we are starting a fresh
|
||||
* instance of the app from an Intent, this will be null.
|
||||
* @param task The Task corresponding to our second selected app. If we are starting a fresh
|
||||
* instance of the app from an Intent, this will be null.
|
||||
* @param drawable The Drawable corresponding to our second selected app's icon.
|
||||
* @param secondView The View representing the current space on the screen where the second app
|
||||
* is (either the ThumbnailView or the tapped icon).
|
||||
* @param intent If we are launching a fresh instance of the app, this is the Intent for it. If
|
||||
* the second app is already running in Recents, this will be null.
|
||||
* @return true if waiting for confirmation of second app or if split animations are running,
|
||||
* false otherwise
|
||||
*/
|
||||
public boolean confirmSplitSelect(TaskView containerTaskView, Task task, IconView iconView,
|
||||
TaskThumbnailView thumbnailView) {
|
||||
public boolean confirmSplitSelect(TaskView containerTaskView, Task task, Drawable drawable,
|
||||
View secondView, @Nullable Bitmap thumbnail, Intent intent) {
|
||||
if (canLaunchFullscreenTask()) {
|
||||
return false;
|
||||
}
|
||||
if (mSplitSelectStateController.isBothSplitAppsConfirmed()) {
|
||||
return true;
|
||||
}
|
||||
mSplitToast.cancel();
|
||||
if (!task.isDockable) {
|
||||
// Task not split screen supported
|
||||
mSplitUnsupportedToast.show();
|
||||
return true;
|
||||
// Second task is selected either as an already-running Task or an Intent
|
||||
if (task != null) {
|
||||
if (!task.isDockable) {
|
||||
// Task does not support split screen
|
||||
mSplitUnsupportedToast.show();
|
||||
return true;
|
||||
}
|
||||
mSplitSelectStateController.setSecondTask(task);
|
||||
} else {
|
||||
mSplitSelectStateController.setSecondTask(intent);
|
||||
}
|
||||
mSplitSelectStateController.setSecondTask(task);
|
||||
|
||||
RectF secondTaskStartingBounds = new RectF();
|
||||
Rect secondTaskEndingBounds = new Rect();
|
||||
// TODO(194414938) starting bounds seem slightly off, investigate
|
||||
@@ -4281,9 +4312,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
false /* fadeWithThumbnail */, true /* isStagedTask */);
|
||||
|
||||
safeRemoveDragLayerView(mSecondFloatingTaskView);
|
||||
mSecondFloatingTaskView = FloatingTaskView.getFloatingTaskView(mActivity,
|
||||
thumbnailView, thumbnailView.getThumbnail(),
|
||||
iconView.getDrawable(), secondTaskStartingBounds);
|
||||
|
||||
mSecondFloatingTaskView = FloatingTaskView.getFloatingTaskView(mActivity, secondView,
|
||||
thumbnail, drawable, secondTaskStartingBounds);
|
||||
mSecondFloatingTaskView.setAlpha(1);
|
||||
mSecondFloatingTaskView.addConfirmAnimation(pendingAnimation, secondTaskStartingBounds,
|
||||
secondTaskEndingBounds, true /* fadeWithThumbnail */, false /* isStagedTask */);
|
||||
@@ -4299,7 +4330,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
});
|
||||
|
||||
mSecondSplitHiddenView = containerTaskView;
|
||||
mSecondSplitHiddenView.setThumbnailVisibility(INVISIBLE);
|
||||
if (mSecondSplitHiddenView != null) {
|
||||
mSecondSplitHiddenView.setThumbnailVisibility(INVISIBLE);
|
||||
}
|
||||
|
||||
InteractionJankMonitorWrapper.begin(this,
|
||||
InteractionJankMonitorWrapper.CUJ_SPLIT_SCREEN_ENTER, "Second tile selected");
|
||||
|
||||
@@ -473,8 +473,8 @@ public class TaskThumbnailView extends View {
|
||||
boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
|
||||
DeviceProfile dp = mActivity.getDeviceProfile();
|
||||
mPreviewPositionHelper.updateThumbnailMatrix(mPreviewRect, mThumbnailData,
|
||||
getMeasuredWidth(), getMeasuredHeight(), dp.widthPx, dp.taskbarSize,
|
||||
dp.isTablet, currentRotation, isRtl);
|
||||
getMeasuredWidth(), getMeasuredHeight(), dp.widthPx, dp.heightPx,
|
||||
dp.taskbarSize, dp.isTablet, currentRotation, isRtl);
|
||||
|
||||
mBitmapShader.setLocalMatrix(mPreviewPositionHelper.getMatrix());
|
||||
mPaint.setShader(mBitmapShader);
|
||||
|
||||
@@ -621,7 +621,8 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
TaskIdAttributeContainer container = mTaskIdAttributeContainer[index];
|
||||
if (container != null) {
|
||||
return getRecentsView().confirmSplitSelect(this, container.getTask(),
|
||||
container.getIconView(), container.getThumbnailView());
|
||||
container.getIconView().getDrawable(), container.getThumbnailView(),
|
||||
container.getThumbnailView().getThumbnail(), /* intent */ null);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ class FullscreenDrawParamsTest : DeviceProfileBaseTest() {
|
||||
val isRtl = false
|
||||
|
||||
mPreviewPositionHelper.updateThumbnailMatrix(previewRect, mThumbnailData, canvasWidth,
|
||||
canvasHeight, dp.widthPx, dp.taskbarSize, dp.isTablet, currentRotation,
|
||||
canvasHeight, dp.widthPx, dp.heightPx, dp.taskbarSize, dp.isTablet, currentRotation,
|
||||
isRtl)
|
||||
params.setProgress(/* fullscreenProgress= */ 1.0f, /* parentScale= */ 1.0f,
|
||||
/* taskViewScale= */ 1.0f, /* previewWidth= */ 0, dp, mPreviewPositionHelper)
|
||||
@@ -78,7 +78,7 @@ class FullscreenDrawParamsTest : DeviceProfileBaseTest() {
|
||||
val isRtl = false
|
||||
|
||||
mPreviewPositionHelper.updateThumbnailMatrix(previewRect, mThumbnailData, canvasWidth,
|
||||
canvasHeight, dp.widthPx, dp.taskbarSize, dp.isTablet, currentRotation,
|
||||
canvasHeight, dp.widthPx, dp.heightPx, dp.taskbarSize, dp.isTablet, currentRotation,
|
||||
isRtl)
|
||||
params.setProgress(/* fullscreenProgress= */ 1.0f, /* parentScale= */ 1.0f,
|
||||
/* taskViewScale= */ 1.0f, /* previewWidth= */ 0, dp, mPreviewPositionHelper)
|
||||
|
||||
@@ -324,6 +324,11 @@ public class InvariantDeviceProfile {
|
||||
return displayOption.grid.name;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public static String getDefaultGridName(Context context) {
|
||||
return new InvariantDeviceProfile().initGrid(context, null);
|
||||
}
|
||||
|
||||
private void initGrid(Context context, Info displayInfo, DisplayOption displayOption,
|
||||
@DeviceType int deviceType) {
|
||||
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
|
||||
|
||||
@@ -521,6 +521,11 @@ public final class Utilities {
|
||||
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
|
||||
}
|
||||
|
||||
/** Converts a dp value to pixels for a certain density. */
|
||||
public static int dpToPx(float dp, int densityDpi) {
|
||||
float densityRatio = (float) densityDpi / DisplayMetrics.DENSITY_DEFAULT;
|
||||
return (int) (dp * densityRatio);
|
||||
}
|
||||
|
||||
public static int pxFromSp(float size, DisplayMetrics metrics) {
|
||||
return pxFromSp(size, metrics, 1f);
|
||||
|
||||
@@ -31,6 +31,7 @@ import androidx.recyclerview.widget.RecyclerView.Adapter;
|
||||
import com.android.launcher3.util.ScrollableLayoutManager;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -43,6 +44,31 @@ public class AllAppsGridAdapter<T extends Context & ActivityContext> extends
|
||||
|
||||
public static final String TAG = "AppsGridAdapter";
|
||||
private final AppsGridLayoutManager mGridLayoutMgr;
|
||||
private final List<OnLayoutCompletedListener> mOnLayoutCompletedListeners = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Listener for {@link RecyclerView.LayoutManager#onLayoutCompleted(RecyclerView.State)}
|
||||
*/
|
||||
public interface OnLayoutCompletedListener {
|
||||
void onLayoutCompleted();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a {@link OnLayoutCompletedListener} to receive a callback when {@link
|
||||
* RecyclerView.LayoutManager#onLayoutCompleted(RecyclerView.State)} is called
|
||||
*/
|
||||
public void addOnLayoutCompletedListener(OnLayoutCompletedListener listener) {
|
||||
mOnLayoutCompletedListeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a {@link OnLayoutCompletedListener} to not receive a callback when {@link
|
||||
* RecyclerView.LayoutManager#onLayoutCompleted(RecyclerView.State)} is called
|
||||
*/
|
||||
public void removeOnLayoutCompletedListener(OnLayoutCompletedListener listener) {
|
||||
mOnLayoutCompletedListeners.remove(listener);
|
||||
}
|
||||
|
||||
|
||||
public AllAppsGridAdapter(T activityContext, LayoutInflater inflater,
|
||||
AlphabeticalAppsList apps, BaseAdapterProvider[] adapterProviders) {
|
||||
@@ -132,6 +158,14 @@ public class AllAppsGridAdapter<T extends Context & ActivityContext> extends
|
||||
return extraRows;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLayoutCompleted(RecyclerView.State state) {
|
||||
super.onLayoutCompleted(state);
|
||||
for (OnLayoutCompletedListener listener : mOnLayoutCompletedListeners) {
|
||||
listener.onLayoutCompleted();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int incrementTotalHeight(Adapter adapter, int position, int heightUntilLastPos) {
|
||||
AllAppsGridAdapter.AdapterItem item = mApps.getAdapterItems().get(position);
|
||||
|
||||
@@ -323,6 +323,9 @@ public final class FeatureFlags {
|
||||
public static final BooleanFlag SHOW_DOT_PAGINATION = getDebugFlag(
|
||||
"SHOW_DOT_PAGINATION", false, "Enable showing dot pagination in workspace");
|
||||
|
||||
public static final BooleanFlag ENABLE_TOAST_IMPRESSION_LOGGING = getDebugFlag(
|
||||
"ENABLE_TOAST_IMPRESSION_LOGGING", false, "Enable toast impression logging");
|
||||
|
||||
public static void initialize(Context context) {
|
||||
synchronized (sDebugFlags) {
|
||||
for (DebugFlag flag : sDebugFlags) {
|
||||
|
||||
@@ -585,7 +585,6 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
|
||||
@Override
|
||||
public void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect,
|
||||
SplitBounds splitInfo, int desiredStagePosition) {
|
||||
boolean isLandscape = dp.isLandscape;
|
||||
float topLeftTaskPercent = splitInfo.appsStackedVertically
|
||||
? splitInfo.topTaskPercent
|
||||
: splitInfo.leftTaskPercent;
|
||||
@@ -593,18 +592,24 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
|
||||
? splitInfo.dividerHeightPercent
|
||||
: splitInfo.dividerWidthPercent;
|
||||
|
||||
int deviceHeightWithoutTaskbar = dp.availableHeightPx - dp.taskbarSize;
|
||||
float scale = (float) outRect.height() / deviceHeightWithoutTaskbar;
|
||||
float topTaskHeight = dp.availableHeightPx * topLeftTaskPercent;
|
||||
float scaledTopTaskHeight = topTaskHeight * scale;
|
||||
float dividerHeight = dp.availableHeightPx * dividerBarPercent;
|
||||
float scaledDividerHeight = dividerHeight * scale;
|
||||
|
||||
if (desiredStagePosition == SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT) {
|
||||
if (isLandscape) {
|
||||
outRect.right = outRect.left + Math.round(outRect.width() * topLeftTaskPercent);
|
||||
if (splitInfo.appsStackedVertically) {
|
||||
outRect.bottom = Math.round(outRect.top + scaledTopTaskHeight);
|
||||
} else {
|
||||
outRect.bottom = outRect.top + Math.round(outRect.height() * topLeftTaskPercent);
|
||||
outRect.right = outRect.left + Math.round(outRect.width() * topLeftTaskPercent);
|
||||
}
|
||||
} else {
|
||||
if (isLandscape) {
|
||||
outRect.left += Math.round(outRect.width()
|
||||
* (topLeftTaskPercent + dividerBarPercent));
|
||||
if (splitInfo.appsStackedVertically) {
|
||||
outRect.top += Math.round(scaledTopTaskHeight + scaledDividerHeight);
|
||||
} else {
|
||||
outRect.top += Math.round(outRect.height()
|
||||
outRect.left += Math.round(outRect.width()
|
||||
* (topLeftTaskPercent + dividerBarPercent));
|
||||
}
|
||||
}
|
||||
@@ -617,7 +622,7 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
|
||||
int spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx;
|
||||
int totalThumbnailHeight = parentHeight - spaceAboveSnapshot;
|
||||
int dividerBar = Math.round(splitBoundsConfig.appsStackedVertically
|
||||
? splitBoundsConfig.dividerHeightPercent * totalThumbnailHeight
|
||||
? splitBoundsConfig.dividerHeightPercent * dp.availableHeightPx
|
||||
: splitBoundsConfig.dividerWidthPercent * parentWidth);
|
||||
int primarySnapshotHeight;
|
||||
int primarySnapshotWidth;
|
||||
@@ -641,12 +646,18 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
|
||||
}
|
||||
secondarySnapshot.setTranslationY(spaceAboveSnapshot);
|
||||
} else {
|
||||
int deviceHeightWithoutTaskbar = dp.availableHeightPx - dp.taskbarSize;
|
||||
float scale = (float) totalThumbnailHeight / deviceHeightWithoutTaskbar;
|
||||
float topTaskHeight = dp.availableHeightPx * taskPercent;
|
||||
float finalDividerHeight = dividerBar * scale;
|
||||
float scaledTopTaskHeight = topTaskHeight * scale;
|
||||
primarySnapshotWidth = parentWidth;
|
||||
primarySnapshotHeight = Math.round(totalThumbnailHeight * taskPercent);
|
||||
primarySnapshotHeight = Math.round(scaledTopTaskHeight);
|
||||
|
||||
secondarySnapshotWidth = parentWidth;
|
||||
secondarySnapshotHeight = totalThumbnailHeight - primarySnapshotHeight - dividerBar;
|
||||
int translationY = primarySnapshotHeight + spaceAboveSnapshot + dividerBar;
|
||||
secondarySnapshotHeight = Math.round(totalThumbnailHeight - primarySnapshotHeight
|
||||
- finalDividerHeight);
|
||||
float translationY = primarySnapshotHeight + spaceAboveSnapshot + finalDividerHeight;
|
||||
secondarySnapshot.setTranslationY(translationY);
|
||||
|
||||
FrameLayout.LayoutParams primaryParams =
|
||||
|
||||
Reference in New Issue
Block a user