diff options
Diffstat (limited to 'src/com/android')
14 files changed, 75 insertions, 46 deletions
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 098a76f2c5..37a20bf679 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -521,11 +521,12 @@ public class Launcher extends StatefulActivity<LauncherState> // TODO: move the SearchConfig to SearchState when new LauncherState is created. mBaseSearchConfig = new BaseSearchConfig(); + setupViews(); + mAppWidgetManager = new WidgetManagerHelper(this); mAppWidgetHolder = createAppWidgetHolder(); mAppWidgetHolder.startListening(); - setupViews(); mPopupDataProvider = new PopupDataProvider(this::updateNotificationDots); boolean internalStateHandled = ACTIVITY_TRACKER.handleCreate(this); diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java index 21dfbe1d0c..d4140d851c 100644 --- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java @@ -444,6 +444,9 @@ public class ActivityAllAppsContainerView<T extends Context & ActivityContext> // Animate to A-Z with 0 time to reset the animation with proper state management. animateToSearchState(false, 0); } + if (isSearching()) { + mWorkManager.reset(); + } } @Override diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java index 663fdb9822..8c2fb195c6 100644 --- a/src/com/android/launcher3/allapps/WorkModeSwitch.java +++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java @@ -166,7 +166,7 @@ public class WorkModeSwitch extends LinearLayout implements Insettable, return super.onApplyWindowInsets(insets); } - private void updateTranslationY() { + void updateTranslationY() { setTranslationY(-mImeInsets.bottom); } @@ -180,6 +180,10 @@ public class WorkModeSwitch extends LinearLayout implements Insettable, rect.set(insets.left, insets.top, insets.right, insets.bottom); } + public Rect getImeInsets() { + return mImeInsets; + } + @Override public void onTranslationStart() { setFlag(FLAG_TRANSLATION_ONGOING); diff --git a/src/com/android/launcher3/allapps/WorkProfileManager.java b/src/com/android/launcher3/allapps/WorkProfileManager.java index 30af50261d..44c233f557 100644 --- a/src/com/android/launcher3/allapps/WorkProfileManager.java +++ b/src/com/android/launcher3/allapps/WorkProfileManager.java @@ -136,6 +136,11 @@ public class WorkProfileManager implements PersonalWorkSlidingTabStrip.OnActiveP public void reset() { boolean isEnabled = !mAllApps.getAppsStore().hasModelFlag(FLAG_QUIET_MODE_ENABLED); updateCurrentState(isEnabled ? STATE_ENABLED : STATE_DISABLED); + if (mWorkModeSwitch != null) { + // reset the position of the button and clear IME insets. + mWorkModeSwitch.getImeInsets().setEmpty(); + mWorkModeSwitch.updateTranslationY(); + } } private void updateCurrentState(@WorkProfileState int currentState) { diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index 621c2abb90..f88ff86612 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -302,7 +302,7 @@ public final class FeatureFlags { "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/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index 2ce6c785c2..dd82ecfb95 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -273,6 +273,8 @@ public class FolderAnimationManager { // {@link #onAnimationEnd} before B reads new UI state from {@link #onAnimationStart}. a.addListener(new AnimatorListenerAdapter() { private CellLayout mCellLayout; + + private boolean mFolderClipChildren; private boolean mFolderClipToPadding; private boolean mContentClipChildren; private boolean mContentClipToPadding; @@ -283,12 +285,14 @@ public class FolderAnimationManager { public void onAnimationStart(Animator animator) { super.onAnimationStart(animator); mCellLayout = mContent.getCurrentCellLayout(); + mFolderClipChildren = mFolder.getClipChildren(); mFolderClipToPadding = mFolder.getClipToPadding(); mContentClipChildren = mContent.getClipChildren(); mContentClipToPadding = mContent.getClipToPadding(); mCellLayoutClipChildren = mCellLayout.getClipChildren(); mCellLayoutClipPadding = mCellLayout.getClipToPadding(); + mFolder.setClipChildren(false); mFolder.setClipToPadding(false); mContent.setClipChildren(false); mContent.setClipToPadding(false); @@ -309,6 +313,7 @@ public class FolderAnimationManager { mFolder.mFooter.setTranslationX(0f); mFolder.mFolderName.setAlpha(1f); + mFolder.setClipChildren(mFolderClipChildren); mFolder.setClipToPadding(mFolderClipToPadding); mContent.setClipChildren(mContentClipChildren); mContent.setClipToPadding(mContentClipToPadding); diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java index 1e3b0030b8..2f7f51e6f7 100644 --- a/src/com/android/launcher3/icons/IconCache.java +++ b/src/com/android/launcher3/icons/IconCache.java @@ -100,6 +100,7 @@ public class IconCache extends BaseIconCache { private final UserCache mUserManager; private final InstantAppResolver mInstantAppResolver; private final IconProvider mIconProvider; + private final HandlerRunnable mCancelledRunnable; private final SparseArray<BitmapInfo> mWidgetCategoryBitmapInfos; @@ -117,6 +118,10 @@ public class IconCache extends BaseIconCache { mInstantAppResolver = InstantAppResolver.newInstance(mContext); mIconProvider = iconProvider; mWidgetCategoryBitmapInfos = new SparseArray<>(); + + mCancelledRunnable = new HandlerRunnable( + mWorkerHandler, () -> null, MAIN_EXECUTOR, c -> { }); + mCancelledRunnable.cancel(); } @Override @@ -172,23 +177,30 @@ public class IconCache extends BaseIconCache { public HandlerRunnable updateIconInBackground(final ItemInfoUpdateReceiver caller, final ItemInfoWithIcon info) { Preconditions.assertUIThread(); + Supplier<ItemInfoWithIcon> task; + if (info instanceof AppInfo || info instanceof WorkspaceItemInfo) { + task = () -> { + getTitleAndIcon(info, false); + return info; + }; + } else if (info instanceof PackageItemInfo pii) { + task = () -> { + getTitleAndIconForApp(pii, false); + return pii; + }; + } else { + Log.i(TAG, "Icon update not supported for " + + info == null ? "null" : info.getClass().getName()); + return mCancelledRunnable; + } + if (mPendingIconRequestCount <= 0) { MODEL_EXECUTOR.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); } mPendingIconRequestCount++; HandlerRunnable<ItemInfoWithIcon> request = new HandlerRunnable<>(mWorkerHandler, - () -> { - if (info instanceof AppInfo || info instanceof WorkspaceItemInfo) { - getTitleAndIcon(info, false); - } else if (info instanceof PackageItemInfo) { - getTitleAndIconForApp((PackageItemInfo) info, false); - } - return info; - }, - MAIN_EXECUTOR, - caller::reapplyItemInfo, - this::onIconRequestEnd); + task, MAIN_EXECUTOR, caller::reapplyItemInfo, this::onIconRequestEnd); Utilities.postAsyncCallback(mWorkerHandler, request); return request; } diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java index 88d3ea4375..66ed779eb5 100644 --- a/src/com/android/launcher3/logging/StatsLogManager.java +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -642,6 +642,9 @@ public class StatsLogManager implements ResourceBasedOverride { @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 7c5ef4db0c..9910dc2e70 100644 --- a/src/com/android/launcher3/util/ContentWriter.java +++ b/src/com/android/launcher3/util/ContentWriter.java @@ -106,7 +106,7 @@ public class ContentWriter { 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/util/ViewOnDrawExecutor.java b/src/com/android/launcher3/util/ViewOnDrawExecutor.java index c2767beb3d..fada4a3f01 100644 --- a/src/com/android/launcher3/util/ViewOnDrawExecutor.java +++ b/src/com/android/launcher3/util/ViewOnDrawExecutor.java @@ -59,6 +59,7 @@ public class ViewOnDrawExecutor implements OnDrawListener, Runnable, private void attachObserver() { if (!mCompleted) { mAttachedView.getViewTreeObserver().addOnDrawListener(this); + mAttachedView.getRootView().invalidate(); } } diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java index 515a2d81a5..4b319e5b61 100644 --- a/src/com/android/launcher3/views/ActivityContext.java +++ b/src/com/android/launcher3/views/ActivityContext.java @@ -20,6 +20,7 @@ import static android.window.SplashScreen.SPLASH_SCREEN_STYLE_SOLID_COLOR; 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 @@ public interface ActivityContext { 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/views/Snackbar.java b/src/com/android/launcher3/views/Snackbar.java index 8d5838e592..2460be17c5 100644 --- a/src/com/android/launcher3/views/Snackbar.java +++ b/src/com/android/launcher3/views/Snackbar.java @@ -65,9 +65,26 @@ public class Snackbar extends AbstractFloatingView { show(activity, labelStringRedId, NO_ID, onDismissed, null); } + /** Show a snackbar with just a label. */ + public static <T extends Context & ActivityContext> void show(T activity, String labelString, + Runnable onDismissed) { + show(activity, labelString, NO_ID, onDismissed, null); + } + /** Show a snackbar with a label and action. */ public static <T extends Context & ActivityContext> void show(T activity, int labelStringResId, int actionStringResId, Runnable onDismissed, @Nullable Runnable onActionClicked) { + show( + activity, + activity.getResources().getString(labelStringResId), + actionStringResId, + onDismissed, + onActionClicked); + } + + /** Show a snackbar with a label and action. */ + public static <T extends Context & ActivityContext> void show(T activity, String labelString, + int actionStringResId, Runnable onDismissed, @Nullable Runnable onActionClicked) { closeOpenViews(activity, true, TYPE_SNACKBAR); Snackbar snackbar = new Snackbar(activity, null); // Set some properties here since inflated xml only contains the children. @@ -105,8 +122,7 @@ public class Snackbar extends AbstractFloatingView { : insets.bottom)); TextView labelView = snackbar.findViewById(R.id.label); - String labelText = res.getString(labelStringResId); - labelView.setText(labelText); + labelView.setText(labelString); TextView actionView = snackbar.findViewById(R.id.action); float actionWidth; @@ -127,7 +143,7 @@ public class Snackbar extends AbstractFloatingView { actionView.setVisibility(GONE); } - int totalContentWidth = (int) (labelView.getPaint().measureText(labelText) + actionWidth) + int totalContentWidth = (int) (labelView.getPaint().measureText(labelString) + actionWidth) + labelView.getPaddingRight() + labelView.getPaddingLeft() + padding * 2; if (totalContentWidth > params.width) { diff --git a/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java index 2742882b1f..580b4f11ea 100644 --- a/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java @@ -105,6 +105,7 @@ public abstract class BaseLauncherAppWidgetHostView extends NavigableAppWidgetHo 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 723ea17147..8dd1de4ac8 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.Adapter; 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.Arrays; 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 @@ public class WidgetsListAdapter extends Adapter<ViewHolder> implements OnHeaderC mAllEntries.clear(); mAllEntries.add(new WidgetListSpaceEntry()); tempEntries.stream().sorted(mRowComparator).forEach(mAllEntries::add); - if (shouldClearVisibleEntries()) { - mVisibleEntries.clear(); - } updateVisibleEntries(); } @@ -426,29 +421,6 @@ public class WidgetsListAdapter extends Adapter<ViewHolder> implements OnHeaderC 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> { |