Adding LongArrayMap as a replacement for HashMap<Long, E>
Change-Id: I4710e6db69abcdbd897a8401fc8b980c09e2ffef
This commit is contained in:
@@ -100,6 +100,7 @@ import com.android.launcher3.compat.LauncherActivityInfoCompat;
|
|||||||
import com.android.launcher3.compat.LauncherAppsCompat;
|
import com.android.launcher3.compat.LauncherAppsCompat;
|
||||||
import com.android.launcher3.compat.UserHandleCompat;
|
import com.android.launcher3.compat.UserHandleCompat;
|
||||||
import com.android.launcher3.compat.UserManagerCompat;
|
import com.android.launcher3.compat.UserManagerCompat;
|
||||||
|
import com.android.launcher3.util.LongArrayMap;
|
||||||
import com.android.launcher3.util.Thunk;
|
import com.android.launcher3.util.Thunk;
|
||||||
import com.android.launcher3.widget.PendingAddWidgetInfo;
|
import com.android.launcher3.widget.PendingAddWidgetInfo;
|
||||||
import com.android.launcher3.widget.WidgetsContainerView;
|
import com.android.launcher3.widget.WidgetsContainerView;
|
||||||
@@ -302,7 +303,7 @@ public class Launcher extends Activity
|
|||||||
|
|
||||||
@Thunk static LocaleConfiguration sLocaleConfiguration = null;
|
@Thunk static LocaleConfiguration sLocaleConfiguration = null;
|
||||||
|
|
||||||
private static HashMap<Long, FolderInfo> sFolders = new HashMap<Long, FolderInfo>();
|
private static LongArrayMap<FolderInfo> sFolders = new LongArrayMap<>();
|
||||||
|
|
||||||
private View.OnTouchListener mHapticFeedbackTouchListener;
|
private View.OnTouchListener mHapticFeedbackTouchListener;
|
||||||
|
|
||||||
@@ -3886,7 +3887,7 @@ public class Launcher extends Activity
|
|||||||
/**
|
/**
|
||||||
* Implementation of the method from LauncherModel.Callbacks.
|
* Implementation of the method from LauncherModel.Callbacks.
|
||||||
*/
|
*/
|
||||||
public void bindFolders(final HashMap<Long, FolderInfo> folders) {
|
public void bindFolders(final LongArrayMap<FolderInfo> folders) {
|
||||||
Runnable r = new Runnable() {
|
Runnable r = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
bindFolders(folders);
|
bindFolders(folders);
|
||||||
@@ -3895,8 +3896,7 @@ public class Launcher extends Activity
|
|||||||
if (waitUntilResume(r)) {
|
if (waitUntilResume(r)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sFolders.clear();
|
sFolders = folders.clone();
|
||||||
sFolders.putAll(folders);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo;
|
|||||||
import com.android.launcher3.compat.UserHandleCompat;
|
import com.android.launcher3.compat.UserHandleCompat;
|
||||||
import com.android.launcher3.compat.UserManagerCompat;
|
import com.android.launcher3.compat.UserManagerCompat;
|
||||||
import com.android.launcher3.util.ComponentKey;
|
import com.android.launcher3.util.ComponentKey;
|
||||||
|
import com.android.launcher3.util.LongArrayMap;
|
||||||
import com.android.launcher3.util.ManagedProfileHeuristic;
|
import com.android.launcher3.util.ManagedProfileHeuristic;
|
||||||
import com.android.launcher3.util.Thunk;
|
import com.android.launcher3.util.Thunk;
|
||||||
|
|
||||||
@@ -141,7 +142,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
|
|
||||||
// sBgItemsIdMap maps *all* the ItemInfos (shortcuts, folders, and widgets) created by
|
// sBgItemsIdMap maps *all* the ItemInfos (shortcuts, folders, and widgets) created by
|
||||||
// LauncherModel to their ids
|
// LauncherModel to their ids
|
||||||
static final HashMap<Long, ItemInfo> sBgItemsIdMap = new HashMap<Long, ItemInfo>();
|
static final LongArrayMap<ItemInfo> sBgItemsIdMap = new LongArrayMap<>();
|
||||||
|
|
||||||
// sBgWorkspaceItems is passed to bindItems, which expects a list of all folders and shortcuts
|
// sBgWorkspaceItems is passed to bindItems, which expects a list of all folders and shortcuts
|
||||||
// created by LauncherModel that are directly on the home screen (however, no widgets or
|
// created by LauncherModel that are directly on the home screen (however, no widgets or
|
||||||
@@ -153,7 +154,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
new ArrayList<LauncherAppWidgetInfo>();
|
new ArrayList<LauncherAppWidgetInfo>();
|
||||||
|
|
||||||
// sBgFolders is all FolderInfos created by LauncherModel. Passed to bindFolders()
|
// sBgFolders is all FolderInfos created by LauncherModel. Passed to bindFolders()
|
||||||
static final HashMap<Long, FolderInfo> sBgFolders = new HashMap<Long, FolderInfo>();
|
static final LongArrayMap<FolderInfo> sBgFolders = new LongArrayMap<>();
|
||||||
|
|
||||||
// sBgWorkspaceScreens is the ordered set of workspace screens.
|
// sBgWorkspaceScreens is the ordered set of workspace screens.
|
||||||
static final ArrayList<Long> sBgWorkspaceScreens = new ArrayList<Long>();
|
static final ArrayList<Long> sBgWorkspaceScreens = new ArrayList<Long>();
|
||||||
@@ -182,7 +183,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
boolean forceAnimateIcons);
|
boolean forceAnimateIcons);
|
||||||
public void bindScreens(ArrayList<Long> orderedScreenIds);
|
public void bindScreens(ArrayList<Long> orderedScreenIds);
|
||||||
public void bindAddScreens(ArrayList<Long> orderedScreenIds);
|
public void bindAddScreens(ArrayList<Long> orderedScreenIds);
|
||||||
public void bindFolders(HashMap<Long,FolderInfo> folders);
|
public void bindFolders(LongArrayMap<FolderInfo> folders);
|
||||||
public void finishBindingItems();
|
public void finishBindingItems();
|
||||||
public void bindAppWidget(LauncherAppWidgetInfo info);
|
public void bindAppWidget(LauncherAppWidgetInfo info);
|
||||||
public void bindAllApplications(ArrayList<AppInfo> apps);
|
public void bindAllApplications(ArrayList<AppInfo> apps);
|
||||||
@@ -286,7 +287,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ItemInfo info : sBgItemsIdMap.values()) {
|
for (ItemInfo info : sBgItemsIdMap) {
|
||||||
if (info instanceof ShortcutInfo) {
|
if (info instanceof ShortcutInfo) {
|
||||||
ShortcutInfo si = (ShortcutInfo) info;
|
ShortcutInfo si = (ShortcutInfo) info;
|
||||||
ComponentName cn = si.getTargetComponent();
|
ComponentName cn = si.getTargetComponent();
|
||||||
@@ -340,7 +341,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
final ArrayList<ShortcutInfo> updates = new ArrayList<>();
|
final ArrayList<ShortcutInfo> updates = new ArrayList<>();
|
||||||
final UserHandleCompat user = UserHandleCompat.myUserHandle();
|
final UserHandleCompat user = UserHandleCompat.myUserHandle();
|
||||||
|
|
||||||
for (ItemInfo info : sBgItemsIdMap.values()) {
|
for (ItemInfo info : sBgItemsIdMap) {
|
||||||
if (info instanceof ShortcutInfo) {
|
if (info instanceof ShortcutInfo) {
|
||||||
ShortcutInfo si = (ShortcutInfo) info;
|
ShortcutInfo si = (ShortcutInfo) info;
|
||||||
ComponentName cn = si.getTargetComponent();
|
ComponentName cn = si.getTargetComponent();
|
||||||
@@ -996,7 +997,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
}
|
}
|
||||||
|
|
||||||
synchronized (sBgLock) {
|
synchronized (sBgLock) {
|
||||||
for (ItemInfo item : sBgItemsIdMap.values()) {
|
for (ItemInfo item : sBgItemsIdMap) {
|
||||||
if (item instanceof ShortcutInfo) {
|
if (item instanceof ShortcutInfo) {
|
||||||
ShortcutInfo info = (ShortcutInfo) item;
|
ShortcutInfo info = (ShortcutInfo) item;
|
||||||
if (intentWithPkg.equals(info.getIntent())
|
if (intentWithPkg.equals(info.getIntent())
|
||||||
@@ -1012,7 +1013,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
/**
|
/**
|
||||||
* Find a folder in the db, creating the FolderInfo if necessary, and adding it to folderList.
|
* Find a folder in the db, creating the FolderInfo if necessary, and adding it to folderList.
|
||||||
*/
|
*/
|
||||||
FolderInfo getFolderById(Context context, HashMap<Long,FolderInfo> folderList, long id) {
|
FolderInfo getFolderById(Context context, LongArrayMap<FolderInfo> folderList, long id) {
|
||||||
final ContentResolver cr = context.getContentResolver();
|
final ContentResolver cr = context.getContentResolver();
|
||||||
Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI, null,
|
Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI, null,
|
||||||
"_id=? and (itemType=? or itemType=?)",
|
"_id=? and (itemType=? or itemType=?)",
|
||||||
@@ -1132,7 +1133,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
return cn.getPackageName().equals(pn) && info.user.equals(user);
|
return cn.getPackageName().equals(pn) && info.user.equals(user);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return filterItemInfos(sBgItemsIdMap.values(), filter);
|
return filterItemInfos(sBgItemsIdMap, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1172,7 +1173,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
switch (item.itemType) {
|
switch (item.itemType) {
|
||||||
case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
|
case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
|
||||||
sBgFolders.remove(item.id);
|
sBgFolders.remove(item.id);
|
||||||
for (ItemInfo info: sBgItemsIdMap.values()) {
|
for (ItemInfo info: sBgItemsIdMap) {
|
||||||
if (info.container == item.id) {
|
if (info.container == item.id) {
|
||||||
// We are deleting a folder which still contains items that
|
// We are deleting a folder which still contains items that
|
||||||
// think they are contained by that folder.
|
// think they are contained by that folder.
|
||||||
@@ -1749,7 +1750,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check & update map of what's occupied; used to discard overlapping/invalid items
|
// check & update map of what's occupied; used to discard overlapping/invalid items
|
||||||
private boolean checkItemPlacement(HashMap<Long, ItemInfo[][]> occupied, ItemInfo item) {
|
private boolean checkItemPlacement(LongArrayMap<ItemInfo[][]> occupied, ItemInfo item) {
|
||||||
LauncherAppState app = LauncherAppState.getInstance();
|
LauncherAppState app = LauncherAppState.getInstance();
|
||||||
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
|
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
|
||||||
final int countX = (int) grid.numColumns;
|
final int countX = (int) grid.numColumns;
|
||||||
@@ -1897,7 +1898,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
// +1 for the hotseat (it can be larger than the workspace)
|
// +1 for the hotseat (it can be larger than the workspace)
|
||||||
// Load workspace in reverse order to ensure that latest items are loaded first (and
|
// Load workspace in reverse order to ensure that latest items are loaded first (and
|
||||||
// before any earlier duplicates)
|
// before any earlier duplicates)
|
||||||
final HashMap<Long, ItemInfo[][]> occupied = new HashMap<Long, ItemInfo[][]>();
|
final LongArrayMap<ItemInfo[][]> occupied = new LongArrayMap<>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID);
|
final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID);
|
||||||
@@ -2436,7 +2437,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
|
|
||||||
// Remove any empty screens
|
// Remove any empty screens
|
||||||
ArrayList<Long> unusedScreens = new ArrayList<Long>(sBgWorkspaceScreens);
|
ArrayList<Long> unusedScreens = new ArrayList<Long>(sBgWorkspaceScreens);
|
||||||
for (ItemInfo item: sBgItemsIdMap.values()) {
|
for (ItemInfo item: sBgItemsIdMap) {
|
||||||
long screenId = item.screenId;
|
long screenId = item.screenId;
|
||||||
if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
|
if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
|
||||||
unusedScreens.contains(screenId)) {
|
unusedScreens.contains(screenId)) {
|
||||||
@@ -2461,14 +2462,13 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
for (int y = 0; y < countY; y++) {
|
for (int y = 0; y < countY; y++) {
|
||||||
String line = "";
|
String line = "";
|
||||||
|
|
||||||
Iterator<Long> iter = occupied.keySet().iterator();
|
for (int i = 0; i < nScreens; i++) {
|
||||||
while (iter.hasNext()) {
|
long screenId = occupied.keyAt(i);
|
||||||
long screenId = iter.next();
|
|
||||||
if (screenId > 0) {
|
if (screenId > 0) {
|
||||||
line += " | ";
|
line += " | ";
|
||||||
}
|
}
|
||||||
|
ItemInfo[][] screen = occupied.valueAt(i);
|
||||||
for (int x = 0; x < countX; x++) {
|
for (int x = 0; x < countX; x++) {
|
||||||
ItemInfo[][] screen = occupied.get(screenId);
|
|
||||||
if (x < screen.length && y < screen[x].length) {
|
if (x < screen.length && y < screen[x].length) {
|
||||||
line += (screen[x][y] != null) ? "#" : ".";
|
line += (screen[x][y] != null) ? "#" : ".";
|
||||||
} else {
|
} else {
|
||||||
@@ -2559,14 +2559,17 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
|
|
||||||
/** Filters the set of folders which are on the specified screen. */
|
/** Filters the set of folders which are on the specified screen. */
|
||||||
private void filterCurrentFolders(long currentScreenId,
|
private void filterCurrentFolders(long currentScreenId,
|
||||||
HashMap<Long, ItemInfo> itemsIdMap,
|
LongArrayMap<ItemInfo> itemsIdMap,
|
||||||
HashMap<Long, FolderInfo> folders,
|
LongArrayMap<FolderInfo> folders,
|
||||||
HashMap<Long, FolderInfo> currentScreenFolders,
|
LongArrayMap<FolderInfo> currentScreenFolders,
|
||||||
HashMap<Long, FolderInfo> otherScreenFolders) {
|
LongArrayMap<FolderInfo> otherScreenFolders) {
|
||||||
|
|
||||||
|
int total = folders.size();
|
||||||
|
for (int i = 0; i < total; i++) {
|
||||||
|
long id = folders.keyAt(i);
|
||||||
|
FolderInfo folder = folders.valueAt(i);
|
||||||
|
|
||||||
for (long id : folders.keySet()) {
|
|
||||||
ItemInfo info = itemsIdMap.get(id);
|
ItemInfo info = itemsIdMap.get(id);
|
||||||
FolderInfo folder = folders.get(id);
|
|
||||||
if (info == null || folder == null) continue;
|
if (info == null || folder == null) continue;
|
||||||
if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
|
if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
|
||||||
info.screenId == currentScreenId) {
|
info.screenId == currentScreenId) {
|
||||||
@@ -2616,7 +2619,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
private void bindWorkspaceItems(final Callbacks oldCallbacks,
|
private void bindWorkspaceItems(final Callbacks oldCallbacks,
|
||||||
final ArrayList<ItemInfo> workspaceItems,
|
final ArrayList<ItemInfo> workspaceItems,
|
||||||
final ArrayList<LauncherAppWidgetInfo> appWidgets,
|
final ArrayList<LauncherAppWidgetInfo> appWidgets,
|
||||||
final HashMap<Long, FolderInfo> folders,
|
final LongArrayMap<FolderInfo> folders,
|
||||||
ArrayList<Runnable> deferredBindRunnables) {
|
ArrayList<Runnable> deferredBindRunnables) {
|
||||||
|
|
||||||
final boolean postOnMainThread = (deferredBindRunnables != null);
|
final boolean postOnMainThread = (deferredBindRunnables != null);
|
||||||
@@ -2704,15 +2707,18 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
ArrayList<ItemInfo> workspaceItems = new ArrayList<ItemInfo>();
|
ArrayList<ItemInfo> workspaceItems = new ArrayList<ItemInfo>();
|
||||||
ArrayList<LauncherAppWidgetInfo> appWidgets =
|
ArrayList<LauncherAppWidgetInfo> appWidgets =
|
||||||
new ArrayList<LauncherAppWidgetInfo>();
|
new ArrayList<LauncherAppWidgetInfo>();
|
||||||
HashMap<Long, FolderInfo> folders = new HashMap<Long, FolderInfo>();
|
|
||||||
HashMap<Long, ItemInfo> itemsIdMap = new HashMap<Long, ItemInfo>();
|
|
||||||
ArrayList<Long> orderedScreenIds = new ArrayList<Long>();
|
ArrayList<Long> orderedScreenIds = new ArrayList<Long>();
|
||||||
|
|
||||||
|
final LongArrayMap<FolderInfo> folders;
|
||||||
|
final LongArrayMap<ItemInfo> itemsIdMap;
|
||||||
|
|
||||||
synchronized (sBgLock) {
|
synchronized (sBgLock) {
|
||||||
workspaceItems.addAll(sBgWorkspaceItems);
|
workspaceItems.addAll(sBgWorkspaceItems);
|
||||||
appWidgets.addAll(sBgAppWidgets);
|
appWidgets.addAll(sBgAppWidgets);
|
||||||
folders.putAll(sBgFolders);
|
|
||||||
itemsIdMap.putAll(sBgItemsIdMap);
|
|
||||||
orderedScreenIds.addAll(sBgWorkspaceScreens);
|
orderedScreenIds.addAll(sBgWorkspaceScreens);
|
||||||
|
|
||||||
|
folders = sBgFolders.clone();
|
||||||
|
itemsIdMap = sBgItemsIdMap.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean isLoadingSynchronously =
|
final boolean isLoadingSynchronously =
|
||||||
@@ -2738,8 +2744,8 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
new ArrayList<LauncherAppWidgetInfo>();
|
new ArrayList<LauncherAppWidgetInfo>();
|
||||||
ArrayList<LauncherAppWidgetInfo> otherAppWidgets =
|
ArrayList<LauncherAppWidgetInfo> otherAppWidgets =
|
||||||
new ArrayList<LauncherAppWidgetInfo>();
|
new ArrayList<LauncherAppWidgetInfo>();
|
||||||
HashMap<Long, FolderInfo> currentFolders = new HashMap<Long, FolderInfo>();
|
LongArrayMap<FolderInfo> currentFolders = new LongArrayMap<>();
|
||||||
HashMap<Long, FolderInfo> otherFolders = new HashMap<Long, FolderInfo>();
|
LongArrayMap<FolderInfo> otherFolders = new LongArrayMap<>();
|
||||||
|
|
||||||
filterCurrentWorkspaceItems(currentScreenId, workspaceItems, currentWorkspaceItems,
|
filterCurrentWorkspaceItems(currentScreenId, workspaceItems, currentWorkspaceItems,
|
||||||
otherWorkspaceItems);
|
otherWorkspaceItems);
|
||||||
@@ -2902,7 +2908,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
if (!updatedPackages.isEmpty()) {
|
if (!updatedPackages.isEmpty()) {
|
||||||
final ArrayList<ShortcutInfo> updates = new ArrayList<ShortcutInfo>();
|
final ArrayList<ShortcutInfo> updates = new ArrayList<ShortcutInfo>();
|
||||||
synchronized (sBgLock) {
|
synchronized (sBgLock) {
|
||||||
for (ItemInfo info : sBgItemsIdMap.values()) {
|
for (ItemInfo info : sBgItemsIdMap) {
|
||||||
if (info instanceof ShortcutInfo && user.equals(info.user)
|
if (info instanceof ShortcutInfo && user.equals(info.user)
|
||||||
&& info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {
|
&& info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {
|
||||||
ShortcutInfo si = (ShortcutInfo) info;
|
ShortcutInfo si = (ShortcutInfo) info;
|
||||||
@@ -3151,7 +3157,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
|
|
||||||
HashSet<String> packageSet = new HashSet<String>(Arrays.asList(packages));
|
HashSet<String> packageSet = new HashSet<String>(Arrays.asList(packages));
|
||||||
synchronized (sBgLock) {
|
synchronized (sBgLock) {
|
||||||
for (ItemInfo info : sBgItemsIdMap.values()) {
|
for (ItemInfo info : sBgItemsIdMap) {
|
||||||
if (info instanceof ShortcutInfo && mUser.equals(info.user)) {
|
if (info instanceof ShortcutInfo && mUser.equals(info.user)) {
|
||||||
ShortcutInfo si = (ShortcutInfo) info;
|
ShortcutInfo si = (ShortcutInfo) info;
|
||||||
boolean infoUpdated = false;
|
boolean infoUpdated = false;
|
||||||
@@ -3527,7 +3533,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ArrayList<ItemInfo> filterItemInfos(Collection<ItemInfo> infos,
|
static ArrayList<ItemInfo> filterItemInfos(Iterable<ItemInfo> infos,
|
||||||
ItemInfoFilter f) {
|
ItemInfoFilter f) {
|
||||||
HashSet<ItemInfo> filtered = new HashSet<ItemInfo>();
|
HashSet<ItemInfo> filtered = new HashSet<ItemInfo>();
|
||||||
for (ItemInfo i : infos) {
|
for (ItemInfo i : infos) {
|
||||||
@@ -3568,7 +3574,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return filterItemInfos(sBgItemsIdMap.values(), filter);
|
return filterItemInfos(sBgItemsIdMap, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3678,7 +3684,7 @@ public class LauncherModel extends BroadcastReceiver
|
|||||||
* Return an existing FolderInfo object if we have encountered this ID previously,
|
* Return an existing FolderInfo object if we have encountered this ID previously,
|
||||||
* or make a new one.
|
* or make a new one.
|
||||||
*/
|
*/
|
||||||
@Thunk static FolderInfo findOrMakeFolder(HashMap<Long, FolderInfo> folders, long id) {
|
@Thunk static FolderInfo findOrMakeFolder(LongArrayMap<FolderInfo> folders, long id) {
|
||||||
// See if a placeholder was created for us already
|
// See if a placeholder was created for us already
|
||||||
FolderInfo folderInfo = folders.get(id);
|
FolderInfo folderInfo = folders.get(id);
|
||||||
if (folderInfo == null) {
|
if (folderInfo == null) {
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ import com.android.launcher3.Launcher.LauncherOverlay;
|
|||||||
import com.android.launcher3.LauncherSettings.Favorites;
|
import com.android.launcher3.LauncherSettings.Favorites;
|
||||||
import com.android.launcher3.UninstallDropTarget.UninstallSource;
|
import com.android.launcher3.UninstallDropTarget.UninstallSource;
|
||||||
import com.android.launcher3.compat.UserHandleCompat;
|
import com.android.launcher3.compat.UserHandleCompat;
|
||||||
|
import com.android.launcher3.util.LongArrayMap;
|
||||||
import com.android.launcher3.util.Thunk;
|
import com.android.launcher3.util.Thunk;
|
||||||
import com.android.launcher3.util.WallpaperUtils;
|
import com.android.launcher3.util.WallpaperUtils;
|
||||||
import com.android.launcher3.widget.PendingAddShortcutInfo;
|
import com.android.launcher3.widget.PendingAddShortcutInfo;
|
||||||
@@ -71,7 +72,6 @@ import com.android.launcher3.widget.PendingAddWidgetInfo;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -120,7 +120,7 @@ public class Workspace extends SmoothPagedView
|
|||||||
final static long EXTRA_EMPTY_SCREEN_ID = -201;
|
final static long EXTRA_EMPTY_SCREEN_ID = -201;
|
||||||
private final static long CUSTOM_CONTENT_SCREEN_ID = -301;
|
private final static long CUSTOM_CONTENT_SCREEN_ID = -301;
|
||||||
|
|
||||||
@Thunk HashMap<Long, CellLayout> mWorkspaceScreens = new HashMap<Long, CellLayout>();
|
@Thunk LongArrayMap<CellLayout> mWorkspaceScreens = new LongArrayMap<>();
|
||||||
@Thunk ArrayList<Long> mScreenOrder = new ArrayList<Long>();
|
@Thunk ArrayList<Long> mScreenOrder = new ArrayList<Long>();
|
||||||
|
|
||||||
@Thunk Runnable mRemoveEmptyScreenRunnable;
|
@Thunk Runnable mRemoveEmptyScreenRunnable;
|
||||||
@@ -834,12 +834,9 @@ public class Workspace extends SmoothPagedView
|
|||||||
}
|
}
|
||||||
|
|
||||||
public long getIdForScreen(CellLayout layout) {
|
public long getIdForScreen(CellLayout layout) {
|
||||||
Iterator<Long> iter = mWorkspaceScreens.keySet().iterator();
|
int index = mWorkspaceScreens.indexOfValue(layout);
|
||||||
while (iter.hasNext()) {
|
if (index != -1) {
|
||||||
long id = iter.next();
|
return mWorkspaceScreens.keyAt(index);
|
||||||
if (mWorkspaceScreens.get(id) == layout) {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -874,8 +871,10 @@ public class Workspace extends SmoothPagedView
|
|||||||
|
|
||||||
int currentPage = getNextPage();
|
int currentPage = getNextPage();
|
||||||
ArrayList<Long> removeScreens = new ArrayList<Long>();
|
ArrayList<Long> removeScreens = new ArrayList<Long>();
|
||||||
for (Long id: mWorkspaceScreens.keySet()) {
|
int total = mWorkspaceScreens.size();
|
||||||
CellLayout cl = mWorkspaceScreens.get(id);
|
for (int i = 0; i < total; i++) {
|
||||||
|
long id = mWorkspaceScreens.keyAt(i);
|
||||||
|
CellLayout cl = mWorkspaceScreens.valueAt(i);
|
||||||
if (id >= 0 && cl.getShortcutsAndWidgets().getChildCount() == 0) {
|
if (id >= 0 && cl.getShortcutsAndWidgets().getChildCount() == 0) {
|
||||||
removeScreens.add(id);
|
removeScreens.add(id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.launcher3.util;
|
||||||
|
|
||||||
|
import android.util.LongSparseArray;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension of {@link LongSparseArray} with some utility methods.
|
||||||
|
*/
|
||||||
|
public class LongArrayMap<E> extends LongSparseArray<E> implements Iterable<E> {
|
||||||
|
|
||||||
|
public boolean containsKey(long key) {
|
||||||
|
return indexOfKey(key) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return size() <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LongArrayMap<E> clone() {
|
||||||
|
return (LongArrayMap<E>) super.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<E> iterator() {
|
||||||
|
return new ValueIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ValueIterator implements Iterator<E> {
|
||||||
|
|
||||||
|
private int mNextIndex = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return mNextIndex < size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E next() {
|
||||||
|
return valueAt(mNextIndex ++);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user