private static final String external_workspace = "/system/default_workspace.xml"; //。。。。。 if(mOpenHelper.loadFavoritesFromExternal(mOpenHelper.getWritableDatabase()) == 0){ mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), R.xml.default_workspace); //。。。。DatabaseHelper增加常量 private static final String TAG_OUT_SHORTCUT = "out-shortcut"; private static final String TAG_OUT_FOLDER = "out-folder"; //.... private int loadFavoritesFromExternal(SQLiteDatabase db) { Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_LAUNCHER); ContentValues values = new ContentValues(); PackageManager packageManager = mContext.getPackageManager(); /* int rid = -1; Resources dwRes = null; Context dwCxt = null; try { ArrayList<PackageInfo> list = (ArrayList<PackageInfo>) packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES); // for(int z = 0;z<list.size();z++) {Log.v(TAG, list.get(z).packageName);} dwCxt = mContext.createPackageContext("com.letou.dw", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); dwRes = packageManager.getResourcesForApplication("com.letou.dw"); rid = dwRes.getIdentifier("default_workspace", "xml", "com.letou.dw"); } catch (Exception e) { e.printStackTrace(); } */ int i = 0; boolean hasOutDw = false; try { File f = new File(external_workspace); //System.out.println(" dw " + f.exists()); hasOutDw = f.exists(); } catch(Exception e) { Log.w(TAG, "Got exception parsing favorites.", e); } if(!hasOutDw) return i; try { //System.out.println(" dw "+rid +" " + dwRes); // if(rid != -1 && dwRes != null) parser = dwRes.getXml(rid); XmlPullParser parserOut = Xml.newPullParser(); parserOut.setInput(new FileInputStream("/system/default_workspace.xml"), "UTF-8"); int event = parserOut.getEventType();// 产生第一个事件 while (event != XmlPullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_DOCUMENT:// 判断当前事件是否是文档开始事件 break; case XmlPullParser.START_TAG:// 判断当前事件是否是标签元素开始事件 String name = parserOut.getName(); int attributeCount = parserOut.getAttributeCount(); long container = LauncherSettings.Favorites.CONTAINER_DESKTOP; int type; String screen = null; String x = null; String y = null; String packName = null; String clzName = null; String spanX = null; String spanY = null; String title = null; String icon = null; String uri = null; boolean added = false; for (int z = 0; z < attributeCount; z++) { //System.out.println(" attribute "+ parserOut.getAttributeName(z) + " "+ parserOut.getAttributeValue(z)); String key = parserOut.getAttributeName(z); String value = parserOut.getAttributeValue(z); if("container".equals(key)) { container = Long.valueOf(value); } else if ("screen".equals(key)) { screen = value; } else if ("x".equals(key)) { x = value; } else if ("y".equals(key)) { y = value; } else if ("packageName".equals(key)) { packName = value; } else if ("className".equals(key)) { clzName = value; } else if ("spanX".equals(key)) { spanX = value; } else if ("spanY".equals(key)) { spanY = value; } else if ("title".equals(key)) { title = value; } else if ("icon".equals(key)) { icon = value; } else if ("uri".equals(key)) { uri = value; } } // If we are adding to the hotseat, the screen is used as the position in the // hotseat. This screen can't be at position 0 because AllApps is in the // zeroth position. if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT && Hotseat.isAllAppsButtonRank(Integer.valueOf(screen))) { throw new RuntimeException("Invalid screen position for hotseat item"); } values.clear(); values.put(LauncherSettings.Favorites.CONTAINER, container); values.put(LauncherSettings.Favorites.SCREEN, screen); values.put(LauncherSettings.Favorites.CELLX, x); values.put(LauncherSettings.Favorites.CELLY, y); if (TAG_FAVORITE.equals(name)) { long id = addAppShortcut(db, values, packName, clzName, packageManager, intent); added = id >= 0; } else if (TAG_SEARCH.equals(name)) { added = addSearchWidget(db, values); } else if (TAG_CLOCK.equals(name)) { added = addClockWidget(db, values); } else if (TAG_APPWIDGET.equals(name)) { added = addAppWidget(db, values, new ComponentName(packName, clzName), Integer.valueOf(spanX.trim()), Integer.valueOf(spanY.trim())); } else if (TAG_OUT_SHORTCUT.equals(name)) { long id = addUriShortcut(db, values, uri , title, icon); added = id >= 0; } else if (TAG_OUT_FOLDER.equals(name)) { values.put(LauncherSettings.Favorites.TITLE, title); long folderId = addFolder(db, values); added = folderId >= 0; ArrayList<Long> folderItems = new ArrayList<Long>(); int folderDepth = parserOut.getDepth(); while ((type = parserOut.next()) != XmlPullParser.END_TAG || parserOut.getDepth() > folderDepth) { if (type != XmlPullParser.START_TAG) { continue; } String packNameItem = null; String clzNameItem = null; String titleItem = null; String iconItem = null; String uriItem = null; int itemCount = parserOut.getAttributeCount(); for (int z = 0; z < itemCount; z++) { String key = parserOut.getAttributeName(z); String value = parserOut.getAttributeValue(z); //System.out.println(" ITEM " + key + " " + value); if ("packageName".equals(key)) { packNameItem = value; } else if ("className".equals(key)) { clzNameItem = value; } else if ("title".equals(key)) { titleItem = value; } else if ("icon".equals(key)) { iconItem = value; } else if ("uri".equals(key)) { uriItem = value; } } final String folder_item_name = parserOut.getName(); values.clear(); values.put(LauncherSettings.Favorites.CONTAINER, folderId); if (TAG_FAVORITE.equals(folder_item_name) && folderId >= 0) { long id = addAppShortcut(db, values, packNameItem, clzNameItem, packageManager, intent); if (id >= 0) { folderItems.add(id); } } else if (TAG_OUT_SHORTCUT.equals(folder_item_name) && folderId >= 0) { long id = addUriShortcut(db, values, uriItem, titleItem, iconItem); if (id >= 0) { folderItems.add(id); } } else { throw new RuntimeException("Folders can " + "contain only shortcuts"); } } } if (added) i++; break; case XmlPullParser.END_TAG:// 判断当前事件是否是标签元素结束事件 if (TAG_FAVORITE.equals(parserOut.getName())) {// 判断结束标签元素 } break; } event = parserOut.next();// 进入下一个元素并触发相应事件 }// end while } catch (XmlPullParserException e) { Log.w(TAG, "Got exception parsing favorites.", e); } catch (IOException e) { Log.w(TAG, "Got exception parsing favorites.", e); } catch (RuntimeException e) { Log.w(TAG, "Got exception parsing favorites.", e); } return i; } private long addAppShortcut(SQLiteDatabase db, ContentValues values, String packName, String clzName, PackageManager packageManager, Intent intent) { long id = -1; ActivityInfo info; String packageName = packName; String className = clzName; try { ComponentName cn; try { cn = new ComponentName(packageName, className); info = packageManager.getActivityInfo(cn, 0); } catch (PackageManager.NameNotFoundException nnfe) { String[] packages = packageManager.currentToCanonicalPackageNames( new String[] { packageName }); cn = new ComponentName(packages[0], className); info = packageManager.getActivityInfo(cn, 0); } id = generateNewId(); intent.setComponent(cn); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); values.put(Favorites.INTENT, intent.toUri(0)); values.put(Favorites.TITLE, info.loadLabel(packageManager).toString()); values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_APPLICATION); values.put(Favorites.SPANX, 1); values.put(Favorites.SPANY, 1); values.put(Favorites._ID, generateNewId()); if (dbInsertAndCheck(this, db, TABLE_FAVORITES, null, values) < 0) { return -1; } } catch (PackageManager.NameNotFoundException e) { Log.w(TAG, "Unable to add favorite: " + packageName + "/" + className, e); } return id; } private boolean addAppWidget(SQLiteDatabase db, ContentValues values, ComponentName cn, int spanX, int spanY) { boolean allocatedAppWidgets = false; final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext); try { int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_APPWIDGET); values.put(Favorites.SPANX, spanX); values.put(Favorites.SPANY, spanY); values.put(Favorites.APPWIDGET_ID, appWidgetId); values.put(Favorites._ID, generateNewId()); dbInsertAndCheck(this, db, TABLE_FAVORITES, null, values); allocatedAppWidgets = true; appWidgetManager.bindAppWidgetId(appWidgetId, cn); } catch (RuntimeException ex) { Log.e(TAG, "Problem allocating appWidgetId", ex); } return allocatedAppWidgets; } private long addUriShortcut(SQLiteDatabase db, ContentValues values, String uri, String title, String icon) { Resources r = mContext.getResources(); final int iconResId = R.drawable.ic_launcher_shortcut_browser_bookmark; // final int titleResId = // a.getResourceId(R.styleable.Favorite_title, 0); Intent intent; try { intent = Intent.parseUri(uri, 0); } catch (URISyntaxException e) { Log.w(TAG, "Shortcut has malformed uri: " + uri); return -1; // Oh well } if (iconResId == 0) { // || titleResId == 0) { Log.w(TAG, "Shortcut is missing icon resource ID"); return -1; } long id = generateNewId(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); values.put(Favorites.INTENT, intent.toUri(0)); values.put(Favorites.TITLE, title); values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_SHORTCUT); values.put(Favorites.SPANX, 1); values.put(Favorites.SPANY, 1); values.put(Favorites.ICON_TYPE, Favorites.ICON_TYPE_RESOURCE); values.put(Favorites.ICON_PACKAGE, mContext.getPackageName()); values.put(Favorites.ICON_RESOURCE, r.getResourceName(iconResId)); values.put(Favorites._ID, id); if (dbInsertAndCheck(this, db, TABLE_FAVORITES, null, values) < 0) { return -1; } return id; } }
从外部读取预置桌面布局
猜你喜欢
转载自ccsosnfs.iteye.com/blog/2113469
今日推荐
周排行