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://xiahunao.cn/news/2660049.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

中职网络安全Server2002——Web隐藏信息获取

B-2:Web隐藏信息获取 任务环境说明: 服务器场景名:Server2002(关闭链接)服务器场景用户名:未知 有问题需要环境加q 通过本地PC中渗透测试平台Kali使用Nmap扫描目标靶机HTTP服务子目录,将扫描子…

用户规模破亿!基于文心一言的创新应用已超4000个

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Matter协议解析记录

目录 目录 1、Matter 协议发展 1.1、什么是Matter 1.2、Matter能做什么 2、整体介绍 3、架构介绍 3.1、Matter网络拓扑结构 3.2、功能解析 3.2.1、Fabric引用和Fabric标识符 3.2.2、供应商标识符(Vendor ID,VID) 3.2.3、产品标识符…

类。。。。

定义一个person类&#xff0c;包含私有成员&#xff0c;int *age,string &name,一个stu类&#xff0c;包含私有成员double *sore,person p1,写出person类和stu类的特殊成员函数&#xff0c;并写一个stu的函数&#xff0c;显示所有信息。 #include <iostream>using n…

树莓派界面改成中文

安装完树莓派系统(Raspberry Pi OS with Desktop)&#xff0c;第一次启动时&#xff0c;时会有如下面二个图所示&#xff0c;让你选择区域时区和语言。 树莓派默认的语言为英文&#xff0c;如果你在安装时没有选择的话&#xff0c;默认的区域为英国&#xff0c;语言为英国英文&…

canal 数据同步组件

canal 数据异构组件 为啥要使用这个组件&#xff1f; 在更新DB的时候不同步更新到redis&#xff0c;es等数据库中&#xff0c;时间太久&#xff0c;而且可能会存在同步失败的问题&#xff0c;因此引入canal去拉取DB的数据&#xff0c;再去更新到redis&#xff0c;es等数据库中&…

【Gradio】1、Gradio 是什么

官网&#xff1a;https://www.gradio.app/ 一、Gradio 是什么 Gradio是一个用于创建机器学习模型交互式界面的 Python 库。通过Gradio&#xff0c;可以快速地为模型构建一个可视化的、易于使用的Web界面&#xff0c;无需编写任何Web前端代码。 Gradio 支持多种不同类型的输入…

代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后 、37. 解数独

332.重新安排行程 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 文档讲解&#xff1a;代码随想录 C代码&#xff1a; class Solution { public: unordered_map<string, map<string, int>> targets;bool backtrack…

Python实现张万森下雪了的效果

写在前面 即将步入婚宴殿堂的女主林北星&#xff0c;遭遇了男友展宇的毁约&#xff0c;生活和工作也变得一团糟。与此同时&#xff0c;她被时光老人带回了十八岁的高三时光&#xff0c;重新开启了自己的人生。林北星摆脱了展宇的束缚&#xff0c;认真准备高考&#xff0c;想要…

九九乘法表c 语言 用于打印九九乘法表

以下是一个简单的C语言程序&#xff0c;用于打印九九乘法表&#xff1a; #include <stdio.h>int main() {int i, j;for (i 1; i < 9; i) {for (j 1; j < i; j) {printf("%d*%d%-2d ", j, i, i*j);}printf("\n");}return 0; }解释&#xff1…

html-css-js移动端导航栏底部固定+i18n国际化全局

需求&#xff1a;要做一个移动端的仿照小程序的导航栏页面操作&#xff0c;但是这边加上了i18n国家化&#xff0c;由于页面切换的时候会导致国际化失效&#xff0c;所以写了这篇文章 1.效果 切换页面的时候中英文也会跟着改变&#xff0c;不会导致切换后回到默认的语言 2.实现…

接口自动化框架设计之参数传递

在我们设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08;如Excel、YAML&#xff09;中&#xff0c;实现测试脚本与测试数据解耦&#xff0c;方便后期维护。 当涉及到业务场景接口用例时&#xff0c;由于接口与接口存在关联关系&#xff…

Mysql For Navicate (老韩)

Navicate创建数据库 先创建一个数据库;然后在数据库中创建一张表;在表格当中填入相应的属性字段;打开表, 然后填入相应的实例字段; – 使用数据库图形化App和使用指令来进行操作各有各的好处和利弊; 数据库的三层结构(破除MySQL神秘) 所谓安装Mysql数据库, 就是在主机安装一…

线程基础知识(三)

前言 之前两篇文章介绍了线程的基本概念和锁的基本知识&#xff0c;本文主要是学习同步机制&#xff0c;包括使用synchronized关键字、ReentrantLock等&#xff0c;了解锁的种类&#xff0c;死锁、竞争条件等并发编程中常见的问题。 关键字synchronized synchronied关键字可…

java设计模式学习之【备忘录模式】

文章目录 引言备忘录模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用备忘录示例代码地址 引言 想象一下&#xff0c;你正在编辑一篇重要的文档&#xff0c;突然你意识到最近的一些更改实际上破坏了文档的结构。幸运的是&#xff0c;你的文本编辑器允许你撤…

【react项目开发遇到的问题记录】:The above error occurred in the <Route.Provider> component:

在进行路由切换会出现一下报错&#xff1a;The above error occurred in the <Route.Provider> component: 解决办法 在使用组件懒加载的时候&#xff0c;在外面套一个react的组件:Suspense Suspense 目前在 react 中一般配合 lazy 使用&#xff0c;当有一些组件需要动…

NLP论文阅读记录 - 02 | 2022 自动文本摘要方法:综合回顾

文章目录 前言0、论文摘要一、Introduction1.1文本摘要的要求1.2主要研究贡献 二.ATS的分类2.1基于没有。输入文档的数量2.2 基于总结方法2.3 基于输出摘要性质&#xff1a;2.4 基于摘要语言2.4.1 基于摘要算法2.5 基于摘要内容2.6 基于摘要类型2.7 基于概括域2.8 基于加工水平…

PyTorch 进阶指南,10个必须知道的原则

PyTorch 是一种流行的深度学习框架&#xff0c;它提供了强大的工具和灵活的接口&#xff0c;使得开发者能够搭建和训练各种神经网络模型。这份指南旨在为开发者提供一些有用的原则&#xff0c;以帮助他们在PyTorch中编写高效、可维护和可扩展的代码。 如果你对 Pytorch 还处于…

软件测试面试中90%会遇到的问题,面试前刷提高百分之60的通过率

面试的时候&#xff0c;遇到这样的提问&#xff0c;很多人的都会感觉脑子一下一片空白&#xff0c;或者星星点点&#xff0c;不知道从何说起。 一方面不知道面试官问这个问题的意图是什么&#xff1f;也不知道他想得到的答案是什么&#xff1f; 更加不知道该从哪些方面来回答…

在香橙派5 Plus上搭建Gitlab

作为一个码农&#xff0c;一定知道Github这个最大的成人交友网站。但是Github在国内不稳定&#xff0c;经常拉不下来代码&#xff0c;也就无法推送代码。为了更方便的使用&#xff0c;顺便更好地了解Git工具&#xff0c;决定在香橙派5 Plus上搭建一个属于自己的代码仓库。 1、…