Implement ability to uninstall shortcuts from workspace
Change-Id: I14ca94ea719825c4de19ab85d67537155098d50c
diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java
index 4be9b81..763ec3f 100644
--- a/src/com/android/launcher3/DeleteDropTarget.java
+++ b/src/com/android/launcher3/DeleteDropTarget.java
@@ -19,7 +19,11 @@
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -27,6 +31,7 @@
import android.graphics.Rect;
import android.graphics.drawable.TransitionDrawable;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
@@ -34,6 +39,8 @@
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
+import java.util.List;
+
public class DeleteDropTarget extends ButtonDropTarget {
private static int DELETE_ANIMATION_DURATION = 285;
private static int FLING_DELETE_ANIMATION_DURATION = 350;
@@ -136,6 +143,12 @@
item.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
return true;
}
+ if (AppsCustomizePagedView.DISABLE_ALL_APPS &&
+ item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION &&
+ item instanceof ShortcutInfo) {
+ ShortcutInfo shortcutInfo = (ShortcutInfo) info;
+ return (shortcutInfo.flags & ApplicationInfo.DOWNLOADED_FLAG) != 0;
+ }
}
return false;
}
@@ -198,20 +211,22 @@
}
private void animateToTrashAndCompleteDrop(final DragObject d) {
- DragLayer dragLayer = mLauncher.getDragLayer();
- Rect from = new Rect();
+ final DragLayer dragLayer = mLauncher.getDragLayer();
+ final Rect from = new Rect();
dragLayer.getViewRectRelativeToSelf(d.dragView, from);
- Rect to = getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(),
+ final Rect to = getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(),
mCurrentDrawable.getIntrinsicWidth(), mCurrentDrawable.getIntrinsicHeight());
- float scale = (float) to.width() / from.width();
+ final float scale = (float) to.width() / from.width();
mSearchDropTargetBar.deferOnDragEnd();
+ deferCompleteDropIfUninstalling(d);
+
Runnable onAnimationEndRunnable = new Runnable() {
@Override
public void run() {
+ completeDrop(d);
mSearchDropTargetBar.onDragEnd();
mLauncher.exitSpringLoadedDragMode();
- completeDrop(d);
}
};
dragLayer.animateView(d.dragView, from, to, scale, 1f, 1f, 0.1f, 0.1f,
@@ -220,12 +235,40 @@
DragLayer.ANIMATION_END_DISAPPEAR, null);
}
- private void completeDrop(DragObject d) {
- ItemInfo item = (ItemInfo) d.dragInfo;
+ private void deferCompleteDropIfUninstalling(DragObject d) {
+ mWaitingForUninstall = false;
+ if (isUninstall(d)) {
+ if (d.dragSource instanceof Folder) {
+ ((Folder) d.dragSource).deferCompleteDropAfterUninstallActivity();
+ } else if (d.dragSource instanceof Workspace) {
+ ((Workspace) d.dragSource).deferCompleteDropAfterUninstallActivity();
+ }
+ mWaitingForUninstall = true;
+ }
+ }
+ private boolean isUninstall(DragObject d) {
+ return AppsCustomizePagedView.DISABLE_ALL_APPS && isWorkspaceOrFolderApplication(d);
+ }
+
+ private boolean mWaitingForUninstall = false;
+ private void completeDrop(final DragObject d) {
+ ItemInfo item = (ItemInfo) d.dragInfo;
+ boolean wasWaitingForUninstall = mWaitingForUninstall;
+ mWaitingForUninstall = false;
if (isAllAppsApplication(d.dragSource, item)) {
// Uninstall the application if it is being dragged from AppsCustomize
- mLauncher.startApplicationUninstallActivity((ApplicationInfo) item);
+ ApplicationInfo appInfo = (ApplicationInfo) item;
+ mLauncher.startApplicationUninstallActivity(appInfo.componentName, appInfo.flags);
+ } else if (AppsCustomizePagedView.DISABLE_ALL_APPS && isWorkspaceOrFolderApplication(d)) {
+ ShortcutInfo shortcut = (ShortcutInfo) item;
+ if (shortcut.intent != null && shortcut.intent.getComponent() != null) {
+ ComponentName componentName = shortcut.intent.getComponent();
+ int flags = ApplicationInfo.initFlags(
+ ShortcutInfo.getPackageInfo(getContext(), componentName.getPackageName()));
+ mWaitingForUninstall =
+ mLauncher.startApplicationUninstallActivity(componentName, flags);
+ }
} else if (isWorkspaceOrFolderApplication(d)) {
LauncherModel.deleteItemFromDatabase(mLauncher, item);
} else if (isWorkspaceFolder(d)) {
@@ -250,6 +293,37 @@
}.start();
}
}
+ if (wasWaitingForUninstall && !mWaitingForUninstall) {
+ if (d.dragSource instanceof Folder) {
+ ((Folder) d.dragSource).onUninstallActivityReturned(false);
+ } else if (d.dragSource instanceof Workspace) {
+ ((Workspace) d.dragSource).onUninstallActivityReturned(false);
+ }
+ }
+ if (mWaitingForUninstall) {
+ final Runnable checkIfUninstallWasSuccess = new Runnable() {
+ @Override
+ public void run() {
+ mWaitingForUninstall = false;
+ ShortcutInfo shortcut = (ShortcutInfo) d.dragInfo;
+ if (shortcut.intent != null && shortcut.intent.getComponent() != null) {
+ String packageName = shortcut.intent.getComponent().getPackageName();
+ List<ResolveInfo> activities =
+ AllAppsList.findActivitiesForPackage(getContext(), packageName);
+ boolean uninstallSuccessful = activities.size() == 0;
+ mLauncher.removeOnResumeCallback(this);
+ if (d.dragSource instanceof Folder) {
+ ((Folder) d.dragSource).
+ onUninstallActivityReturned(uninstallSuccessful);
+ } else if (d.dragSource instanceof Workspace) {
+ ((Workspace) d.dragSource).
+ onUninstallActivityReturned(uninstallSuccessful);
+ }
+ }
+ }
+ };
+ mLauncher.addOnResumeCallback(checkIfUninstallWasSuccess);
+ }
}
public void onDrop(DragObject d) {
@@ -422,6 +496,8 @@
updateCb = createFlingAlongVectorAnimatorListener(dragLayer, d, vel, startTime,
duration, config);
}
+ deferCompleteDropIfUninstalling(d);
+
Runnable onAnimationEndRunnable = new Runnable() {
@Override
public void run() {