Android Security PIN 相关代码

开发项目遇到一个问题,具体描述及复制步骤如下:

就是开启"Enhanced PIN privacy"(增强的PIN隐私)的时候输入秘密的时候还是会显示数字
如下图,应该是直接是“.” 不应该出现PIN 密码

想要的效果如下图:

设置的步骤如下图:

其中涉及到的部分code如下:

/frameworks/base/core/java/com/android/internal/widget/LockPatternUtils.java
/frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java

/frameworks/base/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java

/frameworks/base/services/core/java/com/android/server/locksettings/LockSettingsStorage.java

I.LockPatternUtils.java:

/*** @return Whether enhanced pin privacy is enabled.*/public boolean isPinEnhancedPrivacyEnabled(int userId) {return getBoolean(LOCK_PIN_ENHANCED_PRIVACY, false, userId);}/*** Set whether enhanced pin privacy is enabled.*/public void setPinEnhancedPrivacyEnabled(boolean enabled, int userId) {setBoolean(LOCK_PIN_ENHANCED_PRIVACY, enabled, userId);}private boolean getBoolean(String secureSettingKey, boolean defaultValue, int userId) {Log.i("TD","LockPatternUtils----->getBoolean: "+secureSettingKey);try {return getLockSettings().getBoolean(secureSettingKey, defaultValue, userId);} catch (RemoteException re) {return defaultValue;}}private void setBoolean(String secureSettingKey, boolean enabled, int userId) {Log.i("TD","LockPatternUtils----->setsetBoolean: "+secureSettingKey);try {getLockSettings().setBoolean(secureSettingKey, enabled, userId);} catch (RemoteException re) {// What can we do?Log.e(TAG, "Couldn't write boolean " + secureSettingKey + re);}}

II.KeyguardPinBasedInputViewController.java

protected void onViewAttached() {super.onViewAttached();Log.i("TD","KeyguardPinBasedInputViewController------------->onViewAttached");boolean showAnimations = !mLockPatternUtils.isPinEnhancedPrivacyEnabled(KeyguardUpdateMonitor.getCurrentUser());mPasswordEntry.setShowPassword(showAnimations);for (NumPadKey button : mView.getButtons()) {button.setOnTouchListener((v, event) -> {if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {mFalsingCollector.avoidGesture();}return false;});button.setAnimationEnabled(showAnimations);}mPasswordEntry.setOnKeyListener(mOnKeyListener);mPasswordEntry.setUserActivityListener(this::onUserInput);View deleteButton = mView.findViewById(R.id.delete_button);deleteButton.setOnTouchListener(mActionButtonTouchListener);deleteButton.setOnClickListener(v -> {// check for time-based lockoutsLog.i("TD","KeyguardPinBasedInputViewController------------->deleteButton");if (mPasswordEntry.isEnabled()) {mPasswordEntry.deleteLastChar();}});deleteButton.setOnLongClickListener(v -> {// check for time-based lockoutsif (mPasswordEntry.isEnabled()) {mView.resetPasswordText(true /* animate */, true /* announce */);}Log.i("TD","KeyguardPinBasedInputViewController------------->deleteButton#longPress");mView.doHapticKeyClick();return true;});View okButton = mView.findViewById(R.id.key_enter);if (okButton != null) {okButton.setOnTouchListener(mActionButtonTouchListener);okButton.setOnClickListener(v -> {Log.i("TD","KeyguardPinBasedInputViewController------------->okButton");if (mPasswordEntry.isEnabled()) {verifyPasswordAndUnlock();}});okButton.setOnHoverListener(mLiftToActivateListener);}}

III.LockSettingsStorage.java
Pattern 的加密也会走到这边

public void setBoolean(String key, boolean value, int userId) {Log.i("TD","LockSettingsStorage*******>setBoolean-=-key is: "+key + "  **value: "+value);setString(key, value ? "1" : "0", userId);}public void setString(String key, String value, int userId) {Preconditions.checkArgument(userId != USER_FRP, "cannot store lock settings for FRP user");writeKeyValue(key, value, userId);if (ArrayUtils.contains(SETTINGS_TO_BACKUP, key)) {BackupManager.dataChanged("com.android.providers.settings");}}public void writeKeyValue(String key, String value, int userId) {writeKeyValue(mOpenHelper.getWritableDatabase(), key, value, userId);}@VisibleForTestingpublic void writeKeyValue(SQLiteDatabase db, String key, String value, int userId) {Log.i("TD","LockSettingsService---->writeKeyValue");Log.i("TD","LockSettingsService---->COLUMN_KEY: "+key);Log.i("TD","LockSettingsService---->COLUMN_USERID: "+userId);Log.i("TD","LockSettingsService---->COLUMN_VALUE: "+value);ContentValues cv = new ContentValues();cv.put(COLUMN_KEY, key);cv.put(COLUMN_USERID, userId);cv.put(COLUMN_VALUE, value);db.beginTransaction();try {db.delete(TABLE, COLUMN_KEY + "=? AND " + COLUMN_USERID + "=?",new String[] {key, Integer.toString(userId)});db.insert(TABLE, null, cv);db.setTransactionSuccessful();mCache.putKeyValue(key, value, userId);} finally {db.endTransaction();}dispatchChange(this);}    

IV.PasswordTextView.java

private void startDotAppearAnimation(long delay) {cancelAnimator(dotAnimator);if (!mShowPassword) {// We perform an overshoot animationValueAnimator overShootAnimator = ValueAnimator.ofFloat(currentDotSizeFactor,DOT_OVERSHOOT_FACTOR);overShootAnimator.addUpdateListener(dotSizeUpdater);overShootAnimator.setInterpolator(mAppearInterpolator);long overShootDuration = (long) (DOT_APPEAR_DURATION_OVERSHOOT* OVERSHOOT_TIME_POSITION);overShootAnimator.setDuration(overShootDuration);ValueAnimator settleBackAnimator = ValueAnimator.ofFloat(DOT_OVERSHOOT_FACTOR,1.0f);settleBackAnimator.addUpdateListener(dotSizeUpdater);settleBackAnimator.setDuration(DOT_APPEAR_DURATION_OVERSHOOT - overShootDuration);settleBackAnimator.addListener(dotFinishListener);AnimatorSet animatorSet = new AnimatorSet();animatorSet.playSequentially(overShootAnimator, settleBackAnimator);animatorSet.setStartDelay(delay);animatorSet.start();dotAnimator = animatorSet;} else {ValueAnimator growAnimator = ValueAnimator.ofFloat(currentDotSizeFactor, 1.0f);growAnimator.addUpdateListener(dotSizeUpdater);growAnimator.setDuration((long) (APPEAR_DURATION * (1.0f - currentDotSizeFactor)));growAnimator.addListener(dotFinishListener);growAnimator.setStartDelay(delay);growAnimator.start();dotAnimator = growAnimator;}dotAnimationIsGrowing = true;}
void startAppearAnimation() {boolean dotNeedsAnimation = !mShowPassword&& (dotAnimator == null || !dotAnimationIsGrowing);boolean textNeedsAnimation = mShowPassword&& (textAnimator == null || !textAnimationIsGrowing);boolean widthNeedsAnimation = (widthAnimator == null || !widthAnimationIsGrowing);if (dotNeedsAnimation) {startDotAppearAnimation(0);}if (textNeedsAnimation) {startTextAppearAnimation();}if (widthNeedsAnimation) {startWidthAppearAnimation();}if (mShowPassword) {postDotSwap(TEXT_VISIBILITY_DURATION);}}

出现问题的地方就是下面代码注释的部分,这个值为True.

 public void append(char c) {if (ZTelephonyManagerCommon.IS_ZEBRA_WWAN&& (mPasswordMaxSize != -1)&& (mText.length() >= mPasswordMaxSize)) {return;}int visibleChars = mTextChars.size();CharSequence textbefore = getTransformedText();mText = mText + c;int newLength = mText.length();CharState charState;if (newLength > visibleChars) {charState = obtainCharState(c);mTextChars.add(charState);} else {charState = mTextChars.get(newLength - 1);charState.whichChar = c;}//        if (XXX.orElse(false)) {
//            mShowPassword = Settings.System.getInt(mContext.getContentResolver(),
//                    Settings.System.TEXT_SHOW_PASSWORD, 1) == 1;
//        }Log.i("TD","mShowPassword--------->"+Settings.System.getInt(mContext.getContentResolver(),Settings.System.TEXT_SHOW_PASSWORD, 1));charState.startAppearAnimation();// ensure that the previous element is being swappedif (newLength > 1) {CharState previousState = mTextChars.get(newLength - 2);if (previousState.isDotSwapPending) {previousState.swapToDotWhenAppearFinished();}}userActivity();sendAccessibilityEventTypeViewTextChanged(textbefore, textbefore.length(), 0, 1);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305272.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来

一、前置说明 我们把学习 Appium 的第一个脚本称为 appium_helloworld,它用于展示 Appium 的基本用法,验证配置和环境是否正确。 Appium 自动化操作 APP 的基本流程(Android平台): 启动 Appium Serveradb 连接设备&…

【JavaScript】垃圾回收与内存泄漏

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…

Python 进阶(十八):配置文件(configparser 模块)

大家好,我是水滴~~ configparser模块是Python标准库中的一个模块,用于解析配置文件。它提供了一种简单而灵活的方式来读取、修改和写入INI格式的配置文件。本文将介绍该模块是如何操作配置文件的。 文章中包含大量的示例代码,希望能够帮助新…

Docker七 | 搭建Swarm集群

目录 创建Swarm集群 创建管理节点 增加工作节点 查看集群 部署服务 新建服务 查看服务 服务伸缩 增加服务 减少服务 删除服务 创建Swarm集群 创建管理节点 在192.168.117.131下执行docker swarm init命令的节点自动成为管理节点 [rootlocalhost ~]# docker swar…

同化的题解

时间限制: 1000ms 空间限制: 524288kB 题目描述 古人云:“近朱者赤近墨者黑”。这句话是很有道理的。这不鱼大大和一群苦命打工仔被安排进厂拧螺丝了。 进厂第一天,每个人拧螺丝的动力k都是不同且十分高涨的。但是当大家坐在一起后会聊天偷懒&#xf…

axios配置请求头content-type 和 get/post请求方式

axios配置请求头content-type https://blog.csdn.net/wojiushiwo945you/article/details/107653962 axios 是Ajax的一个插件,axios虽然是一个插件,但是我们不需要通过Vue.use(axios)来使用,下载完成后,只需在项目中引入即可。(一…

如何利用腾讯文档提升办公效率?

1. 实时协作功能:利用腾讯文档的实时协作功能,多人可以同时编辑和评论文档,大大提高团队工作效率。2. 云存储和同步:通过云存储和同步功能,方便地存储、访问和分享文档,不再受到时间和地点的限制。3. 版本控…

Google Ad帐号被封?这几个关键点看好

海外广告投放工作中,账号是非常重要的环节。与在Facebook上运行广告相比,运行Google Ads在代理选择方面通常没有那么严格,因为 Google 对 IP 使用并不那么严格。但是,这并不意味着您可以不加考虑地使用任何代理IP。在本文中&#…

Kubernetes (三) 集群升级

一. 集群升级 v1.23.15----v1.24.0 官网地址: https://v1-24.docs.kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/ kubectl里边内…

2023.12.28力扣每日一题——收集巧克力

2023.12.28 题目来源我的题解(参考力扣官方题解)方法一 枚举方法二 二次差分 题目来源 力扣每日一题;题序:2735 我的题解(参考力扣官方题解) 嗯……今天不会,就当一次搬运工吧。 方法一 枚举…

WEB 3D技术 three.js 设置环境贴图 高光贴图 场景设置 光照贴图

上文WEB 3D技术 three.js 基础网格材质演示几何体贴图 ao贴图效果我们简单构建了一个贴图和ao贴图的几何体材质 我们接下来 来看一下透明度贴图 我们还是官网搜索 MeshBasicMaterial 然后 是我们的 alphaMap 属性 这里 黑色为完全透明 白色 完全不透明 黑白之间还有灰色 这个灰…

基于SSM实现的电动汽车充电网点管理系统

一、系统架构 前端:jsp | jquery | bootstrap | css 后端:spring | springmvc | jdbc 环境:jdk1.8 | mysql 二、代码及数据库 三、功能介绍 01. web端-首页 02. web端-登录 03. web端-注册 04. web端-我要充电 05. web端-个人中心-消…