summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2017-10-24 14:54:30 -0700
committerSunny Goyal <sunnygoyal@google.com>2017-10-24 14:55:54 -0700
commit0236d0b0bac7aae939852bd4acc5d1eadc2577fb (patch)
tree1e62745a8ef0bceec34a086254726933a46de446 /src/com/android/launcher3
parentbe93f264d74eed6d43d6c75694624d53d6877357 (diff)
downloadandroid_packages_apps_Trebuchet-0236d0b0bac7aae939852bd4acc5d1eadc2577fb.tar.gz
android_packages_apps_Trebuchet-0236d0b0bac7aae939852bd4acc5d1eadc2577fb.tar.bz2
android_packages_apps_Trebuchet-0236d0b0bac7aae939852bd4acc5d1eadc2577fb.zip
Caching the uninstall disabled state for each userHandle
> Removing static access to varios drop targets > Creating a cache at UI level with 5sec timeout Bug: 67104426 Change-Id: Ide6e2e0c01606f9b5fb9281f95dc009873c18fb9
Diffstat (limited to 'src/com/android/launcher3')
-rw-r--r--src/com/android/launcher3/ButtonDropTarget.java8
-rw-r--r--src/com/android/launcher3/DeleteDropTarget.java25
-rw-r--r--src/com/android/launcher3/DropTargetBar.java52
-rw-r--r--src/com/android/launcher3/InfoDropTarget.java15
-rw-r--r--src/com/android/launcher3/UninstallDropTarget.java71
-rw-r--r--src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java36
6 files changed, 125 insertions, 82 deletions
diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java
index 1a1c3198f..5c8b080a3 100644
--- a/src/com/android/launcher3/ButtonDropTarget.java
+++ b/src/com/android/launcher3/ButtonDropTarget.java
@@ -201,6 +201,10 @@ public abstract class ButtonDropTarget extends TextView
protected abstract boolean supportsDrop(ItemInfo info);
+ public boolean supportsAccessibilityDrop(ItemInfo info) {
+ return supportsDrop(info);
+ }
+
@Override
public boolean isDropEnabled() {
return mActive && (mAccessibleDrag ||
@@ -241,9 +245,13 @@ public abstract class ButtonDropTarget extends TextView
DragLayer.ANIMATION_END_DISAPPEAR, null);
}
+ public abstract int getAccessibilityAction();
+
@Override
public void prepareAccessibilityDrop() { }
+ public abstract void onAccessibilityDrop(View view, ItemInfo item);
+
public abstract void completeDrop(DragObject d);
@Override
diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java
index fdd4f34bd..c12ea57c3 100644
--- a/src/com/android/launcher3/DeleteDropTarget.java
+++ b/src/com/android/launcher3/DeleteDropTarget.java
@@ -21,6 +21,7 @@ import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
+import com.android.launcher3.accessibility.LauncherAccessibilityDelegate;
import com.android.launcher3.dragndrop.DragOptions;
import com.android.launcher3.folder.Folder;
@@ -49,14 +50,22 @@ public class DeleteDropTarget extends ButtonDropTarget {
setTextBasedOnDragSource(dragObject.dragInfo);
}
- /** @return true for items that should have a "Remove" action in accessibility. */
- public static boolean supportsAccessibleDrop(ItemInfo info) {
+ /**
+ * @return true for items that should have a "Remove" action in accessibility.
+ */
+ @Override
+ public boolean supportsAccessibilityDrop(ItemInfo info) {
return (info instanceof ShortcutInfo)
|| (info instanceof LauncherAppWidgetInfo)
|| (info instanceof FolderInfo);
}
@Override
+ public int getAccessibilityAction() {
+ return LauncherAccessibilityDelegate.REMOVE;
+ }
+
+ @Override
protected boolean supportsDrop(ItemInfo info) {
return true;
}
@@ -77,19 +86,21 @@ public class DeleteDropTarget extends ButtonDropTarget {
public void completeDrop(DragObject d) {
ItemInfo item = d.dragInfo;
if ((d.dragSource instanceof Workspace) || (d.dragSource instanceof Folder)) {
- removeWorkspaceOrFolderItem(mLauncher, item, null);
+ onAccessibilityDrop(null, item);
}
}
/**
* Removes the item from the workspace. If the view is not null, it also removes the view.
*/
- public static void removeWorkspaceOrFolderItem(Launcher launcher, ItemInfo item, View view) {
+ @Override
+ public void onAccessibilityDrop(View view, ItemInfo item) {
// Remove the item from launcher and the db, we can ignore the containerInfo in this call
// because we already remove the drag view from the folder (if the drag originated from
// a folder) in Folder.beginDrag()
- launcher.removeItem(view, item, true /* deleteFromDb */);
- launcher.getWorkspace().stripEmptyScreens();
- launcher.getDragLayer().announceForAccessibility(launcher.getString(R.string.item_removed));
+ mLauncher.removeItem(view, item, true /* deleteFromDb */);
+ mLauncher.getWorkspace().stripEmptyScreens();
+ mLauncher.getDragLayer()
+ .announceForAccessibility(getContext().getString(R.string.item_removed));
}
}
diff --git a/src/com/android/launcher3/DropTargetBar.java b/src/com/android/launcher3/DropTargetBar.java
index 29a1349d5..2f8374a5e 100644
--- a/src/com/android/launcher3/DropTargetBar.java
+++ b/src/com/android/launcher3/DropTargetBar.java
@@ -16,6 +16,9 @@
package com.android.launcher3;
+import static com.android.launcher3.AlphaUpdateListener.updateVisibility;
+import static com.android.launcher3.Utilities.isAccessibilityEnabled;
+
import android.animation.TimeInterpolator;
import android.content.Context;
import android.util.AttributeSet;
@@ -23,13 +26,14 @@ import android.view.View;
import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
-import android.view.accessibility.AccessibilityManager;
import android.view.animation.AccelerateInterpolator;
import android.widget.LinearLayout;
import com.android.launcher3.dragndrop.DragController;
import com.android.launcher3.dragndrop.DragOptions;
+import java.util.ArrayList;
+
/*
* The top bar containing various drop targets: Delete/App Info/Uninstall.
*/
@@ -42,10 +46,7 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi
@Override
public void run() {
- AccessibilityManager am = (AccessibilityManager)
- getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
- boolean accessibilityEnabled = am.isEnabled();
- AlphaUpdateListener.updateVisibility(DropTargetBar.this, accessibilityEnabled);
+ updateVisibility(DropTargetBar.this, isAccessibilityEnabled(getContext()));
}
};
@@ -55,6 +56,7 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi
@ViewDebug.ExportedProperty(category = "launcher")
protected boolean mVisible = false;
+ private ButtonDropTarget[] mDropTargets;
private ViewPropertyAnimator mCurrentAnimation;
public DropTargetBar(Context context, AttributeSet attrs) {
@@ -75,7 +77,27 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi
public void setup(DragController dragController) {
dragController.addDragListener(this);
- setupButtonDropTarget(this, dragController);
+ ArrayList<ButtonDropTarget> outList = new ArrayList<>();
+ findDropTargets(this, outList);
+
+ mDropTargets = new ButtonDropTarget[outList.size()];
+ for (int i = 0; i < mDropTargets.length; i++) {
+ mDropTargets[i] = outList.get(i);
+ mDropTargets[i].setDropTargetBar(this);
+ dragController.addDragListener(mDropTargets[i]);
+ dragController.addDropTarget(mDropTargets[i]);
+ }
+ }
+
+ private static void findDropTargets(View view, ArrayList<ButtonDropTarget> outTargets) {
+ if (view instanceof ButtonDropTarget) {
+ outTargets.add((ButtonDropTarget) view);
+ } else if (view instanceof ViewGroup) {
+ ViewGroup vg = (ViewGroup) view;
+ for (int i = vg.getChildCount() - 1; i >= 0; i--) {
+ findDropTargets(vg.getChildAt(i), outTargets);
+ }
+ }
}
@Override
@@ -130,20 +152,6 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi
return result;
}
- private void setupButtonDropTarget(View view, DragController dragController) {
- if (view instanceof ButtonDropTarget) {
- ButtonDropTarget bdt = (ButtonDropTarget) view;
- bdt.setDropTargetBar(this);
- dragController.addDragListener(bdt);
- dragController.addDropTarget(bdt);
- } else if (view instanceof ViewGroup) {
- ViewGroup vg = (ViewGroup) view;
- for (int i = vg.getChildCount() - 1; i >= 0; i--) {
- setupButtonDropTarget(vg.getChildAt(i), dragController);
- }
- }
- }
-
private void animateToVisibility(boolean isVisible) {
if (mVisible != isVisible) {
mVisible = isVisible;
@@ -190,4 +198,8 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi
mDeferOnDragEnd = false;
}
}
+
+ public ButtonDropTarget[] getDropTargets() {
+ return mDropTargets;
+ }
}
diff --git a/src/com/android/launcher3/InfoDropTarget.java b/src/com/android/launcher3/InfoDropTarget.java
index f78cde5b8..289242f61 100644
--- a/src/com/android/launcher3/InfoDropTarget.java
+++ b/src/com/android/launcher3/InfoDropTarget.java
@@ -26,6 +26,7 @@ import android.util.AttributeSet;
import android.util.Log;
import android.widget.Toast;
+import com.android.launcher3.accessibility.LauncherAccessibilityDelegate;
import com.android.launcher3.compat.LauncherAppsCompat;
import com.android.launcher3.util.Themes;
@@ -49,8 +50,8 @@ public class InfoDropTarget extends UninstallDropTarget {
}
@Override
- protected ComponentName performDropAction(DragObject d) {
- return performDropAction(mLauncher, d.dragInfo, null, null);
+ protected ComponentName performDropAction(ItemInfo item) {
+ return performDropAction(mLauncher, item, null, null);
}
/**
@@ -96,13 +97,15 @@ public class InfoDropTarget extends UninstallDropTarget {
}
@Override
- protected boolean supportsDrop(ItemInfo info) {
- return supportsDrop(getContext(), info);
+ public int getAccessibilityAction() {
+ return LauncherAccessibilityDelegate.INFO;
}
- public static boolean supportsDrop(Context context, ItemInfo info) {
+ @Override
+ protected boolean supportsDrop(ItemInfo info) {
// Only show the App Info drop target if developer settings are enabled.
- boolean developmentSettingsEnabled = Settings.Global.getInt(context.getContentResolver(),
+ boolean developmentSettingsEnabled = Settings.Global.getInt(
+ getContext().getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1;
if (!developmentSettingsEnabled) {
return false;
diff --git a/src/com/android/launcher3/UninstallDropTarget.java b/src/com/android/launcher3/UninstallDropTarget.java
index 43938194e..8e83a30c0 100644
--- a/src/com/android/launcher3/UninstallDropTarget.java
+++ b/src/com/android/launcher3/UninstallDropTarget.java
@@ -10,22 +10,28 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.ArrayMap;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.android.launcher3.Launcher.OnResumeCallback;
+import com.android.launcher3.accessibility.LauncherAccessibilityDelegate;
import com.android.launcher3.compat.LauncherAppsCompat;
import com.android.launcher3.dragndrop.DragOptions;
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
import java.net.URISyntaxException;
-public class UninstallDropTarget extends ButtonDropTarget {
+public class UninstallDropTarget extends ButtonDropTarget implements OnAlarmListener {
private static final String TAG = "UninstallDropTarget";
- private static Boolean sUninstallDisabled;
+
+ private static final long CACHE_EXPIRE_TIMEOUT = 5000;
+ private final ArrayMap<UserHandle, Boolean> mUninstallDisabledCache = new ArrayMap<>(1);
+
+ private final Alarm mCacheExpireAlarm;
public UninstallDropTarget(Context context, AttributeSet attrs) {
this(context, attrs, 0);
@@ -33,6 +39,9 @@ public class UninstallDropTarget extends ButtonDropTarget {
public UninstallDropTarget(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+
+ mCacheExpireAlarm = new Alarm();
+ mCacheExpireAlarm.setOnAlarmListener(this);
}
@Override
@@ -48,18 +57,29 @@ public class UninstallDropTarget extends ButtonDropTarget {
}
@Override
- protected boolean supportsDrop(ItemInfo info) {
- return supportsDrop(getContext(), info);
+ public void onAlarm(Alarm alarm) {
+ mUninstallDisabledCache.clear();
}
- public static boolean supportsDrop(Context context, ItemInfo info) {
- if (sUninstallDisabled == null) {
- UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
- Bundle restrictions = userManager.getUserRestrictions();
- sUninstallDisabled = restrictions.getBoolean(UserManager.DISALLOW_APPS_CONTROL, false)
+ @Override
+ public int getAccessibilityAction() {
+ return LauncherAccessibilityDelegate.UNINSTALL;
+ }
+
+ @Override
+ protected boolean supportsDrop(ItemInfo info) {
+ Boolean uninstallDisabled = mUninstallDisabledCache.get(info.user);
+ if (uninstallDisabled == null) {
+ UserManager userManager =
+ (UserManager) getContext().getSystemService(Context.USER_SERVICE);
+ Bundle restrictions = userManager.getUserRestrictions(info.user);
+ uninstallDisabled = restrictions.getBoolean(UserManager.DISALLOW_APPS_CONTROL, false)
|| restrictions.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS, false);
+ mUninstallDisabledCache.put(info.user, uninstallDisabled);
}
- if (sUninstallDisabled) {
+ // Cancel any pending alarm and set cache expiry after some time
+ mCacheExpireAlarm.setAlarm(CACHE_EXPIRE_TIMEOUT);
+ if (uninstallDisabled) {
return false;
}
@@ -69,13 +89,13 @@ public class UninstallDropTarget extends ButtonDropTarget {
return (appInfo.isSystemApp & AppInfo.FLAG_SYSTEM_NO) != 0;
}
}
- return getUninstallTarget(context, info) != null;
+ return getUninstallTarget(info) != null;
}
/**
* @return the component name that should be uninstalled or null.
*/
- private static ComponentName getUninstallTarget(Context context, ItemInfo item) {
+ private ComponentName getUninstallTarget(ItemInfo item) {
Intent intent = null;
UserHandle user = null;
if (item != null &&
@@ -84,7 +104,7 @@ public class UninstallDropTarget extends ButtonDropTarget {
user = item.user;
}
if (intent != null) {
- LauncherActivityInfo info = LauncherAppsCompat.getInstance(context)
+ LauncherActivityInfo info = LauncherAppsCompat.getInstance(mLauncher)
.resolveActivity(intent, user);
if (info != null
&& (info.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
@@ -103,7 +123,7 @@ public class UninstallDropTarget extends ButtonDropTarget {
@Override
public void completeDrop(final DragObject d) {
- ComponentName target = performDropAction(d);
+ ComponentName target = performDropAction(d.dragInfo);
if (d.dragSource instanceof DeferredOnComplete) {
DeferredOnComplete deferred = (DeferredOnComplete) d.dragSource;
if (target != null) {
@@ -119,27 +139,19 @@ public class UninstallDropTarget extends ButtonDropTarget {
* Performs the drop action and returns the target component for the dragObject or null if
* the action was not performed.
*/
- protected ComponentName performDropAction(DragObject d) {
- return performDropAction(mLauncher, d.dragInfo);
- }
-
- /**
- * Performs the drop action and returns the target component for the dragObject or null if
- * the action was not performed.
- */
- private static ComponentName performDropAction(Context context, ItemInfo info) {
- ComponentName cn = getUninstallTarget(context, info);
+ protected ComponentName performDropAction(ItemInfo info) {
+ ComponentName cn = getUninstallTarget(info);
if (cn == null) {
// System applications cannot be installed. For now, show a toast explaining that.
// We may give them the option of disabling apps this way.
- Toast.makeText(context, R.string.uninstall_system_app_text, Toast.LENGTH_SHORT).show();
+ Toast.makeText(mLauncher, R.string.uninstall_system_app_text, Toast.LENGTH_SHORT).show();
return null;
}
try {
- Intent i = Intent.parseUri(context.getString(R.string.delete_package_intent), 0)
+ Intent i = Intent.parseUri(mLauncher.getString(R.string.delete_package_intent), 0)
.setData(Uri.fromParts("package", cn.getPackageName(), cn.getClassName()))
.putExtra(Intent.EXTRA_USER, info.user);
- context.startActivity(i);
+ mLauncher.startActivity(i);
return cn;
} catch (URISyntaxException e) {
Log.e(TAG, "Failed to parse intent to start uninstall activity for item=" + info);
@@ -147,8 +159,9 @@ public class UninstallDropTarget extends ButtonDropTarget {
}
}
- public static boolean startUninstallActivity(Launcher launcher, ItemInfo info) {
- return performDropAction(launcher, info) != null;
+ @Override
+ public void onAccessibilityDrop(View view, ItemInfo item) {
+ performDropAction(item);
}
/**
diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
index 583492e5a..f17818a42 100644
--- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
+++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
@@ -17,6 +17,7 @@ import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import com.android.launcher3.AppInfo;
import com.android.launcher3.AppWidgetResizeFrame;
import com.android.launcher3.BubbleTextView;
+import com.android.launcher3.ButtonDropTarget;
import com.android.launcher3.CellLayout;
import com.android.launcher3.DeleteDropTarget;
import com.android.launcher3.DropTarget.DragObject;
@@ -45,9 +46,9 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme
private static final String TAG = "LauncherAccessibilityDelegate";
- protected static final int REMOVE = R.id.action_remove;
- protected static final int INFO = R.id.action_info;
- protected static final int UNINSTALL = R.id.action_uninstall;
+ public static final int REMOVE = R.id.action_remove;
+ public static final int INFO = R.id.action_info;
+ public static final int UNINSTALL = R.id.action_uninstall;
protected static final int ADD_TO_WORKSPACE = R.id.action_add_to_workspace;
protected static final int MOVE = R.id.action_move;
protected static final int MOVE_TO_WORKSPACE = R.id.action_move_to_workspace;
@@ -108,14 +109,10 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme
info.addAction(mActions.get(DEEP_SHORTCUTS));
}
- if (DeleteDropTarget.supportsAccessibleDrop(item)) {
- info.addAction(mActions.get(REMOVE));
- }
- if (UninstallDropTarget.supportsDrop(host.getContext(), item)) {
- info.addAction(mActions.get(UNINSTALL));
- }
- if (InfoDropTarget.supportsDrop(host.getContext(), item)) {
- info.addAction(mActions.get(INFO));
+ for (ButtonDropTarget target : mLauncher.getDropTargetBar().getDropTargets()) {
+ if (target.supportsAccessibilityDrop(item)) {
+ info.addAction(mActions.get(target.getAccessibilityAction()));
+ }
}
// Do not add move actions for keyboard request as this uses virtual nodes.
@@ -148,15 +145,7 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme
}
public boolean performAction(final View host, final ItemInfo item, int action) {
- if (action == REMOVE) {
- DeleteDropTarget.removeWorkspaceOrFolderItem(mLauncher, item, host);
- return true;
- } else if (action == INFO) {
- InfoDropTarget.startDetailsActivityForInfo(item, mLauncher, null, null);
- return true;
- } else if (action == UNINSTALL) {
- return UninstallDropTarget.startUninstallActivity(mLauncher, item);
- } else if (action == MOVE) {
+ if (action == MOVE) {
beginAccessibleDrag(host, item);
} else if (action == ADD_TO_WORKSPACE) {
final int[] coordinates = new int[2];
@@ -231,6 +220,13 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme
return true;
} else if (action == DEEP_SHORTCUTS) {
return PopupContainerWithArrow.showForIcon((BubbleTextView) host) != null;
+ } else {
+ for (ButtonDropTarget dropTarget : mLauncher.getDropTargetBar().getDropTargets()) {
+ if (action == dropTarget.getAccessibilityAction()) {
+ dropTarget.onAccessibilityDrop(host, item);
+ return true;
+ }
+ }
}
return false;
}