--剩下半瓶点击滑动，两步滑动，三步滑动
require "import"
import "android.widget.*"
import "android.view.*"
import "com.androlua.*"
import "android.content.Context"

-- ===================== 1. 全局常量定义 =====================
local function initConstants()
    -- 方向常量
    DIRECTION_NONE = 0
    DIRECTION_LEFT = 1
    DIRECTION_RIGHT = 2
    DIRECTION_UP = 3
    DIRECTION_DOWN = 4

    -- 区域常量
    TOP_HALF = 1
    BOTTOM_HALF = 2

    -- 点击类型常量
    SINGLE_TAP = 1
    DOUBLE_TAP = 2
    TRIPLE_TAP = 3
    QUAD_TAP = 4
end

-- ===================== 2. 全局变量与路径 =====================
local function initVariables()
    -- 手势配置存储路径
    configPath = this.getLuaExtDir("插件").."/手势插件/自定义手势试验配置.json"

    -- 加载cjson
    cjson = require "cjson"

    -- 默认手势配置（已剔除三指四指、双指两步三步）
    defaultGestures = {
        -- 单指滑动
        ["TOP_HALF_1_SWIPE_LEFT"] = "上半屏单指左滑",
        ["TOP_HALF_1_SWIPE_RIGHT"] = "上半屏单指右滑",
        ["TOP_HALF_1_SWIPE_UP"] = "上半屏单指上滑",
        ["TOP_HALF_1_SWIPE_DOWN"] = "上半屏单指下滑",
        ["BOTTOM_HALF_1_SWIPE_LEFT"] = "下半屏单指左滑",
        ["BOTTOM_HALF_1_SWIPE_RIGHT"] = "下半屏单指右滑",
        ["BOTTOM_HALF_1_SWIPE_UP"] = "下半屏单指上滑",
        ["BOTTOM_HALF_1_SWIPE_DOWN"] = "下半屏单指下滑",

        -- 双指滑动
        ["TOP_HALF_2_SWIPE_LEFT"] = "上半屏双指左滑",
        ["TOP_HALF_2_SWIPE_RIGHT"] = "上半屏双指右滑",
        ["TOP_HALF_2_SWIPE_UP"] = "上半屏双指上滑",
        ["TOP_HALF_2_SWIPE_DOWN"] = "上半屏双指下滑",
        ["BOTTOM_HALF_2_SWIPE_LEFT"] = "下半屏双指左滑",
        ["BOTTOM_HALF_2_SWIPE_RIGHT"] = "下半屏双指右滑",
        ["BOTTOM_HALF_2_SWIPE_UP"] = "下半屏双指上滑",
        ["BOTTOM_HALF_2_SWIPE_DOWN"] = "下半屏双指下滑",

        -- 单指点击
        ["TOP_HALF_1_TAP_1"] = "上半屏单指单击",
        ["TOP_HALF_1_TAP_2"] = "上半屏单指双击",
        ["TOP_HALF_1_TAP_3"] = "上半屏单指三击",
        ["TOP_HALF_1_TAP_4"] = "上半屏单指四击",
        ["BOTTOM_HALF_1_TAP_1"] = "下半屏单指单击",
        ["BOTTOM_HALF_1_TAP_2"] = "下半屏单指双击",
        ["BOTTOM_HALF_1_TAP_3"] = "下半屏单指三击",
        ["BOTTOM_HALF_1_TAP_4"] = "下半屏单指四击",

        -- 双指点击
        ["TOP_HALF_2_TAP_1"] = "上半屏双指单击",
        ["TOP_HALF_2_TAP_2"] = "上半屏双指双击",
        ["TOP_HALF_2_TAP_3"] = "上半屏双指三击",
        ["TOP_HALF_2_TAP_4"] = "上半屏双指四击",
        ["BOTTOM_HALF_2_TAP_1"] = "下半屏双指单击",
        ["BOTTOM_HALF_2_TAP_2"] = "下半屏双指双击",
        ["BOTTOM_HALF_2_TAP_3"] = "下半屏双指三击",
        ["BOTTOM_HALF_2_TAP_4"] = "下半屏双指四击",

        -- 两步滑动（单指）
        ["TOP_HALF_1_SWIPE2_LEFT_LEFT"] = "上半屏单指左滑+左滑",
        ["TOP_HALF_1_SWIPE2_LEFT_RIGHT"] = "上半屏单指左滑+右滑",
        ["TOP_HALF_1_SWIPE2_LEFT_UP"] = "上半屏单指左滑+上滑",
        ["TOP_HALF_1_SWIPE2_LEFT_DOWN"] = "上半屏单指左滑+下滑",
        ["TOP_HALF_1_SWIPE2_RIGHT_LEFT"] = "上半屏单指右滑+左滑",
        ["TOP_HALF_1_SWIPE2_RIGHT_RIGHT"] = "上半屏单指右滑+右滑",
        ["TOP_HALF_1_SWIPE2_RIGHT_UP"] = "上半屏单指右滑+上滑",
        ["TOP_HALF_1_SWIPE2_RIGHT_DOWN"] = "上半屏单指右滑+下滑",
        ["TOP_HALF_1_SWIPE2_UP_LEFT"] = "上半屏单指上滑+左滑",
        ["TOP_HALF_1_SWIPE2_UP_RIGHT"] = "上半屏单指上滑+右滑",
        ["TOP_HALF_1_SWIPE2_UP_UP"] = "上半屏单指上滑+上滑",
        ["TOP_HALF_1_SWIPE2_UP_DOWN"] = "上半屏单指上滑+下滑",
        ["TOP_HALF_1_SWIPE2_DOWN_LEFT"] = "上半屏单指下滑+左滑",
        ["TOP_HALF_1_SWIPE2_DOWN_RIGHT"] = "上半屏单指下滑+右滑",
        ["TOP_HALF_1_SWIPE2_DOWN_UP"] = "上半屏单指下滑+上滑",
        ["TOP_HALF_1_SWIPE2_DOWN_DOWN"] = "上半屏单指下滑+下滑",

        ["BOTTOM_HALF_1_SWIPE2_LEFT_LEFT"] = "下半屏单指左滑+左滑",
        ["BOTTOM_HALF_1_SWIPE2_LEFT_RIGHT"] = "下半屏单指左滑+右滑",
        ["BOTTOM_HALF_1_SWIPE2_LEFT_UP"] = "下半屏单指左滑+上滑",
        ["BOTTOM_HALF_1_SWIPE2_LEFT_DOWN"] = "下半屏单指左滑+下滑",
        ["BOTTOM_HALF_1_SWIPE2_RIGHT_LEFT"] = "下半屏单指右滑+左滑",
        ["BOTTOM_HALF_1_SWIPE2_RIGHT_RIGHT"] = "下半屏单指右滑+右滑",
        ["BOTTOM_HALF_1_SWIPE2_RIGHT_UP"] = "下半屏单指右滑+上滑",
        ["BOTTOM_HALF_1_SWIPE2_RIGHT_DOWN"] = "下半屏单指右滑+下滑",
        ["BOTTOM_HALF_1_SWIPE2_UP_LEFT"] = "下半屏单指上滑+左滑",
        ["BOTTOM_HALF_1_SWIPE2_UP_RIGHT"] = "下半屏单指上滑+右滑",
        ["BOTTOM_HALF_1_SWIPE2_UP_UP"] = "下半屏单指上滑+上滑",
        ["BOTTOM_HALF_1_SWIPE2_UP_DOWN"] = "下半屏单指上滑+下滑",
        ["BOTTOM_HALF_1_SWIPE2_DOWN_LEFT"] = "下半屏单指下滑+左滑",
        ["BOTTOM_HALF_1_SWIPE2_DOWN_RIGHT"] = "下半屏单指下滑+右滑",
        ["BOTTOM_HALF_1_SWIPE2_DOWN_UP"] = "下半屏单指下滑+上滑",
        ["BOTTOM_HALF_1_SWIPE2_DOWN_DOWN"] = "下半屏单指下滑+下滑",

        -- 三步滑动（单指左开头）
        ["TOP_HALF_1_SWIPE3_LEFT_LEFT_LEFT"] = "上半屏单指左滑+左滑+左滑",
        ["TOP_HALF_1_SWIPE3_LEFT_LEFT_RIGHT"] = "上半屏单指左滑+左滑+右滑",
        ["TOP_HALF_1_SWIPE3_LEFT_LEFT_UP"] = "上半屏单指左滑+左滑+上滑",
        ["TOP_HALF_1_SWIPE3_LEFT_LEFT_DOWN"] = "上半屏单指左滑+左滑+下滑",
        ["TOP_HALF_1_SWIPE3_LEFT_RIGHT_LEFT"] = "上半屏单指左滑+右滑+左滑",
        ["TOP_HALF_1_SWIPE3_LEFT_RIGHT_RIGHT"] = "上半屏单指左滑+右滑+右滑",
        ["TOP_HALF_1_SWIPE3_LEFT_RIGHT_UP"] = "上半屏单指左滑+右滑+上滑",
        ["TOP_HALF_1_SWIPE3_LEFT_RIGHT_DOWN"] = "上半屏单指左滑+右滑+下滑",
        ["TOP_HALF_1_SWIPE3_LEFT_UP_LEFT"] = "上半屏单指左滑+上滑+左滑",
        ["TOP_HALF_1_SWIPE3_LEFT_UP_RIGHT"] = "上半屏单指左滑+上滑+右滑",
        ["TOP_HALF_1_SWIPE3_LEFT_UP_UP"] = "上半屏单指左滑+上滑+上滑",
        ["TOP_HALF_1_SWIPE3_LEFT_UP_DOWN"] = "上半屏单指左滑+上滑+下滑",
        ["TOP_HALF_1_SWIPE3_LEFT_DOWN_LEFT"] = "上半屏单指左滑+下滑+左滑",
        ["TOP_HALF_1_SWIPE3_LEFT_DOWN_RIGHT"] = "上半屏单指左滑+下滑+右滑",
        ["TOP_HALF_1_SWIPE3_LEFT_DOWN_UP"] = "上半屏单指左滑+下滑+上滑",
        ["TOP_HALF_1_SWIPE3_LEFT_DOWN_DOWN"] = "上半屏单指左滑+下滑+下滑",

        ["BOTTOM_HALF_1_SWIPE3_LEFT_LEFT_LEFT"] = "下半屏单指左滑+左滑+左滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_LEFT_RIGHT"] = "下半屏单指左滑+左滑+右滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_LEFT_UP"] = "下半屏单指左滑+左滑+上滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_LEFT_DOWN"] = "下半屏单指左滑+左滑+下滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_RIGHT_LEFT"] = "下半屏单指左滑+右滑+左滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_RIGHT_RIGHT"] = "下半屏单指左滑+右滑+右滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_RIGHT_UP"] = "下半屏单指左滑+右滑+上滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_RIGHT_DOWN"] = "下半屏单指左滑+右滑+下滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_UP_LEFT"] = "下半屏单指左滑+上滑+左滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_UP_RIGHT"] = "下半屏单指左滑+上滑+右滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_UP_UP"] = "下半屏单指上滑+上滑+上滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_UP_DOWN"] = "下半屏单指上滑+下滑+下滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_DOWN_LEFT"] = "下半屏单指下滑+下滑+左滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_DOWN_RIGHT"] = "下半屏单指下滑+下滑+右滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_DOWN_UP"] = "下半屏单指下滑+下滑+上滑",
        ["BOTTOM_HALF_1_SWIPE3_LEFT_DOWN_DOWN"] = "下半屏单指下滑+下滑+下滑",
    }

    -- 手势操作配置
    gestureActions = {}

    -- 触摸变量
    startX, startY = 0, 0
    minDistance = 100
    maxClickDistance = 200
    doubleTapTimeout = 250
    multiTapTimeout = 300
    lastDirection = DIRECTION_NONE
    isClick = false
    isSliding = false

    -- 点击历史
    tapHistory = {
        time = 0,
        count = 0,
        area = 0,
        fingers = 0,
        x = 0,
        y = 0
    }

    -- 滑动变量：保留原有，只加 steps
    swipeHistory = {
        time = 0,
        first = DIRECTION_NONE,
        area = 0,
        steps = {}
    }
    twoSwipeTimeout = 250

    Handler = luajava.bindClass("android.os.Handler")
    handler = Handler()
    fingerCount = 0
end

-- ===================== 3. 配置文件操作 =====================
-- 加载手势配置
local function loadGestureConfig()
    local file, eor = io.open(configPath, "r")
    if eor == nil then
        local data = file:read('*a')
        if data ~= "" then
            gestureActions = cjson.decode(data)
            file:close()
            return
        end
    end
    gestureActions = {}
    for key, value in pairs(defaultGestures) do
        gestureActions[key] = value
    end
end

-- 保存手势配置
local function saveGestureConfig()
    local dir = configPath:match("^(.*[/\\])")
    os.execute("mkdir -p '"..dir.."'")

    local file = io.open(configPath, "w")
    if file then
        file:write(cjson.encode(gestureActions))
        file:close()
    end
end

-- ===================== 4. 手势工具函数 =====================
-- 获取滑动方向
local function getDirection(dx, dy)
    if math.abs(dx) > math.abs(dy) then
        if dx > minDistance then return DIRECTION_RIGHT end
        if dx < -minDistance then return DIRECTION_LEFT end
    else
        if dy > minDistance then return DIRECTION_DOWN end
        if dy < -minDistance then return DIRECTION_UP end
    end
    return DIRECTION_NONE
end

-- 方向 → 文字
local function dirToStr(dir)
    if dir == DIRECTION_LEFT then return "LEFT" end
    if dir == DIRECTION_RIGHT then return "RIGHT" end
    if dir == DIRECTION_UP then return "UP" end
    if dir == DIRECTION_DOWN then return "DOWN" end
    return "NONE"
end

-- 生成手势键名
local function getGestureKey(area, gestureType, fingers, subType)
    local areaText = area == TOP_HALF and "TOP_HALF" or "BOTTOM_HALF"
    if gestureType == "SWIPE" then
        local dstr = dirToStr(subType)
        return string.format("%s_%d_SWIPE_%s", areaText, fingers, dstr)
    elseif gestureType == "SWIPE2" then
        local first = dirToStr(subType[1])
        local second = dirToStr(subType[2])
        return string.format("%s_%d_SWIPE2_%s_%s", areaText, fingers, first, second)
    elseif gestureType == "SWIPE3" then
        local d1 = dirToStr(subType[1])
        local d2 = dirToStr(subType[2])
        local d3 = dirToStr(subType[3])
        return string.format("%s_%d_SWIPE3_%s_%s_%s", areaText, fingers, d1, d2, d3)
    else
        return string.format("%s_%d_TAP_%d", areaText, fingers, subType)
    end
end

-- 获取手势描述
local function getGestureDescription(area, gestureType, fingers, subType)
    local areaText = area == TOP_HALF and "上半屏" or "下半屏"
    local fingerText = fingers == 1 and "单指" or "双指"

    local function dir2text(d)
        if d == DIRECTION_LEFT then return "左滑"
        elseif d == DIRECTION_RIGHT then return "右滑"
        elseif d == DIRECTION_UP then return "上滑"
        elseif d == DIRECTION_DOWN then return "下滑"
        else return "无" end
    end

    if gestureType == "SWIPE" then
        return areaText..fingerText..dir2text(subType)
    elseif gestureType == "SWIPE2" then
        local d1 = dir2text(subType[1])
        local d2 = dir2text(subType[2])
        return areaText..fingerText..d1.." + "..d2
    elseif gestureType == "SWIPE3" then
        local d1 = dir2text(subType[1])
        local d2 = dir2text(subType[2])
        local d3 = dir2text(subType[3])
        return areaText..fingerText..d1.." + "..d2.." + "..d3
    else
        local cnt = subType == 1 and "单击"
                    or subType == 2 and "双击"
                    or subType == 3 and "三击"
                    or "四击"
        return areaText..fingerText..cnt
    end
end

-- 重置点击历史
local function resetTapHistory()
    tapHistory.time = 0
    tapHistory.count = 0
    tapHistory.area = 0
    tapHistory.fingers = 0
end

-- 重置滑动
local function resetSwipeHistory()
    swipeHistory.time = 0
    swipeHistory.first = DIRECTION_NONE
    swipeHistory.area = 0
    swipeHistory.steps = {}
end

-- ===================== 5. 编辑与对话框 =====================
-- 编辑手势对话框
local function showEditGestureDialog(gestureKey, gestureDesc)
    local editLayout = loadlayout({
        LinearLayout,
        orientation = 1,
        layout_width = "fill",
        layout_height = "fill",
        padding = "10dp",
        {TextView, text="手势: "..gestureDesc, textSize="16sp", layout_width="fill", layout_height="wrap", layout_marginBottom="15dp"},
        {TextView, text="功能名称", textSize="16sp", layout_width="fill", layout_height="wrap", layout_marginBottom="5dp"},
        {EditText, id="edtName", hint="如：震动", layout_width="fill", layout_height="wrap", layout_marginBottom="15dp"},
        {TextView, text="指令", textSize="16sp", layout_width="fill", layout_height="wrap", layout_marginBottom="5dp"},
        {
            LinearLayout,
            orientation=0,
            layout_width="fill",
            layout_height="wrap",
            gravity="center_vertical",
            {EditText, id="edtCmd", hint="不勾选：一行一个按钮名，连续点击\n勾选：直接按 Lua 代码运行", layout_width="0dp", layout_weight=1, layout_height="wrap"},
            {CheckBox, id="cbUsePlugin", text="直接运行代码", layout_width="wrap", layout_height="wrap", layout_marginLeft="8dp"}
        }
    })

    local curr = gestureActions[gestureKey]
    if type(curr) == "table" then
        edtName.text = curr[1] or ""
        edtCmd.text = curr[2] or ""
        cbUsePlugin.setChecked(curr[3] or false)
    else
        edtName.text = tostring(curr or "")
        edtCmd.text = ""
        cbUsePlugin.setChecked(false)
    end

    local editDlg = LuaDialog(service)
    editDlg.setTitle("编辑手势")
    editDlg.setView(editLayout)
    editDlg.setButton("保存", function()
        service.setTouchExplorationMode(false)
        local name = edtName.text
        local cmd = edtCmd.text
        local usePlugin = cbUsePlugin.isChecked()
        if name == "" then return end

        if not usePlugin then
    cmd = cmd:gsub("\r\n", ",")
    cmd = cmd:gsub("\n", ",")

    local list = {}
    local item = ""
    local inBracket = 0
    for i = 1, #cmd do
        local c = cmd:sub(i,i)
        if c == "[" then
            inBracket = inBracket + 1
            item = item..c
        elseif c == "]" then
            inBracket = inBracket - 1
            item = item..c
        elseif c == "," and inBracket == 0 then
            item = item:match("^%s*(.-)%s*$")
            if item ~= "" then
                table.insert(list,item)
            end
            item = ""
        else
            item = item..c
        end
    end
    item = item:match("^%s*(.-)%s*$")
    if item ~= "" then
        table.insert(list,item)
    end
    cmd = table.concat(list,",")
end

        gestureActions[gestureKey] = {name, cmd, usePlugin}
        saveGestureConfig()
        service.speak("已保存")
        editDlg.dismiss()
    end)
    editDlg.setButton2("取消", function()
        service.setTouchExplorationMode(false)
        editDlg.dismiss()
    end)
    editDlg.show()
end

-- 打开主菜单（编辑/重置）
local function openGestureMenu()
    local vibrator = this.getSystemService(Context.VIBRATOR_SERVICE)
    vibrator.vibrate(50)

    local menuItems = {"编辑手势", "重置为默认"}
    local menuDlg = LuaDialog(service)
    menuDlg.setTitle("手势菜单")
    menuDlg.setItems(menuItems)
    menuDlg.show()
    service.setTouchExplorationMode(true)

    menuDlg.onItemClick = function(_, _, itemKey)
        menuDlg.dismiss()

        if itemKey == 0 then
            local gestureTypes = {}
            local dirs = {DIRECTION_LEFT, DIRECTION_RIGHT, DIRECTION_UP, DIRECTION_DOWN}
            local areaList = {TOP_HALF, BOTTOM_HALF}

            -- 1. 单指点击：上半屏 → 下半屏
            for _,area in ipairs(areaList) do
                for k=1,4 do
                    table.insert(gestureTypes, {area=area, type="TAP", fingers=1, subType=k})
                end
            end

            -- 2. 单指普通滑动：上半屏 → 下半屏
            for _,area in ipairs(areaList) do
                for _,d in ipairs(dirs) do
                    table.insert(gestureTypes, {area=area, type="SWIPE", fingers=1, subType=d})
                end
            end

            -- 3. 单指两步滑动：上半屏 → 下半屏
            local comb2 = {
                {DIRECTION_LEFT, DIRECTION_LEFT},
                {DIRECTION_LEFT, DIRECTION_RIGHT},
                {DIRECTION_LEFT, DIRECTION_UP},
                {DIRECTION_LEFT, DIRECTION_DOWN},
                {DIRECTION_RIGHT, DIRECTION_LEFT},
                {DIRECTION_RIGHT, DIRECTION_RIGHT},
                {DIRECTION_RIGHT, DIRECTION_UP},
                {DIRECTION_RIGHT, DIRECTION_DOWN},
                {DIRECTION_UP, DIRECTION_LEFT},
                {DIRECTION_UP, DIRECTION_RIGHT},
                {DIRECTION_UP, DIRECTION_UP},
                {DIRECTION_UP, DIRECTION_DOWN},
                {DIRECTION_DOWN, DIRECTION_LEFT},
                {DIRECTION_DOWN, DIRECTION_RIGHT},
                {DIRECTION_DOWN, DIRECTION_UP},
                {DIRECTION_DOWN, DIRECTION_DOWN},
            }
            for _,area in ipairs(areaList) do
                for _,c in ipairs(comb2) do
                    table.insert(gestureTypes, {area=area, type="SWIPE2", fingers=1, subType=c})
                end
            end

            -- 4. 单指三步滑动：上半屏 → 下半屏
            local comb3 = {
                {DIRECTION_LEFT, DIRECTION_LEFT, DIRECTION_LEFT},
                {DIRECTION_LEFT, DIRECTION_LEFT, DIRECTION_RIGHT},
                {DIRECTION_LEFT, DIRECTION_LEFT, DIRECTION_UP},
                {DIRECTION_LEFT, DIRECTION_LEFT, DIRECTION_DOWN},
                {DIRECTION_LEFT, DIRECTION_RIGHT, DIRECTION_LEFT},
                {DIRECTION_LEFT, DIRECTION_RIGHT, DIRECTION_RIGHT},
                {DIRECTION_LEFT, DIRECTION_RIGHT, DIRECTION_UP},
                {DIRECTION_LEFT, DIRECTION_RIGHT, DIRECTION_DOWN},
                {DIRECTION_LEFT, DIRECTION_UP, DIRECTION_LEFT},
                {DIRECTION_LEFT, DIRECTION_UP, DIRECTION_RIGHT},
                {DIRECTION_LEFT, DIRECTION_UP, DIRECTION_UP},
                {DIRECTION_LEFT, DIRECTION_UP, DIRECTION_DOWN},
                {DIRECTION_LEFT, DIRECTION_DOWN, DIRECTION_LEFT},
                {DIRECTION_LEFT, DIRECTION_DOWN, DIRECTION_RIGHT},
                {DIRECTION_LEFT, DIRECTION_DOWN, DIRECTION_UP},
                {DIRECTION_LEFT, DIRECTION_DOWN, DIRECTION_DOWN},
            }
            for _,area in ipairs(areaList) do
                for _,c in ipairs(comb3) do
                    table.insert(gestureTypes, {area=area, type="SWIPE3", fingers=1, subType=c})
                end
            end

            -- 5. 双指点击：上半屏 → 下半屏
            for _,area in ipairs(areaList) do
                for k=1,4 do
                    table.insert(gestureTypes, {area=area, type="TAP", fingers=2, subType=k})
                end
            end

            -- 6. 双指普通滑动：上半屏 → 下半屏
            for _,area in ipairs(areaList) do
                for _,d in ipairs(dirs) do
                    table.insert(gestureTypes, {area=area, type="SWIPE", fingers=2, subType=d})
                end
            end

            local gestureTexts = {}
            for _, g in ipairs(gestureTypes) do
                local key = getGestureKey(g.area,g.type,g.fingers,g.subType)
                local desc = getGestureDescription(g.area,g.type,g.fingers,g.subType)
                local val = gestureActions[key]
                local showText = desc

                if type(val) == "table" then
                    local name = val[1] or ""
                    if name ~= "" then
                        showText = desc.." | "..name
                    end
                elseif type(val) == "string" then
                    showText = desc.." | "..val
                end

                table.insert(gestureTexts, showText)
            end

            local selectDlg = LuaDialog(service)
            selectDlg.setTitle("选择要编辑的手势")
            selectDlg.setItems(gestureTexts)
            selectDlg.setButton("取消", function()
                service.setTouchExplorationMode(false)
                selectDlg.dismiss()
            end)
            selectDlg.onItemClick = function(_, _, pos)
                selectDlg.dismiss()
                local g = gestureTypes[pos+1]
                if g then
                    local key = getGestureKey(g.area, g.type, g.fingers, g.subType)
                    local desc = getGestureDescription(g.area, g.type, g.fingers, g.subType)
                    showEditGestureDialog(key, desc)
                end
            end
            selectDlg.show()

        elseif itemKey == 1 then
            local confirmDlg = LuaDialog(service)
            confirmDlg.setTitle("确认重置")
            confirmDlg.setMessage("确定要重置所有手势为默认配置吗？")
            confirmDlg.setButton("确定", function()
                service.setTouchExplorationMode(false)
                gestureActions = {}
                for key, val in pairs(defaultGestures) do
                    gestureActions[key] = val
                end
                saveGestureConfig()
                service.speak("已重置为默认配置")
                confirmDlg.dismiss()
            end)
            confirmDlg.setButton2("取消", function()
                service.setTouchExplorationMode(false)
                confirmDlg.dismiss()
            end)
            confirmDlg.show()
        end
    end
end

-- ===================== 6. 手势执行 =====================
local function handleGesture(area, gestureType, fingers, subType)
    if area == TOP_HALF and fingers == 1 and gestureType == "TAP" and subType == DOUBLE_TAP then
        openGestureMenu()
        return
    end

    local gestureKey = getGestureKey(area, gestureType, fingers, subType)
    local gestureDesc = getGestureDescription(area, gestureType, fingers, subType)
    local action = gestureActions[gestureKey]

    if mtmb and mtmb.isShowing() then
        mtmb.dismiss()
    end

    task(550, function()
        if not action then
            service.speak(gestureDesc)
            return
        end
        if type(action) == "string" then
            service.speak(action)
            return
        end

        local name = action[1]
        local cmd = action[2]
        local runCode = action[3]

        if not cmd or cmd == "" then
            service.speak(name or gestureDesc)
            return
        end

        if runCode then
            local f, err = loadstring(cmd)
            if f then
                f()
            else
                service.speak("代码错误：" .. err)
            end
        else
            local arr = {}
local item = ""
local inBracket = 0
for i = 1, #cmd do
    local c = cmd:sub(i,i)
    if c == "[" then
        inBracket = inBracket + 1
        item = item..c
    elseif c == "]" then
        inBracket = inBracket - 1
        item = item..c
    elseif c == "," and inBracket == 0 then
        item = item:match("^%s*(.-)%s*$")
        if item ~= "" then
            table.insert(arr,item)
        end
        item = ""
    else
        item = item..c
    end
end
item = item:match("^%s*(.-)%s*$")
if item ~= "" then
    table.insert(arr,item)
end
            if #arr > 0 then
                service.click({arr})
            else
                service.speak(name)
            end
        end
    end)
end

-- ===================== 核心：只改写这个函数 =====================
local function handleSwipe(area, dir, fingers)
    -- 只允许单指、双指
    if fingers ~= 1 and fingers ~= 2 then
        return
    end
    -- 双指只识别普通滑动，不进两步三步逻辑
    if fingers == 2 then
        handleGesture(area, "SWIPE", fingers, dir)
        return
    end

    local now = os.clock() * 1000
    local timeout = twoSwipeTimeout

    handler.removeCallbacksAndMessages(nil)

    if dir ~= DIRECTION_NONE and swipeHistory.area == area then
        if now - swipeHistory.time <= timeout then
            table.insert(swipeHistory.steps, dir)
        else
            swipeHistory.steps = {dir}
        end
    else
        swipeHistory.steps = {dir}
    end

    swipeHistory.time = now
    swipeHistory.area = area

    handler.postDelayed(function()
        local n = #swipeHistory.steps
        if n == 1 then
            handleGesture(area, "SWIPE", 1, swipeHistory.steps[1])
        elseif n == 2 then
            handleGesture(area, "SWIPE2", 1, {swipeHistory.steps[1], swipeHistory.steps[2]})
        elseif n >= 3 then
            handleGesture(area, "SWIPE3", 1, {swipeHistory.steps[1], swipeHistory.steps[2], swipeHistory.steps[3]})
        end
        resetSwipeHistory()
    end, timeout)
end

local function handleTap(area, count, fingers)
    resetSwipeHistory()
    -- 只允许单指双指点击
    if fingers == 1 or fingers == 2 then
        handleGesture(area, "TAP", fingers, count)
    end
end

-- ===================== 7. 界面创建 =====================
local function createMainPanel()
    local layout = {
        LinearLayout,
        {
            TextView,
            id = "touchArea",
            layout_width = "100%w",
            layout_height = "100%h",
            text = "触摸区域(仅单双指，支持点击、普通滑动、单指两步三步滑动)\n上半屏单指双击编辑手势对应功能",
            textSize = "22sp",
            gravity = "center",
            background = "#FF0E0E3C",
        },
    }
    mtmb = LuaDialog()
    mtmb.setView(loadlayout(layout))
    mtmb.setOnDismissListener(function()
        service.setTouchExplorationMode(true)
    end)
    mtmb.show()
local vibrator = this.getSystemService(Context.VIBRATOR_SERVICE)
vibrator.vibrate(30)
service.setTouchExplorationMode(false)
    return touchArea
end

-- ===================== 8. 触摸事件 =====================
local function bindTouchEvent(touchArea)
    touchArea.onTouch = function(v, event)
        local action = event.getActionMasked()
        local x, y = event.getX(), event.getY()
        local currentTime = os.clock() * 1000
        local height = v.getHeight()
        local currentArea = y < height / 2 and TOP_HALF or BOTTOM_HALF

        if action == MotionEvent.ACTION_DOWN or action == MotionEvent.ACTION_POINTER_DOWN then
            fingerCount = event.getPointerCount()
            startX = x
            startY = y
            isClick = true
            isSliding = false
            lastDirection = DIRECTION_NONE

            if currentTime - tapHistory.time > multiTapTimeout or
               currentArea ~= tapHistory.area or
               fingerCount ~= tapHistory.fingers then
                resetTapHistory()
            end
        end

        if action == MotionEvent.ACTION_MOVE then
            local dx = x - startX
            local dy = y - startY

            if math.abs(dx) > maxClickDistance or math.abs(dy) > maxClickDistance then
                isClick = false
                isSliding = true
                resetTapHistory()
            end

            if isSliding then
                local dir = getDirection(dx, dy)
                if dir ~= DIRECTION_NONE and dir ~= lastDirection then
                    handleSwipe(currentArea, dir, fingerCount)
                    lastDirection = dir
                    startX = x
                    startY = y
                end
            end
        end

        if action == MotionEvent.ACTION_UP or action == MotionEvent.ACTION_POINTER_UP then
            if isClick and math.abs(x-startX) <= maxClickDistance and math.abs(y-startY) <= maxClickDistance then
                tapHistory.count = tapHistory.count + 1
                tapHistory.time = currentTime
                tapHistory.area = currentArea
                tapHistory.fingers = fingerCount
                tapHistory.x = x
                tapHistory.y = y

                handler.removeCallbacksAndMessages(nil)
                handler.postDelayed(function()
                    if tapHistory.count > 0 then
                        handleTap(tapHistory.area, tapHistory.count, tapHistory.fingers)
                        resetTapHistory()
                    end
                end, doubleTapTimeout)
            end
            fingerCount = event.getPointerCount() - (action == MotionEvent.ACTION_UP and 1 or 0)
        end

        return true
    end
end

-- ===================== 程序入口 =====================
local function main()
    initConstants()
    initVariables()
    loadGestureConfig()
    local touchArea = createMainPanel()
    bindTouchEvent(touchArea)
end

main()
return true