Android12 MTK 二级菜单拖拽图标到主屏时出现图标重复

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数据解析有点繁琐,暂时没找到快速方法。大家在使用时,如果有
    快速方法,请千万告知一下,谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值