auto import from //branches/cupcake_rel/...@138607

This commit is contained in:
The Android Open Source Project 2009-03-13 13:04:24 -07:00
parent 7376faefbb
commit ca9475f040
5 changed files with 111 additions and 90 deletions

View File

@ -273,8 +273,9 @@ public final class Launcher extends Activity implements View.OnClickListener, On
}
private void startLoaders() {
sModel.loadApplications(true, this, mLocaleChanged);
sModel.loadUserItems(!mLocaleChanged, this, mLocaleChanged, true);
boolean loadApplications = sModel.loadApplications(true, this, mLocaleChanged);
sModel.loadUserItems(!mLocaleChanged, this, mLocaleChanged, loadApplications);
mRestoring = false;
}
@ -352,16 +353,6 @@ public final class Launcher extends Activity implements View.OnClickListener, On
closeDrawer(false);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
boolean handled = super.onKeyUp(keyCode, event);
if (keyCode == KeyEvent.KEYCODE_SEARCH) {
handled = mWorkspace.snapToSearch();
if (handled) closeDrawer(true);
}
return handled;
}
private boolean acceptFilter() {
final InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
@ -882,11 +873,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On
startWallpaper();
return true;
case MENU_SEARCH:
if (mWorkspace.snapToSearch()) {
closeDrawer(true); // search widget: get drawer out of the way
} else {
onSearchRequested(); // no search widget: use system search UI
}
onSearchRequested();
return true;
case MENU_NOTIFICATIONS:
showNotifications();
@ -896,6 +883,16 @@ public final class Launcher extends Activity implements View.OnClickListener, On
return super.onOptionsItemSelected(item);
}
@Override
public boolean onSearchRequested() {
if (mWorkspace.snapToSearch()) {
closeDrawer(true); // search widget: get drawer out of the way
return true;
} else {
return super.onSearchRequested(); // no search widget: use system search UI
}
}
private void addItems() {
showAddDialog(mMenuAddInfo);
}
@ -1166,8 +1163,8 @@ public final class Launcher extends Activity implements View.OnClickListener, On
void onDesktopItemsLoaded() {
if (mDestroyed) return;
mAllAppsGrid.setAdapter(Launcher.getModel().getApplicationsAdapter());
android.util.Log.d("Home", "setting grid adapter");
mAllAppsGrid.setAdapter(sModel.getApplicationsAdapter());
bindDesktopItems();
}
@ -1467,6 +1464,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On
if (cellInfo.cell == null) {
if (cellInfo.valid) {
// User long pressed on empty space
mWorkspace.setAllowLongPress(false);
showAddDialog(cellInfo);
}
} else {
@ -1745,6 +1743,8 @@ public final class Launcher extends Activity implements View.OnClickListener, On
@Override
public void onReceive(Context context, Intent intent) {
boolean reloadWorkspace = false;
android.util.Log.d("Home", "application intent received: " + intent.getAction());
android.util.Log.d("Home", " --> " + intent.getData());
if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
removeShortcutsForPackage(intent.getData().getSchemeSpecificPart());
@ -1753,10 +1753,11 @@ public final class Launcher extends Activity implements View.OnClickListener, On
}
}
removeDialog(DIALOG_CREATE_SHORTCUT);
sModel.dropApplicationCache();
if (!reloadWorkspace) {
android.util.Log.d("Home", " --> loading apps");
sModel.loadApplications(false, Launcher.this, false);
} else {
android.util.Log.d("Home", " --> loading workspace");
sModel.loadUserItems(false, Launcher.this, false, true);
}
}

View File

@ -66,17 +66,18 @@ public class LauncherModel {
private ApplicationsAdapter mApplicationsAdapter;
private ApplicationsLoader mApplicationsLoader;
private DesktopItemsLoader mDesktopItemsLoader;
private Thread mLoader;
private Thread mDesktopLoader;
private Thread mApplicationsLoaderThread;
private Thread mDesktopLoaderThread;
private final HashMap<ComponentName, ApplicationInfo> mAppInfoCache =
new HashMap<ComponentName, ApplicationInfo>(INITIAL_ICON_CACHE_CAPACITY);
void abortLoaders() {
synchronized void abortLoaders() {
if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) {
mApplicationsLoader.stop();
mApplicationsLoaded = false;
}
if (mDesktopItemsLoader != null && mDesktopItemsLoader.isRunning()) {
mDesktopItemsLoader.stop();
mDesktopItemsLoaded = false;
@ -94,44 +95,62 @@ public class LauncherModel {
/**
* Loads the list of installed applications in mApplications.
*
* @return true if the applications loader must be started
* (see startApplicationsLoader()), false otherwise.
*/
synchronized void loadApplications(boolean isLaunching, Launcher launcher,
synchronized boolean loadApplications(boolean isLaunching, Launcher launcher,
boolean localeChanged) {
if (localeChanged) {
dropApplicationCache();
}
android.util.Log.d("Home", "load applications");
if (isLaunching && mApplicationsLoaded && !localeChanged) {
mApplicationsAdapter = new ApplicationsAdapter(launcher, mApplications);
return;
android.util.Log.d("Home", " --> applications loaded, return");
return false;
}
waitForApplicationsLoader();
if (localeChanged) {
dropApplicationCache();
}
if (mApplicationsAdapter == null || isLaunching || localeChanged) {
mApplications = new ArrayList<ApplicationInfo>(DEFAULT_APPLICATIONS_NUMBER);
mApplicationsAdapter = new ApplicationsAdapter(launcher, mApplications);
}
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);
return false;
}
return true;
}
private synchronized void waitForApplicationsLoader() {
if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) {
android.util.Log.d("Home", " --> wait for applications loader");
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 {
mApplicationsLoaderThread.join(APPLICATION_NOT_RESPONDING_TIMEOUT);
} catch (InterruptedException e) {
// EMpty
}
}
}
private void startApplicationsLoader(Launcher launcher) {
private synchronized void startApplicationsLoader(Launcher launcher) {
android.util.Log.d("Home", " --> starting applications loader");
waitForApplicationsLoader();
mApplicationsLoader = new ApplicationsLoader(launcher);
mLoader = new Thread(mApplicationsLoader, "Applications Loader");
mLoader.start();
mApplicationsLoaderThread = new Thread(mApplicationsLoader, "Applications Loader");
mApplicationsLoaderThread.start();
}
private class ApplicationsLoader implements Runnable {
@ -168,7 +187,7 @@ public class LauncherModel {
final int count = apps.size();
final ApplicationsAdapter applicationList = mApplicationsAdapter;
final ChangeNotifier action = new ChangeNotifier(applicationList, launcher);
ChangeNotifier action = new ChangeNotifier(applicationList, true);
final HashMap<ComponentName, ApplicationInfo> appInfoCache = mAppInfoCache;
for (int i = 0; i < count && !mStopped; i++) {
@ -194,8 +213,13 @@ public class LauncherModel {
appInfoCache.put(componentName, application);
}
action.add(application);
if (action.add(application)) {
launcher.runOnUiThread(action);
action = new ChangeNotifier(applicationList, false);
}
}
launcher.runOnUiThread(action);
}
if (!mStopped) {
@ -207,15 +231,13 @@ public class LauncherModel {
private static class ChangeNotifier implements Runnable, Comparator<ApplicationInfo> {
private final ApplicationsAdapter mApplicationList;
private final Launcher mLauncher;
private final ArrayList<ApplicationInfo> mBuffer;
private final Object mLock = new Object();
private boolean mFirst = true;
ChangeNotifier(ApplicationsAdapter applicationList, Launcher launcher) {
ChangeNotifier(ApplicationsAdapter applicationList, boolean first) {
mApplicationList = applicationList;
mLauncher = launcher;
mFirst = first;
mBuffer = new ArrayList<ApplicationInfo>(UI_NOTIFICATION_RATE);
}
@ -228,30 +250,24 @@ public class LauncherModel {
mFirst = false;
}
synchronized (mLock) {
final ArrayList<ApplicationInfo> buffer = mBuffer;
final int count = buffer.size();
final ArrayList<ApplicationInfo> buffer = mBuffer;
final int count = buffer.size();
for (int i = 0; i < count; i++) {
applicationList.setNotifyOnChange(false);
applicationList.add(buffer.get(i));
}
buffer.clear();
for (int i = 0; i < count; i++) {
applicationList.setNotifyOnChange(false);
applicationList.add(buffer.get(i));
}
buffer.clear();
applicationList.sort(this);
applicationList.notifyDataSetChanged();
}
synchronized void add(ApplicationInfo application) {
synchronized (mLock) {
final ArrayList<ApplicationInfo> buffer = mBuffer;
buffer.add(application);
if (buffer.size() >= UI_NOTIFICATION_RATE) {
mLauncher.runOnUiThread(this);
}
}
boolean add(ApplicationInfo application) {
final ArrayList<ApplicationInfo> buffer = mBuffer;
buffer.add(application);
return buffer.size() >= UI_NOTIFICATION_RATE;
}
public final int compare(ApplicationInfo a, ApplicationInfo b) {
@ -269,8 +285,10 @@ public class LauncherModel {
*/
void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged,
boolean loadApplications) {
android.util.Log.d("Home", "loading user items");
if (isLaunching && isDesktopLoaded()) {
android.util.Log.d("Home", " --> items loaded, return");
if (loadApplications) startApplicationsLoader(launcher);
// We have already loaded our data from the DB
launcher.onDesktopItemsLoaded();
@ -282,16 +300,17 @@ public class LauncherModel {
// 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);
mDesktopLoaderThread.join(APPLICATION_NOT_RESPONDING_TIMEOUT);
} catch (InterruptedException e) {
// Empty
}
}
android.util.Log.d("Home", " --> starting workspace loader");
mDesktopItemsLoaded = false;
mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged, loadApplications);
mDesktopLoader = new Thread(mDesktopItemsLoader, "Desktop Items Loader");
mDesktopLoader.start();
mDesktopLoaderThread = new Thread(mDesktopItemsLoader, "Desktop Items Loader");
mDesktopLoaderThread.start();
}
private static void updateShortcutLabels(ContentResolver resolver, PackageManager manager) {
@ -745,28 +764,21 @@ public class LauncherModel {
/**
* @return The current list of applications
*/
public ArrayList<ApplicationInfo> getApplications() {
return mApplications;
}
/**
* @return The current list of applications
*/
public ApplicationsAdapter getApplicationsAdapter() {
ApplicationsAdapter getApplicationsAdapter() {
return mApplicationsAdapter;
}
/**
* @return The current list of desktop items
*/
public ArrayList<ItemInfo> getDesktopItems() {
ArrayList<ItemInfo> getDesktopItems() {
return mDesktopItems;
}
/**
* @return The current list of desktop items
*/
public ArrayList<LauncherAppWidgetInfo> getDesktopAppWidgets() {
ArrayList<LauncherAppWidgetInfo> getDesktopAppWidgets() {
return mDesktopAppWidgets;
}
@ -774,7 +786,7 @@ public class LauncherModel {
* Add an item to the desktop
* @param info
*/
public void addDesktopItem(ItemInfo info) {
void addDesktopItem(ItemInfo info) {
// TODO: write to DB; also check that folder has been added to folders list
mDesktopItems.add(info);
}
@ -783,7 +795,7 @@ public class LauncherModel {
* Remove an item from the desktop
* @param info
*/
public void removeDesktopItem(ItemInfo info) {
void removeDesktopItem(ItemInfo info) {
// TODO: write to DB; figure out if we should remove folder from folders list
mDesktopItems.remove(info);
}
@ -791,14 +803,14 @@ public class LauncherModel {
/**
* Add a widget to the desktop
*/
public void addDesktopAppWidget(LauncherAppWidgetInfo info) {
void addDesktopAppWidget(LauncherAppWidgetInfo info) {
mDesktopAppWidgets.add(info);
}
/**
* Remove a widget from the desktop
*/
public void removeDesktopAppWidget(LauncherAppWidgetInfo info) {
void removeDesktopAppWidget(LauncherAppWidgetInfo info) {
mDesktopAppWidgets.remove(info);
}

View File

@ -55,7 +55,7 @@ public class LauncherProvider extends ContentProvider {
private static final String DATABASE_NAME = "launcher.db";
private static final int DATABASE_VERSION = 2;
private static final int DATABASE_VERSION = 3;
static final String AUTHORITY = "com.android.launcher.settings";
@ -200,7 +200,7 @@ public class LauncherProvider extends ContentProvider {
"spanX INTEGER," +
"spanY INTEGER," +
"itemType INTEGER," +
"gadgetId INTEGER NOT NULL DEFAULT -1," +
"appWidgetId INTEGER NOT NULL DEFAULT -1," +
"isShortcut INTEGER," +
"iconType INTEGER," +
"iconPackage TEXT," +
@ -320,15 +320,15 @@ public class LauncherProvider extends ContentProvider {
if (LOGD) Log.d(LOG_TAG, "onUpgrade triggered");
int version = oldVersion;
if (version == 1) {
// upgrade 1 -> 2 added appWidgetId column
if (version < 3) {
// upgrade 1,2 -> 3 added appWidgetId column
db.beginTransaction();
try {
// Insert new column for holding appWidgetIds
db.execSQL("ALTER TABLE favorites " +
"ADD COLUMN gadgetId INTEGER NOT NULL DEFAULT -1;");
"ADD COLUMN appWidgetId INTEGER NOT NULL DEFAULT -1;");
db.setTransactionSuccessful();
version = 2;
version = 3;
} catch (SQLException ex) {
// Old version remains, which means we wipe old data
Log.e(LOG_TAG, ex.getMessage(), ex);
@ -337,7 +337,7 @@ public class LauncherProvider extends ContentProvider {
}
// Convert existing widgets only if table upgrade was successful
if (version == 2) {
if (version == 3) {
convertWidgets(db);
}
}

View File

@ -172,7 +172,7 @@ class LauncherSettings {
*
* <P>Type: INTEGER</P>
*/
static final String APPWIDGET_ID = "gadgetId";
static final String APPWIDGET_ID = "appWidgetId";
/**
* Indicates whether this favorite is an application-created shortcut or not.

View File

@ -1195,6 +1195,14 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag
public boolean allowLongPress() {
return mAllowLongPress;
}
/**
* Set true to allow long-press events to be triggered, usually checked by
* {@link Launcher} to accept or block dpad-initiated long-presses.
*/
public void setAllowLongPress(boolean allowLongPress) {
mAllowLongPress = allowLongPress;
}
void removeShortcutsForPackage(String packageName) {
final ArrayList<View> childrenToRemove = new ArrayList<View>();