Merge "Fixing Toast Hiding behind Taskbar - Part 2" into udc-dev
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 9d36c67..fcbca7e 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -113,7 +113,7 @@
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"Брзи поставки"</string>
<string name="taskbar_a11y_title" msgid="6432169809852243110">"Лента со задачи"</string>
<string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Лентата со задачи е прикажана"</string>
- <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Лентата со задачи е сокриена"</string>
+ <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Лентата со задачи е скриена"</string>
<string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Лента за навигација"</string>
<string name="always_show_taskbar" msgid="3608801276107751229">"Секогаш прикажувај „Лента“"</string>
<string name="change_navigation_mode" msgid="9088393078736808968">"Променете режим на навигација"</string>
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 95c2326..e4e8880 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -878,7 +878,9 @@
private void onTISConnected(TISBinder binder) {
mTaskbarManager = binder.getTaskbarManager();
- mTaskbarManager.setActivity(this);
+ if (mTaskbarManager != null) {
+ mTaskbarManager.setActivity(this);
+ }
mOverviewCommandHelper = binder.getOverviewCommandHelper();
}
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index f5202b7..3a6566a 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -147,6 +147,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
@@ -662,6 +663,14 @@
} else {
runningTasks = mGestureState.getRunningTask().getPlaceholderTasks();
}
+
+ // Safeguard against any null tasks being sent to recents view, happens when quickswitching
+ // very quickly w/ split tasks because TopTaskTracker provides stale information compared to
+ // actual running tasks in the recents animation.
+ // TODO(b/236226779), Proper fix (ag/22237143)
+ if (Arrays.stream(runningTasks).anyMatch(Objects::isNull)) {
+ return;
+ }
mRecentsView.onGestureAnimationStart(runningTasks, mDeviceState.getRotationTouchHelper());
}
@@ -915,7 +924,12 @@
if (DesktopTaskView.DESKTOP_MODE_SUPPORTED && targets.hasDesktopTasks()) {
mRemoteTargetHandles = mTargetGluer.assignTargetsForDesktop(targets);
} else {
+ int untrimmedAppCount = mRemoteTargetHandles.length;
mRemoteTargetHandles = mTargetGluer.assignTargetsForSplitScreen(targets);
+ if (mRemoteTargetHandles.length < untrimmedAppCount && mIsSwipeForSplit) {
+ updateIsGestureForSplit(mRemoteTargetHandles.length);
+ setupRecentsViewUi();
+ }
}
mRecentsAnimationController = controller;
mRecentsAnimationTargets = targets;
diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java
index 253341d..39af7fd 100644
--- a/quickstep/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/src/com/android/quickstep/RecentsActivity.java
@@ -144,7 +144,9 @@
private void onTISConnected(TouchInteractionService.TISBinder binder) {
mTaskbarManager = binder.getTaskbarManager();
- mTaskbarManager.setActivity(this);
+ if (mTaskbarManager != null) {
+ mTaskbarManager.setActivity(this);
+ }
}
@Override
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index d9c269a..84b90b9 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -29,12 +29,15 @@
import com.android.quickstep.views.DesktopTaskView;
import java.util.ArrayList;
+import java.util.Arrays;
/**
* Glues together the necessary components to animate a remote target using a
* {@link TaskViewSimulator}
*/
public class RemoteTargetGluer {
+ private static final int DEFAULT_NUM_HANDLES = 2;
+
private RemoteTargetHandle[] mRemoteTargetHandles;
private SplitBounds mSplitBounds;
@@ -62,8 +65,9 @@
}
}
- int[] splitIds = TopTaskTracker.INSTANCE.get(context).getRunningSplitTaskIds();
- init(context, sizingStrategy, splitIds.length == 2 ? 2 : 1, false /* forDesktop */);
+ // Assume 2 handles needed for split, scale down as needed later on when we actually
+ // get remote targets
+ init(context, sizingStrategy, DEFAULT_NUM_HANDLES, false /* forDesktop */);
}
private void init(Context context, BaseActivityInterface sizingStrategy, int numHandles,
@@ -108,6 +112,17 @@
* the left/top task, index 1 right/bottom.
*/
public RemoteTargetHandle[] assignTargetsForSplitScreen(RemoteAnimationTargets targets) {
+ // Resize the mRemoteTargetHandles array since we started assuming split screen, but
+ // targets.apps is the ultimate source of truth here
+ long appCount = Arrays.stream(targets.apps)
+ .filter(app -> app.mode == targets.targetMode)
+ .count();
+ if (appCount < mRemoteTargetHandles.length) {
+ RemoteTargetHandle[] newHandles = new RemoteTargetHandle[(int) appCount];
+ System.arraycopy(mRemoteTargetHandles, 0/*src*/, newHandles, 0/*dst*/, (int) appCount);
+ mRemoteTargetHandles = newHandles;
+ }
+
if (mRemoteTargetHandles.length == 1) {
// If we're not in split screen, the splitIds count doesn't really matter since we
// should always hit this case.
@@ -233,6 +248,14 @@
targets.targetMode);
}
+ /**
+ * The object returned by this is may be modified in
+ * {@link #assignTargetsForSplitScreen(RemoteAnimationTargets)}, specifically the length of the
+ * array may be shortened based on the number of RemoteAnimationTargets present.
+ * <p>
+ * This can be accessed at any time, however the count will be more accurate if accessed after
+ * calling one of the respective assignTargets*() methods
+ */
public RemoteTargetHandle[] getRemoteTargetHandles() {
return mRemoteTargetHandles;
}
diff --git a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
index 1b4fdc4..25ac47a 100644
--- a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
+++ b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
@@ -82,7 +82,8 @@
mContext = context;
mDeviceState = deviceState;
mGestureState = gestureState;
- mIsSwipeForSplit = TopTaskTracker.INSTANCE.get(context).getRunningSplitTaskIds().length > 1;
+ updateIsGestureForSplit(TopTaskTracker.INSTANCE.get(context)
+ .getRunningSplitTaskIds().length);
mTargetGluer = new RemoteTargetGluer(mContext, mGestureState.getActivityInterface());
mRemoteTargetHandles = mTargetGluer.getRemoteTargetHandles();
@@ -280,6 +281,10 @@
return out;
}
+ protected void updateIsGestureForSplit(int targetCount) {
+ mIsSwipeForSplit = targetCount > 1;
+ }
+
private RectFSpringAnim getWindowAnimationToHomeInternal(
HomeAnimationFactory homeAnimationFactory, RectF targetRect,
TransformParams transformParams, TaskViewSimulator taskViewSimulator,
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 1fbfbe6..1624eb6 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -139,8 +139,10 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.LinkedList;
+import java.util.function.Consumer;
import java.util.function.Function;
/**
@@ -157,15 +159,21 @@
private static final String HAS_ENABLED_QUICKSTEP_ONCE = "launcher.has_enabled_quickstep_once";
- private final TISBinder mTISBinder = new TISBinder();
+ private final TISBinder mTISBinder = new TISBinder(this);
/**
* Local IOverviewProxy implementation with some methods for local components
*/
- public class TISBinder extends IOverviewProxy.Stub {
+ public static class TISBinder extends IOverviewProxy.Stub {
+
+ private final WeakReference<TouchInteractionService> mTis;
@Nullable private Runnable mOnOverviewTargetChangeListener = null;
+ private TISBinder(TouchInteractionService tis) {
+ mTis = new WeakReference<>(tis);
+ }
+
@BinderThread
public void onInitialize(Bundle bundle) {
ISystemUiProxy proxy = ISystemUiProxy.Stub.asInterface(
@@ -193,14 +201,14 @@
bundle.getBinder(KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER));
IDragAndDrop dragAndDrop = IDragAndDrop.Stub.asInterface(
bundle.getBinder(KEY_EXTRA_SHELL_DRAG_AND_DROP));
- MAIN_EXECUTOR.execute(() -> {
- SystemUiProxy.INSTANCE.get(TouchInteractionService.this).setProxy(proxy, pip,
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ SystemUiProxy.INSTANCE.get(tis).setProxy(proxy, pip,
bubbles, splitscreen, onehanded, shellTransitions, startingWindow,
recentTasks, launcherUnlockAnimationController, backAnimation, desktopMode,
unfoldTransition, dragAndDrop);
- TouchInteractionService.this.initInputMonitor("TISBinder#onInitialize()");
- preloadOverview(true /* fromInit */);
- });
+ tis.initInputMonitor("TISBinder#onInitialize()");
+ tis.preloadOverview(true /* fromInit */);
+ }));
sIsInitialized = true;
}
@@ -208,65 +216,72 @@
@Override
public void onTaskbarToggled() {
if (!FeatureFlags.ENABLE_KEYBOARD_TASKBAR_TOGGLE.get()) return;
- MAIN_EXECUTOR.execute(() -> {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
TaskbarActivityContext activityContext =
- mTaskbarManager.getCurrentActivityContext();
+ tis.mTaskbarManager.getCurrentActivityContext();
if (activityContext != null) {
activityContext.toggleTaskbarStash();
}
- });
+ }));
}
@BinderThread
public void onOverviewToggle() {
TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "onOverviewToggle");
- // If currently screen pinning, do not enter overview
- if (mDeviceState.isScreenPinningActive()) {
- return;
- }
- TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
- mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_TOGGLE);
+ executeForTouchInteractionService(tis -> {
+ // If currently screen pinning, do not enter overview
+ if (tis.mDeviceState.isScreenPinningActive()) {
+ return;
+ }
+ TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
+ tis.mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_TOGGLE);
+ });
}
@BinderThread
@Override
public void onOverviewShown(boolean triggeredFromAltTab) {
- if (triggeredFromAltTab) {
- TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
- mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_KEYBOARD_INPUT);
- } else {
- mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_SHOW);
- }
+ executeForTouchInteractionService(tis -> {
+ if (triggeredFromAltTab) {
+ TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
+ tis.mOverviewCommandHelper.addCommand(
+ OverviewCommandHelper.TYPE_KEYBOARD_INPUT);
+ } else {
+ tis.mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_SHOW);
+ }
+ });
}
@BinderThread
@Override
public void onOverviewHidden(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
- if (triggeredFromAltTab && !triggeredFromHomeKey) {
- // onOverviewShownFromAltTab hides the overview and ends at the target app
- mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_HIDE);
- }
+ executeForTouchInteractionService(tis -> {
+ if (triggeredFromAltTab && !triggeredFromHomeKey) {
+ // onOverviewShownFromAltTab hides the overview and ends at the target app
+ tis.mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_HIDE);
+ }
+ });
}
@BinderThread
@Override
public void onAssistantAvailable(boolean available, boolean longPressHomeEnabled) {
- MAIN_EXECUTOR.execute(() -> {
- mDeviceState.setAssistantAvailable(available);
- TouchInteractionService.this.onAssistantVisibilityChanged();
- executeForTaskbarManager(() -> mTaskbarManager
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ tis.mDeviceState.setAssistantAvailable(available);
+ tis.onAssistantVisibilityChanged();
+ executeForTaskbarManager(taskbarManager -> taskbarManager
.onLongPressHomeEnabled(longPressHomeEnabled));
- });
+ }));
}
@BinderThread
@Override
public void onAssistantVisibilityChanged(float visibility) {
- MAIN_EXECUTOR.execute(() -> {
- mDeviceState.setAssistantVisibility(visibility);
- TouchInteractionService.this.onAssistantVisibilityChanged();
- });
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ tis.mDeviceState.setAssistantVisibility(visibility);
+ tis.onAssistantVisibilityChanged();
+ }));
}
@Override
@@ -276,16 +291,17 @@
@BinderThread
public void onSystemUiStateChanged(int stateFlags) {
- MAIN_EXECUTOR.execute(() -> {
- int lastFlags = mDeviceState.getSystemUiStateFlags();
- mDeviceState.setSystemUiFlags(stateFlags);
- TouchInteractionService.this.onSystemUiFlagsChanged(lastFlags);
- });
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ int lastFlags = tis.mDeviceState.getSystemUiStateFlags();
+ tis.mDeviceState.setSystemUiFlags(stateFlags);
+ tis.onSystemUiFlagsChanged(lastFlags);
+ }));
}
@BinderThread
public void onActiveNavBarRegionChanges(Region region) {
- MAIN_EXECUTOR.execute(() -> mDeviceState.setDeferredGestureRegion(region));
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(
+ tis -> tis.mDeviceState.setDeferredGestureRegion(region)));
}
@BinderThread
@@ -309,75 +325,105 @@
@BinderThread
@Override
public void enterStageSplitFromRunningApp(boolean leftOrTop) {
- StatefulActivity activity =
- mOverviewComponentObserver.getActivityInterface().getCreatedActivity();
- if (activity != null) {
- activity.enterStageSplitFromRunningApp(leftOrTop);
- }
+ executeForTouchInteractionService(tis -> {
+ StatefulActivity activity =
+ tis.mOverviewComponentObserver.getActivityInterface().getCreatedActivity();
+ if (activity != null) {
+ activity.enterStageSplitFromRunningApp(leftOrTop);
+ }
+ });
}
/**
* Preloads the Overview activity.
- *
+ * <p>
* This method should only be used when the All Set page of the SUW is reached to safely
* preload the Launcher for the SUW first reveal.
*/
public void preloadOverviewForSUWAllSet() {
- preloadOverview(false, true);
+ executeForTouchInteractionService(tis -> tis.preloadOverview(false, true));
}
@Override
public void onRotationProposal(int rotation, boolean isValid) {
- executeForTaskbarManager(() -> mTaskbarManager.onRotationProposal(rotation, isValid));
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onRotationProposal(rotation, isValid));
}
@Override
public void disable(int displayId, int state1, int state2, boolean animate) {
- executeForTaskbarManager(() -> mTaskbarManager
- .disableNavBarElements(displayId, state1, state2, animate));
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.disableNavBarElements(displayId, state1, state2, animate));
}
@Override
public void onSystemBarAttributesChanged(int displayId, int behavior) {
- executeForTaskbarManager(() -> mTaskbarManager
- .onSystemBarAttributesChanged(displayId, behavior));
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onSystemBarAttributesChanged(displayId, behavior));
}
@Override
public void onNavButtonsDarkIntensityChanged(float darkIntensity) {
- executeForTaskbarManager(() -> mTaskbarManager
- .onNavButtonsDarkIntensityChanged(darkIntensity));
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onNavButtonsDarkIntensityChanged(darkIntensity));
}
- private void executeForTaskbarManager(final Runnable r) {
- MAIN_EXECUTOR.execute(() -> {
- if (mTaskbarManager == null) {
- return;
- }
- r.run();
- });
+ private void executeForTouchInteractionService(
+ @NonNull Consumer<TouchInteractionService> tisConsumer) {
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return;
+ tisConsumer.accept(tis);
}
+ private void executeForTaskbarManager(
+ @NonNull Consumer<TaskbarManager> taskbarManagerConsumer) {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ TaskbarManager taskbarManager = tis.mTaskbarManager;
+ if (taskbarManager == null) return;
+ taskbarManagerConsumer.accept(taskbarManager);
+ }));
+ }
+
+ /**
+ * Returns the {@link TaskbarManager}.
+ * <p>
+ * Returns {@code null} if TouchInteractionService is not connected
+ */
+ @Nullable
public TaskbarManager getTaskbarManager() {
- return mTaskbarManager;
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return null;
+ return tis.mTaskbarManager;
}
+ /**
+ * Returns the {@link OverviewCommandHelper}.
+ * <p>
+ * Returns {@code null} if TouchInteractionService is not connected
+ */
+ @Nullable
public OverviewCommandHelper getOverviewCommandHelper() {
- return mOverviewCommandHelper;
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return null;
+ return tis.mOverviewCommandHelper;
}
/**
* Sets a proxy to bypass swipe up behavior
*/
public void setSwipeUpProxy(Function<GestureState, AnimatedFloat> proxy) {
- mSwipeUpProxyProvider = proxy != null ? proxy : (i -> null);
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return;
+ tis.mSwipeUpProxyProvider = proxy != null ? proxy : (i -> null);
}
/**
* Sets the task id where gestures should be blocked
*/
public void setGestureBlockedTaskId(int taskId) {
- mDeviceState.setGestureBlockingTaskId(taskId);
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return;
+ tis.mDeviceState.setGestureBlockingTaskId(taskId);
}
/** Sets a listener to be run on Overview Target updates. */
diff --git a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
index 8274a51..1868463 100644
--- a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
+++ b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
@@ -61,6 +61,7 @@
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.anim.AnimatorPlaybackController;
+import com.android.launcher3.taskbar.TaskbarManager;
import com.android.launcher3.util.Executors;
import com.android.quickstep.GestureState;
import com.android.quickstep.TouchInteractionService.TISBinder;
@@ -100,6 +101,7 @@
private TISBindHelper mTISBindHelper;
private TISBinder mBinder;
+ @Nullable private TaskbarManager mTaskbarManager = null;
private final AnimatedFloat mSwipeProgress = new AnimatedFloat(this::onSwipeProgressUpdate);
private BgDrawable mBackground;
@@ -262,19 +264,25 @@
mAnimatedBackground.playAnimation();
}
+ private void setSetupUIVisible(boolean visible) {
+ if (mBinder == null || mTaskbarManager == null) return;
+ mTaskbarManager.setSetupUIVisible(visible);
+ }
+
@Override
protected void onResume() {
super.onResume();
maybeResumeOrPauseBackgroundAnimation();
if (mBinder != null) {
- mBinder.getTaskbarManager().setSetupUIVisible(true);
+ setSetupUIVisible(true);
mBinder.setSwipeUpProxy(this::createSwipeUpProxy);
}
}
private void onTISConnected(TISBinder binder) {
mBinder = binder;
- mBinder.getTaskbarManager().setSetupUIVisible(isResumed());
+ mTaskbarManager = mBinder.getTaskbarManager();
+ setSetupUIVisible(isResumed());
mBinder.setSwipeUpProxy(isResumed() ? this::createSwipeUpProxy : null);
mBinder.setOverviewTargetChangeListener(mBinder::preloadOverviewForSUWAllSet);
mBinder.preloadOverviewForSUWAllSet();
@@ -293,7 +301,7 @@
private void clearBinderOverride() {
if (mBinder != null) {
- mBinder.getTaskbarManager().setSetupUIVisible(false);
+ setSetupUIVisible(false);
mBinder.setSwipeUpProxy(null);
mBinder.setOverviewTargetChangeListener(null);
}
@@ -352,9 +360,8 @@
mContentView.setAlpha(alpha);
mContentView.setTranslationY((alpha - 1) * mSwipeUpShift);
- if (mLauncherStartAnim == null) {
- mLauncherStartAnim = mBinder.getTaskbarManager().createLauncherStartFromSuwAnim(
- MAX_SWIPE_DURATION);
+ if (mLauncherStartAnim == null && mTaskbarManager != null) {
+ mLauncherStartAnim = mTaskbarManager.createLauncherStartFromSuwAnim(MAX_SWIPE_DURATION);
}
if (mLauncherStartAnim != null) {
mLauncherStartAnim.setPlayFraction(Utilities.mapBoundToRange(
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 2664988..93ea28e 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -100,7 +100,7 @@
<string name="folder_name_format_exact" msgid="8626242716117004803">"Ordner: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> Elemente"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Ordner: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> oder mehr Elemente"</string>
<string name="wallpaper_button_text" msgid="8404103075899945851">"Hintergründe"</string>
- <string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hintergrund & Stil"</string>
+ <string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hintergrund und Stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startbildschirm bearbeiten"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Einstellungen"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Von deinem Administrator deaktiviert"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 8416815..7478968 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -50,8 +50,7 @@
<string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personnels"</string>
<string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Professionnels"</string>
<string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string>
- <!-- no translation found for widget_category_note_taking (3469689394504266039) -->
- <skip />
+ <string name="widget_category_note_taking" msgid="3469689394504266039">"Prise de note"</string>
<string name="widget_education_header" msgid="4874760613775913787">"Renseignements utiles à portée de main"</string>
<string name="widget_education_content" msgid="1731667670753497052">"Pour obtenir des informations sans ouvrir d\'applications, vous pouvez ajouter des widgets à votre écran d\'accueil"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Touchez pour modifier les paramètres du widget"</string>
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 621c2ab..f88ff86 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -302,7 +302,7 @@
"Enable widget transition animation when resizing the widgets");
public static final BooleanFlag PREEMPTIVE_UNFOLD_ANIMATION_START = getDebugFlag(270397209,
- "PREEMPTIVE_UNFOLD_ANIMATION_START", ENABLED,
+ "PREEMPTIVE_UNFOLD_ANIMATION_START", DISABLED,
"Enables starting the unfold animation preemptively when unfolding, without"
+ "waiting for SystemUI and then merging the SystemUI progress whenever we "
+ "start receiving the events");
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 15f3538..17d3302 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -642,6 +642,9 @@
@UiEvent(doc = "User has swiped upwards from the gesture handle to show transient taskbar.")
LAUNCHER_TRANSIENT_TASKBAR_SHOW(1331),
+
+ @UiEvent(doc = "App launched through pending intent")
+ LAUNCHER_APP_LAUNCH_PENDING_INTENT(1394),
;
// ADD MORE
diff --git a/src/com/android/launcher3/util/ContentWriter.java b/src/com/android/launcher3/util/ContentWriter.java
index 7c5ef4d..9910dc2 100644
--- a/src/com/android/launcher3/util/ContentWriter.java
+++ b/src/com/android/launcher3/util/ContentWriter.java
@@ -106,7 +106,7 @@
public int commit() {
if (mCommitParams != null) {
- mCommitParams.mDbController.update(
+ return mCommitParams.mDbController.update(
Favorites.TABLE_NAME, getValues(mContext),
mCommitParams.mWhere, mCommitParams.mSelectionArgs);
}
diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java
index 515a2d8..4b319e5 100644
--- a/src/com/android/launcher3/views/ActivityContext.java
+++ b/src/com/android/launcher3/views/ActivityContext.java
@@ -20,6 +20,7 @@
import static com.android.launcher3.LauncherSettings.Animation.DEFAULT_NO_ICON;
import static com.android.launcher3.logging.KeyboardStateManager.KeyboardState.HIDE;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_KEYBOARD_CLOSED;
+import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_PENDING_INTENT;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_TAP;
import static com.android.launcher3.model.WidgetsModel.GO_DISABLE_WIDGETS;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
@@ -305,6 +306,11 @@
ActivityOptionsWrapper options = getActivityLaunchOptions(v, item);
try {
intent.send(null, 0, null, null, null, null, options.toBundle());
+ if (item != null) {
+ InstanceId instanceId = new InstanceIdSequence().newInstanceId();
+ getStatsLogManager().logger().withItemInfo(item).withInstanceId(instanceId)
+ .log(LAUNCHER_APP_LAUNCH_PENDING_INTENT);
+ }
return options.onEndCallback;
} catch (PendingIntent.CanceledException e) {
Toast.makeText(v.getContext(),
diff --git a/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
index 2742882..580b4f1 100644
--- a/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
@@ -105,6 +105,7 @@
mEnforcedRectangle);
setOutlineProvider(mCornerRadiusEnforcementOutline);
setClipToOutline(true);
+ invalidateOutline();
}
/** Returns the corner radius currently enforced, in pixels. */
diff --git a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
index 723ea17..8dd1de4 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
@@ -42,7 +42,6 @@
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.android.launcher3.R;
-import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.recyclerview.ViewHolderBinder;
import com.android.launcher3.util.LabelComparator;
import com.android.launcher3.util.PackageUserKey;
@@ -58,7 +57,6 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import java.util.Map;
import java.util.OptionalInt;
import java.util.function.IntSupplier;
import java.util.function.Predicate;
@@ -174,9 +172,6 @@
mAllEntries.clear();
mAllEntries.add(new WidgetListSpaceEntry());
tempEntries.stream().sorted(mRowComparator).forEach(mAllEntries::add);
- if (shouldClearVisibleEntries()) {
- mVisibleEntries.clear();
- }
updateVisibleEntries();
}
@@ -426,29 +421,6 @@
updateVisibleEntries();
}
- /**
- * Returns {@code true} if there is a change in {@link #mAllEntries} that results in an
- * invalidation of {@link #mVisibleEntries}. e.g. there is change in the device language.
- */
- private boolean shouldClearVisibleEntries() {
- Map<PackageUserKey, PackageItemInfo> packagesInfo =
- mAllEntries.stream()
- .filter(entry -> entry instanceof WidgetsListHeaderEntry)
- .map(entry -> entry.mPkgItem)
- .collect(Collectors.toMap(
- entry -> PackageUserKey.fromPackageItemInfo(entry),
- entry -> entry));
- for (WidgetsListBaseEntry visibleEntry: mVisibleEntries) {
- PackageUserKey key = PackageUserKey.fromPackageItemInfo(visibleEntry.mPkgItem);
- PackageItemInfo packageItemInfo = packagesInfo.get(key);
- if (packageItemInfo != null
- && !visibleEntry.mPkgItem.title.equals(packageItemInfo.title)) {
- return true;
- }
- }
- return false;
- }
-
/** Comparator for sorting WidgetListRowEntry based on package title. */
public static class WidgetListBaseRowEntryComparator implements
Comparator<WidgetsListBaseEntry> {
diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
index d7c4ae3..604fe42 100644
--- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
+++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
@@ -242,17 +242,7 @@
public void setUp() throws Exception {
mLauncher.onTestStart();
- final boolean keyguardAlreadyVisible = sSeenKeygard;
-
- sSeenKeygard = sSeenKeygard
- || !TestHelpers.wait(
- Until.gone(By.res(SYSTEMUI_PACKAGE, "keyguard_status_view")), 60000);
-
- Assert.assertFalse(
- "Keyguard is visible, which is likely caused by a crash in SysUI, seeing keyguard"
- + " for the first time = "
- + !keyguardAlreadyVisible,
- sSeenKeygard);
+ verifyKeyguardInvisible();
final String launcherPackageName = mDevice.getLauncherPackageName();
try {
@@ -285,6 +275,20 @@
}
}
+ private static void verifyKeyguardInvisible() {
+ final boolean keyguardAlreadyVisible = sSeenKeygard;
+
+ sSeenKeygard = sSeenKeygard
+ || !TestHelpers.wait(
+ Until.gone(By.res(SYSTEMUI_PACKAGE, "keyguard_status_view")), 60000);
+
+ Assert.assertFalse(
+ "Keyguard is visible, which is likely caused by a crash in SysUI, seeing keyguard"
+ + " for the first time = "
+ + !keyguardAlreadyVisible,
+ sSeenKeygard);
+ }
+
@After
public void verifyLauncherState() {
try {
@@ -402,6 +406,7 @@
// flakiness.
protected void waitForLauncherCondition(
String message, Function<Launcher, Boolean> condition, long timeout) {
+ verifyKeyguardInvisible();
if (!TestHelpers.isInLauncherProcess()) return;
Wait.atMost(message, () -> getFromLauncher(condition), timeout, mLauncher);
}