diff --git a/esoui/ingame/lfg/gamepad/zo_activityfinderroot_gamepad.lua b/esoui/ingame/lfg/gamepad/zo_activityfinderroot_gamepad.lua
new file mode 100644
index 0000000..4b8a676
--- /dev/null
+++ b/esoui/ingame/lfg/gamepad/zo_activityfinderroot_gamepad.lua
@@ -0,0 +1,179 @@
+ZO_GAMEPAD_ACTIVITY_FINDER_ROOT_SCENE_NAME = "gamepad_activity_finder_root"
+
+--------------
+--Initialize--
+--------------
+
+local ActivityFinderRoot_Gamepad = ZO_Gamepad_ParametricList_Screen:Subclass()
+
+function ActivityFinderRoot_Gamepad:New(...)
+ return ZO_Gamepad_ParametricList_Screen.New(self, ...)
+end
+
+function ActivityFinderRoot_Gamepad:Initialize(control)
+ local ACTIVATE_LIST_ON_SHOW = true
+ GAMEPAD_ACTIVITY_FINDER_ROOT_SCENE = ZO_Scene:New(ZO_GAMEPAD_ACTIVITY_FINDER_ROOT_SCENE_NAME, SCENE_MANAGER)
+ ZO_Gamepad_ParametricList_Screen.Initialize(self, control, ZO_GAMEPAD_HEADER_TABBAR_DONT_CREATE, ACTIVATE_LIST_ON_SHOW, GAMEPAD_ACTIVITY_FINDER_ROOT_SCENE)
+ self:SetListsUseTriggerKeybinds(true)
+ self:AddRolesMenuEntry()
+
+ local function RefreshCategories()
+ self:RefreshCategories()
+ end
+
+ ZO_ACTIVITY_FINDER_ROOT_MANAGER:RegisterCallback("OnLevelUpdate", RefreshCategories)
+ self.control:RegisterForEvent(EVENT_PLAYER_ACTIVATED, RefreshCategories)
+end
+
+function ActivityFinderRoot_Gamepad:InitializeKeybindStripDescriptors()
+ self.keybindStripDescriptor =
+ {
+ alignment = KEYBIND_STRIP_ALIGN_LEFT,
+
+ -- Select
+ {
+ name = GetString(SI_GAMEPAD_SELECT_OPTION),
+ keybind = "UI_SHORTCUT_PRIMARY",
+ callback = function()
+ local targetData = self:GetMainList():GetTargetData()
+ if targetData then
+ local entryData = targetData.data
+ if entryData.isRoleSelector then
+ GAMEPAD_GROUP_ROLES_BAR:ToggleSelected()
+ else
+ SCENE_MANAGER:Push(entryData.sceneName)
+ end
+ end
+ end,
+ enabled = function()
+ local targetData = self:GetMainList():GetTargetData()
+ return targetData and targetData.enabled
+ end
+ },
+ }
+
+ ZO_Gamepad_AddBackNavigationKeybindDescriptors(self.keybindStripDescriptor, GAME_NAVIGATION_TYPE_BUTTON)
+end
+
+function ActivityFinderRoot_Gamepad:OnDeferredInitialize()
+ self.headerData =
+ {
+ titleText = "Activity Finder",
+ }
+
+ ZO_GamepadGenericHeader_Refresh(self.header, self.headerData)
+end
+
+function ActivityFinderRoot_Gamepad:SetupList(list)
+ local function CategoryEntrySetup(control, data, selected, reselectingDuringRebuild, enabled, active)
+ local isLevelLocked = false
+ local lowestLevelLimit, lowestRankLimit
+ if data.data.activityFinderObject then
+ isLevelLocked, lowestLevelLimit, lowestRankLimit = data.data.activityFinderObject:GetLevelLockInfo()
+ end
+ enabled = enabled and not isLevelLocked and IsUnitSoloOrGroupLeader("player")
+ data.enabled = enabled
+ ZO_SharedGamepadEntry_OnSetup(control, data, selected, reselectingDuringRebuild, enabled, active)
+ end
+
+ list:AddDataTemplate("ZO_GamepadMenuEntryTemplate", CategoryEntrySetup, ZO_GamepadMenuEntryTemplateParametricListFunction)
+ list:AddDataTemplateWithHeader("ZO_GamepadMenuEntryTemplate", CategoryEntrySetup, ZO_GamepadMenuEntryTemplateParametricListFunction, nil, "ZO_GamepadMenuEntryHeaderTemplate")
+
+ local function OnSelectedMenuEntry(_, selectedData)
+ if selectedData.data.isRoleSelector then
+ GAMEPAD_TOOLTIPS:ClearTooltip(GAMEPAD_LEFT_TOOLTIP)
+ GAMEPAD_GROUP_ROLES_BAR:Activate()
+ else
+ GAMEPAD_GROUP_ROLES_BAR:Deactivate()
+ self:RefreshTooltip(selectedData.data)
+ end
+
+ KEYBIND_STRIP:UpdateKeybindButtonGroup(self.keybindStripDescriptor)
+ end
+
+ list:SetOnSelectedDataChangedCallback(OnSelectedMenuEntry)
+ list:SetDefaultSelectedIndex(2) --Don't select roles by default
+end
+
+----------
+--Update--
+----------
+
+function ActivityFinderRoot_Gamepad:PerformUpdate()
+ --We must override this
+end
+
+function ActivityFinderRoot_Gamepad:OnShowing()
+ local list = self:GetMainList()
+ --Make sure we aren't interacting with the roles bar when we get there
+ local targetData = list:GetTargetData()
+ if targetData and targetData.data.isRoleSelector then
+ local DONT_ANIMATE = false
+ local ALLOW_EVEN_IF_DISABLED = true
+ list:SetDefaultIndexSelected(DONT_ANIMATE, ALLOW_EVEN_IF_DISABLED)
+ targetData = list:GetTargetData()
+ else
+ GAMEPAD_GROUP_ROLES_BAR:Deactivate()
+ end
+ list:RefreshVisible()
+ self:RefreshTooltip(targetData.data)
+ KEYBIND_STRIP:UpdateKeybindButtonGroup(self.keybindStripDescriptor)
+end
+
+do
+ local LOCK_TEXTURE = zo_iconFormat("EsoUI/Art/Miscellaneous/Gamepad/gp_icon_locked32.dds", "100%", "100%")
+ local RANK_ICON = zo_iconFormat(GetGamepadVeteranRankIcon(), "100%", "100%")
+ local NOT_LEADER_TEXT = zo_strformat(SI_FORMAT_ICON_TEXT, LOCK_TEXTURE, GetString(SI_ACTIVITY_FINDER_LOCKED_NOT_LEADER_TEXT))
+
+ function ActivityFinderRoot_Gamepad:RefreshTooltip(data)
+ if self.scene:IsShowing() and not data.isRoleSelector then
+ local isLevelLocked, lowestLevelLimit, lowestRankLimit = data.activityFinderObject:GetLevelLockInfo()
+ local lockedText
+ if isLevelLocked then
+ if lowestLevelLimit then
+ lockedText = zo_strformat(SI_ACTIVITY_FINDER_TOOLTIP_LEVEL_LOCK, LOCK_TEXTURE, lowestLevelLimit)
+ elseif lowestRankLimit then
+ lockedText = zo_strformat(SI_ACTIVITY_FINDER_TOOLTIP_RANK_LOCK, LOCK_TEXTURE, RANK_ICON, lowestRankLimit)
+ end
+ else
+ if not IsUnitSoloOrGroupLeader("player") then
+ lockedText = NOT_LEADER_TEXT
+ end
+ end
+
+ GAMEPAD_TOOLTIPS:LayoutTitleAndMultiSectionDescriptionTooltip(GAMEPAD_LEFT_TOOLTIP, data.name, data.tooltipDescription, lockedText)
+ end
+ end
+end
+
+--Add an ethereal entry to interact with the roles
+function ActivityFinderRoot_Gamepad:AddRolesMenuEntry()
+ local entryData = ZO_GamepadEntryData:New("")
+ entryData.data =
+ {
+ isRoleSelector = true,
+ }
+
+ local list = self:GetMainList()
+ list:AddEntry("ZO_GamepadMenuEntryTemplate", entryData)
+end
+
+function ActivityFinderRoot_Gamepad:AddCategory(categoryData)
+ local entryData = ZO_GamepadEntryData:New(categoryData.name, categoryData.menuIcon)
+ entryData.data = categoryData
+ entryData:SetIconTintOnSelection(true)
+
+ local list = self:GetMainList()
+ list:AddEntry("ZO_GamepadMenuEntryTemplate", entryData)
+ list:Commit()
+end
+
+function ActivityFinderRoot_Gamepad:RefreshCategories()
+ local list = self:GetMainList()
+ list:RefreshVisible()
+ list:Commit()
+end
+
+function ZO_ActivityFinderRoot_Gamepad_OnInitialize(control)
+ ZO_ACTIVITY_FINDER_ROOT_GAMEPAD = ActivityFinderRoot_Gamepad:New(control)
+end
\ No newline at end of file