将原生的Launcher修改成类似MiUi样式的Launcher
上面这个是原生的
上面这个是我们要修改的成果
原生的Launcher已4.2.2版本为base,需要更改一下的几点:
1. Workspace
原生:workspace是存放的App的快捷方式(shortcut)
新生:workspace显示了已经安装的App
2. App的删除方式
原生:在workspace中按住App的快捷方式后,出现Remove的标识,将快捷方式移动到Remove是删除App的快捷方式,并不会卸载此App
新生:在workspace按住App的快捷方式后,出现删除的提示,将App移动到删除提示后,是将此App卸载。
3. 在worksapce中默认是加载的快捷方式,但是原生的App并不一定都是快捷方式,所以需要在Launcher第一次运行的时候,将AllApps加载为Shortcut
那么开始改吧:
1.首先在LauncherModel.java文件中添加一个新类AlreadyInDesktopApps,记录哪些App已经在Desktop上,以及哪个screen已经存在Shortcut
public class AlreadyInDesktopApps {
List<Integer> screenList = null;
List<ShortcutFlag> shortcutFlagList = null;
AlreadyInDesktopApp() {
screenList = new ArrayList<Integer>();
shortcutFlagList = new ArrayList<ShortcutFlag>();
}
public void addScreen(int screen) {
if (!isExistedScreen(screen)) {
screenList.add(screen);
}
}
public List<Integer> getScreens() {
return screenList;
}
public void addShortcutFlag(String packegName, String componentName) {
ShortcutFlag shortcutFlag = new ShortcutFlag(packegName,
componentName);
if (!isExistedShortcutFlag(shortcutFlag)) {
shortcutFlagList.add(shortcutFlag);
}
}
public boolean isExistedScreen(int screen) {
return screenList.contains(screen);
}
public boolean isExistedShortcutFlag(ShortcutFlag shortcutFlag) {
return shortcutFlagList.contains(shortcutFlag);
}
public boolean isExistedShortcutFlag(String packegName,
String componentName) {
ShortcutFlag shortcutFlag = new ShortcutFlag(packegName,
componentName);
return shortcutFlagList.contains(shortcutFlag);
}
private class ShortcutFlag {
String packegName;
String componentName;
public ShortcutFlag(String packegName, String componentName) {
this.packegName = packegName;
this.componentName = componentName;
}
@Override
public boolean equals(Object o) {
if (o instanceof ShortcutFlag) {
ShortcutFlag appFlag = (ShortcutFlag) o;
if (appFlag.packegName.equals(packegName)
&& appFlag.componentName.equals(componentName)) {
return true;
}
}
return false;
}
}
}
在LauncherModel.java中添加函数loadNotInDesktopAllAppsByBatch
private void loadNotInDesktopAllAppsByBatch() {
final Callbacks oldCallbacks = mCallbacks.get();
if (oldCallbacks == null) {
return;
}
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final PackageManager packageManager = mContext.getPackageManager();
List<ResolveInfo> apps = null;
int N = Integer.MAX_VALUE;
int cellCountX = LauncherModel.getCellCountX();
int cellCountY = LauncherModel.getCellCountY();
int maxItemNumOnePage = cellCount