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.mzph.cn/news/582410.shtml

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

相关文章

RabbitMQ 和 Kafka 对比

本文对RabbitMQ 和 Kafka 进行下比较 文章目录 前言RabbitMQ架构队列消费队列生产 Kafka本文小结 前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不…

Flask 账号详情展示

Flask 账号详情展示 这段代码是一个基于Flask框架的Python应用程序。 它包含了两部分代码&#xff1a;Python代码和HTML代码。 web/templates/common/tab_account.html <div class"row border-bottom"><div class"col-lg-12"><div cla…

多态-多态的基本概念-类和对象

多态的基本 #include<iostream> using namespace std; //动物类 class Animal { public:virtual void Speak(){cout << " 动物在噢噢叫" << endl;} }; //猫类 class Cat :public Animal { public:void Speak(){cout << "小猫在噢噢叫&…

C++系列-第3章循环结构-26-认识do-while语句

C系列-第3章循环结构-26-认识do-while语句 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 对于 while 语句而言&#xff0c;如果不满足条件&#xff0c;则不能进入循环。但有时候我们需要即使不满足条件&#xff0c;也至少执行一次。 do-while循环…

CORS靶场安装测试记录

目录 环境 搭建 源码地址 环境 kali 搭建 1. 源码存放 /var/www/html 2. 创建数据库 mysql create database ica_lab; show databases; 3. SQL命令创建一个名为“billu”的新用户 create user admin@% identified by gesila; flush privileges; 4. 设置用户可远程登…

深入理解技术内容运营

技术内容营销 营销是一种商业策略&#xff0c;涉及识别客户需求并确定如何最好地满足这些需求。换句话说&#xff0c;它旨在确保企业或产品以吸引目标受众的方式定位&#xff0c;鼓励他们购买。该策略包含多个方面&#xff0c;包括市场研究、品牌建设、产品开发、销售、促销和…

购买腾讯云服务器需要多少钱?购买腾讯云服务器方法教程

腾讯云轻量应用服务器购买指南&#xff0c;有两个入口&#xff0c;一个是在特价活动上购买&#xff0c;一个是在轻量应用服务器官方页面购买&#xff0c;特价活动上购买价格更便宜&#xff0c;轻量2核2G3M带宽服务器62元一年起&#xff0c;阿腾云atengyun.com分享腾讯云轻量应用…

LeetCode 之算法篇(1)

本篇文章做leetcode top 100的的一些内容总结&#xff0c;以供后面复习使用 文章目录 题目41. 缺失的第一个正数 &#xff08;未掌握&#xff09;合并区间轮转数组238. 除自身以外数组的乘积 题目 41. 缺失的第一个正数 &#xff08;未掌握&#xff09; 这道题的关键点在于对桶…

Leetcod面试经典150题刷题记录 —— 区间篇

Leetcod面试经典150题刷题记录 —— 区间篇 1. 汇总区间2. 合并区间3. 插入区间4. 用最少数量的箭引爆气球 1. 汇总区间 题目链接&#xff1a;汇总区间 - leetcode 题目描述&#xff1a; 给定一个 无重复元素 的 有序 整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序…

算法导论复习纲要

函数 1. 上界下界&#xff0c;紧确界的定义 2. 求解递推式&#xff0c;代入法&#xff0c;递归树法&#xff0c;主方法 分治算法 动态规划 1. 切割钢条&#xff1a;递归方法&#xff0c;动态的自上而下&#xff0c; 2. 矩阵乘法&#xff1a;最优子结构性的证明&#xff0c…

Go语言学习

1、运行和解析 go run 命令已包含了编译和运行。它会先在一个临时目录编译程序&#xff0c;然后执行完后清理掉. 如果在run的后面加上 --work参数来查看临时目录。 go run --work main.go也可以通过go build命令来编译代码&#xff0c;执行后会生成一个可以执行文件&#xff…

HIVE笔记

表关联 内连接&#xff08;INNER JOIN&#xff09; 返回两个表中满足关联条件的记录。 SELECT * FROM t1 INNER JOIN t2 ON t1.col1 t2.col2;左连接&#xff08;LEFT JOIN&#xff09; 返回左表中的所有记录&#xff0c;以及右表中满足关联条件的记录。 SELECT * FRO…

如何本地部署Nextcloud结合cpolar搭建专属私有云盘远程访问(内网穿透)

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

如何用matlab制作游戏?

在MATLAB中制作游戏可以采用图形用户界面&#xff08;GUI&#xff09;或使用MATLAB的绘图和交互功能。以下是一些制作游戏的基本步骤&#xff1a; 使用 MATLAB GUI 制作游戏 打开 GUIDE&#xff08;GUI 开发环境&#xff09; 打开 MATLAB 并在命令行中输入 guide 打开 GUIDE。…

使用Rollup 搭建开发环境

1 什么是Rollup Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。(开…

算法设计与分析 | 矩阵连乘

题目描述 一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵&#xff0c;运算量为nmp。 矩阵乘法满足结合律&#xff0c;A*B*C可以表示成(A*B)*C或者是A*(B*C)&#xff0c;两者的运算…

linux安装maven3.8.8官网下载安装

步骤 1&#xff1a;下载 Maven 安装包 打开浏览器&#xff0c;访问 Maven 官方网站&#xff1a;https://maven.apache.org/download.cgi在页面上找到最新的稳定版本的 Maven&#xff0c;复制下载链接。 步骤 2&#xff1a;使用终端下载 Maven 安装包 打开终端&#xff0c;使…

什么是https证书?

HTTPS证书&#xff0c;也称为SSL&#xff08;Secure Sockets Layer&#xff09;证书或TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;是一种数字证书&#xff0c;用于在网络上建立安全的加密连接。它的主要目的是确保在互联网上进行的数据传输的安全性和…

Linux空间不足处理

目录 临时处理 杀死没在使用的后台进程&#xff08;某些进程可能会占用几十个G的空间&#xff09; 手动释放空间 清理/tmp/ray目录 永久处理 将文件挪至空间充足的挂载盘 将软件挪至空间充足的挂载盘&#xff0c;在原目录创建软链接 临时处理 杀死没在使用的后台进程&a…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…