diff options
author | Tony Wickham <twickham@google.com> | 2017-04-20 16:24:09 -0700 |
---|---|---|
committer | Tony Wickham <twickham@google.com> | 2017-04-20 16:24:09 -0700 |
commit | 623daea93b8ca55b9cc99516df2284bde4322a0c (patch) | |
tree | ba3bdf1678d0443e327a44525c17db47d5e4ff39 | |
parent | 2feac00e2b9cf46269ffa11bb71ba412e9c3d1b1 (diff) | |
parent | 6f725f2831e90f1df11f1315906c7554c87c5722 (diff) | |
download | android_packages_apps_Trebuchet-623daea93b8ca55b9cc99516df2284bde4322a0c.tar.gz android_packages_apps_Trebuchet-623daea93b8ca55b9cc99516df2284bde4322a0c.tar.bz2 android_packages_apps_Trebuchet-623daea93b8ca55b9cc99516df2284bde4322a0c.zip |
resolve merge conflicts of 6f725f283 to ub-launcher3-master
Test: I solemnly swear I tested this conflict resolution.
Change-Id: I3559969b62a9a4b1ec04697109636e8cb0fd9fc8
7 files changed, 115 insertions, 61 deletions
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 5938fba38..53d938506 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -717,6 +717,16 @@ public class LauncherModel extends BroadcastReceiver if (DEBUG_LOADERS) Log.d(TAG, "step 3.2: bind deep shortcuts"); bindDeepShortcuts(); + // Take a break + if (DEBUG_LOADERS) Log.d(TAG, "step 3 completed, wait for idle"); + waitForIdle(); + verifyNotStopped(); + + // fourth step + if (DEBUG_LOADERS) Log.d(TAG, "step 4.1: loading widgets"); + refreshAndBindWidgetsAndShortcuts(getCallback(), false /* bindFirst */, + null /* packageUser */); + synchronized (mLock) { // Everything loaded bind the data. mModelLoaded = true; diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 0a2ec2acc..9a9158344 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -30,6 +30,7 @@ import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; +import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; @@ -44,6 +45,7 @@ import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.PackageManagerHelper; +import com.android.launcher3.util.PackageUserKey; import java.util.ArrayList; import java.util.Arrays; @@ -370,6 +372,14 @@ public class PackageUpdatedTask extends ExtendedModelTask { callbacks.notifyWidgetProvidersChanged(); } }); + } else if (Utilities.isAtLeastO() && mOp == OP_ADD) { + // Load widgets for the new package. + for (int i = 0; i < N; i++) { + LauncherModel model = app.getModel(); + model.refreshAndBindWidgetsAndShortcuts( + model.getCallback(), false /* bindFirst */, + new PackageUserKey(packages[i], mUser) /* packageUser */); + } } } } diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index 5891085e4..a4823ae3e 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -146,21 +146,24 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra return null; } - List<String> shortcutIds = launcher.getPopupDataProvider().getShortcutIdsForItem(itemInfo); - List<NotificationKeyData> notificationKeys = launcher.getPopupDataProvider() + PopupDataProvider popupDataProvider = launcher.getPopupDataProvider(); + List<String> shortcutIds = popupDataProvider.getShortcutIdsForItem(itemInfo); + List<NotificationKeyData> notificationKeys = popupDataProvider .getNotificationKeysForItem(itemInfo); + List<SystemShortcut> systemShortcuts = popupDataProvider + .getEnabledSystemShortcutsForItem(itemInfo); final PopupContainerWithArrow container = (PopupContainerWithArrow) launcher.getLayoutInflater().inflate( R.layout.popup_container, launcher.getDragLayer(), false); container.setVisibility(View.INVISIBLE); launcher.getDragLayer().addView(container); - container.populateAndShow(icon, shortcutIds, notificationKeys); + container.populateAndShow(icon, shortcutIds, notificationKeys, systemShortcuts); return container; } public void populateAndShow(final BubbleTextView originalIcon, final List<String> shortcutIds, - final List<NotificationKeyData> notificationKeys) { + final List<NotificationKeyData> notificationKeys, List<SystemShortcut> systemShortcuts) { final Resources resources = getResources(); final int arrowWidth = resources.getDimensionPixelSize(R.dimen.popup_arrow_width); final int arrowHeight = resources.getDimensionPixelSize(R.dimen.popup_arrow_height); @@ -171,7 +174,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra // Add dummy views first, and populate with real info when ready. PopupPopulator.Item[] itemsToPopulate = PopupPopulator - .getItemsToPopulate(shortcutIds, notificationKeys); + .getItemsToPopulate(shortcutIds, notificationKeys, systemShortcuts); addDummyViews(originalIcon, itemsToPopulate, notificationKeys.size() > 1); measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); @@ -218,7 +221,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra new Handler(workerLooper).postAtFrontOfQueue(PopupPopulator.createUpdateRunnable( mLauncher, originalItemInfo, new Handler(Looper.getMainLooper()), this, shortcutIds, shortcutViews, notificationKeys, mNotificationItemView, - systemShortcutViews)); + systemShortcuts, systemShortcutViews)); } private void addDummyViews(BubbleTextView originalIcon, @@ -624,12 +627,9 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra @Override protected void onWidgetsBound() { - enableWidgets(); - } - - public boolean enableWidgets() { - return mShortcutsItemView != null && mShortcutsItemView.enableWidgets( - (ItemInfo) mOriginalIcon.getTag()); + if (mShortcutsItemView != null) { + mShortcutsItemView.enableWidgetsIfExist(mOriginalIcon); + } } private ObjectAnimator createArrowScaleAnim(float scale) { diff --git a/src/com/android/launcher3/popup/PopupDataProvider.java b/src/com/android/launcher3/popup/PopupDataProvider.java index c1a9ba1bc..eaceaa959 100644 --- a/src/com/android/launcher3/popup/PopupDataProvider.java +++ b/src/com/android/launcher3/popup/PopupDataProvider.java @@ -33,6 +33,7 @@ import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageUserKey; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -49,7 +50,7 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan private static final String TAG = "PopupDataProvider"; /** Note that these are in order of priority. */ - public static final SystemShortcut[] SYSTEM_SHORTCUTS = new SystemShortcut[] { + private static final SystemShortcut[] SYSTEM_SHORTCUTS = new SystemShortcut[] { new SystemShortcut.AppInfo(), new SystemShortcut.Widgets(), }; @@ -240,6 +241,16 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan : notificationListener.getNotificationsForKeys(notificationKeys); } + public @NonNull List<SystemShortcut> getEnabledSystemShortcutsForItem(ItemInfo info) { + List<SystemShortcut> systemShortcuts = new ArrayList<>(); + for (SystemShortcut systemShortcut : SYSTEM_SHORTCUTS) { + if (systemShortcut.getOnClickListener(mLauncher, info) != null) { + systemShortcuts.add(systemShortcut); + } + } + return systemShortcuts; + } + public void cancelNotification(String notificationKey) { NotificationListener notificationListener = NotificationListener.getInstanceIfConnected(); if (notificationListener == null) { diff --git a/src/com/android/launcher3/popup/PopupPopulator.java b/src/com/android/launcher3/popup/PopupPopulator.java index 3ba4ebafd..fd0010599 100644 --- a/src/com/android/launcher3/popup/PopupPopulator.java +++ b/src/com/android/launcher3/popup/PopupPopulator.java @@ -72,7 +72,8 @@ public class PopupPopulator { } public static @NonNull Item[] getItemsToPopulate(@NonNull List<String> shortcutIds, - @NonNull List<NotificationKeyData> notificationKeys) { + @NonNull List<NotificationKeyData> notificationKeys, + @NonNull List<SystemShortcut> systemShortcuts) { boolean hasNotifications = notificationKeys.size() > 0; int numNotificationItems = hasNotifications ? 1 : 0; int numShortcuts = shortcutIds.size(); @@ -80,7 +81,7 @@ public class PopupPopulator { numShortcuts = MAX_SHORTCUTS_IF_NOTIFICATIONS; } int numItems = Math.min(MAX_ITEMS, numShortcuts + numNotificationItems) - + PopupDataProvider.SYSTEM_SHORTCUTS.length; + + systemShortcuts.size(); Item[] items = new Item[numItems]; for (int i = 0; i < numItems; i++) { items[i] = Item.SHORTCUT; @@ -91,7 +92,7 @@ public class PopupPopulator { } // The system shortcuts are always last. boolean iconsOnly = !shortcutIds.isEmpty(); - for (int i = 0; i < PopupDataProvider.SYSTEM_SHORTCUTS.length; i++) { + for (int i = 0; i < systemShortcuts.size(); i++) { items[numItems - 1 - i] = iconsOnly ? Item.SYSTEM_SHORTCUT_ICON : Item.SYSTEM_SHORTCUT; } return items; @@ -182,7 +183,8 @@ public class PopupPopulator { final Handler uiHandler, final PopupContainerWithArrow container, final List<String> shortcutIds, final List<DeepShortcutView> shortcutViews, final List<NotificationKeyData> notificationKeys, - final NotificationItemView notificationView, final List<View> systemShortcutViews) { + final NotificationItemView notificationView, final List<SystemShortcut> systemShortcuts, + final List<View> systemShortcutViews) { final ComponentName activity = originalInfo.getTargetComponent(); final UserHandle user = originalInfo.user; return new Runnable() { @@ -217,8 +219,8 @@ public class PopupPopulator { // This ensures that mLauncher.getWidgetsForPackageUser() // doesn't return null (it puts all the widgets in memory). - for (int i = 0; i < PopupDataProvider.SYSTEM_SHORTCUTS.length; i++) { - final SystemShortcut systemShortcut = PopupDataProvider.SYSTEM_SHORTCUTS[i]; + for (int i = 0; i < systemShortcuts.size(); i++) { + final SystemShortcut systemShortcut = systemShortcuts.get(i); uiHandler.post(new UpdateSystemShortcutChild(container, systemShortcutViews.get(i), systemShortcut, launcher, originalInfo)); } @@ -274,7 +276,6 @@ public class PopupPopulator { /** Updates the system shortcut child based on the given shortcut info. */ private static class UpdateSystemShortcutChild implements Runnable { - private static final float DISABLED_ALPHA = 0.38f; private final PopupContainerWithArrow mContainer; private final View mSystemShortcutChild; @@ -294,29 +295,24 @@ public class PopupPopulator { @Override public void run() { final Context context = mSystemShortcutChild.getContext(); - if (mSystemShortcutChild instanceof DeepShortcutView) { - // Expanded system shortcut, with both icon and text shown on white background. - final DeepShortcutView shortcutView = (DeepShortcutView) mSystemShortcutChild; - shortcutView.getIconView().setBackground(mSystemShortcutInfo.getIcon(context)); - shortcutView.getBubbleText().setText(mSystemShortcutInfo.getLabel(context)); - } else if (mSystemShortcutChild instanceof ImageView) { - // Only the system shortcut icon shows on a gray background header. - final ImageView shortcutIcon = (ImageView) mSystemShortcutChild; - shortcutIcon.setImageDrawable(mSystemShortcutInfo.getIcon(context)); - shortcutIcon.setContentDescription(mSystemShortcutInfo.getLabel(context)); - } - if (!(mSystemShortcutInfo instanceof SystemShortcut.Widgets)) { - mSystemShortcutChild.setOnClickListener(mSystemShortcutInfo - .getOnClickListener(mLauncher, mItemInfo)); - } else { - mSystemShortcutChild.setTag(mSystemShortcutInfo); - // Widgets might not be enabled right away. - if (mContainer.enableWidgets()) { - return; - } - // Disable Widgets (we might be able to re-enable when widgets are bound). - mSystemShortcutChild.setAlpha(DISABLED_ALPHA); - } + initializeSystemShortcut(context, mSystemShortcutChild, mSystemShortcutInfo); + mSystemShortcutChild.setOnClickListener(mSystemShortcutInfo + .getOnClickListener(mLauncher, mItemInfo)); + } + } + + public static void initializeSystemShortcut(Context context, View view, SystemShortcut info) { + if (view instanceof DeepShortcutView) { + // Expanded system shortcut, with both icon and text shown on white background. + final DeepShortcutView shortcutView = (DeepShortcutView) view; + shortcutView.getIconView().setBackground(info.getIcon(context)); + shortcutView.getBubbleText().setText(info.getLabel(context)); + } else if (view instanceof ImageView) { + // Only the system shortcut icon shows on a gray background header. + final ImageView shortcutIcon = (ImageView) view; + shortcutIcon.setImageDrawable(info.getIcon(context)); + shortcutIcon.setContentDescription(info.getLabel(context)); } + view.setTag(info); } } diff --git a/src/com/android/launcher3/popup/SystemShortcut.java b/src/com/android/launcher3/popup/SystemShortcut.java index 7d86163f0..9caf98c2f 100644 --- a/src/com/android/launcher3/popup/SystemShortcut.java +++ b/src/com/android/launcher3/popup/SystemShortcut.java @@ -41,7 +41,6 @@ public abstract class SystemShortcut { public abstract View.OnClickListener getOnClickListener(final Launcher launcher, final ItemInfo itemInfo); - public static class Widgets extends SystemShortcut { public Widgets() { diff --git a/src/com/android/launcher3/shortcuts/ShortcutsItemView.java b/src/com/android/launcher3/shortcuts/ShortcutsItemView.java index 1f90bb023..ee64b984a 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutsItemView.java +++ b/src/com/android/launcher3/shortcuts/ShortcutsItemView.java @@ -26,6 +26,7 @@ import android.view.View; import android.widget.LinearLayout; import com.android.launcher3.AbstractFloatingView; +import com.android.launcher3.BubbleTextView; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; @@ -119,6 +120,10 @@ public class ShortcutsItemView extends PopupItemView implements View.OnLongClick } public void addShortcutView(View shortcutView, PopupPopulator.Item shortcutType) { + addShortcutView(shortcutView, shortcutType, -1); + } + + private void addShortcutView(View shortcutView, PopupPopulator.Item shortcutType, int index) { if (shortcutType == PopupPopulator.Item.SHORTCUT) { mDeepShortcutViews.add((DeepShortcutView) shortcutView); } else { @@ -131,7 +136,7 @@ public class ShortcutsItemView extends PopupItemView implements View.OnLongClick R.layout.system_shortcut_icons, mShortcutsLayout, false); mShortcutsLayout.addView(mSystemShortcutIcons, 0); } - mSystemShortcutIcons.addView(shortcutView); + mSystemShortcutIcons.addView(shortcutView, index); } else { if (mShortcutsLayout.getChildCount() > 0) { View prevChild = mShortcutsLayout.getChildAt(mShortcutsLayout.getChildCount() - 1); @@ -139,7 +144,7 @@ public class ShortcutsItemView extends PopupItemView implements View.OnLongClick prevChild.findViewById(R.id.divider).setVisibility(VISIBLE); } } - mShortcutsLayout.addView(shortcutView); + mShortcutsLayout.addView(shortcutView, index); } } @@ -160,24 +165,47 @@ public class ShortcutsItemView extends PopupItemView implements View.OnLongClick } /** - * Sets the onClickListener on widgets system shortcut child, and updates alpha to 1. - * @return whether widgets is enabled, i.e. the onClickListener is not null. + * Adds a {@link SystemShortcut.Widgets} item if there are widgets for the given ItemInfo. */ - public boolean enableWidgets(ItemInfo itemInfo) { - for (View systemShortcut : mSystemShortcutViews) { - if (systemShortcut.getTag() instanceof SystemShortcut.Widgets) { - View.OnClickListener onClickListener = - ((SystemShortcut.Widgets) systemShortcut.getTag()).getOnClickListener( - mLauncher, itemInfo); - if (onClickListener != null) { - systemShortcut.setAlpha(1f); - systemShortcut.setOnClickListener(onClickListener); - return true; - } - return false; + public void enableWidgetsIfExist(final BubbleTextView originalIcon) { + ItemInfo itemInfo = (ItemInfo) originalIcon.getTag(); + SystemShortcut widgetInfo = new SystemShortcut.Widgets(); + View.OnClickListener onClickListener = widgetInfo.getOnClickListener(mLauncher, itemInfo); + View widgetsView = null; + for (View systemShortcutView : mSystemShortcutViews) { + if (systemShortcutView.getTag() instanceof SystemShortcut.Widgets) { + widgetsView = systemShortcutView; + break; + } + } + final PopupPopulator.Item widgetsItem = mSystemShortcutIcons == null + ? PopupPopulator.Item.SYSTEM_SHORTCUT + : PopupPopulator.Item.SYSTEM_SHORTCUT_ICON; + if (onClickListener != null && widgetsView == null) { + // We didn't have any widgets cached but now there are some, so enable the shortcut. + widgetsView = mLauncher.getLayoutInflater().inflate(widgetsItem.layoutId, this, false); + PopupPopulator.initializeSystemShortcut(getContext(), widgetsView, widgetInfo); + widgetsView.setOnClickListener(onClickListener); + if (widgetsItem == PopupPopulator.Item.SYSTEM_SHORTCUT_ICON) { + addShortcutView(widgetsView, widgetsItem, 0); + } else { + // If using the expanded system shortcut (as opposed to just the icon), we need to + // reopen the container to ensure measurements etc. all work out. While this could + // be quite janky, in practice the user would typically see a small flicker as the + // animation restarts partway through, and this is a very rare edge case anyway. + ((PopupContainerWithArrow) getParent()).close(false); + PopupContainerWithArrow.showForIcon(originalIcon); + } + } else if (onClickListener == null && widgetsView != null) { + // No widgets exist, but we previously added the shortcut so remove it. + if (widgetsItem == PopupPopulator.Item.SYSTEM_SHORTCUT_ICON) { + mSystemShortcutViews.remove(widgetsView); + mSystemShortcutIcons.removeView(widgetsView); + } else { + ((PopupContainerWithArrow) getParent()).close(false); + PopupContainerWithArrow.showForIcon(originalIcon); } } - return false; } @Override |