[{"data":1,"prerenderedAt":925},["ShallowReactive",2],{"post-2026-11-10-xiaomi-double-click-power-google-wallet-en":3,"surround-2026-11-10-xiaomi-double-click-power-google-wallet-en":916,"randomIndex-year-month-day-slug___en-{\"year\":\"2026\",\"month\":\"11\",\"day\":\"10\",\"slug\":\"xiaomi-double-click-power-google-wallet\"}":222,"language-switch-year-month-day-slug___en-{\"year\":\"2026\",\"month\":\"11\",\"day\":\"10\",\"slug\":\"xiaomi-double-click-power-google-wallet\"}-zh":924},{"title":4,"date":5,"path":6,"tags":7,"body":12,"description":915},"Opening Google Wallet with a Double Press of the Power Button on a China-Version Xiaomi 15: It Only Takes One adb Command","2026-11-10","/2026/11/10/xiaomi-double-click-power-google-wallet",[8,9,10,11],"Android","Xiaomi","HyperOS","ADB",{"type":13,"value":14,"toc":899},"minimark",[15,25,40,78,81,86,103,107,122,129,135,142,149,153,160,168,177,183,186,192,205,208,262,265,271,275,281,312,324,328,331,336,341,345,360,366,413,425,431,435,438,444,459,462,518,521,578,581,647,653,657,660,667,671,763,766,777,781,820,824,830,850,862,866,895],[16,17,18,19,24],"p",{},"In my ",[20,21,23],"a",{"href":22},"/en/2026/02/20/xiaomi-china-version-fcm-push-debug/","previous post about FCM",", I mentioned that I was getting ready to study abroad. Now that I'm actually overseas, I tap my card for almost everything—getting on the bus, buying coffee—so Google Wallet has become one of the most-used apps on my phone. But on the China version of HyperOS, \"double-press the power button\" can only open Mi Wallet. Every time I pull out my phone I have to unlock it, find the icon and tap it, which completely breaks the flow.",[16,26,27,28,34,35,39],{},"A few days ago I came across ",[20,29,33],{"href":30,"rel":31},"https://github.com/DustinYe/PowerWallet",[32],"nofollow","DustinYe/PowerWallet"," on GitHub. Its tagline is literally \"double-press the power button on a Xiaomi phone to open Google Wallet\", no root required. Unfortunately it only supports one specific ROM build on the Xiaomi 13 Ultra. I forked it to port it to my Xiaomi 15, and after a fair amount of tinkering I realised that ",[36,37,38],"strong",{},"on HyperOS 4, this really only takes one adb command",":",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-bash shiki shiki-themes one-light one-dark-pro","adb shell settings put system double_click_power_key launch_QAW_wallet\n","bash","",[48,49,50],"code",{"__ignoreMap":46},[51,52,55,59,63,66,69,72,75],"span",{"class":53,"line":54},"line",1,[51,56,58],{"class":57},"sAdtL","adb",[51,60,62],{"class":61},"sDhpE"," shell",[51,64,65],{"class":61}," settings",[51,67,68],{"class":61}," put",[51,70,71],{"class":61}," system",[51,73,74],{"class":61}," double_click_power_key",[51,76,77],{"class":61}," launch_QAW_wallet\n",[16,79,80],{},"In the rest of this post, I'll go through \"how stock Android works → what Xiaomi changed → what the original project did → what my fork does\" to explain why this command works, and why I still ended up turning it into an app.",[82,83,85],"h2",{"id":84},"test-environment","Test Environment",[87,88,89,97,100],"ul",{},[90,91,92,93,96],"li",{},"Xiaomi 15, China version (dada), HyperOS ",[48,94,95],{},"OS4.0.0.22.XOCCNXM",", Android 17",[90,98,99],{},"\"Google basic services\" enabled, Google Wallet installed with a card added, default NFC payment app set to Google Pay",[90,101,102],{},"Bootloader locked, no root",[82,104,106],{"id":105},"how-stock-android-works","How Stock Android Works",[16,108,109,110,113,114,117,118,121],{},"Android 11 introduced a system interface called ",[36,111,112],{},"Quick Access Wallet"," (QAW): a wallet app implements a ",[48,115,116],{},"QuickAccessWalletService",", and the system can launch it straight from the power menu, the lock screen or a gesture. For Google Wallet, this service is provided by Play services as ",[48,119,120],{},"com.google.android.gms/.tapandpay.globalactions.WalletQuickAccessWalletService",".",[16,123,124,125,128],{},"Notably, QAW isn't tied to any particular wallet. Instead, it ",[36,126,127],{},"first reads the default NFC payment app, then looks for a QAW service inside that app",". So \"which wallet opens\" is actually decided by the default payment app. Mi Wallet doesn't implement a QAW service: when I set the default payment app to Mi Wallet and double-pressed the power button, all I got was this message:",[130,131,132],"blockquote",{},[16,133,134],{},"当前默认钱包不支持双击电源键打开，请修改设置\n(The current default wallet doesn't support opening with a double press of the power button. Please change your settings.)",[16,136,137,138,141],{},"In other words, ",[48,139,140],{},"launch_QAW_wallet"," can only open wallets that implement QAW, such as Google Wallet. It can't open Mi Wallet.",[16,143,144,145,148],{},"Later, stock Android also added an \"open wallet\" option to the \"double-press power button\" gesture, which corresponds to ",[48,146,147],{},"double_tap_power_button_gesture=1"," in the Secure settings table.",[82,150,152],{"id":151},"what-xiaomi-changed","What Xiaomi Changed",[16,154,155,156,159],{},"HyperOS doesn't use that stock setting directly. Instead, it uses its own ",[48,157,158],{},"double_click_power_key"," (in the System table) to decide what a double press does, then syncs the choice to the stock setting. You can see the sync in the logs:",[41,161,166],{"className":162,"code":164,"language":165},[163],"language-text","MiuiSingKeyShortcutObserver: DTPB-Wallet syncAosp function=launch_QAW_wallet enabled=1 gesture=1\n","text",[48,167,164],{"__ignoreMap":46},[16,169,170,171,174,175,39],{},"DTPB stands for Double Tap Power Button. The settings screen on the China version only offers options like Mi Wallet (",[48,172,173],{},"mi_pay","), transit codes and the camera, but the list of functions the system prints at boot also contains a ",[48,176,140],{},[41,178,181],{"className":179,"code":180,"language":165},[163],"ShortcutFunctionManager: init config,function=mi_pay, supportActions=[double_click_power_key]\nShortcutFunctionManager: init config,function=launch_QAW_wallet, supportActions=[double_click_power_key]\n",[48,182,180],{"__ignoreMap":46},[16,184,185],{},"That's the stock \"open wallet\". It's missing from the China version's settings because a customisation config switches it off:",[41,187,190],{"className":188,"code":189,"language":165},[163],"InputFeature: DTPB-Wallet support=false reason=disabledByCustFeature\n",[48,191,189],{"__ignoreMap":46},[16,193,194,195,198,199,201,202,121],{},"The system also registers a ",[48,196,197],{},"MIUI_REGION_CHANGED"," broadcast receiver, so my guess is that this switch depends on the region. But the option is only hidden; nothing blocks it at runtime. After I manually set the value to ",[48,200,140],{},", ",[36,203,204],{},"a double press opened Google Wallet directly, both unlocked and on the lock screen",[16,206,207],{},"Putting stock Android and Xiaomi's logic together, here's what happens after a double press of the power button:",[41,209,213],{"className":210,"code":211,"language":212,"meta":46,"style":46},"language-mermaid shiki shiki-themes one-light one-dark-pro","flowchart TD\n    Press([\"Double-press power\"]) --> Key{\"double_click_power_key\"}\n    Key -->|\"mi_pay\"| Mi[\"Mi Wallet\"]\n    Key -->|\"launch_QAW_wallet\"| NFC{\"Default NFC payment app\"}\n    Key -->|\"null / google_pay\"| Nothing[\"Nothing happens\"]\n    NFC -->|\"Google Pay\"| QAW[\"Play services'\u003Cbr/>\u003Cb style='color:#b45309'>QuickAccessWalletService\u003C/b>\"]\n    QAW --> GW[\"Google Wallet\"]\n    NFC -->|\"Mi Wallet\"| Tip[\"Message: the default wallet\u003Cbr/>doesn't support double press\"]\n","mermaid",[48,214,215,220,226,232,238,244,250,256],{"__ignoreMap":46},[51,216,217],{"class":53,"line":54},[51,218,219],{},"flowchart TD\n",[51,221,223],{"class":53,"line":222},2,[51,224,225],{},"    Press([\"Double-press power\"]) --> Key{\"double_click_power_key\"}\n",[51,227,229],{"class":53,"line":228},3,[51,230,231],{},"    Key -->|\"mi_pay\"| Mi[\"Mi Wallet\"]\n",[51,233,235],{"class":53,"line":234},4,[51,236,237],{},"    Key -->|\"launch_QAW_wallet\"| NFC{\"Default NFC payment app\"}\n",[51,239,241],{"class":53,"line":240},5,[51,242,243],{},"    Key -->|\"null / google_pay\"| Nothing[\"Nothing happens\"]\n",[51,245,247],{"class":53,"line":246},6,[51,248,249],{},"    NFC -->|\"Google Pay\"| QAW[\"Play services'\u003Cbr/>\u003Cb style='color:#b45309'>QuickAccessWalletService\u003C/b>\"]\n",[51,251,253],{"class":53,"line":252},7,[51,254,255],{},"    QAW --> GW[\"Google Wallet\"]\n",[51,257,259],{"class":53,"line":258},8,[51,260,261],{},"    NFC -->|\"Mi Wallet\"| Tip[\"Message: the default wallet\u003Cbr/>doesn't support double press\"]\n",[16,263,264],{},"The other thing Xiaomi does is check this value at boot. If it decides the current value is \"not supported\", it clears it:",[41,266,269],{"className":267,"code":268,"language":165},[163],"MiuiSingKeyShortcutObserver: set double_click_power_key to null, because function not support\n",[48,270,268],{"__ignoreMap":46},[82,272,274],{"id":273},"what-the-original-project-did","What the Original Project Did",[16,276,277,278,280],{},"The original project didn't know ",[48,279,140],{}," existed, so it took a long detour:",[282,283,284,294,305],"ol",{},[90,285,286,287,289,290,293],{},"Set ",[48,288,158],{}," to ",[48,291,292],{},"google_pay",", a value the system doesn't recognise, so the system's double-press action does nothing;",[90,295,296,297,300,301,304],{},"Use adb to start a long-running process via ",[48,298,299],{},"app_process"," as the shell user, which listens for power-key presses and releases with ",[48,302,303],{},"getevent"," and detects double presses itself;",[90,306,307,308,311],{},"On a double press, open Google Wallet's tap-to-pay screen with ",[48,309,310],{},"am start",", with a companion app handling the lock-screen state.",[16,313,314,315,317,318,321,322,121],{},"It's a clever idea, but it has two problems: the long-running process is gone after a reboot, so you have to connect to a computer and reactivate it after every restart; and on HyperOS 4, an unrecognised value like ",[48,316,292],{}," also gets cleared by the system at boot. I started by porting this approach as-is. It was only while chasing down a bug where \"the original value in the backup mysteriously turned into ",[48,319,320],{},"null","\" that I stumbled onto the boot-time cleanup and then ",[48,323,140],{},[82,325,327],{"id":326},"what-my-fork-does","What My Fork Does",[16,329,330],{},"At its core, it's just the command from the start of this post. What my fork does is fill in three things around that command:",[332,333,335],"h3",{"id":334},"_1-use-the-native-launch_qaw_wallet","1. Use the native launch_QAW_wallet",[16,337,338,339,121],{},"No long-running process, no lock-screen handling of our own; the system takes care of everything. Mi Wallet mode simply writes the value back to ",[48,340,173],{},[332,342,344],{"id":343},"_2-switch-the-default-nfc-payment-app-along-with-the-mode","2. Switch the default NFC payment app along with the mode",[16,346,347,348,351,352,355,356,359],{},"The default payment app is stored in ",[48,349,350],{},"settings secure nfc_payment_default_component",". On the Google side it's ",[48,353,354],{},"com.google.android.gms/.tapandpay.hce.service.TpHceService","; Mi Wallet is ",[48,357,358],{},"com.android.nfc/.cardemulation.ESEWalletDummyService"," (it uses the eSE). Switching to Google Wallet mode sets the default payment app to Google Pay, and switching to Mi Wallet mode sets it to Mi Wallet. If you've chosen a third-party payment app, it's left alone.",[16,361,362,363,121],{},"As mentioned above, QAW opens the wallet of the default payment app, so this step isn't just a nice extra: ",[36,364,365],{},"each mode is a pair of settings, and both have to match",[367,368,369,386],"table",{},[370,371,372],"thead",{},[373,374,375,379,383],"tr",{},[376,377,378],"th",{},"Mode",[376,380,381],{},[48,382,158],{},[376,384,385],{},"Default NFC payment app",[387,388,389,402],"tbody",{},[373,390,391,395,399],{},[392,393,394],"td",{},"Google Wallet",[392,396,397],{},[48,398,140],{},[392,400,401],{},"Google Pay",[373,403,404,407,411],{},[392,405,406],{},"Mi Wallet",[392,408,409],{},[48,410,173],{},[392,412,406],{},[16,414,415,416,424],{},"This matters especially when switching back to Mi Wallet. Changing only the default payment app isn't enough—a double press just shows \"the current default wallet doesn't support opening with a double press of the power button\". ",[36,417,418,419,421,422],{},"You must also set ",[48,420,158],{}," back to ",[48,423,173],{},", and that step needs adb too.",[16,426,427,428,430],{},"If adb isn't convenient at that moment (for example, you've already turned off Developer options), there's a fallback that doesn't need adb: in system settings, go to Accessibility → General → Shortcut gestures → Double-press power button (「辅助功能 → 通用 → 快捷手势 → 双击电源键」) and switch it back to \"Transit / Mi Pay / Door card\" (「公交 / Mi Pay / 门卡」). The plugin won't know you did this, though: if it still has Google Wallet mode recorded, it will set the value back to ",[48,429,140],{}," the next time the phone boots with adb available. So if you want Mi Wallet long-term, switch in the plugin when you get the chance.",[332,432,434],{"id":433},"_3-let-the-app-run-the-command-itself","3. Let the app run the command itself",[16,436,437],{},"This command has to run as the shell user; a normal app can't write the setting:",[41,439,442],{"className":440,"code":441,"language":165},[163],"You cannot keep your settings in the secure settings.\n",[48,443,441],{"__ignoreMap":46},[16,445,446,448,449,121],{},[48,447,158],{}," isn't a public setting. SettingsProvider only lets system, shell, root and preinstalled privileged apps change it, and any normal app targeting an SDK above 22 is rejected outright—",[36,450,451,452,455,456],{},"even after being granted ",[48,453,454],{},"WRITE_SECURE_SETTINGS"," via ",[48,457,458],{},"pm grant",[16,460,461],{},"So, following the approach of Ice Box and Shizuku, I had the plugin act as its own adb client and connect to the phone's own wireless debugging to get a shell:",[87,463,464,475,494],{},[90,465,466,469,470,472,473,121],{},[36,467,468],{},"First-time setup",": In Developer options → Wireless debugging, tap \"Pair device with pairing code\", then enter the 6-digit code in the plugin's notification. Once paired, the plugin uses the shell to ",[48,471,458],{}," itself ",[48,474,454],{},[90,476,477,480,481,484,485,489,490,493],{},[36,478,479],{},"Switching modes",": The plugin uses that permission to turn on wireless debugging (",[48,482,483],{},"adb_wifi_enabled"," is in the Global table, which it ",[486,487,488],"em",{},"can"," write), finds the local adbd port via mDNS, connects to itself, runs ",[48,491,492],{},"settings put",", then turns wireless debugging off again. The whole thing takes about 5 seconds.",[90,495,496,499,500,502,503,505,506,508,509,511,512,514,515,517],{},[36,497,498],{},"Restoring after boot",": After boot, it schedules a JobScheduler job that requires Wi-Fi. If you're in Google Wallet mode and the value after boot is ",[48,501,320],{}," or ",[48,504,173],{},", it writes ",[48,507,140],{}," back; if it's some other function (say you set it to the camera in system settings), it leaves it alone. At boot there's no way to tell \"",[48,510,173],{}," filled in by the system\" from \"",[48,513,173],{}," chosen by the user\", so if you want Mi Wallet long-term, switch to it in the plugin—",[48,516,173],{}," survives reboots on its own.",[16,519,520],{},"Here's roughly what happens when the plugin switches modes:",[41,522,524],{"className":210,"code":523,"language":212,"meta":46,"style":46},"sequenceDiagram\n    participant App as Plugin\n    participant Sys as System settings\n    participant Adbd as Local adbd\n    App->>Sys: Turn on wireless debugging (adb_wifi_enabled=1)\n    App->>Adbd: Discover _adb-tls-connect._tcp via mDNS\n    App->>Adbd: Connect to 127.0.0.1 with the paired key\n    App->>Adbd: shell: settings put (double press + default payment)\n    Adbd->>Sys: Write as the shell user\n    App->>Sys: Turn off wireless debugging (adb_wifi_enabled=0)\n",[48,525,526,531,536,541,546,551,556,561,566,572],{"__ignoreMap":46},[51,527,528],{"class":53,"line":54},[51,529,530],{},"sequenceDiagram\n",[51,532,533],{"class":53,"line":222},[51,534,535],{},"    participant App as Plugin\n",[51,537,538],{"class":53,"line":228},[51,539,540],{},"    participant Sys as System settings\n",[51,542,543],{"class":53,"line":234},[51,544,545],{},"    participant Adbd as Local adbd\n",[51,547,548],{"class":53,"line":240},[51,549,550],{},"    App->>Sys: Turn on wireless debugging (adb_wifi_enabled=1)\n",[51,552,553],{"class":53,"line":246},[51,554,555],{},"    App->>Adbd: Discover _adb-tls-connect._tcp via mDNS\n",[51,557,558],{"class":53,"line":252},[51,559,560],{},"    App->>Adbd: Connect to 127.0.0.1 with the paired key\n",[51,562,563],{"class":53,"line":258},[51,564,565],{},"    App->>Adbd: shell: settings put (double press + default payment)\n",[51,567,569],{"class":53,"line":568},9,[51,570,571],{},"    Adbd->>Sys: Write as the shell user\n",[51,573,575],{"class":53,"line":574},10,[51,576,577],{},"    App->>Sys: Turn off wireless debugging (adb_wifi_enabled=0)\n",[16,579,580],{},"And this is how the boot restore decides what to do:",[41,582,584],{"className":210,"code":583,"language":212,"meta":46,"style":46},"flowchart TD\n    Boot([\"Boot\"]) --> Check[\"HyperOS checks double_click_power_key\u003Cbr/>may clear it, fill in mi_pay or keep it\"]\n    Check --> Mode{\"Mode recorded by the plugin\"}\n    Mode -->|\"Mi Wallet\"| Skip[\"Do nothing\u003Cbr/>mi_pay survives reboots\"]\n    Mode -->|\"Google Wallet\"| Job[\"Schedule a job that requires Wi-Fi\"]\n    Job --> Wifi{\"Connected to Wi-Fi?\"}\n    Wifi -->|\"Not yet\"| Wait[\"Wait\"] --> Wifi\n    Wifi -->|\"Yes\"| Adb[\"Turn on wireless debugging and connect to itself\u003Cbr/>(requires Developer options)\"]\n    Adb --> Value{\"Current value\"}\n    Value -->|\"null / mi_pay\"| Write[\"Write back \u003Cb style='color:#b45309'>launch_QAW_wallet\u003C/b>\"]\n    Value -->|\"launch_QAW_wallet\"| Ok[\"Already correct, leave it\"]\n    Value -->|\"Something else\"| Keep[\"Respect the user's choice, leave it\"]\n",[48,585,586,590,595,600,605,610,615,620,625,630,635,641],{"__ignoreMap":46},[51,587,588],{"class":53,"line":54},[51,589,219],{},[51,591,592],{"class":53,"line":222},[51,593,594],{},"    Boot([\"Boot\"]) --> Check[\"HyperOS checks double_click_power_key\u003Cbr/>may clear it, fill in mi_pay or keep it\"]\n",[51,596,597],{"class":53,"line":228},[51,598,599],{},"    Check --> Mode{\"Mode recorded by the plugin\"}\n",[51,601,602],{"class":53,"line":234},[51,603,604],{},"    Mode -->|\"Mi Wallet\"| Skip[\"Do nothing\u003Cbr/>mi_pay survives reboots\"]\n",[51,606,607],{"class":53,"line":240},[51,608,609],{},"    Mode -->|\"Google Wallet\"| Job[\"Schedule a job that requires Wi-Fi\"]\n",[51,611,612],{"class":53,"line":246},[51,613,614],{},"    Job --> Wifi{\"Connected to Wi-Fi?\"}\n",[51,616,617],{"class":53,"line":252},[51,618,619],{},"    Wifi -->|\"Not yet\"| Wait[\"Wait\"] --> Wifi\n",[51,621,622],{"class":53,"line":258},[51,623,624],{},"    Wifi -->|\"Yes\"| Adb[\"Turn on wireless debugging and connect to itself\u003Cbr/>(requires Developer options)\"]\n",[51,626,627],{"class":53,"line":568},[51,628,629],{},"    Adb --> Value{\"Current value\"}\n",[51,631,632],{"class":53,"line":574},[51,633,634],{},"    Value -->|\"null / mi_pay\"| Write[\"Write back \u003Cb style='color:#b45309'>launch_QAW_wallet\u003C/b>\"]\n",[51,636,638],{"class":53,"line":637},11,[51,639,640],{},"    Value -->|\"launch_QAW_wallet\"| Ok[\"Already correct, leave it\"]\n",[51,642,644],{"class":53,"line":643},12,[51,645,646],{},"    Value -->|\"Something else\"| Keep[\"Respect the user's choice, leave it\"]\n",[16,648,649,652],{},[36,650,651],{},"To be clear, this approach doesn't get around adb."," The plugin just turns on wireless debugging for you. Both switching modes and restoring after boot need adb shell access at that moment, which means Developer options and USB debugging / wireless debugging must be on. This is essentially the same as the original project's \"reactivate via adb after every reboot\"—it just removes the computer from the picture.",[82,654,656],{"id":655},"about-the-adb-client","About the adb Client",[16,658,659],{},"Wireless debugging pairing and connection involve protocol details like SPAKE2 and TLS. Honestly, I don't fully understand them myself; I left that code entirely to AI, working from the AOSP adb source, and my job was testing on a real device, reading logs and reporting problems. If you're curious, the code is in the repository.",[16,661,662,663,666],{},"There's only one thing worth mentioning for actual use: HyperOS freezes an app the moment it goes to the background (the log says ",[48,664,665],{},"freezeUid SUCCESS ... reason=tobg","). My first test got stuck exactly at the step where I switched to Settings to find the pairing code. So make sure to allow \"Autostart\" for the plugin and set its battery saver to \"No restrictions\".",[82,668,670],{"id":669},"test-results","Test Results",[367,672,673,683],{},[370,674,675],{},[373,676,677,680],{},[376,678,679],{},"Item",[376,681,682],{},"Result",[387,684,685,695,705,717,725,733,753],{},[373,686,687,692],{},[392,688,689,691],{},[48,690,140],{}," opens Google Wallet",[392,693,694],{},"Passed, both unlocked and locked",[373,696,697,702],{},[392,698,699,701],{},[48,700,173],{}," opens Mi Wallet",[392,703,704],{},"Passed",[373,706,707,710],{},[392,708,709],{},"Default NFC payment app follows the mode",[392,711,712,713,716],{},"Passed; the preferred payment service in ",[48,714,715],{},"dumpsys nfc"," changes immediately",[373,718,719,722],{},[392,720,721],{},"Switching modes in the plugin (wireless debugging toggled automatically)",[392,723,724],{},"Passed, about 5 seconds",[373,726,727,730],{},[392,728,729],{},"Full boot-restore chain",[392,731,732],{},"Passed: boot broadcast → wait for network → turn on wireless debugging → connect → run → turn off wireless debugging",[373,734,735,747],{},[392,736,737,738,740,741,740,743,746],{},"Boot-restore rules (",[48,739,173],{}," / ",[48,742,320],{},[48,744,745],{},"launch_camera",")",[392,748,749,750,752],{},"The first two are rewritten to ",[48,751,140],{},"; the last is left unchanged",[373,754,755,760],{},[392,756,757,759],{},[48,758,140],{}," with Mi Wallet as the default payment app",[392,761,762],{},"Can't open Mi Wallet; shows \"the current default wallet doesn't support opening with a double press of the power button. Please change your settings.\"",[16,764,765],{},"Not yet tested:",[87,767,768,771,774],{},[90,769,770],{},"Booting without Wi-Fi and connecting a while later",[90,772,773],{},"The full flow from pairing onwards on a fresh install",[90,775,776],{},"Paying at a real card reader",[82,778,780],{"id":779},"things-to-note","Things to Note",[87,782,783,792,798,804,814],{},[90,784,785,788,789,791],{},[36,786,787],{},"Everything depends on Developer options."," Many people keep Developer options off day to day; banking apps such as HSBC HK, for example, refuse to run on a phone with Developer options enabled. If that's you: while it's off, you can't switch modes through the plugin, and if you need Mi Wallet you'll have to go to Accessibility → General → Shortcut gestures → Double-press power button and switch back to \"Transit / Mi Pay / Door card\" manually; Mi Wallet mode isn't affected by reboots; but Google Wallet mode may be cleared by the system after a reboot, and a double press won't open Google Wallet until you turn Developer options back on and connect to Wi-Fi so the plugin can write it back. I also haven't verified whether turning off Developer options revokes the granted ",[48,790,454],{}," and the wireless debugging pairing.",[90,793,794,797],{},[36,795,796],{},"Wi-Fi is required."," Wireless debugging only works over Wi-Fi.",[90,799,800,803],{},[36,801,802],{},"The pairing can expire."," By default, Android revokes wireless debugging keys that haven't connected for 7 days. Fortunately, every mode switch and boot restore counts as a connection. If it does expire, just enter a pairing code in the notification again.",[90,805,806,809,810,813],{},[36,807,808],{},"The plugin now has network permission."," It only connects to adbd on ",[48,811,812],{},"127.0.0.1",", but it holds a key that adbd trusts, so it can get a shell whenever wireless debugging is on. If that bothers you, use \"Revoke USB debugging authorisations\" in Developer options.",[90,815,816,819],{},[36,817,818],{},"If you'd rather not install the plugin",", just run the command from the start of this post once by hand—you may need to run it again after a reboot.",[82,821,823],{"id":822},"conclusion","Conclusion",[16,825,826,827,829],{},"The China version of HyperOS 4 already hides the ability to open Google Wallet with a double press of the power button: it's stock Android's Quick Access Wallet, called ",[48,828,140],{}," in HyperOS. It just isn't exposed in the settings screen, and the system itself may clear it at boot.",[16,831,832,833,839,840,842,843,845,846,849],{},"So the whole thing really comes down to ",[36,834,835,836,838],{},"using adb permissions to change the ",[48,837,158],{}," setting",", and matching the default payment app to it. Going the other way, if you want Mi Wallet you also have to set it back to ",[48,841,173],{},", because ",[48,844,140],{}," can't open Mi Wallet. My fork just automates ",[486,847,848],{},"when"," that command runs: pair once, and from then on switching modes and restoring after boot don't need a computer—as long as Developer options stay on, which isn't great for anyone who has to turn Developer options off to use their banking apps.",[16,851,852,853,856,857,121],{},"As for why Quick Access Wallet is marked ",[48,854,855],{},"disabledByCustFeature"," on China ROMs yet works perfectly at runtime—",[51,858,861],{"className":859},[860],"heimu","probably because nobody uses Google Wallet on a China-version phone",[82,863,865],{"id":864},"see-also","See Also",[87,867,868,875,881,888],{},[90,869,870],{},[20,871,874],{"href":872,"rel":873},"https://github.com/zhullyb/PowerWallet",[32],"zhullyb/PowerWallet: the fork this post is about",[90,876,877],{},[20,878,880],{"href":30,"rel":879},[32],"DustinYe/PowerWallet: double-press the power button on a Xiaomi phone to open Google Wallet",[90,882,883],{},[20,884,887],{"href":885,"rel":886},"https://developer.android.com/reference/android/service/quickaccesswallet/QuickAccessWalletService",[32],"Android Developers - QuickAccessWalletService",[90,889,890],{},[20,891,894],{"href":892,"rel":893},"https://icebox.catchingnow.com/zh-hans/guide/wireless-debugging/",[32],"Ice Box - Wireless debugging activation (Chinese)",[896,897,898],"style",{},"html pre.shiki code .sAdtL, html code.shiki .sAdtL{--shiki-default:#4078F2;--shiki-dark:#61AFEF}html pre.shiki code .sDhpE, html code.shiki .sDhpE{--shiki-default:#50A14F;--shiki-dark:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":46,"searchDepth":222,"depth":222,"links":900},[901,902,903,904,905,910,911,912,913,914],{"id":84,"depth":222,"text":85},{"id":105,"depth":222,"text":106},{"id":151,"depth":222,"text":152},{"id":273,"depth":222,"text":274},{"id":326,"depth":222,"text":327,"children":906},[907,908,909],{"id":334,"depth":228,"text":335},{"id":343,"depth":228,"text":344},{"id":433,"depth":228,"text":434},{"id":655,"depth":222,"text":656},{"id":669,"depth":222,"text":670},{"id":779,"depth":222,"text":780},{"id":822,"depth":222,"text":823},{"id":864,"depth":222,"text":865},"In my previous post about FCM, I mentioned that I was getting ready to study abroad. Now that I'm actually overseas, I tap my card for almost everything—getting on the bus, buying coffee—so Google Wallet has become one of the most-used apps on my phone. But on the China version of HyperOS, \"double-press the power button\" can only open Mi Wallet. Every time I pull out my phone I have to unlock it, find the icon and tap it, which completely breaks the flow.",[917,918],null,{"title":919,"path":920,"stem":921,"date":922,"lang":923,"children":-1},"Cudy TR3000 Can't Eat the Whole Cake Anymore – Introducing HomeServer as Proxy Helper","/2026/07/17/my-router-proxy-plan-with-cudy-tr3000-and-n100","posts/en/my-router-proxy-plan-with-cudy-tr3000-and-n100","2026-07-17","en","/2026/11/10/xiaomi-double-click-power-google-wallet/",1794279581282]