diff options
-rw-r--r-- | RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java | 14 | ||||
-rw-r--r-- | res/values/colors.xml | 3 | ||||
-rw-r--r-- | src/com/android/launcher3/AppDrawerListAdapter.java | 42 | ||||
-rw-r--r-- | src/com/android/launcher3/AppInfo.java | 13 | ||||
-rw-r--r-- | src/com/android/launcher3/BubbleTextView.java | 22 | ||||
-rw-r--r-- | src/com/android/launcher3/Folder.java | 49 | ||||
-rw-r--r-- | src/com/android/launcher3/FolderIcon.java | 26 | ||||
-rw-r--r-- | src/com/android/launcher3/FolderInfo.java | 24 | ||||
-rw-r--r-- | src/com/android/launcher3/ItemInfo.java | 7 | ||||
-rw-r--r-- | src/com/android/launcher3/Launcher.java | 1 | ||||
-rw-r--r-- | src/com/android/launcher3/ShortcutInfo.java | 5 |
11 files changed, 146 insertions, 60 deletions
diff --git a/RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java b/RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java index a79791f6d..b3a147c19 100644 --- a/RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java +++ b/RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java @@ -22,6 +22,15 @@ public class RemoteFolderManager { public Folder createRemoteFolder(final FolderIcon icon, ViewGroup root) { return null; } /** + * Get a drawable for the supplied item in the folder icon preview. + * @param items list of views in the folder. + * @param position index of icon to retreive. + * @return an icon to draw in the folder preview. + */ + public Drawable getFolderIconDrawable(final ArrayList<View> items, + final int position) { return null; } + + /** * Called when Launcher finishes binding items from the model. */ public void bindFinished() { } @@ -49,6 +58,11 @@ public class RemoteFolderManager { public void onBindAddApps(ArrayList<AppInfo> apps) { } /** + * Called when launcher loads apps and applies them to the drawer. + */ + public void onSetApps() { } + + /** * Called when the info icon is clicked */ public void onInfoIconClicked() { } diff --git a/res/values/colors.xml b/res/values/colors.xml index 302ab2139..55f17a394 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -57,8 +57,5 @@ <color name="scrubber_background">#CC14191E</color> <color name="drawer_header_text_shadow">#b0000000</color> - <color name="drawer_container_background_default">#00000000</color> - <color name="drawer_container_background_custom">#66000000</color> - <color name="folder_background">#141a1e</color> </resources> diff --git a/src/com/android/launcher3/AppDrawerListAdapter.java b/src/com/android/launcher3/AppDrawerListAdapter.java index b3001e527..c68f52f7a 100644 --- a/src/com/android/launcher3/AppDrawerListAdapter.java +++ b/src/com/android/launcher3/AppDrawerListAdapter.java @@ -21,7 +21,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.ComponentName; import android.content.Context; -import android.content.res.Resources; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.provider.Settings; @@ -34,11 +33,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; -import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.RelativeLayout; import android.widget.SectionIndexer; -import android.widget.TextView; import com.android.launcher3.locale.LocaleSetManager; import com.android.launcher3.locale.LocaleUtils; import com.android.launcher3.settings.SettingsProvider; @@ -48,6 +44,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.List; /** * AppDrawerListAdapter - list adapter for the vertical app drawer @@ -519,7 +516,7 @@ public class AppDrawerListAdapter extends RecyclerView.Adapter<AppDrawerListAdap Collections.sort(mHeaderList); } - public void setApps(ArrayList<AppInfo> list) { + public void setApps(List<AppInfo> list) { if (!LauncherAppState.isDisableAllApps()) { initParams(); @@ -559,7 +556,7 @@ public class AppDrawerListAdapter extends RecyclerView.Adapter<AppDrawerListAdap processApps(); } - public void updateApps(ArrayList<AppInfo> list) { + public void updateApps(List<AppInfo> list) { if (!LauncherAppState.isDisableAllApps()) { mAllApps.removeAll(list); mAllApps.addAll(list); @@ -567,11 +564,11 @@ public class AppDrawerListAdapter extends RecyclerView.Adapter<AppDrawerListAdap } } - public void addApps(ArrayList<AppInfo> list) { + public void addApps(List<AppInfo> list) { updateApps(list); } - public void removeApps(ArrayList<AppInfo> appInfos) { + public void removeApps(List<AppInfo> appInfos) { if (!LauncherAppState.isDisableAllApps()) { mAllApps.removeAll(appInfos); reset(); @@ -597,6 +594,11 @@ public class AppDrawerListAdapter extends RecyclerView.Adapter<AppDrawerListAdap icon.setOnClickListener(mLauncher); icon.setOnLongClickListener(this); holder.mIconLayout.addView(icon); + + icon.mIcon.setPadding(mDeviceProfile.iconDrawablePaddingPx, + mDeviceProfile.iconDrawablePaddingPx, + mDeviceProfile.iconDrawablePaddingPx, + mDeviceProfile.iconDrawablePaddingPx); } if (viewType == ViewHolder.TYPE_CUSTOM) { @@ -641,6 +643,10 @@ public class AppDrawerListAdapter extends RecyclerView.Adapter<AppDrawerListAdap public void onBindViewHolder(ViewHolder holder, int position) { AppItemIndexedInfo indexedInfo = mHeaderList.get(position); + if (indexedInfo.isRemote()) { + mRemoteFolderManager.onBindViewHolder(holder, indexedInfo); + } + holder.mHeaderTextView.setVisibility(indexedInfo.isChild ? View.INVISIBLE : View.VISIBLE); if (!indexedInfo.isChild) { holder.mHeaderTextView.setText(indexedInfo.mStartString); @@ -674,24 +680,22 @@ public class AppDrawerListAdapter extends RecyclerView.Adapter<AppDrawerListAdap } else { icon.setVisibility(View.VISIBLE); AppInfo info = indexedInfo.mInfo.get(i); - icon.setTag(info); - Drawable d = Utilities.createIconDrawable(info.iconBitmap); + + Drawable d; + if (info.customDrawable != null) { + d = info.customDrawable; + } else { + d = Utilities.createIconDrawable(info.iconBitmap); + } d.setBounds(mIconRect); icon.mIcon.setImageDrawable(d); - icon.mIcon.setPadding(mDeviceProfile.iconDrawablePaddingPx, - mDeviceProfile.iconDrawablePaddingPx, - mDeviceProfile.iconDrawablePaddingPx, - mDeviceProfile.iconDrawablePaddingPx); + icon.mLabel.setText(info.title); icon.mLabel.setVisibility(mHideIconLabels ? View.INVISIBLE : View.VISIBLE); } } holder.itemView.setTag(indexedInfo); - - if (indexedInfo.isRemote()) { - mRemoteFolderManager.onBindViewHolder(holder, indexedInfo); - } } @Override @@ -862,7 +866,7 @@ public class AppDrawerListAdapter extends RecyclerView.Adapter<AppDrawerListAdap return index; } - private void filterProtectedApps(ArrayList<AppInfo> list) { + private void filterProtectedApps(List<AppInfo> list) { updateProtectedAppsList(mLauncher); Iterator<AppInfo> iterator = list.iterator(); diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index 907b42cd9..d14b0e086 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -93,16 +93,13 @@ public class AppInfo extends ItemInfo { this.user = user; } - public AppInfo(Intent intent, String title, Bitmap icon, UserHandleCompat user, - boolean remote) { + public AppInfo(Intent intent, String title, UserHandleCompat user) { this.componentName = intent.getComponent(); this.container = ItemInfo.NO_ID; this.intent = intent; this.title = title; - iconBitmap = icon; this.user = user; - flags = remote ? REMOTE_APP_FLAG : 0; } public static int initFlags(LauncherActivityInfoCompat info) { @@ -150,6 +147,14 @@ public class AppInfo extends ItemInfo { return (flags & flag) != 0; } + /** + * Set a flag for this app + * @param flag flag to apply. + */ + public void setFlag(int flag) { + flags |= flag; + } + @Override public String toString() { return "ApplicationInfo(title=" + title.toString() + " id=" + this.id diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index d26577ac0..9bfde23a7 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -118,15 +118,21 @@ public class BubbleTextView extends TextView { public void applyFromShortcutInfo(ShortcutInfo info, IconCache iconCache, boolean setDefaultPadding, boolean promiseStateChanged) { - Bitmap b = info.getIcon(iconCache); LauncherAppState app = LauncherAppState.getInstance(); + DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); - FastBitmapDrawable iconDrawable = Utilities.createIconDrawable(b); - iconDrawable.setGhostModeEnabled(info.isDisabled != 0); + Drawable iconDrawable; + if (info.customDrawable != null) { + iconDrawable = info.customDrawable; + } else { + Bitmap b = info.getIcon(iconCache); + iconDrawable = Utilities.createIconDrawable(b); + ((FastBitmapDrawable) iconDrawable).setGhostModeEnabled(info.isDisabled != 0); + } + iconDrawable.setBounds(0, 0, grid.iconSizePx, grid.iconSizePx); setCompoundDrawables(null, iconDrawable, null, null); if (setDefaultPadding) { - DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); setCompoundDrawablePadding(grid.iconDrawablePaddingPx); } if (info.contentDescription != null) { @@ -144,7 +150,12 @@ public class BubbleTextView extends TextView { LauncherAppState app = LauncherAppState.getInstance(); DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); - Drawable topDrawable = Utilities.createIconDrawable(info.iconBitmap); + Drawable topDrawable; + if (info.customDrawable != null) { + topDrawable = info.customDrawable; + } else { + topDrawable = Utilities.createIconDrawable(info.iconBitmap); + } topDrawable.setBounds(0, 0, grid.allAppsIconSizePx, grid.allAppsIconSizePx); setCompoundDrawables(null, topDrawable, null, null); setCompoundDrawablePadding(grid.iconDrawablePaddingPx); @@ -155,7 +166,6 @@ public class BubbleTextView extends TextView { setTag(info); } - @Override protected boolean setFrame(int left, int top, int right, int bottom) { if (getLeft() != left || getRight() != right || getTop() != top || getBottom() != bottom) { diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java index 1cad48d3d..486d5e514 100644 --- a/src/com/android/launcher3/Folder.java +++ b/src/com/android/launcher3/Folder.java @@ -1633,8 +1633,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList // If this item is being dragged from this open folder, we have already handled // the work associated with removing the item, so we don't have to do anything here. if (item == mCurrentDragInfo) return; - View v = getViewForInfo(item); - mContent.removeView(v); + mContent.removeView(getViewForInfo(item)); if (mState == STATE_ANIMATING) { mRearrangeOnClose = true; } else { @@ -1648,21 +1647,49 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList @Override public void onRemoveAll() { // Clear the UX after folder contents are removed from the DB - mContent.removeAllViews(); + removeViewsForItems(null); mLauncher.closeFolder(this); replaceFolderWithFinalItem(); } - protected View getViewForInfo(ShortcutInfo item) { - for (int j = 0; j < mContent.getCountY(); j++) { - for (int i = 0; i < mContent.getCountX(); i++) { - View v = mContent.getChildAt(i, j); - if (v.getTag() == item) { - return v; - } + @Override + public void onRemoveAll(ArrayList<ShortcutInfo> items) { + removeViewsForItems(items); + if (mInfo.contents.isEmpty()) { + mLauncher.closeFolder(this); + } + replaceFolderWithFinalItem(); + } + + /** + * Remove all the supplied item views from this folder. + * @param items info of views to remove, or null if all views should be removed. + */ + protected void removeViewsForItems(ArrayList<ShortcutInfo> items) { + if (items == null) { + mContent.removeAllViews(); + } else { + for (ShortcutInfo item : items) { + mContent.removeView(getViewForInfo(item)); } } - return null; + } + + /** + * Update the view tied to this shortcut. + * @param info updated info to be applied to view. + */ + public void updateViewForInfo(final ShortcutInfo info) { + View v = getViewForInfo(info); + if (v != null & v instanceof BubbleTextView) { + ((BubbleTextView) v).applyFromShortcutInfo(info, mIconCache, false); + + mItemsInvalidated = true; + } + } + + public View getViewForInfo(ShortcutInfo item) { + return mContent.getChildAt(item.cellX, item.cellY); } public void onItemsChanged() { diff --git a/src/com/android/launcher3/FolderIcon.java b/src/com/android/launcher3/FolderIcon.java index c7e0abfb6..a166b1819 100644 --- a/src/com/android/launcher3/FolderIcon.java +++ b/src/com/android/launcher3/FolderIcon.java @@ -30,7 +30,6 @@ import android.graphics.drawable.Drawable; import android.os.Looper; import android.os.Parcelable; import android.util.AttributeSet; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -698,7 +697,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { super.dispatchDraw(canvas); if (mFolder == null) return; - if (mFolder.getItemCount() == 0 && !mAnimating) return; + if (mFolder.getItemCount() == 0 && !mAnimating && !mInfo.isRemote()) return; ArrayList<View> items = mFolder.getItemsInReadingOrder(); Drawable d; @@ -707,13 +706,13 @@ public class FolderIcon extends FrameLayout implements FolderListener { // Update our drawing parameters if necessary if (mAnimating) { computePreviewDrawingParams(mAnimParams.drawable); - } else { + } else if (!items.isEmpty()) { v = (TextView) items.get(0); d = getTopDrawable(v); - computePreviewDrawingParams(d); + if (d != null) computePreviewDrawingParams(d); } - int nItemsInPreview = Math.min(items.size(), NUM_ITEMS_IN_PREVIEW); + int ntemsInPreview = Math.min(items.size(), NUM_ITEMS_IN_PREVIEW); // Hidden folder - don't display Preview View folderLock = findViewById(R.id.folder_lock_image); @@ -734,15 +733,20 @@ public class FolderIcon extends FrameLayout implements FolderListener { if (!mAnimating) { for (int i = 0; i < NUM_ITEMS_IN_PREVIEW; i++) { d = null; - if (i < items.size()) { + if (mInfo.isRemote()) { + d = mLauncher.getRemoteFolderManager().getFolderIconDrawable(items, i); + } else if (i < items.size()) { v = (TextView) items.get(i); if (!mHiddenItems.contains(v.getTag())) { d = getTopDrawable(v); - mParams = computePreviewItemDrawingParams(i, mParams); - mParams.drawable = d; } } + if (d != null) { + mParams = computePreviewItemDrawingParams(i, mParams); + mParams.drawable = d; + } + ImageView appIcon = null; switch(i) { case 0: @@ -847,6 +851,12 @@ public class FolderIcon extends FrameLayout implements FolderListener { requestLayout(); } + @Override + public void onRemoveAll(ArrayList<ShortcutInfo> items) { + invalidate(); + requestLayout(); + } + public void onTitleChanged(CharSequence title) { mFolderName.setText(title.toString()); setContentDescription(String.format(getContext().getString(R.string.folder_name_format), diff --git a/src/com/android/launcher3/FolderInfo.java b/src/com/android/launcher3/FolderInfo.java index 2050864da..bed1a5d47 100644 --- a/src/com/android/launcher3/FolderInfo.java +++ b/src/com/android/launcher3/FolderInfo.java @@ -88,6 +88,19 @@ public class FolderInfo extends ItemInfo { } /** + * Remove all supplied shortcuts. Does not change the DB unless + * LauncherModel.deleteFolderContentsFromDatabase(Context, FolderInfo) is called first. + * @param items the shortcuts to remove. + */ + public void removeAll(ArrayList<ShortcutInfo> items) { + contents.removeAll(items); + for (int i = 0; i < listeners.size(); i++) { + listeners.get(i).onRemoveAll(items); + } + itemsChanged(); + } + + /** * @return true if this info represents a remote folder, false otherwise */ public boolean isRemote() { @@ -144,11 +157,12 @@ public class FolderInfo extends ItemInfo { } interface FolderListener { - public void onAdd(ShortcutInfo item); - public void onRemove(ShortcutInfo item); - public void onRemoveAll(); - public void onTitleChanged(CharSequence title); - public void onItemsChanged(); + void onAdd(ShortcutInfo item); + void onRemove(ShortcutInfo item); + void onRemoveAll(); + void onRemoveAll(ArrayList<ShortcutInfo> items); + void onTitleChanged(CharSequence title); + void onItemsChanged(); } @Override diff --git a/src/com/android/launcher3/ItemInfo.java b/src/com/android/launcher3/ItemInfo.java index 91af5873e..5c1bc0d55 100644 --- a/src/com/android/launcher3/ItemInfo.java +++ b/src/com/android/launcher3/ItemInfo.java @@ -20,6 +20,7 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; import android.util.Log; import com.android.launcher3.compat.UserHandleCompat; @@ -125,6 +126,12 @@ public class ItemInfo { UserHandleCompat user; + /** + * A custom drawable to use for the icon. Not persisted to the database because + * it is not guaranteed to be a bitmap (could be a vector). + */ + Drawable customDrawable; + ItemInfo() { user = UserHandleCompat.myUserHandle(); } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 7fc373061..6618c75a6 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -5290,6 +5290,7 @@ public class Launcher extends Activity } else { if (mAppDrawerAdapter != null) { mAppDrawerAdapter.setApps(apps); + mRemoteFolderManager.onSetApps(); } if (mAppsCustomizeContent != null) { mAppsCustomizeContent.setApps(apps); diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 0a762849c..288030d9e 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -59,9 +59,6 @@ public class ShortcutInfo extends ItemInfo { */ public static final int FLAG_RESTORE_STARTED = 8; - /** Indicates that this shortcut is part of the remote folder **/ - public static final int FLAG_REMOTE = 16; - /** * The intent used to start the application. */ @@ -88,7 +85,7 @@ public class ShortcutInfo extends ItemInfo { /** * The application icon. */ - private Bitmap mIcon; + Bitmap mIcon; /** * Indicates that the icon is disabled due to safe mode restrictions. |