work profile关闭时桌面图标变灰

应用变为不可用,图标变灰色,和刚毕业第一家公司当时还是Android4.4版本,Launcher做的图标变色功能有点像:用豌豆荚把安装的应用移动到sd卡,拔掉sd卡,图标变灰色,插入sd卡,应用重新变成彩色。
翻了一下之前的blog,才发现关于插拔sd卡的launcher没有写。好尴尬啊。。。

简单来写一下work profile的Launcher流程吧

操作步骤

1、work profile是Google mada测试的一项,安装Test DPC 之后,Launcher的all apps列表会有一个worp profile的栏目,里面有几个默认的apk带角标。
2、Google的launcher3默认实现了workprofile图标信息的展示
3、拖动图标到桌面,关闭work profile,图标变灰色。

图标更新逻辑

1、app/src/com/tblenovo/launcher/LauncherModel.java中收到work profile关闭的广播

public void onReceive(Context context, Intent intent) {if (DEBUG_RECEIVER) Log.d(TAG, "onReceive intent=" + intent);final String action = intent.getAction();if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {// If we have changed locale we need to clear out the labels in all apps/workspace.forceReload();} else if (Intent.ACTION_MANAGED_PROFILE_ADDED.equals(action)|| Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) {UserManagerCompat.getInstance(context).enableAndResetCache();forceReload();} else if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) ||Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action) ||Intent.ACTION_MANAGED_PROFILE_UNLOCKED.equals(action)) {UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER);if (user != null) {if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) ||Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) {enqueueModelUpdateTask(new PackageUpdatedTask(PackageUpdatedTask.OP_USER_AVAILABILITY_CHANGE, user));}// ACTION_MANAGED_PROFILE_UNAVAILABLE sends the profile back to locked mode, so// we need to run the state change task again.if (Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action) ||Intent.ACTION_MANAGED_PROFILE_UNLOCKED.equals(action)) {enqueueModelUpdateTask(new UserLockStateChangedTask(user));}}}else if (Intent.ACTION_WALLPAPER_CHANGED.equals(action)) {WallpaperBgCompat.getInstance(context.getApplicationContext()).getCompressWallpaper(true);} else if (BaseFlags.IS_DOGFOOD_BUILD && ACTION_FORCE_ROLOAD.equals(action)) {Launcher l = (Launcher) getCallback();l.reload();}}

2、app/src/com/android/launcher/model/PackageUpdatedTask.java中,OP_USER_AVAILABILITY_CHANGE操作,然后更新图标数据。
workprofile像是基于多用户去做的一个功能,默认主用户user 0,workprofile的user 我当时打断点的时候是user 10
3、省略中间的逻辑部分
4、bindUpdatedWorkspaceItems(updatedWorkspaceItems);更新图标
5、app/src/com/android/launcher/Workspace.java的updateShortcuts更新图标

void updateShortcuts(ArrayList<WorkspaceItemInfo> shortcuts) {...mapOverItems(MAP_RECURSE, new ItemOperator() {@Overridepublic boolean evaluate(ItemInfo info, View v) {if (info instanceof WorkspaceItemInfo && v instanceof BubbleTextView &&updates.contains(info)) {WorkspaceItemInfo si = (WorkspaceItemInfo) info;BubbleTextView shortcut = (BubbleTextView) v;Drawable oldIcon = shortcut.getIcon();boolean oldPromiseState = (oldIcon instanceof PreloadIconDrawable)&& ((PreloadIconDrawable) oldIcon).hasNotCompleted();shortcut.applyFromWorkspaceItem(si, si.isPromise() != oldPromiseState);}// process all the shortcutsreturn false;}});...}

6、app/src/com/android/launcher/BubbleTextView.java

public void applyFromWorkspaceItem(WorkspaceItemInfo info, boolean promiseStateChanged) {applyIconAndLabel(info);//这里更新图标和应用名称setTag(info);if (promiseStateChanged || (info.hasPromiseIconUi())) {applyPromiseState(promiseStateChanged);}applyDotState(info, false /* animate */);}
private void applyIconAndLabel(ItemInfoWithIcon info) {FastBitmapDrawable iconDrawable = DrawableFactory.INSTANCE.get(getContext()).newIcon(getContext(), info);//创建图标mDotParams.color = IconPalette.getMutedColor(info.iconColor, 0.54f);setIcon(iconDrawable);setText(info.title);if (info.contentDescription != null) {setContentDescription(info.isDisabled()? getContext().getString(R.string.disabled_app_label, info.contentDescription): info.contentDescription);}}

7、app/src/com/android/launcher/graphics/DrawableFactory.java

 /*** Returns a FastBitmapDrawable with the icon.*/public FastBitmapDrawable newIcon(Context context, ItemInfoWithIcon info) {FastBitmapDrawable drawable = info.usingLowResIcon()? new PlaceHolderIconDrawable(info, IconShape.getShapePath(), context): new FastBitmapDrawable(info);drawable.setIsDisabled(info.isDisabled());//这个disable就很灵性,点进去果然就是图标的处理部分代码太长就不贴了。return drawable;}
尾注

简单写一点图标颜色的部分逻辑分析,没有完整的打开,launcher更新、关闭、图标变化、主菜单更新等等。
有点费时间写。

授之以渔

灵感: 我是怎么找到这个逻辑的
因为之前做过launcher,所以对桌面图标印象还是比较深的,直接找到BubbleTextView.java这个类
它其实是一个textview,设置了文字和图标在文字的那个方向

protected void applyCompoundDrawables(Drawable icon) {// If we had already set an icon before, disable relayout as the icon size is the// same as before.mDisableRelayout = mIcon != null;icon.setBounds(0, 0, mIconSize, mIconSize);if (mLayoutHorizontal) {setCompoundDrawablesRelative(icon, null, null, null);} else {setCompoundDrawables(null, icon, null, null);}mDisableRelayout = false;}

直接在这里打断点就可以了,所以桌面图标更新都会走到这里,被调用的有点多,慢慢过滤了一下就找到了上面的流程。。。。

work profile关闭时桌面图标变灰相关推荐

  1. 如何解决桌面图标变白(原因及方法)

    如图我们打开电脑发现桌面的个别图标变成了白色, 重启电脑之后发现并没有作用 双击可以正常打开,但是看着老觉得不舒服 在Win10系统中,为了加速图标的显示,系统会对桌面图标进行缓存,若在缓存时出了问题 ...

  2. 2021-07-12 怎么将桌面图标变大变小

    怎么将桌面图标变大变小 怎么将桌面图标变大变小 一.ctrl+鼠标滑轮 鼠标滑轮向上即图标变大:鼠标滑轮向下即图标变小. 二.右键–>查看–>大图标/中等图标/小图标 如下图: 实现效果

  3. 计算机桌面图标方向变了,Win7系统桌面图标变了怎么办?

    有时候我们开启电脑后会遇到一个问题,那就是电脑桌面上的图标变成了未知的图片,原来正常的图标被替换成了空白的图案,即使重启电脑也没用,这是怎么回事呢?其实这是一个比较常见的问题,下面给大家介绍几种方法来 ...

  4. 桌面只计算机图标发白,win7系统桌面图标变白怎么回事_电脑桌面图标有小白块...

    说起电脑桌面图标,网友们会罗列出各种问题,其中就是电脑桌面图标有小白块的情况,虽然桌面图标变白可以正常影响,但难免影响美观.win7系统桌面图标变白是怎么回事呢?通常,是因为桌面图标有缓存,长期没有进 ...

  5. win10桌面图标变白

    问题描述:win10桌面图标变白 方法一: win+R 输入ie4uinit -show 结果:无效 方法二: 删除C:\Users\你的用户名\AppData\Local\IconCache.db ...

  6. 计算机开机后桌面放大,win10系统电脑重启后桌面图标变大的修复方法

    在windows操作系统中,如果你自己不去更改的话,一般电脑桌面图标的大小是默认设置的.不少用户安装了win10纯净版后,电脑开机后桌面图标变大,看着很不适应.针对这个问题我们除了可以通过对显卡驱动重 ...

  7. win7桌面图标变扁了怎么回事?

    电脑的桌面显示是具有一定的比例的,一般电脑正常使用,比例显示是正常的,但是很多小伙伴发现自己的电脑桌面图标发生了变化,使用起来非常的不舒适,想要知道win7桌面图标变扁了怎么办? win7桌面图标变扁 ...

  8. Ubuntu20重启后桌面图标变大了

    Ubuntu20重启后桌面图标变大了 解决办法:设置里找显示器,改成1920X1080(16:9) 而通过外观调整图标大小只会影响左侧栏,对全局并无作用.

  9. 计算机桌面图标如何变小,怎么把桌面图标变小,教您怎么把桌面图标变小

    最近有网友跟小编反应,不习惯电脑系统默认的大图标,图标面积太大,不美观,此时,如果我们能通过一种方法将桌面的图标变小,将会让我们打开程序成为一件十分容易的事情.那么,如果将桌面的图标变小呢,下面,小编 ...

  10. 怎样能让计算机桌面软件变小,win7系统桌面图标如何变小?win7系统把桌面图标变小的4种方法...

    win7系统桌面图标如何变小?有些用户升级win7系统后发现桌面图标很大,与之前xp系统有很大区别,看着不舒服,win7系统桌面图标如何变小?其实把桌面变小有很多方法,下面小编一一向大家win7系统把 ...

最新文章

  1. Android studio中2种build.gradle文件介绍
  2. oracle终止dbms调度,Oracle使用DBMS_JOB创建的数据库作业,遇到数据库关闭状态的调度...
  3. SpringBoot中自定义日志配置logback-spring.xml
  4. hadoop-0.21.0 在Windows环境下的部署(2)Hadoop配置
  5. 阿里巴巴向全社会开放黑科技:“泡在水里”的服务器
  6. java案例源代码_求java案例源代码 越多越好!
  7. phpcmsV9 自定义分页函数与调用 - 不影响后台SQL分页
  8. 安卓c语言文档下载,C语言.NET技术09.doc
  9. 电脑知识:如何将旧的Windows笔记本电脑切换到Linux
  10. 制造企业年终仓库盘点有哪些好的方法
  11. 英语3500词(十二)Easter主题(2022.1.24)
  12. Robot framework模拟打开浏览器问题
  13. Java技巧之双括弧初始化
  14. MATLAB与SolidWorks联合仿真(1)
  15. (Note)七彩虹30系列显卡——《一键超频》按键
  16. 空气污染数据的空间地图绘制(点转面画出来)
  17. 京东程序员压力太大在网页植入骂人代码?官方辟谣!
  18. 多样数字人民币钱包来袭,阻力与动力并存
  19. 计算机平面设计教程,计算机平面设计实用教程 培训课件.ppt
  20. 5GNR漫谈15:OFDM与IFFT

热门文章

  1. 对有序表进行折半查找的非递归算法
  2. HR_NZ_ROUNDING_DECIMALS DUMP
  3. oracle 分区之 interval range 分区
  4. Redhat 8 制作本地光盘镜像yum源
  5. 解决docker中启动Spring Boot微服务注册在Eureka后无法访问的问题
  6. esxcli software vib 命令为 ESXi 5.x/6.x 主机安装补丁程序 (2008939)
  7. 小游戏2048最佳算法怎么实现?思路全解析!
  8. LTP(Linux Test Project)学习(二)——LTP下载编译执行
  9. Qt5 QFileDialog中文英文交界处乱码问题
  10. html 的scor属性,[HTML] 通过 scrollWidth 属性滚动内容