summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher/LauncherModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher/LauncherModel.java')
-rw-r--r--src/com/android/launcher/LauncherModel.java955
1 files changed, 0 insertions, 955 deletions
diff --git a/src/com/android/launcher/LauncherModel.java b/src/com/android/launcher/LauncherModel.java
deleted file mode 100644
index 783eef2db..000000000
--- a/src/com/android/launcher/LauncherModel.java
+++ /dev/null
@@ -1,955 +0,0 @@
-/*
- * Copyright (C) 2008 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.launcher;
-
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Intent;
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.util.Log;
-import android.os.Process;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Comparator;
-import java.lang.ref.WeakReference;
-import java.text.Collator;
-import java.net.URISyntaxException;
-
-/**
- * Maintains in-memory state of the Launcher. It is expected that there should be only one
- * LauncherModel object held in a static. Also provide APIs for updating the database state
- * for the Launcher
- */
-public class LauncherModel {
- private static final int UI_NOTIFICATION_RATE = 4;
- private static final int DEFAULT_APPLICATIONS_NUMBER = 42;
- private static final long APPLICATION_NOT_RESPONDING_TIMEOUT = 5000;
-
- private final Collator sCollator = Collator.getInstance();
-
- private boolean mApplicationsLoaded;
- private boolean mDesktopItemsLoaded;
-
- private ArrayList<ItemInfo> mDesktopItems;
- private HashMap<Long, FolderInfo> mFolders;
-
- private ArrayList<ApplicationInfo> mApplications;
- private ApplicationsAdapter mApplicationsAdapter;
- private ApplicationsLoader mApplicationsLoader;
- private DesktopItemsLoader mDesktopItemsLoader;
- private Thread mLoader;
- private Thread mDesktopLoader;
-
- void abortLoaders() {
- if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) {
- mApplicationsLoader.stop();
- mApplicationsLoaded = false;
- }
- if (mDesktopItemsLoader != null && mDesktopItemsLoader.isRunning()) {
- mDesktopItemsLoader.stop();
- mDesktopItemsLoaded = false;
- }
- }
-
- /**
- * Loads the list of installed applications in mApplications.
- */
- void loadApplications(boolean isLaunching, Launcher launcher, boolean localeChanged) {
- if (isLaunching && mApplicationsLoaded && !localeChanged) {
- mApplicationsAdapter = new ApplicationsAdapter(launcher, mApplications);
- return;
- }
-
- if (mApplicationsAdapter == null || isLaunching || localeChanged) {
- mApplicationsAdapter = new ApplicationsAdapter(launcher,
- mApplications = new ArrayList<ApplicationInfo>(DEFAULT_APPLICATIONS_NUMBER));
- }
-
- if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) {
- mApplicationsLoader.stop();
- // Wait for the currently running thread to finish, this can take a little
- // time but it should be well below the timeout limit
- try {
- mLoader.join(APPLICATION_NOT_RESPONDING_TIMEOUT);
- } catch (InterruptedException e) {
- // Empty
- }
- }
-
- mApplicationsLoaded = false;
-
- if (!isLaunching) {
- startApplicationsLoader(launcher);
- }
- }
-
- private void startApplicationsLoader(Launcher launcher) {
- mApplicationsLoader = new ApplicationsLoader(launcher);
- mLoader = new Thread(mApplicationsLoader, "Applications Loader");
- mLoader.start();
- }
-
- private class ApplicationsLoader implements Runnable {
- private final WeakReference<Launcher> mLauncher;
-
- private volatile boolean mStopped;
- private volatile boolean mRunning;
-
- ApplicationsLoader(Launcher launcher) {
- mLauncher = new WeakReference<Launcher>(launcher);
- }
-
- void stop() {
- mStopped = true;
- }
-
- boolean isRunning() {
- return mRunning;
- }
-
- public void run() {
- mRunning = true;
-
- android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
- Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
-
- final Launcher launcher = mLauncher.get();
- final PackageManager manager = launcher.getPackageManager();
- final List<ResolveInfo> apps = manager.queryIntentActivities(mainIntent, 0);
-
- if (apps != null && !mStopped) {
- final int count = apps.size();
- final ApplicationsAdapter applicationList = mApplicationsAdapter;
-
- ChangeNotifier action = new ChangeNotifier(applicationList);
-
- for (int i = 0; i < count && !mStopped; i++) {
- ApplicationInfo application = new ApplicationInfo();
- ResolveInfo info = apps.get(i);
-
- application.title = info.loadLabel(manager);
- if (application.title == null) {
- application.title = info.activityInfo.name;
- }
- application.setActivity(new ComponentName(
- info.activityInfo.applicationInfo.packageName,
- info.activityInfo.name),
- Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- application.icon = info.activityInfo.loadIcon(manager);
- application.container = ItemInfo.NO_ID;
-
- action.add(application);
- }
-
- action.sort(new Comparator<ApplicationInfo>() {
- public final int compare(ApplicationInfo a, ApplicationInfo b) {
- return sCollator.compare(a.title.toString(), b.title.toString());
- }
- });
-
- if (!mStopped) {
- launcher.runOnUiThread(action);
- }
- }
-
- if (!mStopped) {
- mApplicationsLoaded = true;
- }
- mRunning = false;
- }
- }
-
- private static class ChangeNotifier implements Runnable {
- private final ApplicationsAdapter mApplicationList;
- private ArrayList<ApplicationInfo> mBuffer;
-
- ChangeNotifier(ApplicationsAdapter applicationList) {
- mApplicationList = applicationList;
- mBuffer = new ArrayList<ApplicationInfo>(UI_NOTIFICATION_RATE);
- }
-
- public void run() {
- final ArrayList<ApplicationInfo> buffer = mBuffer;
- final ApplicationsAdapter applicationList = mApplicationList;
- final int count = buffer.size();
-
- applicationList.clear();
- for (int i = 0; i < count; i++) {
- applicationList.setNotifyOnChange(false);
- applicationList.add(buffer.get(i));
- }
-
- applicationList.notifyDataSetChanged();
- buffer.clear();
- }
-
- void add(ApplicationInfo application) {
- mBuffer.add(application);
- }
-
- void sort(Comparator<ApplicationInfo> comparator) {
- Collections.sort(mBuffer, comparator);
- }
- }
-
- boolean isDesktopLoaded() {
- return mDesktopItems != null && mDesktopItemsLoaded;
- }
-
- /**
- * Loads all of the items on the desktop, in folders, or in the dock.
- * These can be apps, shortcuts or widgets
- */
- void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged,
- boolean loadApplications) {
-
- if (isLaunching && mDesktopItems != null && mDesktopItemsLoaded) {
- if (loadApplications) startApplicationsLoader(launcher);
- // We have already loaded our data from the DB
- launcher.onDesktopItemsLoaded();
- return;
- }
-
- if (mDesktopItemsLoader != null && mDesktopItemsLoader.isRunning()) {
- mDesktopItemsLoader.stop();
- // Wait for the currently running thread to finish, this can take a little
- // time but it should be well below the timeout limit
- try {
- mDesktopLoader.join(APPLICATION_NOT_RESPONDING_TIMEOUT);
- } catch (InterruptedException e) {
- // Empty
- }
- }
-
- mDesktopItemsLoaded = false;
- mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged, loadApplications);
- mDesktopLoader = new Thread(mDesktopItemsLoader, "Desktop Items Loader");
- mDesktopLoader.start();
- }
-
- private static void updateShortcutLabels(ContentResolver resolver, PackageManager manager) {
- final Cursor c = resolver.query(LauncherSettings.Favorites.CONTENT_URI,
- new String[] { LauncherSettings.Favorites.ID, LauncherSettings.Favorites.TITLE,
- LauncherSettings.Favorites.INTENT, LauncherSettings.Favorites.ITEM_TYPE },
- null, null, null);
-
- final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ID);
- final int intentIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.INTENT);
- final int itemTypeIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ITEM_TYPE);
- final int titleIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.TITLE);
-
- // boolean changed = false;
-
- try {
- while (c.moveToNext()) {
- try {
- if (c.getInt(itemTypeIndex) !=
- LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {
- continue;
- }
-
- final String intentUri = c.getString(intentIndex);
- if (intentUri != null) {
- final Intent shortcut = Intent.getIntent(intentUri);
- if (Intent.ACTION_MAIN.equals(shortcut.getAction())) {
- final ComponentName name = shortcut.getComponent();
- if (name != null) {
- final ActivityInfo activityInfo = manager.getActivityInfo(name, 0);
- final String title = c.getString(titleIndex);
- String label = getLabel(manager, activityInfo);
-
- if (title == null || !title.equals(label)) {
- final ContentValues values = new ContentValues();
- values.put(LauncherSettings.Favorites.TITLE, label);
-
- resolver.update(LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION,
- values, "_id=?",
- new String[] { String.valueOf(c.getLong(idIndex)) });
-
- // changed = true;
- }
- }
- }
- }
- } catch (URISyntaxException e) {
- // Ignore
- } catch (PackageManager.NameNotFoundException e) {
- // Ignore
- }
- }
- } finally {
- c.close();
- }
-
- // if (changed) resolver.notifyChange(Settings.Favorites.CONTENT_URI, null);
- }
-
- private static String getLabel(PackageManager manager, ActivityInfo activityInfo) {
- String label = activityInfo.loadLabel(manager).toString();
- if (label == null) {
- label = manager.getApplicationLabel(activityInfo.applicationInfo).toString();
- if (label == null) {
- label = activityInfo.name;
- }
- }
- return label;
- }
-
- private class DesktopItemsLoader implements Runnable {
- private volatile boolean mStopped;
- private volatile boolean mRunning;
-
- private final WeakReference<Launcher> mLauncher;
- private final boolean mLocaleChanged;
- private final boolean mLoadApplications;
-
- DesktopItemsLoader(Launcher launcher, boolean localeChanged, boolean loadApplications) {
- mLoadApplications = loadApplications;
- mLauncher = new WeakReference<Launcher>(launcher);
- mLocaleChanged = localeChanged;
- }
-
- void stop() {
- mStopped = true;
- }
-
- boolean isRunning() {
- return mRunning;
- }
-
- public void run() {
- mRunning = true;
-
- final Launcher launcher = mLauncher.get();
- final ContentResolver contentResolver = launcher.getContentResolver();
- final PackageManager manager = launcher.getPackageManager();
-
- if (mLocaleChanged) {
- updateShortcutLabels(contentResolver, manager);
- }
-
- mDesktopItems = new ArrayList<ItemInfo>();
- mFolders = new HashMap<Long, FolderInfo>();
-
- final ArrayList<ItemInfo> desktopItems = mDesktopItems;
-
- final Cursor c = contentResolver.query(
- LauncherSettings.Favorites.CONTENT_URI, null, null, null, null);
-
- try {
- final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ID);
- final int intentIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.INTENT);
- final int titleIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.TITLE);
- final int iconTypeIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_TYPE);
- final int iconIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON);
- final int iconPackageIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_PACKAGE);
- final int iconResourceIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON_RESOURCE);
- final int containerIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CONTAINER);
- final int itemTypeIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ITEM_TYPE);
- final int gadgetIdIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.GADGET_ID);
- final int screenIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SCREEN);
- final int cellXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLX);
- final int cellYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLY);
- final int spanXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANX);
- final int spanYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANY);
- final int uriIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.URI);
- final int displayModeIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.DISPLAY_MODE);
-
- ApplicationInfo info;
- String intentDescription;
- Widget widgetInfo = null;
- LauncherGadgetInfo gadgetInfo = null;
- int container;
- long id;
- Intent intent;
-
- final HashMap<Long, FolderInfo> folders = mFolders;
-
- while (!mStopped && c.moveToNext()) {
- try {
- int itemType = c.getInt(itemTypeIndex);
-
- switch (itemType) {
- case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
- case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
- intentDescription = c.getString(intentIndex);
- try {
- intent = Intent.getIntent(intentDescription);
- } catch (java.net.URISyntaxException e) {
- continue;
- }
-
- if (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {
- info = getApplicationInfo(manager, intent);
- } else {
- info = getApplicationInfoShortcut(c, launcher, iconTypeIndex,
- iconPackageIndex, iconResourceIndex, iconIndex);
- }
-
- if (info == null) {
- info = new ApplicationInfo();
- info.icon = manager.getDefaultActivityIcon();
- }
-
- if (info != null) {
- info.title = c.getString(titleIndex);
- info.intent = intent;
-
- info.id = c.getLong(idIndex);
- container = c.getInt(containerIndex);
- info.container = container;
- info.screen = c.getInt(screenIndex);
- info.cellX = c.getInt(cellXIndex);
- info.cellY = c.getInt(cellYIndex);
-
- switch (container) {
- case LauncherSettings.Favorites.CONTAINER_DESKTOP:
- desktopItems.add(info);
- break;
- default:
- // Item is in a user folder
- UserFolderInfo folderInfo =
- findOrMakeUserFolder(folders, container);
- folderInfo.add(info);
- break;
- }
- }
- break;
- case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
-
- id = c.getLong(idIndex);
- UserFolderInfo folderInfo = findOrMakeUserFolder(folders, id);
-
- folderInfo.title = c.getString(titleIndex);
-
- folderInfo.id = id;
- container = c.getInt(containerIndex);
- folderInfo.container = container;
- folderInfo.screen = c.getInt(screenIndex);
- folderInfo.cellX = c.getInt(cellXIndex);
- folderInfo.cellY = c.getInt(cellYIndex);
-
- switch (container) {
- case LauncherSettings.Favorites.CONTAINER_DESKTOP:
- desktopItems.add(folderInfo);
- break;
- }
- break;
- case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER:
-
- id = c.getLong(idIndex);
- LiveFolderInfo liveFolderInfo = findOrMakeLiveFolder(folders, id);
-
- intentDescription = c.getString(intentIndex);
- intent = null;
- if (intentDescription != null) {
- try {
- intent = Intent.getIntent(intentDescription);
- } catch (java.net.URISyntaxException e) {
- // Ignore, a live folder might not have a base intent
- }
- }
-
- liveFolderInfo.title = c.getString(titleIndex);
- liveFolderInfo.id = id;
- container = c.getInt(containerIndex);
- liveFolderInfo.container = container;
- liveFolderInfo.screen = c.getInt(screenIndex);
- liveFolderInfo.cellX = c.getInt(cellXIndex);
- liveFolderInfo.cellY = c.getInt(cellYIndex);
- liveFolderInfo.uri = Uri.parse(c.getString(uriIndex));
- liveFolderInfo.baseIntent = intent;
- liveFolderInfo.displayMode = c.getInt(displayModeIndex);
-
- loadLiveFolderIcon(launcher, c, iconTypeIndex, iconPackageIndex,
- iconResourceIndex, liveFolderInfo);
-
- switch (container) {
- case LauncherSettings.Favorites.CONTAINER_DESKTOP:
- desktopItems.add(liveFolderInfo);
- break;
- }
- break;
- case LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH:
- widgetInfo = Widget.makeSearch();
-
- container = c.getInt(containerIndex);
- if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP) {
- Log.e(Launcher.LOG_TAG, "Widget found where container "
- + "!= CONTAINER_DESKTOP ignoring!");
- continue;
- }
-
- widgetInfo.id = c.getLong(idIndex);
- widgetInfo.screen = c.getInt(screenIndex);
- widgetInfo.container = container;
- widgetInfo.cellX = c.getInt(cellXIndex);
- widgetInfo.cellY = c.getInt(cellYIndex);
-
- desktopItems.add(widgetInfo);
- break;
- case LauncherSettings.Favorites.ITEM_TYPE_GADGET:
- // Read all Launcher-specific gadget details
- int gadgetId = c.getInt(gadgetIdIndex);
- gadgetInfo = new LauncherGadgetInfo(gadgetId);
- gadgetInfo.id = c.getLong(idIndex);
- gadgetInfo.screen = c.getInt(screenIndex);
- gadgetInfo.cellX = c.getInt(cellXIndex);
- gadgetInfo.cellY = c.getInt(cellYIndex);
- gadgetInfo.spanX = c.getInt(spanXIndex);
- gadgetInfo.spanY = c.getInt(spanYIndex);
-
- container = c.getInt(containerIndex);
- if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP) {
- Log.e(Launcher.LOG_TAG, "Gadget found where container "
- + "!= CONTAINER_DESKTOP -- ignoring!");
- continue;
- }
- gadgetInfo.container = c.getInt(containerIndex);
-
- desktopItems.add(gadgetInfo);
- break;
- }
- } catch (Exception e) {
- Log.w(Launcher.LOG_TAG, "Desktop items loading interrupted:", e);
- }
- }
- } finally {
- c.close();
- }
-
- if (!mStopped) {
- launcher.runOnUiThread(new Runnable() {
- public void run() {
- launcher.onDesktopItemsLoaded();
- }
- });
- if (mLoadApplications) startApplicationsLoader(launcher);
- }
-
- if (!mStopped) {
- mDesktopItemsLoaded = true;
- }
- mRunning = false;
- }
- }
-
- private static void loadLiveFolderIcon(Launcher launcher, Cursor c, int iconTypeIndex,
- int iconPackageIndex, int iconResourceIndex, LiveFolderInfo liveFolderInfo) {
-
- int iconType = c.getInt(iconTypeIndex);
- switch (iconType) {
- case LauncherSettings.Favorites.ICON_TYPE_RESOURCE:
- String packageName = c.getString(iconPackageIndex);
- String resourceName = c.getString(iconResourceIndex);
- PackageManager packageManager = launcher.getPackageManager();
- try {
- Resources resources = packageManager.getResourcesForApplication(packageName);
- final int id = resources.getIdentifier(resourceName, null, null);
- liveFolderInfo.icon = resources.getDrawable(id);
- } catch (Exception e) {
- liveFolderInfo.icon =
- launcher.getResources().getDrawable(R.drawable.ic_launcher_folder);
- }
- liveFolderInfo.iconResource = new Intent.ShortcutIconResource();
- liveFolderInfo.iconResource.packageName = packageName;
- liveFolderInfo.iconResource.resourceName = resourceName;
- break;
- default:
- liveFolderInfo.icon =
- launcher.getResources().getDrawable(R.drawable.ic_launcher_folder);
- }
- }
-
- /**
- * Finds the user folder defined by the specified id.
- *
- * @param id The id of the folder to look for.
- *
- * @return A UserFolderInfo if the folder exists or null otherwise.
- */
- FolderInfo findFolderById(long id) {
- return mFolders.get(id);
- }
-
- void addFolder(FolderInfo info) {
- mFolders.put(info.id, info);
- }
-
- /**
- * Return an existing UserFolderInfo object if we have encountered this ID previously, or make a
- * new one.
- */
- private UserFolderInfo findOrMakeUserFolder(HashMap<Long, FolderInfo> folders, long id) {
- // See if a placeholder was created for us already
- FolderInfo folderInfo = folders.get(id);
- if (folderInfo == null || !(folderInfo instanceof UserFolderInfo)) {
- // No placeholder -- create a new instance
- folderInfo = new UserFolderInfo();
- folders.put(id, folderInfo);
- }
- return (UserFolderInfo) folderInfo;
- }
-
- /**
- * Return an existing UserFolderInfo object if we have encountered this ID previously, or make a
- * new one.
- */
- private LiveFolderInfo findOrMakeLiveFolder(HashMap<Long, FolderInfo> folders, long id) {
- // See if a placeholder was created for us already
- FolderInfo folderInfo = folders.get(id);
- if (folderInfo == null || !(folderInfo instanceof LiveFolderInfo)) {
- // No placeholder -- create a new instance
- folderInfo = new LiveFolderInfo();
- folders.put(id, folderInfo);
- }
- return (LiveFolderInfo) folderInfo;
- }
-
- /**
- * Remove the callback for the cached drawables or we leak the previous
- * Home screen on orientation change.
- */
- void unbind() {
- mApplicationsAdapter = null;
- unbindAppDrawables(mApplications);
- unbindDrawables(mDesktopItems);
- }
-
- /**
- * Remove the callback for the cached drawables or we leak the previous
- * Home screen on orientation change.
- */
- private void unbindDrawables(ArrayList<ItemInfo> desktopItems) {
- if (desktopItems != null) {
- final int count = desktopItems.size();
- for (int i = 0; i < count; i++) {
- ItemInfo item = desktopItems.get(i);
- switch (item.itemType) {
- case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
- case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
- ((ApplicationInfo)item).icon.setCallback(null);
- }
- }
- }
- }
-
- /**
- * Remove the callback for the cached drawables or we leak the previous
- * Home screen on orientation change.
- */
- private void unbindAppDrawables(ArrayList<ApplicationInfo> applications) {
- if (applications != null) {
- final int count = applications.size();
- for (int i = 0; i < count; i++) {
- applications.get(i).icon.setCallback(null);
- }
- }
- }
-
- /**
- * @return The current list of applications
- */
- public ArrayList<ApplicationInfo> getApplications() {
- return mApplications;
- }
-
- /**
- * @return The current list of applications
- */
- public ApplicationsAdapter getApplicationsAdapter() {
- return mApplicationsAdapter;
- }
-
- /**
- * @return The current list of desktop items
- */
- public ArrayList<ItemInfo> getDesktopItems() {
- return mDesktopItems;
- }
-
- /**
- * Add an item to the desktop
- * @param info
- */
- public void addDesktopItem(ItemInfo info) {
- // TODO: write to DB; also check that folder has been added to folders list
- mDesktopItems.add(info);
- }
-
- /**
- * Remove an item from the desktop
- * @param info
- */
- public void removeDesktopItem(ItemInfo info) {
- // TODO: write to DB; figure out if we should remove folder from folders list
- mDesktopItems.remove(info);
- }
-
- /**
- * Make an ApplicationInfo object for an application
- */
- private static ApplicationInfo getApplicationInfo(PackageManager manager, Intent intent) {
- final ResolveInfo resolveInfo = manager.resolveActivity(intent, 0);
-
- if (resolveInfo == null) {
- return null;
- }
-
- final ApplicationInfo info = new ApplicationInfo();
- final ActivityInfo activityInfo = resolveInfo.activityInfo;
- info.icon = activityInfo.loadIcon(manager);
- if (info.title == null || info.title.length() == 0) {
- info.title = activityInfo.loadLabel(manager);
- }
- if (info.title == null) {
- info.title = "";
- }
- info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
- return info;
- }
-
- /**
- * Make an ApplicationInfo object for a sortcut
- */
- private ApplicationInfo getApplicationInfoShortcut(Cursor c, Launcher launcher,
- int iconTypeIndex, int iconPackageIndex, int iconResourceIndex, int iconIndex) {
-
- final ApplicationInfo info = new ApplicationInfo();
- info.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
-
- int iconType = c.getInt(iconTypeIndex);
- switch (iconType) {
- case LauncherSettings.Favorites.ICON_TYPE_RESOURCE:
- String packageName = c.getString(iconPackageIndex);
- String resourceName = c.getString(iconResourceIndex);
- PackageManager packageManager = launcher.getPackageManager();
- try {
- Resources resources = packageManager.getResourcesForApplication(packageName);
- final int id = resources.getIdentifier(resourceName, null, null);
- info.icon = resources.getDrawable(id);
- } catch (Exception e) {
- info.icon = packageManager.getDefaultActivityIcon();
- }
- info.iconResource = new Intent.ShortcutIconResource();
- info.iconResource.packageName = packageName;
- info.iconResource.resourceName = resourceName;
- info.customIcon = false;
- break;
- case LauncherSettings.Favorites.ICON_TYPE_BITMAP:
- byte[] data = c.getBlob(iconIndex);
- Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
- info.icon = new FastBitmapDrawable(
- Utilities.createBitmapThumbnail(bitmap, launcher));
- info.filtered = true;
- info.customIcon = true;
- break;
- default:
- info.icon = launcher.getPackageManager().getDefaultActivityIcon();
- info.customIcon = false;
- break;
- }
- return info;
- }
-
- /**
- * Remove an item from the in-memory represention of a user folder. Does not change the DB.
- */
- void removeUserFolderItem(UserFolderInfo folder, ItemInfo info) {
- //noinspection SuspiciousMethodCalls
- folder.contents.remove(info);
- }
-
- /**
- * Removes a UserFolder from the in-memory list of folders. Does not change the DB.
- * @param userFolderInfo
- */
- void removeUserFolder(UserFolderInfo userFolderInfo) {
- mFolders.remove(userFolderInfo.id);
- }
-
- /**
- * Adds an item to the DB if it was not created previously, or move it to a new
- * <container, screen, cellX, cellY>
- */
- static void addOrMoveItemInDatabase(Context context, ItemInfo item, long container,
- int screen, int cellX, int cellY) {
- if (item.container == ItemInfo.NO_ID) {
- // From all apps
- addItemToDatabase(context, item, container, screen, cellX, cellY, false);
- } else {
- // From somewhere else
- moveItemInDatabase(context, item, container, screen, cellX, cellY);
- }
- }
-
- /**
- * Move an item in the DB to a new <container, screen, cellX, cellY>
- */
- static void moveItemInDatabase(Context context, ItemInfo item, long container, int screen,
- int cellX, int cellY) {
- item.container = container;
- item.screen = screen;
- item.cellX = cellX;
- item.cellY = cellY;
-
- final ContentValues values = new ContentValues();
- final ContentResolver cr = context.getContentResolver();
-
- values.put(LauncherSettings.Favorites.CONTAINER, item.container);
- values.put(LauncherSettings.Favorites.CELLX, item.cellX);
- values.put(LauncherSettings.Favorites.CELLY, item.cellY);
- values.put(LauncherSettings.Favorites.SCREEN, item.screen);
-
- cr.update(LauncherSettings.Favorites.getContentUri(item.id, false), values, null, null);
- }
-
- /**
- * Returns true if the shortcuts already exists in the database.
- * we identify a shortcut by its title and intent.
- */
- static boolean shortcutExists(Context context, String title, Intent intent) {
- final ContentResolver cr = context.getContentResolver();
- Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI,
- new String[] { "title", "intent" }, "title=? and intent=?",
- new String[] { title, intent.toURI() }, null);
- boolean result = false;
- try {
- result = c.moveToFirst();
- } finally {
- c.close();
- }
- return result;
- }
-
- FolderInfo getFolderById(Context context, long id) {
- final ContentResolver cr = context.getContentResolver();
- Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI, null,
- "_id=? and itemType=? or itemType=?",
- new String[] { String.valueOf(id),
- String.valueOf(LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER),
- String.valueOf(LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER) }, null);
-
- try {
- if (c.moveToFirst()) {
- final int itemTypeIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ITEM_TYPE);
- final int titleIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.TITLE);
- final int containerIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CONTAINER);
- final int screenIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SCREEN);
- final int cellXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLX);
- final int cellYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLY);
-
- FolderInfo folderInfo = null;
- switch (c.getInt(itemTypeIndex)) {
- case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
- folderInfo = findOrMakeUserFolder(mFolders, id);
- break;
- case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER:
- folderInfo = findOrMakeLiveFolder(mFolders, id);
- break;
- }
-
- folderInfo.title = c.getString(titleIndex);
- folderInfo.id = id;
- folderInfo.container = c.getInt(containerIndex);
- folderInfo.screen = c.getInt(screenIndex);
- folderInfo.cellX = c.getInt(cellXIndex);
- folderInfo.cellY = c.getInt(cellYIndex);
-
- return folderInfo;
- }
- } finally {
- c.close();
- }
-
- return null;
- }
-
- /**
- * Add an item to the database in a specified container. Sets the container, screen, cellX and
- * cellY fields of the item. Also assigns an ID to the item.
- */
- static void addItemToDatabase(Context context, ItemInfo item, long container,
- int screen, int cellX, int cellY, boolean notify) {
- item.container = container;
- item.screen = screen;
- item.cellX = cellX;
- item.cellY = cellY;
-
- final ContentValues values = new ContentValues();
- final ContentResolver cr = context.getContentResolver();
-
- item.onAddToDatabase(values);
-
- Uri result = cr.insert(notify ? LauncherSettings.Favorites.CONTENT_URI :
- LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION, values);
-
- if (result != null) {
- item.id = Integer.parseInt(result.getPathSegments().get(1));
- }
- }
-
- /**
- * Update an item to the database in a specified container.
- */
- static void updateItemInDatabase(Context context, ItemInfo item) {
- final ContentValues values = new ContentValues();
- final ContentResolver cr = context.getContentResolver();
-
- item.onAddToDatabase(values);
-
- cr.update(LauncherSettings.Favorites.getContentUri(item.id, false), values, null, null);
- }
-
- /**
- * Removes the specified item from the database
- * @param context
- * @param item
- */
- static void deleteItemFromDatabase(Context context, ItemInfo item) {
- final ContentResolver cr = context.getContentResolver();
-
- cr.delete(LauncherSettings.Favorites.getContentUri(item.id, false), null, null);
- }
-
-
- /**
- * Remove the contents of the specified folder from the database
- */
- static void deleteUserFolderContentsFromDatabase(Context context, UserFolderInfo info) {
- final ContentResolver cr = context.getContentResolver();
-
- cr.delete(LauncherSettings.Favorites.getContentUri(info.id, false), null, null);
- cr.delete(LauncherSettings.Favorites.CONTENT_URI,
- LauncherSettings.Favorites.CONTAINER + "=" + info.id, null);
- }
-}