【Launcher3系列】 Android 11 Launcher3 在workspace中隐藏单个APP

本文介绍了在Android 11的Launcher3中如何在workspace隐藏特定APP图标的详细方法,包括在AddWorkspaceItemsTask中过滤添加项以及在BaseLoaderResults中处理更新时的隐藏逻辑。
摘要由CSDN通过智能技术生成
1. 概述

Android系统的Launcher改造在国内算是一个不算很低频的需求,尤其是相当多的三方硬件设备以及部分手机厂商的个性化ROM等,受限于国内整体的开源环境,网上能找到相关的开发资源并不多,最近公司有相关业务需求的开发,就自己涉及到的改造点作一些分享。

我也在网上找过很多博文,如何隐藏单个APP的图标展示,提供的修改方法包括更改AppFilter的shouldShowApp方法修改LoadTask的loadAllApps()方法&添加PackageUpdatedTask的excute方法过滤,但实测发现并不能满足我的要求,尤其是在workspace区域已有该图标的前提下,无法隐藏。经过自己的摸索及追踪源码成功解决。涉及到的改动点如下:

  • 在往workspace区域添加item时,忽略掉需要隐藏的APP,以解决初次加载时的隐藏。

  • 绑定workspace的时机,移除需要隐藏的APP,以解决更新时对该图标的隐藏。

2. 涉及到的类及接口等

主要是改动添加item的任务类AddWorkspaceItemsTask和绑定workspace的result类BaseLoaderResults

com.android.launcher3.model.AddWorkspaceItemsTask
com.android.launcher3.model.BaseLoaderResults
3. Show the code
  • 在添加item任务中添加过滤

    AddWorkspaceItemsTask.java

    public class AddWorkspaceItemsTask extends BaseModelUpdateTask {
    
        private final List<Pair<ItemInfo, Object>> mItemList;
    
        /**
         * @param itemList items to add on the workspace
         */
        public AddWorkspaceItemsTask(List<Pair<ItemInfo, Object>> itemList) {
            mItemList = itemList;
            //少了"设置"、"lawnchair设置",原因在BgDataModel里少了俩
        }
    
        @Override
        public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
            if (mItemList.isEmpty()) {
                return;
            }
    
            final ArrayList<ItemInfo> addedItemsFinal = new ArrayList<>();
            final IntArray addedWorkspaceScreensFinal = new IntArray();
    
            synchronized(dataModel) {
                IntArray workspaceScreens = dataModel.collectWorkspaceScreens();
    
                List<ItemInfo> filteredItems = new ArrayList<>();
                for (Pair<ItemInfo, Object> entry : mItemList) {
                    ItemInfo item = entry.first;
                    Log.e("item=====",item.getTargetComponent().getPackageName() + " , " + item.title);
                    if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION ||
                            item.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
                        // Short-circuit this logic if the icon exists somewhere on the workspace
                        if (shortcutExists(dataModel, item.getIntent(), item.user)) {
                            continue;
                        }
    
                        // b/139663018 Short-circuit this logic if the icon is a system app
                        if (PackageManagerHelper.isSystemApp(app.getContext(), item.getIntent())) {
                            continue;
                        }
    //====修改start====
                        //只能保证新装有用,后续升级加筛选不会生效。
                        if("com.example.aaaa.bbbb".equals(item.getTargetComponent().getPackageName())){
                            continue;
                        }
    //====修改end====
                    }
    
                    if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {
                        if (item instanceof AppInfo) {
                            item = ((AppInfo) item).makeWorkspaceItem();
                        }
                    }
                    if (item != null) {
                        filteredItems.add(item);
                    }
                }
    
                InstallSessionHelper packageInstaller =
                        InstallSessionHelper.INSTANCE.get(app.getContext());
                LauncherApps launcherApps = app.getContext().getSystemService(LauncherApps.class);
    
                for (ItemInfo item : filteredItems) {
                    // Find appropriate space for the item.
                    
                    // ... //
                }
            }
            //...//
        }
    }
    
  • 绑定workspace时过滤

    BaseLoaderResults.java

        /**
         * Binds all loaded data to actual views on the main thread.
         */
        public void bindWorkspace() {
            // Save a copy of all the bg-thread collections
            ArrayList<ItemInfo> workspaceItems = new ArrayList<>();
            ArrayList<LauncherAppWidgetInfo> appWidgets = new ArrayList<>();
            final IntArray orderedScreenIds = new IntArray();
    
            synchronized (mBgDataModel) {
    //====修改start====
                //只能保证更新有用,初次安装反而不会生效。
                mBgDataModel.workspaceItems.removeIf(aI -> "com.example.aaaa.bbbb".equals(aI.getTargetComponent().getPackageName()));
    //====修改end====            
                workspaceItems.addAll(mBgDataModel.workspaceItems);
                appWidgets.addAll(mBgDataModel.appWidgets);
                orderedScreenIds.addAll(mBgDataModel.collectWorkspaceScreens());
                mBgDataModel.lastBindId++;
                mMyBindingId = mBgDataModel.lastBindId;
            }
    
            for (Callbacks cb : mCallbacksList) {
                new WorkspaceBinder(cb, mUiExecutor, mApp, mBgDataModel, mMyBindingId,
                        workspaceItems, appWidgets, orderedScreenIds).bind();
            }
        }
    
4. 结语

在试过了网上找到的解决方法仍无法解决之后,追踪workspace区域的各种加载绑定及展示相关代码,最终找到合适的位置添加过滤逻辑从而解决该问题,供参考。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tried Not Tired

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值