/* * 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.launcher2; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.widget.Toast; import com.android.launcher.R; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class UninstallShortcutReceiver extends BroadcastReceiver { private static final String ACTION_UNINSTALL_SHORTCUT = "com.android.launcher.action.UNINSTALL_SHORTCUT"; // The set of shortcuts that are pending uninstall private static ArrayList mUninstallQueue = new ArrayList(); // Determines whether to defer uninstalling shortcuts immediately until // disableAndFlushUninstallQueue() is called. private static boolean mUseUninstallQueue = false; private static class PendingUninstallShortcutInfo { Intent data; public PendingUninstallShortcutInfo(Intent rawData) { data = rawData; } } public void onReceive(Context context, Intent data) { if (!ACTION_UNINSTALL_SHORTCUT.equals(data.getAction())) { return; } PendingUninstallShortcutInfo info = new PendingUninstallShortcutInfo(data); if (mUseUninstallQueue) { mUninstallQueue.add(info); } else { processUninstallShortcut(context, info); } } static void enableUninstallQueue() { mUseUninstallQueue = true; } static void disableAndFlushUninstallQueue(Context context) { mUseUninstallQueue = false; Iterator iter = mUninstallQueue.iterator(); while (iter.hasNext()) { processUninstallShortcut(context, iter.next()); iter.remove(); } } private static void processUninstallShortcut(Context context, PendingUninstallShortcutInfo pendingInfo) { String spKey = LauncherApplication.getSharedPreferencesKey(); SharedPreferences sharedPrefs = context.getSharedPreferences(spKey, Context.MODE_PRIVATE); final Intent data = pendingInfo.data; LauncherApplication app = (LauncherApplication) context.getApplicationContext(); synchronized (app) { removeShortcut(context, data, sharedPrefs); } } private static void removeShortcut(Context context, Intent data, final SharedPreferences sharedPrefs) { Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); boolean duplicate = data.getBooleanExtra(Launcher.EXTRA_SHORTCUT_DUPLICATE, true); if (intent != null && name != null) { final ContentResolver cr = context.getContentResolver(); Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI, new String[] { LauncherSettings.Favorites._ID, LauncherSettings.Favorites.INTENT }, LauncherSettings.Favorites.TITLE + "=?", new String[] { name }, null); final int intentIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.INTENT); final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID); boolean changed = false; try { while (c.moveToNext()) { try { if (intent.filterEquals(Intent.parseUri(c.getString(intentIndex), 0))) { final long id = c.getLong(idIndex); final Uri uri = LauncherSettings.Favorites.getContentUri(id, false); cr.delete(uri, null, null); changed = true; if (!duplicate) { break; } } } catch (URISyntaxException e) { // Ignore } } } finally { c.close(); } if (changed) { cr.notifyChange(LauncherSettings.Favorites.CONTENT_URI, null); Toast.makeText(context, context.getString(R.string.shortcut_uninstalled, name), Toast.LENGTH_SHORT).show(); } // Remove any items due to be animated boolean appRemoved; Set newApps = new HashSet(); newApps = sharedPrefs.getStringSet(InstallShortcutReceiver.NEW_APPS_LIST_KEY, newApps); synchronized (newApps) { do { appRemoved = newApps.remove(intent.toUri(0).toString()); } while (appRemoved); } if (appRemoved) { final Set savedNewApps = newApps; new Thread("setNewAppsThread-remove") { public void run() { synchronized (savedNewApps) { SharedPreferences.Editor editor = sharedPrefs.edit(); editor.putStringSet(InstallShortcutReceiver.NEW_APPS_LIST_KEY, savedNewApps); if (savedNewApps.isEmpty()) { // Reset the page index if there are no more items editor.putInt(InstallShortcutReceiver.NEW_APPS_PAGE_KEY, -1); } editor.commit(); } } }.start(); } } } }