開發人員關係工程師
Googlebook 的推出,為高擬真度的桌機級體驗開闢了新境界。在這場講座中,我們將深入瞭解兩位先驅合作夥伴,他們從零開始為這個平台打造產品。
Notability 將分享他們使用 Jetpack Compose 打造電腦級 Android 應用程式的歷程。瞭解他們如何從其他應用程式平台轉移,並以電腦為優先考量。接著,Logitech 將深入探討硬體層面,說明如何建構及自訂周邊裝置,與 Googlebook 完美整合。歡迎參加這場講座,瞭解如何最佳化輸入內容、運用大螢幕 API,以及在軟硬體上提供優質一致的使用者體驗。
轉錄稿
大家好,我是 Emilie Roberts,擔任開發人員服務代表,在筆電上開發 Android 應用程式已有約九年時間。
Googlebook 隨之問世。
太好了!
我非常期待,因為我們為筆電領域帶來了很棒的創新。
很高興能與兩位開發人員同台,他們投入大量心力,讓應用程式在 Googlebook 上呈現絕佳效果。
您好
我是 Notability 的 Ryan。
我是 Android 經理,這款數位筆記本應用程式是我們剛在 Android 推出的產品。
這項功能也適用於 iOS、電腦,以及 Google 圖書。
你好:
我是 Logitech 的 Joe,我們以優質硬體和周邊裝置聞名。
並說明我們如何將這些功能導入新平台。
我要把他們推倒。
Google 圖書應運而生。
太好了!
太好了!
太好了!
希望大家有機會親自試用,或前往樓上/樓下的展示攤位體驗。
當然,也別忘了檢查應用程式在這些裝置上的顯示效果。
我會照慣例說明 Android 生態系統正在成長。
我九年來一直這麼說,現在依然如此。
應用程式也需要與時俱進,確保能滿足使用者在所有螢幕尺寸和裝置上的需求。
目前,採用效能良好且運作正常的應用程式版面配置已是標準做法。
而 Jetpack Compose 和 Navigation 3 是最佳選擇。
輸入內容也一樣。
應該就能正常運作。
當然,應用程式的架構和狀態管理也都是版面配置和輸入內容的一部分。
我們在 ADS 舉辦了多場講座,介紹如何運用最新工具和最佳做法達成這個目標。
不過,今天我們想藉此機會,為從一開始就為 Googlebook 開發產品的開發人員提供一點空間,聽聽他們的故事。
Notability 是專為 Googlebook 打造的強大記事應用程式。
Logitech 不僅確保鍵盤、滑鼠和其他周邊裝置能正常運作,還確保這些裝置在 Googlebook 上能發揮最佳效能,包括使用者自訂功能。
抱歉搶了你的風采,Joe,但我們會深入探討細節。
這對我來說已經足夠了。
抱歉,這次沒有饒舌。
也絕對不要再即興發揮了。
總之,我們很高興能在 Googlebooks 上推出 Notability,現在我要把簡報筆交給 Ryan。
謝謝。
太棒了!
非常感謝,Em。
我們很高興能加入 Googlebooks。
Notability 是數百萬名學生學習和專業人士做筆記的地方。
如前所述,這項功能現已在 Android 上推出。我會快速說明我們如何建構這項功能,以及如何正確建構 Android 應用程式,以便在 Googlebooks 上達到最佳效果。
首先,我們大約在兩年前開始這個專案時,就希望確保我們不只是移植 iOS 應用程式,然後直接提供給使用者,並認為這樣就足夠了。
我們希望打造出真正符合使用者期望的原生體驗,同時提供完整的功能。
為此,我們使用 Material Design 和元件,從頭開始自訂所有畫面。
此外,我們也確保能充分運用 Jetpack Compose。
由於這是一款完全採用 Jetpack Compose 的原生 Android 應用程式,因此我們能支援各種硬體,不只是小型手機和低階裝置,還包括高階、功能強大的大螢幕平板電腦、電腦、XR、車輛等,以及介於兩者之間的所有裝置。
Jetpack Compose 可讓您輕鬆支援這些原生功能,不必在 UI 介面中建構大量額外功能。
接下來,我們來看看 Notability。
Notability 的所有內容都是以 Jetpack Compose 建構而成。
整個平台的使用者介面都一致,基本上只要建構一次,手機上顯示的內容與最終在平板電腦和 Googlebook 等大型裝置上顯示的內容之間,不會有任何實際變更。
為此,Navigation 3 是我們的一大突破。
Navigation 3 在 Google 內建 Notability 中的運作方式是,根據螢幕大小,我們實際上可以自訂版面配置,而不必擔心該功能會如何呈現。
在這個示範中,你可以看到,如果某個項目有空間可以開啟側邊面板,就會開啟。
如果沒有,則會以底部功能表的形式彈出。
那麼,程式碼會是什麼樣子?
在畫面上顯示的程式碼中,您可以看到側邊實際摘要面板有一個進入點,我們將其新增至返回堆疊。
接著,自訂場景策略會根據是否有空間,為側邊面板選擇版面配置。
因此,在平板電腦或 Googlebook 裝置上,系統會尋找可用空間,並騰出空間,然後從右側滑入面板。
不過,在手機或折疊式裝置等裝置上,可能沒有足夠空間正確顯示該面板,因此會改為彈出底部功能表。
Notability 會根據視窗大小調整,而不是根據裝置類型 (手機、Googlebook、平板電腦、摺疊式裝置等),因此我們的 UI 可以輕鬆自動調整,滿足使用者需求。
在手機上,所有按鈕和工具都會重新排列,方便使用者用拇指操作。
在平板電腦上,導覽面板會顯示在所有主要內容旁邊,因為平板電腦有更多空間,螢幕也更容易互動。
在摺疊式裝置上,我們利用摺疊功能提供獨特的版面配置和 UI,例如學習測驗,使用者可以在下半部回答問題,並在上半部查看實際測驗進度。
最後,在 Google 圖書中,我們實際上可以順暢地調整視窗大小。
因此,就像在電腦上使用其他一般視窗應用程式一樣,Notability 會根據你調整視窗大小的方式,配合你的並排需求。
如前所述,我們在建構 Google 圖書時,採用了自動調整式 UI,幾乎能提供完整的電腦版體驗。
這項功能可以讓你非常接近目標。
不過,如果你想獲得媲美桌機的體驗,享受真正與眾不同的效果,建議你採取以下幾項做法。
首先,以鍵盤操作為優先。
使用者不會像在一般平板電腦或手機裝置上那樣,對觸控操作那麼敏感,因此提供鍵盤快速鍵和輕鬆存取 Android 快速鍵清單的方法非常重要。
接下來,您有時可以設計功能,根據裝置類型和可用的輸入周邊裝置,採用不同的版面配置。
如果偵測到筆電、外接鍵盤或滑鼠,主畫面會顯示略有不同的使用者介面,將使用者重新導向至我們認為他們會偏好的工具,而不是平板電腦等裝置,因為這類裝置的主要選項是觸控筆和自動手寫筆記。
另一件需要思考的事,是多個不同裝置如何互動。
Android 17 的新功能「接續使用」可讓您在不同裝置間順暢切換應用程式。
舉例來說,在這個範例中,我們將記事從手機轉移到較大的電腦裝置。
只要快速同步處理附註 ID,並快速查看進度,即可輕鬆完成。
因此,我們只要向 Googlebook 裝置傳送快速應用程式意圖,就能輕鬆接續上次中斷的地方。
針對電腦級裝置,另一項要考量的是多輸入支援模型。
因此,除了前面提到的鍵盤快速鍵等功能外,觸控板也會提供與以往不同的縮放和捲動行為。
此外,您可能需要為使用者提供先前沒有的右鍵選單。
此外,由於許多 Googlebook 裝置仍是觸控螢幕裝置,因此當使用者與裝置互動時,您必須確保系統能辨識不同的輸入方式,不只是觸控筆和手指,還有觸控板游標,因為這三種方式都應以不同方式處理。
如果您對筆跡和筆記功能感興趣,例如 Notability,建議使用 Jetpack Ink。
因此,我們使用這個系統為筆跡提供低延遲建構系統,而不必管理龐大、複雜的執行緒、轉譯和緩衝區讀取器,以及其他我稍後會介紹的內容。
但如果現在能用,我其實可以向大家現場示範 Notability 應用程式,這要感謝 Logitech。
好,太棒了。
所以,噢,拜託。
好了,太棒了。
這就是我剛才執行的測試。
但如你所見,我用的是手指,所以這裡仍會辨識手指輸入,這點很棒。
我也可以視需要使用滑鼠。
不過,我們目前已能打造一些 Android 專屬的自訂筆刷。
如你所見,我選取了彩虹和亮粉效果,因此輸入或筆跡效果會受到底層 Jetpack Ink 程式庫的影響。
現在,我再寫一次訊息。
大家好。
最後,我們選擇 Android 綠色。
很難正確觸控。
Android 綠色。
接著,我們可以看到實際顏色會根據您在這裡做為基本模型的顏色而變更。
太好了。
過去,我們可能需要花上幾個月的時間,才能完成所有自訂著色器和介面,並確保一切正確無誤且美觀。
幸好,現在有了 Jetpack Ink,只要運用 AI 和自訂筆刷建構工具,不到一週就能完成。
所以如果你想刺青,可以找他們。
這項 API 非常實用,為我們省下許多時間。
太棒了!
如先前所述,這就是大致的樣子。
因此,我們有所謂的濕墨層。
這是我們正在繪製的墨水,還在繪製中,需要非常非常靈敏,你知道,相對於乾墨水層。
從實體角度來看,這很合理,你可以這樣想。
那是儲存的墨水,已經完成了。
因此,交接工作過去完全由我們負責。
因此,我們必須進行執行緒、重新繪製和清理,並將其交給乾層,確保這些同步且不會閃爍,而且存在所有這些複雜性。
最後,我們必須運用 Notability 的獨特之處,對吧?
我們有自己的曲線擬合模型,可以讓你的手寫內容脫穎而出。
這是舊模式。
多虧 Jetpack Ink,我們只要將曲線擬合輸入自訂進度形狀檢視畫面,就能在 Android 上立即看到神奇的效果。
在討論 Jetpack Ink 和其他 Google 程式庫時,我們也考慮到 KMP。
所以我們一開始先查看已建構的 iOS 程式碼,然後心想:「好,我們想在 Android 和 iOS 之間共用一些邏輯。
我們有模型、有變化,還有複雜的數學。
分享是合理的做法。」
我們當時想:「嘿,C++,你知道,Apple 的 Objective-C,我們就走這條路吧。」
結果發現,Kotlin Multiplatform 不僅讓 iOS 工程師更容易實作,而且速度更快。
因此,使用 Kotlin 不僅能提升效能,還能複製許多 Android 程式碼,長期來看,對 iOS 也更輕鬆。
因此,如果您想共用程式碼,建議您研究 Kotlin Multiplatform。
目前我們仍在評估中。
雖然目前還沒有 100% 支援,但如您所知,不同的 AI 模型確實讓作弊變得更容易,只要將程式碼放在多個地方即可,但我們仍在積極調查,而且我對這項功能評價很高。
好,現在來介紹 Notability 的獨家功能。
如果您曾嘗試在 Android 上建構可用的文字編輯器,可能會注意到,目前其實沒有很好的方法可以建構大型、龐大的文件文字編輯器。
基本的 Android 編輯輸入欄位都是小型 UI、小型 EditText 和短格式內容。
我們最後必須建構這個非常複雜的系統,基本上是建構在現有的 Android API 之上,但能夠同時處理更大型的文件,例如數千頁的文字,而且可以共同編輯,因此您可以讓其他地方的使用者編輯距離您 500 頁的內容,這會導致變更,進而影響您的工作。
我們發現,基本上按鍵輸入會經過兩條路徑。
第一種方法是,我們盡力而為,這個鍵應該出現在這裡。
根據目前所能判斷的一切,以及底層結構的狀況,我們認為這項功能很實用。
然後我們快速同步一下,對吧?
我們會到後端檢查合作夥伴,詢問他們:「一切都好嗎?
這樣合理嗎?
我們準備好了嗎?」
如果情況有變,系統會重新調整。
您可以想像,如果兩位使用者在同一行上輸入按鍵,那麼誰會得到什麼就會有點混亂。
但大致上來說,這個方法的效果非常好。
之所以在這裡提到這點,是因為我們投入了大量心力,並考慮將其開放原始碼。
因此,如果與會者或日後在線上看到這場會議的人,認為這是個好主意,並想與我們合作,歡迎與我們聯絡。
我們正在討論是否真的值得投入心力,但你知道,這對我們來說是一項重大任務,我們對結果感到非常自豪。
好,接下來說明筆跡的運作方式。
因此,在協作模式方面,這更像是我們這邊的直接運作方式。
如您所見,這裡有三個步驟。
首先是 Touchdown,我們會向任何連結的裝置 (在本例中為 iPad) 說:「順帶一提,我們正在啟動筆跡事件」。
接著是實際繪圖,因此可能有一到數百萬個,具體取決於使用者在裝置上繪圖的時間長度。
希望不會太久。
雖然我認為這項功能有其限制,但對一般用途來說,效果相當不錯。
接著是 lift-up 事件。
因此,我們在模型中保留一個暫時物件,用來管理這項資訊。
因此,在 iPad 上,我們會說:「好的,有筆劃即將出現,但還沒到。
我們無法與其互動。
It's ephemeral."
只有在完成事件啟動後,我們才會實際進入並說:「好的,太棒了。
現在,請將整個內容替換為 iOS 或任何其他用戶端可以擷取並互動的單一物件。」
我們也正在考慮將這項技術開源。
這不是我們直接手寫的內容,而是一些暫時性的內容,尤其是在文字層中。
太好了!
然後,沒錯。
我們也建議使用其他工具。
裝置端 AI 非常實用。
我們用它來掃描文件,因此您可以掃描文件、分析 PDF 文字,以及進行一些手寫辨識。
我們也使用 Gemini 等開放式 Cloud AI 模型,生成智慧筆記,將使用者的筆記分類、摘要,並以更適合學習模型、更具互動性的方式回饋給使用者。
這些功能結合在一起,讓 Notability 就像筆電應用程式一樣,對吧?
這就是最終目標。
我們有各種有趣的模型、不同的功能、文字、輸入內容,但重點是,這款應用程式用起來像筆電應用程式,還是像在大螢幕上開啟「電話」應用程式,然後隨便用用?
鍵盤、觸控板、觸控筆、視窗大小調整,這些都是關鍵功能,必須正確運作,才能確保使用者獲得良好體驗。
不過,正如我先前所說,Jetpack Compose、Navigation 3、Material Design 都涵蓋了這點。
因此,只要做法正確,其實不會太費力。
這裡很容易到達。
所以,
以上就是我們的重點摘要。
展望 Android 的未來,我認為不應再侷限於裝置。
我不會去想,這是手機、摺疊式裝置、XR 裝置、桌上型電腦或筆電、平板電腦、汽車或電視。
而是要思考:我能使用多大的螢幕尺寸?使用者能使用哪些輸入模式?
並為日後的使用者提供最佳體驗。
就像我在上一張投影片提到的,Compose 和 Nav 3 讓支援這些功能變得非常簡單。
Google 每天都會推出全新且強大的 API,例如 Jetpack Ink 或 Gemini 裝置端等,讓您輕鬆打造核心體驗,並專注於打造獨特魅力。
好的。
所以…
謝謝大家
我的演講到此結束。
如果各位有任何問題,我稍後可以回答,或者也可以直接與 Notability 聯絡。
這款應用程式大約兩個月前才在 Android 推出。
我們終於結束 Beta 版測試了。
歡迎試用。
提供意見。
您也可以在身後的展示流程中,透過 Google 圖書取得這份資料。
接下來,我將交由 Logitech 的 Joe 繼續說明。
感謝您!
現在我們來做個小測驗
謝謝 Ryan。
今天,好的,抱歉。
好,我們來看看投影片。
謝謝 Ryan。
今天,我將分享我們如何將 Options+ (周邊裝置自訂應用程式) 導入 Googlebook。
以及打造周邊體驗的意義。
我會介紹我們開發的產品、背後的工程亮點,以及未來的發展方向。
Logitech 裝置過去就支援 Android,大多數使用者發現,這些周邊裝置能提升無障礙體驗,尤其是搭配高階筆電和外接螢幕的手機。
說到這個,我剛才在樓下的 Googlebook 示範攤位,看到他們把 Logitech 遊戲序列式排檔桿固定在桌上,用來切換平板電腦上的不同畫面。
就在這裡
這是其中一種用法。
對了,法拉利還得額外收取 5 萬歐元,才能提供序列式…算了。
是啊
正如 Ryan 詳盡說明,Googlebook 有更多空間可供運用。
如你所見,你可以調整螢幕大小、橫向、直向或正方形,如果喜歡的話,你可以在應用程式之間有更多的空間。
你可以繼續手邊的工作、使用不同應用程式,以及切換情境等。
這確實改變了應用程式設計,版面配置也必須在整個程序中保持實用。
對 Logitech 來說,這點特別有趣,因為我們在周邊設備方面擁有豐富經驗,對吧?
我們為這項工作奠定了非常穩固的基礎。
因此,我們認為在這種工作環境中,使用者一整天都會透過滑鼠或鍵盤與外掛程式互動。
他們可以非常順暢地進入工作流程。
我認為,說 Logitech 將數十年的經驗帶入這項工作,一點也不誇張。
本月初剛好是我們成立 45 週年。
我想,我們從 Logitech 成立第二年、第二天起,就一直在製造滑鼠。
因此,我們非常有信心能進入這個領域。
更棒的是,我們與 ChromeOS 合作已久。
我們過去保證與 ChromeOS 具有頂級相容性。
綜上所述,我們在打破硬體、軟體、平台、OS 和 Googlebooks 之間的界線方面,有非常豐富的實務經驗。
舉例來說,使用者按下按鈕後,會看到可預測的結果。
這就像是大家認為理所當然的事。
但實際上需要無縫的元件相容性。
此外,大家都希望裝置能與周邊設備相容。
例如,將靈敏度調整到恰到好處。
65 歲,不多也不少。
因此,這三者之間必須完美整合,才能確保相容性。
現在,隨著 Googlebooks 的推出,我們也推出了適用於 Googlebooks 的 Options+。
目前我們支援多種滑鼠和鍵盤,未來還會支援更多。
使用者也可以在這裡設定裝置。
正如我之前提到的,比如感性,所有這類事情。
現在,這裡的場景變得更有趣了。
談到可設定性,我們實際上是在談論兩個方面。
一端是硬體和韌體,功能在韌體中實作。
另一端是 OS 端,也是這場示範和簡報的重點。
我想大家都知道,過去 Android 裝置和大多數應用程式都位於自己的沙箱 (使用者空間) 中。
在許多情況下,您能做、不能做和想做的事,都會受到某些限制。
這對我們來說非常重要。
現在,這是一張螢幕截圖,我們稍後會進行示範,但這裡有螢幕截圖。
我們這裡有一隻滑鼠,MX Master 4,這裡有很多功能。
如果你熟悉周邊裝置,就會發現某些功能其實是韌體功能、裝置功能。
有些則不然。
我們正在努力讓使用者能設定兩端。
我們的工作基本上是讓使用者瞭解這些選項,並提供完整功能,以及正確設定 OS 和韌體。
現在,我們來看看快速示範。
這場示範令人印象深刻。
但下次,Ryan,請使用滑鼠。
好,我們開始吧。
這是我的裝置螢幕。
可以看到我已註冊 MX Master 4 滑鼠,就是這個。
現在就開始吧。
我們將直接前往設定畫面,如您先前所見,這裡就是魔法發生的地方。
首先,我們將畫圈搜尋功能指派給拇指按鈕。
接著,我們將魔術指標放入功能按鈕。
現在,我們開始吧。
開啟瀏覽器。
前往。
我按下剛才指派給「畫圈搜尋」的拇指按鈕。
如你所見,我圈選了鍵盤。
我變!
Google 只會顯示這個鍵盤的相關資訊。
非常實用,而且很流暢。
現在,我們來試試其他方法。
抱歉。
讓我倒轉。
我們來試試魔術指標。
我們來切換這個選項。
我可以按下功能按鈕,標記這個裝置,然後按下「這是什麼裝置?」
大功告成!
Google 開始搜尋並顯示結果。
因此,這項功能的優點在於,您只需單手操作,就能整合整個工作流程。
只要預先指派功能,然後按下、圈選、點選,就完成了。
因此,我們相信這類作業將大幅提升使用者的無障礙體驗和工作方式。
現在回到投影片。
所以你可能會問,是什麼原因造成這種情況。
因為過去有許多事情是應用程式無法做到的。
這就是 Peripheral Customization API,可在 Googlebook 和 Android 裝置上使用。
不過,以下是 Google 的附註。
目前,這個 API 僅開放給許可清單中的使用者。
但預計會與 Android 更新一起發布,直到 2026 年第 4 季 (即本季)。
因此,一旦發布,我認為世界各地的開發人員都能使用。
現在,我們來談談技術層面的問題。
這項功能包含三個主要元件:裝置、觸發條件 (可以是按鍵或按鈕),以及動作 (在應用程式 OS 端)。
現在,我們來快速查看這個程式碼片段。
在最上方,我們使用供應商 ID 和產品 ID 定義裝置。
// Vendor and product Information
const val VENDOR_ID = 1234
val pid = 123
// Use the mouse Middle Button as the trigger
val trigger = ButtonCustomizationTrigger(MotionEvent.BUTTON_TERTIARY)
// Set Voice Assistant as the action
val actionBuilder = AppCustomizationAction.Builder(component, ACTION_MAIN)
actionBuilder.setData(ActionId.ACTION_VOICE_ASSIST.actionId) // Action IDs are predefined
val action = actionBuilder.build()
val im = context.getSystemService(INPUT_SERVICE) as InputManager
im.addPeripheralCustomization(VENDOR_ID, pid, trigger, action)我們通常稱之為 vid 和 pid。
接著,我們開始定義觸發條件。
如您所見,我們想使用中間的按鈕做為觸發條件。
我們想將中間的按鈕對應到 OS 功能的語音助理部分。
對吧?
我們在 AppCustomizationAction 這裡和這裡都有 actionBuilder。
接著往下看,我們在這裡註冊產品、裝置、觸發條件和動作之間的對應關係。
當然,實際的程式碼會比這更複雜,但整體概念就是這樣。
非常簡單易用。
接下來介紹另一個非常酷炫有趣的功能。
我在此處放了 GIF 檔案,方便大家查看。
基本上,當有相容且支援的裝置 (例如 Logitech Mobifold 滑鼠) 時,OS 就會觸發標準通知,告訴你「嘿,你有一個應用程式可以搭配使用」。
當然是通知使用者。
點選後,系統會將你導向 Play 商店,你可以在該處直接安裝。
這項功能稱為「快速配對探索」。
最後,我們來看看 UI 部分。
Ryan 已經介紹過 Googlebook 的許多優點,以及如何設計使用者介面,因此我會快速帶過這部分。
如你所見,Options+ 可以在不同平台上執行,包括 Windows、Mac 和現在的 Chromebook。
因此,我們有兩個目標:第一,我們希望讓使用者感覺這是平台專屬的應用程式,但同時,我們也希望讓使用者感覺在不同平台上使用時,體驗是相似的,也就是說,一旦您熟悉了在一個平台上使用 Options+,您應該能夠在另一個平台上順暢地使用它。
也就是說,我們希望善用特定平台,同時使用相同的設計語言。
如你所見,整體設計語言一致。
如前所述,Googlebook 使用者傾向以筆電/桌機的方式使用 Googlebook。
因此,即使在 Googlebook 上,應用程式本身看起來也像電腦版應用程式。
因此,應用程式本身的運作方式可能與電腦版應用程式類似,而且在各種視窗大小、不同觸控方式下都能正常運作,當然,您也可以控制使用滑鼠和鍵盤。
以上就是 Logitech 周邊裝置和 Options+ 在 Googlebook 上的簡短故事。
效果非常好。
不過,這只是起頭而已。
我們有幾個步驟:首先,我們希望將這項體驗帶到更多裝置、更多鍵盤、滑鼠和其他周邊裝置,並希望根據實際使用者意見回饋,改善這個應用程式。
當然,最重要的是,我們未來會與 Google 進一步合作,並更深入整合到新平台。
因此,我們的終極目標是讓周邊裝置自訂功能成為使用 Googlebook 時非常自然的體驗,並協助使用者以自己想要的方式工作。
好的。
請務必前往樓下的攤位,親自體驗 Options+ 和出色的 Logitech 裝置。
感謝合作夥伴 Google,也感謝各位撥冗參與。
謝謝大家
// Vendor and product Information
const val VENDOR_ID = 1234
val pid = 123
// Use the mouse Middle Button as the trigger
val trigger = ButtonCustomizationTrigger(MotionEvent.BUTTON_TERTIARY)
// Set Voice Assistant as the action
val actionBuilder = AppCustomizationAction.Builder(component, ACTION_MAIN)
actionBuilder.setData(ActionId.ACTION_VOICE_ASSIST.actionId) // Action IDs are predefined
val action = actionBuilder.build()
val im = context.getSystemService(INPUT_SERVICE) as InputManager
im.addPeripheralCustomization(VENDOR_ID, pid, trigger, action)