问题描述
打开设置–>系统–>高级–>多用户,如下图所示:
测试同事发现当没有启用这个功能时候,在锁屏页面还是可以添加新用户,默认是没有打开这个功能的。先看看锁屏页面,在锁屏页面调出下拉菜单:
然后点击方框中的头像:
可以进入这个页面,点击添加访客,可以进行切换,而此时设置中的从锁定屏幕中添加用户是禁止的状态,说明确实存在问题,那就跟代码吧。
这里先说一下我的思路,先找到设置中设置从锁定屏幕中添加用户的代码,先确定点击点击按钮settings做了什么。因为锁屏属于systemUi模块,所以我们得在systemui中拿到settings中这个按钮的状态。然后当在锁屏页面点击头像按钮时进行检查,如果settings中的设置是禁止状态,那就不响应点击事件就是了。
分析过程
首先根据字符串找到settings中设置的逻辑,搜索到字符串再根据它的name找到使用它的地方:
然后vim res/xml/user_settings.xml +38
这个字符串用在了com.android.settingslib.RestrictedSwitchPreference控件中,显然这是个Preference,所以继续搜索它的key:
熟悉settings的同学都应该知道,它里面的控件都对应Controller控制器。对于这个控件它的控制器就是AddUserWhenLockedPreferenceController,
@Override
public boolean setChecked(boolean isChecked) {
return Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.ADD_USERS_WHEN_LOCKED, isChecked ? 1 : 0);
}
很简单,这里就是保存状态的地方。
下面再去找点击锁屏添加用户头像的响应方法,通过Android Device Monitor可以直接找到resource-id :com.android.systemui:id/multi_user_switch ,继续grep:
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java:112: mMultiUserSwitch = findViewById(R.id.multi_user_switch);
mMultiUserSwitch 是一个自定义控件MultiUserSwitch,
路径:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
打开它的源码会发现它里面有一个onClick方法,这里就是响应点击的地方了。
所以我们要做的就是在onClick中添加判断是否允许添加新用户的代码。
解决方法
先声明两个成员变量
//记录settings中按钮状态
private boolean mAddUsersWhenLocked;
//判断当前是否在锁屏页面
private KeyguardManager mKeyguardManager;
在MultiUserSwitch构造方法中初始化mKeyguardManager :
public MultiUserSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
mUserManager = UserManager.get(getContext());
//add by pitt.guo for *** start
mKeyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
//add by pitt.guo for *** end
}
在onClick中添加下面代码,因为这个按钮在解锁后的页面也是存在的,所以一定要加上对锁屏状态的判断:
@Override
public void onClick(View v) {
//add by pitt.guo for *** start
mAddUsersWhenLocked = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.ADD_USERS_WHEN_LOCKED, 0) != 0;
//判读锁屏状态 和 settings中的设置
if(mKeyguardManager.inKeyguardRestrictedInputMode() && !mAddUsersWhenLocked){
//如果走到这,说明在锁屏页面,而且setting没有打开该功能,直接返回
return;
}
//add by pitt.guo for *** end
if (mKeyguardMode) {
if (mKeyguardUserSwitcher != null) {
mKeyguardUserSwitcher.show(true /* animate */);
}
} else if (mQsPanel != null && mUserSwitcherController != null) {
View center = getChildCount() > 0 ? getChildAt(0) : this;
center.getLocationInWindow(mTmpInt2);
mTmpInt2[0] += center.getWidth() / 2;
mTmpInt2[1] += center.getHeight() / 2;
mQsPanel.showDetailAdapter(true,
getUserDetailAdapter(),
mTmpInt2);
}
}
以上就是对该问题的分析过程和解决方法了。