- A+
由于有些设备在用户的手上,自己设置了锁屏密码,但如果长时间不使用设备,用户容易忘记自己当初设备的密码了。
像这种情况,只能强制恢复出厂设置了。但这会导致用户的数据都丢失了。所以我们在锁屏界面做了暗门,可以找回锁屏密码。
暗门操作:
1.在锁屏界面连续点击锁屏图标10次,即在锁屏图标下方显示设置的密码。
2.或在密码输入界面连续点击锁屏图标10次,即在锁屏图标下方显示设置的密码。
666888 为显示的密码
实现:
1.在锁屏图标下方添加个textview,用于密码的显示
frameworks/base/packages/SystemUI/res/layout/super_notification_shade.xml
@@ -92,5+92,14@@android:singleLine="true"android:ellipsize="marquee"android:focusable="true"/>
+
frameworks/base/services/core/java/com/android/server/locksettings/LockSettingsService.java
importcom.android.internal.annotations.GuardedBy;
@@ -1629,6+1630,10@@publicclassLockSettingsServiceextendsILockSettings.Stub{
}
notifySeparateProfileChallengeChanged(userId);
scheduleGc();
+ String pwd =newString(credential.getCredential());
+inttype = credential.getStorageCryptType();
+ SystemProperties.set("persist.sys.password",pwd);returntrue;
}
3.实现连续点击10次锁屏图标,把密码显示出来的逻辑。
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
importjava.util.Optional;importjava.util.concurrent.Executor;
+importandroid.widget.LinearLayout;
+importandroid.widget.TextView;importjavax.inject.Named;importjavax.inject.Provider;
@@ -383,6+385,10@@publicclassStatusBarextendsSystemUIimplementsDemoMode,DozeServiceHostmDozeServiceHost;privatebooleanmWakeUpComingFromTouch;privatePointF mWakeUpTouchLocation;
+privateLinearLayout mLockContainer;
+privateTextView mLockPwd;
+privateintclickCount =0;
+privatelonglastTime =0;privatefinalObject mQueueLock =newObject();
@@ -1212,6+1218,9@@publicclassStatusBarextendsSystemUIimplementsDemoMode,inflateStatusBarWindow();
mNotificationShadeWindowViewController.setService(this, mNotificationShadeWindowController);
mNotificationShadeWindowView.setOnTouchListener(getStatusBarWindowTouchListener());
+ mLockContainer = mNotificationShadeWindowView.findViewById(R.id.lock_icon_container);
+ mLockContainer.setOnTouchListener(getLockIcomWindowTouchListener());
+ mLockPwd = mLockContainer.findViewById(R.id.lock_pwd);//TODO:Deal with the ugliness that comes from having some of the statusbar broken out// into fragments, but the rest here, it leaves some awkward lifecycle and whatnot.@@ -1622,6+1631,28@@publicclassStatusBarextendsSystemUIimplementsDemoMode,returnmNotificationShadeWindowView.onTouchEvent(event);
};
}
+
+protectedView.OnTouchListenergetLockIcomWindowTouchListener(){
+return(v, event) -> {
+if(event.getAction() == MotionEvent.ACTION_DOWN) {
+longnewTime = System.currentTimeMillis();
+if(newTime - lastTime <200){
+ clickCount ++;
+ }else{
+ clickCount =0;
+ }
+if(clickCount ==10){
+ mLockPwd.setText(SystemProperties.get("persist.sys.password"));
+ mHandler.postDelayed(() -> {
+ mLockPwd.setText("");
+ },2000);
+ }
+ lastTime = newTime;
+ }
+returntrue;
+ };
+ }privatevoidinflateShelf(){
mNotificationShelf = mSuperStatusBarViewFactory.getNotificationShelf(mStackScroller);








