Last active
August 7, 2022 03:58
-
-
Save BourgonLaurent/752d60484072d0e0649ea723d69205c6 to your computer and use it in GitHub Desktop.
AirPods Pro Listening Mode Changer. Copy-Paste the contents of the file "AirPods Pro Listening Mode Changer.json" inside BTT. The two other files are the scripts used by the widget. The last file (APPro_LMC_diag.applescript) retrieves the necessary information to add a new device, or debug a current one.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ | |
{ | |
"BTTWidgetName" : "AirPods Pro Listening Mode", | |
"BTTTriggerType" : 639, | |
"BTTTriggerTypeDescription" : "Apple Script \/ JavaScript Widget", | |
"BTTTriggerClass" : "BTTTriggerTypeTouchBar", | |
"BTTPredefinedActionType" : 195, | |
"BTTPredefinedActionName" : "Run Apple Script (async in background)", | |
"BTTInlineAppleScript" : "-- Change the listening mode of AirPods Pro, Laurent Bourgon 2020\r-- Works in the background using private APIs, thanks to @smithumble\r\r\r-- Frameworks to connect with Bluetooth\ruse framework \"IOBluetooth\"\ruse scripting additions\r\r-- Get AirPods Name\rtell application \"BetterTouchTool\" to set AIRPODS_PRO_NAME to get_string_variable \"AirPodsWg_DevceName\"\r\r-- Constant values\rset OFF to 1\rset ANC to 2\rset TRANSPARENCY to 3\r\rtry\r\t-- Get Device\r\trepeat with dev in (current application's IOBluetoothDevice's pairedDevices() as list)\r\t\tif (dev's nameOrAddress as string) contains AIRPODS_PRO_NAME then set device to dev\r\tend repeat\r\t\r\t-- Cycle safely through listening modes\r\tif (device's listeningMode as integer is equal to OFF) then\r\t\tif device's isANCSupported as boolean then -- Check if ANC is available\r\t\t\tset device's listeningMode to ANC\r\t\telse if device's isTransparencySupported as boolean then -- Fallback to transparency, is available\r\t\t\tset device's listeningMode to TRANSPARENCY\r\t\tend if\r\t\t\r\telse if (device's listeningMode as integer is equal to ANC) then\r\t\tif device's isTransparencySupported as boolean then -- Check if transparency is available\r\t\t\tset device's listeningMode to TRANSPARENCY\r\t\telse\r\t\t\tset device's listeningMode to OFF -- Fallback to off\r\t\tend if\r\t\t\r\telse\r\t\tset device's listeningMode to OFF -- return to the top of cycle\r\tend if\r\t\r\ton error\r\t----------------- error alert window ---------------\r\ttell application \"BetterTouchTool\" to display dialog \"Huh, wasn't able to do that. \n\nMake sure your AirPods Pros are connected.\" with title \"AirPods Pro Widget\" with icon note buttons {\"OK\"} default button \"OK\"\r\t----------------- error alert window ---------------\r\t\r\tif the button returned of the result is \"Reset Widget\" then\r\t\treturn\r\telse --if window pressed OK\r\t\treturn\r\tend if\rend try", | |
"BTTEnabled2" : 1, | |
"BTTRepeatDelay" : 0, | |
"BTTUUID" : "A0941075-41B9-4957-BE1C-6E628D0FA9D4", | |
"BTTNotesInsteadOfDescription" : 0, | |
"BTTNotes" : "💖Thanks to Contributor @LTO from the AQT Discord!", | |
"BTTEnabled" : 1, | |
"BTTModifierMode" : 0, | |
"BTTOrder" : 9, | |
"BTTDisplayOrder" : 0, | |
"BTTMergeIntoTouchBarGroups" : 0, | |
"BTTTriggerConfig" : { | |
"BTTTouchBarOnlyShowIcon" : true, | |
"BTTTouchBarItemPadding" : -25, | |
"BTTTouchBarButtonColor" : "35.000000, 44.000000, 69.000000, 255.000000", | |
"BTTTouchBarApplyCornerRadiusTo" : -1, | |
"BTTTouchBarItemPlacement" : 2, | |
"BTTTouchBarAppleScriptStringRunOnInit" : true, | |
"BTTTouchBarAlwaysShowButton" : false, | |
"BTTScriptType" : 0, | |
"BTTTouchBarButtonWidth" : 100, | |
"BTTTouchBarScriptUpdateInterval" : 2, | |
"BTTTouchBarItemIconHeight" : 30, | |
"BTTTouchBarButtonTextAlignment" : 0, | |
"BTTTouchBarAlternateBackgroundColor" : "35.000000, 44.000000, 69.000000, 255.000000", | |
"BTTTouchBarAppleScriptUsePath" : 0, | |
"BTTTBWidgetWidth" : 400, | |
"BTTTouchBarColorRegex" : "off", | |
"BTTTouchBarItemIconWidth" : 30, | |
"BTTTouchBarButtonName" : "AirPods Pro Listening Mode", | |
"BTTTouchBarButtonFontSize" : 15, | |
"BTTTouchBarFontColor" : "10.000000, 132.000000, 255.000000, 255.000000", | |
"BTTTouchBarIconTextOffset" : 5, | |
"BTTTouchBarAppleScriptString" : "-- Find the listening mode of AirPods Pro, Laurent Bourgon 2020\r-- Works in the background using private APIs, thanks to @smithumble\r\r-- Frameworks to connect with Bluetooth\ruse framework \"IOBluetooth\"\ruse scripting additions\r\r-- Get AirPods Name\rtell application \"BetterTouchTool\" to set AIRPODS_PRO_NAME to get_string_variable \"AirPodsWg_DevceName\"\r\r-- Constant values\rset OFF to 1\rset ANC to 2\rset TRANSPARENCY to 3\r\rtry\r\t-- Get Device\r\trepeat with dev in (current application's IOBluetoothDevice's pairedDevices() as list)\r\t\tif (dev's nameOrAddress as string) is AIRPODS_PRO_NAME then set device to dev\r\tend repeat\r\t\r\t-- Check if the device has special listening modes\r\tif (device's isANCSupported as boolean) or (device's isTransparencySupported as boolean) then\r\t\tset listeningMode to device's listeningMode as integer\r\t\t\r\t\t-- Return Icon\r\t\tif listeningMode is equal to OFF then\r\t\t\treturn \"{\\\"text\\\":\\\"off\\\",\\\"icon_data\\\":\\\"iVBORw0KGgoAAAANSUhEUgAAAGQAAACACAYAAAD9N8zAAAAABmJLR0QA\/wD\/AP+gvaeTAAAIbUlEQVR4nO2dXaxdRRXHf6sU+gFtsUJrAakIRTBQwFKMplGjJvok+oTR4oOa+ABRiZL4ET\/eIIZEqRrsgzHxg+iLJpgYiKLxQYwFxTaWQkkLLS0KLb22tr2lt71\/H2Ya2zJzzpx795pz7nV+yX05e\/bM2vu\/52vNmrnQaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0Wg0Go1Go9H4P8WGbUAJkgx4Xfy7IP7NA+YC5wCTwET8Owz8BzgIHDCzk8OweaqMrCBRhOXApcDFhJc\/KCeBA8Be4EUzm+zOQh9GThBJ5wBXACuBBR1mPQHsBnaY2fEO8+2UkREk1ojLgasJzZEXJ4AdwM5RbM5GQhBJC4EbgaUViz0K\/N3MDlQssy9DF0TSZcB1DNZHnASOEL72SWBOvH\/hgPkI2G5mzw5wjytDFUTSW4BVBUlPAC8D+4BXgHEzUybPBcCFwDLCoOC8gvz3AptHodMfiiCxv7gBuKxP0qPATmCPmZ2YQjlzgBXAm4ElfZIfAP4y7H5lWIKsJnTgOSaA7cCurr5aSZcA19J75LYf2DTMmlJdEEnXAlf2SLKP0Hwccyh7LqG\/6lUz\/wX8NdckelNVkPiVvq1HkueAp7xfhqQ3AqvJP\/92M9vuaUOOObUKkrSI0G8kLwNbzGxrjS\/TzF4ANhFGaylWSVrmbUeKKoLETnw1we+UYpuZ7a5hyynMbB\/wBGHY\/JrLwA2Szq1pE9SrIVcQHIMpnjWznZXsOIMoyubM5XnANRXNAabmsBsISecR3CEp9hFGU4PkdwHwAeAdwFXA+cA4sIvQDP3GzF4pzc\/M9kq6kPDRnM1KSbvN7OAgNk4Hd0EILy1VzgTBdVHUZ8Q2\/avApwgi5JiQ9Avga2b2fKGN24CLgEWJa1cDjxfmM21cmyxJ84A3ZS5vNbNXC\/P5OPAM8Fl6iwFwLrAe2CLpM7H\/6kmcd2whDC7OZnmsQVXw7kNWZso4aGZ7SjKQ9E3gpwR3yCAsAn4A\/Di69HtiZmPAPzOXU82ZC26CnOZOT\/F0YR53A9+YpinrgZ+ViEKohalasiLWdnc8a8hFwPzE74fi6KYnkj4GfKsjW24Dvt4vkZkdIczUz2YOcElHtvTEU5A3ZH7f1e\/GOKP\/brfm8BVJawvSPZ\/5Pfc8nVJbkEngxYJ7v0f3i1VzgR9GD3CWOGQeT1xaGofwrrgIEucKqTZ3v5lN9Ln3GuBWD7uA64EPFaRLNVtGhRVNrxqSm5W\/XHDv3fjW3C8UpMnZmXuuzvB68NwQdazXTZLmAx\/t3pwzWCcp5zk4xRjp0Zb7fMRLkNTkbRI41Oe+dxLWxb15X6+LcXXySOJSv0nptPESJPVSs+vgp\/FeD2MS9BQkkhJkfuF8Zsp4CZKafxwtuO+6rg2ZRjk5e10niJ0LEmfoqXx7jq4itRaFlhekydk742pIzuCSaI6LuzSkB0sK5hQ5e1095NWWcAvLGjjUZ4pM0v8DydnrusTsIUjuQUtmuS91aUgP9hfEX+XsdY3b6lyQOJJKGV0iSGqG7EFJObn1dNda7NVkpXxBJYL8uWtDMvypIE1qNCWg83ix06kpyIKCjvRhD2MSPFKQJhV6esw7TMlLkNyMvKdzzsyeAZ7q3pwzOAT8vleC6BxNfTzuwQ5eguQML\/GW3tulIQk2mNnhPmlydvZz\/UwbL0FyYTgl84wHGTA0aAAOAd8uSJeboO7v0JYkLoLEaJLU17RIUr9m6yRwO+CxD\/DOfjum4tp5aiZ\/gj7e6i7wnBjmIjhW9rvRzDYR1kW65AEz+0lBupWkg7BfqhF37CnI3szvRREcZrYB+Dzp2NtB+RHwuX6J4vJuLlKmKGxpurgJYmZHCaGiqTLfWpjH\/YTma6qd6XHgy2b2yX5Lx5EryXuq3fsP8Pdl5YKoL5V0UUkGZvYgYUvaBgZzW\/wOuMnMikZtcW\/iVZnLO2tt4HHfsCNpHemlz8PAHwd50Bge9GHgI8AazlzjPkwIB30I+OWgO2sl3Uw6UuYY8Idaew9rCLKUsDSb4kkzy\/U1JXkvJuwZPB5DQaeazyLg3ZnLm+MGnyq4R7+b2QFJe0jv65vWGrWZHaKbyVpuI+gYlTrzU9RaD9lK2in370rl92OM1\/ZPk4TaUXXzZxVB4gjnceDU9gMROsqSOC13on1\/43\/2HQeeKHCxzGwkmaQlMf5q5JA0R9LCkj0lXgz9rJOpEDvzJYQ5w2JCyM44IbLe3b3hyUgLEmvSzYRR2lrCxK3fMRnjhOOXdgBPAo8Rjsxw99TOSiQtlrRe0q8kjasbTkh6VNIdklYM+xlnBJJWSbpX0lhHIuQ4KenXkt4\/7GceSSRdLmljfFG1eUzSu4b9DkYCSfMl3SPp1SEIcTY\/15CO0hgJJK2VtG3IIpzNPkm3DfvdVEfS7ZKODvnl92KjKmxdGzoKk8L7hvyyS3lUweFYnSrzEIWVuI3Ap2uU1xGbgA\/WnmjWci7ex8wSA+AW4GFJ7rumTsddEEl3And5l+PELYSjOap5NFwLkrSG4LqY6Z3kXWb2nRoFuQmiEFmyhfxZWTOJ48AaM\/uHd0GeTdYXmR1iQKjhD9RoulwKUFhH30X4Px+ziVvN7CHPArxqyB3MPjEAvuRdQOc1JFbr5ygIGZ2hXO\/Zl3jUkLcze8WAcPaWGx6C5OKbZgvv8czcQ5AbHfIcJW7yzNxDkJJTEmYy5ytseXOh5kkOswm3iE8PQbY55DlK7MVx86eHIPdTdvLPTOUez\/BSj5MctgHrgN\/ifAxFZZ4GPmFm3\/csxNvbu5iwCWYZ8HoqnMjWIROEXVP7gRdKT+JuNBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0YP\/AhOvCROsHQgcAAAAAElFTkSuQmCC\\\"}\"\r\t\telse if listeningMode is equal to ANC then\r\t\t\treturn \"{\\\"text\\\":\\\"anc\\\",\\\"icon_data\\\":\\\"iVBORw0KGgoAAAANSUhEUgAAAGQAAACACAYAAAD9N8zAAAAABmJLR0QA\/wD\/AP+gvaeTAAAH80lEQVR4nO2dbYxdRRnH\/0NLAYtbebGAL4i8mFIlkZSWUFCJb6Ua7ScjghU1EqIQDCqRD8RAggFNY6yJQk00hmLEgGBsImhB0w+s2BCJpFprqFDeRKSU3UK3bLf9+WHupst65p45986cc+7t80v2y5wzz\/xnnnvOnJl5ZlYyDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDlFc0wJiAOZKWi5pmaTFks6UtFDSiKSjJE1K2tX5+6ekLZL+ImmTc26iCc1DBzAHWAXcDbxMb+wB7gMuA45suk4DCTAfuA54qkcnhNgJfBd4c9N1HAjwT8QVwHOJHTGbMeB64A1N17m1AKcAmzI7YjbbgQuarvtsGu\/UgdWSfiTp6ArZ9kh6XNJuSROS5sl38O+UtKCCnSlJN0r6tnOOCvmGD8ABN0X+mncDvwQ+D5wGHNbF7tuBTwE\/AV6ItP9z4Ig6698qgMOA2yNfK1cCIz2WcwRwCfBIRFmbgPmp69p68E\/Gj0sa5yXgamBewjIvBnaUlPsAh9rnMfCdkkb5PfC2TGWPAD8rKf\/XdHklDhWdX2k31tbRGMAXgckuOm7IraFxgHcDrwQaYD9wec16Pgq82kXPyjr11Aq+Ex\/t8ou8piFdHwH2BjQ9B7ypCV3ZAb7WxRk3Nazt0i7abqtbT\/aBIXC8pO3yA7fZbJS00jm3v4K9oyWtkHSepNMlzZcfHO6QtFnSb51zOytqXCvp6qJLkpY45x6tYq\/VAN8L\/Pp2AidUsLMQ3+mH+qFpJoH1wCkVbM8DtgTsbeip4m0EOBGYCFT0sgp2LgV2lThiNuP4ycqotwCwHN+ZF3Fu763QIoBvBSr4SIWGuqGiI2azHpgTWdYvAjbu6K8lWgAwF3g6UMEVkTau7dMZ09wZ4xTgDGBfQf69VHi9thJgRaBx\/hqZ\/5JEzpjmxshy7wrkL+r0BwfgtkDFrojI+xZ8p5+SfcDSiLIvDOT\/Y5qWaQD8ZN7zBZV6jYjBFnBPYmdM8xglUzMd7UWTkFPAcelaqZhc80aLJBW9cx9wzr3cLSOwSNKqLKqksyR9stsNnYWqewsuzZGUfYUxl0POC6TfH5H3WuXTJUlfj7jnvkD68pRCishV8dC7erRbJvxaxMXp5byOC4B3ldzzsKQDBemlfVC\/5HLI6QVpk5LKvrCWS6ojGuRD3S4658YkbSu4dEYeOQep0yFPOuemSvJ9MIeYAro6pMPjBWlvBY5KLWYmuRxyYkHaExH53pNaSB\/l\/Ksgzam4bslI7hB8HG7RunTXr6sOCxPLCREz6g7pzRoIkeMJCQl+NSJvXWGeCygPoHglkP7G1GJmksMhoYCzmLinsj4mFQckla3BhKJPir6+kpHDIaHw\/5hR7n9SCunCixGLYiG9e1KLmUlyhzjn9qlY9PER2Z9PLKefckIOiekLeybXV9ZTBWkx\/cOfUgsJ8FDEPUUfGPsl\/TuxlteRyyFPFqSdTPnejJiplRT8rttF\/OLZkoJLz0SMpfoil0OKRuRO0vndMjnntkn6exZFBxmX9IeSexap+BWbPdghl0NCwt8XkfeWlEIK+IFzLvRJO03ohzOY0Sf44IYDBWsKf4vIOwfYlnohpMMYcGyEhl8F8r8\/TQs1APBooFKlawrAMvxiVmpWR5R9EsVxv+PA4WlaJ0zOdYd7AulfLsvonNssvy6Skludc+sj7rtcUlHDb+h80g8mwKkUv7b2AidF2vgq4VipKvw05teN3+ATipS5qP9WaRj8Xo8iouOc8NEnYz064jXgugplXR+ws53I2K5Wgw\/5DxG99gEchw8jnargjI3A4gplnEw4TPWq3lqghQAPByq5lYqdJD486Cudxn5plr3dwEPAN4HKK3vAvQGdzzJMe9qB8ynuSwA+06ftEeAE4Jg+7SzuovEL\/dhuJYR33EZFE+YGWBnQN8ow7jcEjuk8+rP5WNPaJAk4Fn9QzUwmgDOb1pYN4BwOnmMyBaxpWtNMgE9wMNryBeDjTWvKDnA4cDaZtj33C3AkfvyUfUQeovGzTnoBf7LDAvll1hH59foJSePOuV1NauuXVjsEH8l4jnwA3VJJp0k6Vd0PmJmQ39O4XX52dlTSn51z43nVDin4T9nP4scFoe1wVZkCHsSfmxI1bXPIg9+9dAvV9xJWZT+wAfhw03VuJfgpi3WkmUSsyiiDvMaREvwXzc3kWfeoyp1AXVGT7QNYip\/LahP\/BT7ddNvUDrCa\/x8Vt4l1JDqnq9Xg9+6tabixY3kQyBrDG6KWcQh+gm6dpC\/VUV4iNku6qO6BZl0zmWs0WM6Q\/LHm91PzOYx1nN52laRGzsNKwDJJtxN5DEgKshYELJGfuhj0TvIa59z36ygom0Pw5+A+Jqlsx+sgMCl\/btaW3AXlfGV9Q8PhDMk\/4bfW8erKUgA+XHOHqh0fPgiscs79JmcBuZ6QKzV8zpCk6BivXkn+hHQe6yckvSO17ZZwVs6+JMcTcq6G1xmSlHW+K4dDPpDBZpu4MKfxHA55bwabbeLsnMZzOGSwzyYsZz7+7OAs5HDI4EeJlzM3l+EcDtmawWabeFbSWC7jORyyVplPO2iYm3P+v6ocJzlslT+bcKPKzxMZJP4h6XPOuR\/mLCT3bO+I\/GFmC+WPqhik\/\/G0T9KLnb+nnXPPNKzHMAzDMAzDMAzDMAzDMAzDMAzDMAzDMAzDMAzDMAaf\/wHZEmz3LFSz4AAAAABJRU5ErkJggg==\\\"}\"\r\t\telse if listeningMode is equal to TRANSPARENCY then\r\t\t\treturn \"{\\\"text\\\":\\\"transparency\\\",\\\"icon_data\\\":\\\"iVBORw0KGgoAAAANSUhEUgAAAGQAAAB+CAYAAADSr7SpAAAABmJLR0QA\/wD\/AP+gvaeTAAAH3ElEQVR4nO2ca4xdVRXH\/3s69CmPIiVYSqE8pAJqWlQmCDZGomIJ8YGggWAwxmj84DOiCcYEE+WDYnw\/KnwSBCQaI9DIo0VqC2IDJWBoiSVga0tLoe2UKbSdmZ8f9p3k9vTsc+6de\/Z53Fm\/ZD7MOXvvtfZe5+7X2ntJhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmHUE2AmcB5wdNW6TGkAB9wAvIFnDPgFMLNq3aYkwBdI54dV69Z3AMuB+4B\/A7cBb01J83TAICPAYCLtW4BfA08Bq4HryqtNwwE+B4wnGnkvcFYi3e6AQQBObEt3PPBCSpoflF+7hgFMB14JNPIdibSrA+m2JNJ9L5DuILCg3Bo2DOCsjK\/++UTaoVajtjMOfCqR7v6MMj9Sbg07Y6BqBdrYKWk08O6l9n+cc49JulDSvZL+K2mVpOXOuTsS+bZnyPvfJPWcOuAH8TSumWR5Qxw5JgE8BtTpY6wOYKDVUMuAuYl3RwN\/bGu4A8D1gOtB3tX4icEEq0mMH8Bs4OKWTkdNVlbjAM4GNrY1zh7gsynpFrSMNqcgudOBdwNnpLz7MLCtTaftwEVFyK01wCCwKaX7GAUurEin04DhFJ12A8dXoVOZ\/ej7JR2xyJM0TdK1JerRziclpe2DHSfpypJ1kSQN5icpjKwv7rhuCmqNKadLOkPSsZL2yc+2NjnnxrooKkvum7vRqXEApwRmPABf67CMc4FfATsC5ewBft9pFwhcHigHYFlvNW4AwI0pFd8AzM7JNwu4Cb+r2yl3AfNyynXAvSl5b6OHmV1jaDXAJ4C\/An8HvkvOTApYAvynC0O0swP4YE75g8BXgFX4Tc3PM5Wmvt0AvAPYNUljTHAAuKzqujQe\/N7Wzh6NMcF+4OKq61Q5+IXgLcB6fF99SYf5BoA1BRljgi1AR7M5YClwZ0vvO4ELemuJGoCfESW308eAT3eQ99sFG2OC33Ug+yL8L6qdN+jwY6otrS8rja3AtIx8c4F9kQwyDpybo\/c\/AnmfKL6VjiTmSv1dgecnSzolI98XJb2peHUkSU7SV3PSvCfwfEnWh1QUMQ2yJ\/B8VNLetBetCn8pmkaea4ATMt6\/Eni+O4YySWIa5LeB53c550KVWyppfiR9JpghKWs8COl9S5fbMvUD79N+va3\/\/gsQ7I6IN5gnWZGhwyD+lMpoK+0ocCv9slgE5hHwRaSkvackg2zsQJf5wAWUfBiiVvs1wAZJ7yxB1IhzLtbEoSfq5lc+MT9JIcyhIG9k0UT3hwAL5R1TO5xzT+ckL\/PQ9LGSRkIvW13sIklbnXO5XVztwe\/s\/gQ41NZ3ryJxsCGR58WSxpBxYEZAhxn47ffxtrR3h9I3BuDLgca4OyPP47Et0eLVDB1uCuT5WZyWKgm84ymNMSDVPQr8IUbrp\/CvDL1DO8x7afhKPTSLGch492AkXZI8kPEutCN8jCQi6HIYMQ3yaOD5i5K2BN79TSVUuiUnxNrA838658ZjKFMKeAfT9sTP\/hDw0Zx8K+P1VAA8l9X14BexybNar9EPh+eAU4EfAw8AtwNDHeQZimyQqzvQ4W3AipbeK4C3F9MiDQX4UyRjPEEJA3PfgXdSPV+wMYaBs6uuW63A+8qvAx7BT4tvJuDnBs4n++paNxwALg\/ImYE\/jrQeWAd8g6lymxf4UUpjbSSwJY\/3y\/e6eh8GPhQofwC\/e5Dkz\/T7\/RFgUUajXZ+Rbz7+FOJkeAhYnFH2FRl5KznUUOZXEPJVS95TmIpzbptz7kpJ75O0UtLBHDnjktZI+rhz7gM5G4NBuZIqOfpT5un3lzPe7crL7JxbI2kNfsxZLmmJpIXyK+u98vcQn5J0j3PupWBBneu0s8MymgkwDXgmpWs4CIROqMTWaQHwaopOu4BjqtCpVPA3lta3VXwncFXFOi3j8Cn2ZuD8qvSpxIULnCNplqRnnXP7q9Ahoc90SYvlu\/AnnXNl7KcZhtE1tTp1kgXehbpI\/l7hyZLmynd7M+WnwiOShuWjN2yWtLkO3WG31NYgeN\/7pZLe2\/o7T\/7GbjdskvfLrJW00jln4TS6AR+y7zN4n0gyuEyvjAFr8b7+rm79Tjnwpxu\/T3E3pvJ4DfgNiThcUx5gDvAdDo9FUiYHgV8CJ1XdFpWDD\/byXEWGSLIHf\/u2tmNqNICjgJ8SDiJQJSvJvjvSXwAnUfxlzqJ5gamwdQKcKn\/u6syyZPbAiPz2\/f1lCy7FIMCZkh6WX9A1hQPyRrmvTKHRDYLvk9cqPTRT3Xld0iXOuXVlCYxqEHxQ44flV9pN5WVJS51zW8sQFtuFe6OabQxJmifpdhIRs2MR7RcCLJX0uLrff6orX3fO3RxbSBSD4BdY6yTlHh1tEPskLXbObYspJFaXdZn6yxiSv273zdhCYv1CHpHUj+GQ9kta6JwLRXvomcJ\/IcDpkpp\/dD+d2fKRTKMRo8v6mGrs+CqAK2IWHsMgTZ\/m5jEUcwocwyCZ8aj6gDmSTotVeAyD9HcAYk+0LfoYBml2CKPOOBSr4BgGCd4B7xNGJD0bq\/AYBrlB\/nxUP4Kkb8U871W4QZxzG+TjLd4qaUfR5VfEfvm7KZc6534eU1AZ\/pBZ8oPgCapfOKg8huWjGPXrL94wDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwyuX\/pyrJqgW+mrEAAAAASUVORK5CYII=\\\"}\"\r\t\tend if\r\tend if\ron error\r\treturn\rend try", | |
"BTTTouchBarButtonCornerRadius" : 0, | |
"BTTTouchBarFreeSpaceAfterButton" : 1 | |
} | |
} | |
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Change the listening mode of AirPods Pro, Laurent Bourgon 2020 | |
-- Works in the background using private APIs, thanks to @smithumble | |
-- Frameworks to connect with Bluetooth | |
use framework "IOBluetooth" | |
use scripting additions | |
-- Get AirPods Name | |
tell application "BetterTouchTool" to set AIRPODS_PRO_NAME to get_string_variable "AirPodsWg_DevceName" | |
-- Constant values | |
set OFF to 1 | |
set ANC to 2 | |
set TRANSPARENCY to 3 | |
try | |
-- Get Device | |
repeat with dev in (current application's IOBluetoothDevice's pairedDevices() as list) | |
if (dev's nameOrAddress as string) is AIRPODS_PRO_NAME then set device to dev | |
end repeat | |
-- Cycle safely through listening modes | |
if (device's listeningMode as integer is equal to OFF) then | |
if device's isANCSupported as boolean then -- Check if ANC is available | |
set device's listeningMode to ANC | |
else if device's isTransparencySupported as boolean then -- Fallback to transparency, is available | |
set device's listeningMode to TRANSPARENCY | |
end if | |
else if (device's listeningMode as integer is equal to ANC) then | |
if device's isTransparencySupported as boolean then -- Check if transparency is available | |
set device's listeningMode to TRANSPARENCY | |
else | |
set device's listeningMode to OFF -- Fallback to off | |
end if | |
else | |
set device's listeningMode to OFF -- return to the top of cycle | |
end if | |
on error | |
----------------- error alert window --------------- | |
tell application "BetterTouchTool" to display dialog "Huh, wasn't able to do that. | |
Make sure your AirPods Pros are connected." with title "AirPods Pro Widget" with icon note buttons {"OK"} default button "OK" | |
----------------- error alert window --------------- | |
if the button returned of the result is "Reset Widget" then | |
return | |
else --if window pressed OK | |
return | |
end if | |
end try |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Diagnostics to get the listening mode of a bluetooth device | |
-- Used to get info/debug in order to make a BTT widget with AQT | |
-- Laurent Bourgon (@LTO/@BourgonLaurent), 2021 | |
-- Frameworks to connect with Bluetooth | |
use framework "IOBluetooth" | |
use scripting additions | |
-- Things to Show | |
set listToShow to {"Copy all this message (click here and then ⌘+A) and send it: | |
"} | |
-- Things that will change during the try/error | |
set PLIST_COMMAND to "couldn't generate command (see error)" | |
try | |
-- Constant values | |
set OFF to 1 | |
set ANC to 2 | |
set TRANSPARENCY to 3 | |
copy "[-] Get the name of the device stored in BTT" to the end of the listToShow | |
-- Get AirPods Name | |
tell application "BetterTouchTool" to set AIRPODS_PRO_NAME to get_string_variable "AirPodsWg_DevceName" | |
copy " [x] Device name: " & AIRPODS_PRO_NAME to the end of the listToShow | |
-- Get Paired Devices | |
set pairedDevices to current application's IOBluetoothDevice's pairedDevices() as list | |
-- Set `device` to the instance of `AIRPODS_PRO_NAME` | |
repeat with dev in (pairedDevices) | |
if (dev's nameOrAddress as string) is AIRPODS_PRO_NAME then | |
set device to dev | |
exit repeat | |
end if | |
end repeat | |
set deviceAddress to device's addressString as string | |
copy " [x] Retrieved the device " & (device's nameOrAddress as string) & " with address " & deviceAddress to the end of the listToShow | |
try | |
set ProductID to do shell script "/usr/libexec/PlistBuddy -c \"print :DeviceCache:" & deviceAddress & ":ProductID\" /Library/Preferences/com.apple.Bluetooth.plist" | |
on error | |
set ProductID to "ERROR" | |
set currentModel to "Not Airpods" | |
end try | |
copy " [x] ProductID: " & ProductID to the end of the listToShow | |
set PLIST_COMMAND to "/usr/libexec/PlistBuddy -c \"print :DeviceCache:" & deviceAddress & "\" /Library/Preferences/com.apple.Bluetooth.plist > ~/Desktop/" & deviceAddress & ".log" | |
copy " | |
[-] Check if the Device has Listening Modes" to the end of the listToShow | |
copy " [?] ANC supported? " & (device's isANCSupported as boolean) to the end of the listToShow | |
copy " [?] Transparency supported? " & (device's isTransparencySupported as boolean) to the end of the listToShow | |
-- Check if the device has special listening modes | |
if (device's isANCSupported as boolean) or (device's isTransparencySupported as boolean) then | |
set listeningMode to device's listeningMode as integer | |
copy " | |
[x] There's a listening mode (as integer): " & listeningMode to the end of listToShow | |
-- Return Icon | |
if listeningMode is equal to OFF then | |
copy " [x] Listening Mode is: OFF" to the end of listToShow | |
else if listeningMode is equal to ANC then | |
copy " [x] Listening Mode is: ANC" to the end of listToShow | |
else if listeningMode is equal to TRANSPARENCY then | |
copy " [x] Listening Mode is: Transparency" to the end of listToShow | |
end if | |
end if | |
on error errMsg | |
copy "[!] ERROR: " & errMsg to the end of the listToShow | |
end try | |
copy " | |
[-] Commands" to the end of the listToShow | |
copy "PlistBuddy command: | |
" & PLIST_COMMAND to the end of the listToShow | |
set AppleScript's text item delimiters to " | |
" | |
set stringToShow to listToShow as string | |
set AppleScript's text item delimiters to "" | |
display dialog stringToShow |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Find the listening mode of AirPods Pro, Laurent Bourgon 2020 | |
-- Works in the background using private APIs, thanks to @smithumble | |
-- Frameworks to connect with Bluetooth | |
use framework "IOBluetooth" | |
use scripting additions | |
-- Get AirPods Name | |
tell application "BetterTouchTool" to set AIRPODS_PRO_NAME to get_string_variable "AirPodsWg_DevceName" | |
-- Constant values | |
set OFF to 1 | |
set ANC to 2 | |
set TRANSPARENCY to 3 | |
try | |
-- Get Device | |
repeat with dev in (current application's IOBluetoothDevice's pairedDevices() as list) | |
if (dev's nameOrAddress as string) is AIRPODS_PRO_NAME then set device to dev | |
end repeat | |
-- Check if the device has special listening modes | |
if (device's isANCSupported as boolean) or (device's isTransparencySupported as boolean) then | |
set listeningMode to device's listeningMode as integer | |
-- Return Icon | |
if listeningMode is equal to OFF then | |
return "{\"text\":\"off\",\"icon_data\":\"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\"}" | |
else if listeningMode is equal to ANC then | |
return "{\"text\":\"anc\",\"icon_data\":\"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\"}" | |
else if listeningMode is equal to TRANSPARENCY then | |
return "{\"text\":\"transparency\",\"icon_data\":\"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\"}" | |
end if | |
end if | |
on error | |
return | |
end try |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment