项目需求:RK3568Android12要外接一个实体的ADC按键实现back功能,同时长按按键10s触发是否恢复出厂设置弹框。
可以通过以下命令查看是否有被触发
logcat -s FactoryReset
修改补丁如下:
rk_android12_230217/frameworks/base/services$ git show 9bdfc9b4380ef64f56982280f3b4980600961747
commit 9bdfc9b4380ef64f56982280f3b4980600961747 (HEAD)
Author: win <win>
Date: Wed Jun 17 20:26:36 2026 +0800
adc-keys: back按键长按10s触发恢复出厂设置弹框
Change-Id: I1a3fb7283fbfd535bcfeaa9deaffcbb794db2464
diff –git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 48e347d44664..24cb009b65f4 100644
— a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -191,6 +191,8 @@ import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.autofill.AutofillManagerInternal;
+import android.app.AlertDialog; //add bubble
+
import com.android.internal.R;
import com.android.internal.accessibility.AccessibilityShortcutController;
import com.android.internal.app.AssistUtils;
@@ -541,6 +543,21 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// What we do when the user long presses on home
private int mLongPressOnHomeBehavior;
+
+ //add start bubble
+ private static final long FACTORY_RESET_TIMEOUT = 10000; // 10秒
+ private long mBackKeyDownTime = 0;
+ private boolean mFactoryResetDialogShowing = false;
+
+ private final Runnable mLongPressCheckRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mBackKeyDownTime != 0 && !mFactoryResetDialogShowing) {
+ showFactoryResetDialog();
+ }
+ }
+ };
+ //end
// What we do when the user double-taps on home
private int mDoubleTapOnHomeBehavior;
@@ -1382,6 +1399,37 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
}
+//add bubble start
+ private void showFactoryResetDialog() {
+ mHandler.post(() -> {
+ // 设置状态位
+ mFactoryResetDialogShowing = true;
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext,
+ com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert);
+ builder.setTitle("恢复出厂设置");
+ builder.setMessage("是否确认清除数据,恢复出厂设置?");
+
+ builder.setPositiveButton("确定", (dialog, which) -> {
+ mFactoryResetDialogShowing = false;
+ Intent intent = new Intent("android.intent.action.FACTORY_RESET");
+ intent.setPackage("android");
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.putExtra(Intent.EXTRA_REASON, "UserLongPressBack");
+ mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM);
+ });
+
+ builder.setNegativeButton("取消", (dialog, which) -> {
+ mFactoryResetDialogShowing = false;
+ });
+
+ AlertDialog dialog = builder.create();
+ dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ dialog.show();
+ });
+ }
+ //end
+
private void cancelGlobalActionsAction() {
mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);
}
@@ -3549,6 +3597,27 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
final int keyCode = event.getKeyCode();
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
+
+ //add start bubble
+ Log.d("FactoryReset", "Keycode: " + keyCode + " down: " + down);
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (down) {
+ if (event.getRepeatCount() == 0) {
+ mBackKeyDownTime = System.currentTimeMillis();
+ mHandler.postDelayed(mLongPressCheckRunnable, FACTORY_RESET_TIMEOUT);
+ }
+ } else {
+ mHandler.removeCallbacks(mLongPressCheckRunnable);
+ if (mFactoryResetDialogShowing) {
+ mBackKeyDownTime = 0;
+ mFactoryResetDialogShowing = false;
+ return 0;
+ }
+ mBackKeyDownTime = 0;
+ }
+ }
+ //end
+
boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
|| event.isWakeKey();




