1、情景描述
Android12,mtk平台,Launcher是抽屉模式。测试人员发现,从二级菜单拖曳应用图标到主屏时会出现重复的情况。
2、解决
路径:/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
@Override
public boolean acceptDrop(DragObject d) {
// If it's an external drop (e.g. from All Apps), check if it should be accepted
CellLayout dropTargetLayout = mDropToLayout;
if (d.dragSource != this) {
// Don't accept the drop if we're not over a screen at time of drop
if (dropTargetLayout == null) {
return false;
}
if (d.dragInfo.id != ItemInfo.NO_ID){
mIsItemLeaveFromFolder = true;
} else {
mIsItemLeaveFromFolder = false;
}
if(isTargetItemExistInDatabase(getContext(), d.dragInfo.getTargetPackage().toString()) && !mIsItemLeaveFromFolder) {
return false;
}
if (!transitionStateShouldAllowDrop()) {
return false;
}
上述方法中,通过if(isTargetItemExistInDatabase(getContext(), d.dragInfo.getTargetPackage().toString()) && !mIsItemLeaveFromFolder)来进行判断,具体方法如下:
private boolean isTargetItemExistInDatabase(Context context, String targetTitle){
Uri uri = LauncherSettings.Favorites.CONTENT_URI;
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
if (cursor.moveToFirst()){
do{
String intent = cursor.getString(cursor.getColumnIndexOrThrow(LauncherSettings.Favorites.INTENT));
String packageName = getPackageName(intent);
if (packageName != null){
if (packageName.equals(targetTitle)){
cursor.close();
return true;
}
}
}while (cursor.moveToNext());
}
cursor.close();
return false;
}
private String getPackageName(String intent){
String packageName = null;
if(!TextUtils.isEmpty(intent)){
if(intent.contains("component=") && intent.contains(";")){
String[] array = intent.split(";");
for(String str : array){
if(str.contains("component=")){
String[] array2 = str.split("=");
String[] array3 = array2[1].split("/");
packageName = array3[0];
return packageName;
}
}
}
}
return packageName;
}
**上述判断中,重点是通过包名进行比较,包名是唯一的,保证不会出错。
如果是通过应用名称进行比较的话,在切换系统语言后,可能依旧会出现上述问题**
注:上述获取报名时,对获得的intent数据解析有点繁琐,暂时没找到快速方法。大家在使用时,如果有
快速方法,请千万告知一下,谢谢!