情景模式
Table of contents
0.1. 前言
You can build a simple rules engine yourself. All you need is to create a bunch of objects with conditions and actions, store them in a collection, and run through them to evaluate the conditions and execute the actions. Martin Fowler
0.2. 介绍
情景模式简单理解:
“什么时候,干什么。”
什么时候就是触发条件(condition)
干什么就是动作(actions)
0.3. 新建
新建一条入门实例如下,以JSON格式为例:
[
  {
    "name": "Current pkg",
    "description": "应用切换时,使用Toast显示当前应用的当前应用包名",
    "priority": 2,
    "delay": 2000,
    "condition": "frontPkgChanged == true",
    "actions": [
      "ui.showShortToast(activity.getFrontAppPackage());"
    ]
  }
]
参数解释:
| 参数名 | 含义 | 
|---|---|
| name | 请使用英文,情景模式名字,多个模式不能重复,否则会被覆盖 | 
| description | 任意的描述 | 
| priority | 优先级,决定执行顺序 | 
| delay | action 动作执行的延迟,时间单位为毫秒 | 
| condition | 触发条件,支持mvel表达式,条件可选的基于事实的facts-param请参考下面的章节 语法注意:双引号需要使用\转移字符转义 | 
| actions | 要执行的动作,支持mvel表达式 ,可以设置多个,动作可选的handle请参考下面的章节 语法注意:双引号需要使用\转移字符转义 | 
0.4. Fatcs-params
除了提供规则引擎之外,Thanox也会提供常用的事实与参数,用于condition条件判断。
0.4.1. 应用安装、卸载、更新
应用安装、卸载、更新之后,thanox会发布这个事实,并注入一些参数,你可以使用这些参数做条件判断,或者执行动作时作为参数使用。
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| pkgAdded | Boolean | 新应用已经安装 | 如下 | 
| pkgRemoved | Boolean | 应用被卸载 | 如下 | 
| pkgUpdated | Boolean | 应用已更新 | 如下 | 
| pkgName | String | 安装的应用包名 | 如下 | 
pkgAdded 示例
-  作为条件判断: "condition": "pkgAdded == true"
pkgName示例
-  作为条件判断: "condition": "pkgAdded == true && pkgName == \"com.tencent.mm\""
-  作为动作参数: "ui.showShortToast(pkgName);"
0.4.2. 应用切换
前台应用切换时,thanox也会发布这个事实,参数如下。
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| frontPkgChanged | Boolean(true/false) | 前台应用已切换 | 如下 | 
| from | String(字符串) | 从哪个应用切换的,包名 | 如下 | 
| to | String(字符串) | 切换到哪个应用,包名 | 略 | 
frontPkgChanged示例
-  作为条件判断: "condition": "frontPkgChanged == true"
from示例
-  作为条件判断,微信是否回到了后台: "condition": "frontPkgChanged == true && from == \"com.tencent.mm\""
0.4.3. 任务清理
当某个应用的任务被移除时,一般场景为最近任务中,该任务被用户划掉。此时thanox也会发布这个事实,参数如下。
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| taskRemoved | Boolean(true/false) | 任务已移除 | 如下 | 
| pkgName | String(字符串) | 从哪个应用切换的,包名 | 如下 | 
taskRemoved示例
-  作为条件判断: "condition": "taskRemoved == true"
pkgName示例:
-  作为条件判断,微信任务移除时杀死应用: "condition": "taskRemoved == true && pkgName == \"com.tencent.mm\"", "actions": [ "ui.showShortToast(\"正在杀死微信\");", "killer.killPackage(pkgName);" ]
0.4.4. Activity Created
通常一个应用的活动页已经创建好,可以称为Activity Created。此时thanox也会发布这个事实,参数如下。 通常一个活动的生命周期为Created(创建好)–>Resumed(显示好,可以交互了)–> Paused(暂停)–> Destroyed(销毁了),需要注意的是,
如果一个活动走到Resumed状态时,被其他活动覆盖,例如被支付宝支付页面覆盖,那么它会走如下生命周期: Resumed–> Paused(被其他活动覆盖)–>Resumed(如果其他活动销毁了,回到了该活动,那么又会恢复到Resumed,而不会再次Create)。
详细的Android活动的生命周期可以参考:https://developer.android.com/guide/components/activities/activity-lifecycle
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| activityCreated | Boolean(true/false) | 活动页已经创建好 | 如下 | 
| componentNameAsString | String(字符串) | 活动的组件全名,Thanox的显示当前活动复制来的名字就是这个 | 如下 | 
| componentNameAsShortString | String(字符串) | 活动的组件缩名 | 如下 | 
| componentName | ComponentName | 活动的组件 | 如下 | 
| pkgName | String(字符串) | 应用的包名 | 如下 | 
0.4.5. Activity Resumed
通常一个应用的活动页已经显示,可以称为Activity Resumed。此时thanox也会发布这个事实,参数如下。
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| activityResumed | Boolean(true/false) | 活动已经显示 | 如下 | 
| componentNameAsString | String(字符串) | 活动的组件全名,Thanox的显示当前活动复制来的名字就是这个 | 如下 | 
| componentNameAsShortString | String(字符串) | 活动的组件缩名 | 如下 | 
| componentName | ComponentName | 活动的组件 | 如下 | 
| pkgName | String(字符串) | 应用的包名 | 如下 | 
通常很多应用启动首页会有一个首页显示广告,有个跳过按钮可以点击,下面是使用该事实实现的广告跳过示例:
[
  {
    "name": "AD Skip",
    "description": "彩云天气广告页面点击跳过",
    "priority": 1,
    "condition": "activityResumed == true && componentNameAsShortString == \"com.nowcasting.activity/.SplashActivity\"",
    "actions": [
      "ui.showShortToast(\"尝试点击跳过...\");",
      "ui.findAndClickViewByText(\"跳过\", \"com.nowcasting.activity/com.nowcasting.activity.SplashActivity\");"
    ]
  }
]
| 提示:此处条件只判断了彩云天气,可以使用 | 操作符做多条件判断。此处的ui操作后续会介绍。 | 
0.4.6. Activity Changed
当前前台活动(Activity)发生改变时thanox会发布该事件。(Since Thanox(or Pro)-2.5)
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| frontActivityChanged | Boolean(true/false) | 前台Activity改变 | 无 | 
| fromActivity | ComponentName | 活动的组件 | 无 | 
| toActivity | ComponentName | 活动的组件 | 无 | 
ComponentName 是活动组件名称。
例如:com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity
Thanox的开发者设置中,”显示当前Activity”功能也可以显示当前activity的ComponentName。
0.4.7. 应用停止运行
应用被杀死或者其他原因停止运行,Thanox会发布该事实。
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| pkgKilled | Boolean(true/false) | 任务已移除 | 如下 | 
| pkgName | String(字符串) | 应用包名 | 如下 | 
0.4.8. 屏幕开关
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| screenOn | Boolean(true/false) | 亮屏事件 | 无 | 
| screenOff | Boolean(true/false) | 灭屏事件 | 无 | 
| userPresent | Boolean(true/false) | 解锁事件 | 无 | 
0.4.9. 电量变化
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| batteryChanged | Boolean(true/false) | 电量发生变化 | 无 | 
| batteryLevel | int | 电量 | 无 | 
| isCharging | Boolean(true/false) | 是否在充电 | 无 | 
| isAcCharge | Boolean(true/false) | 是否为AC | 无 | 
| isUsbCharge | Boolean(true/false) | 是否为USB | 无 | 
0.4.10. 蓝牙事件
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| btStateChanged | Boolean(true/false) | 蓝牙开关状态发生变化 | 无 | 
| btStateOff | Boolean(true/false) | 蓝牙为关闭状态 | 无 | 
| btStateTurningOff | Boolean(true/false) | 蓝牙为正在关闭状态 | 无 | 
| btStateOn | Boolean(true/false) | 蓝牙为开启状态 | 无 | 
| btStateTurningOn | Boolean(true/false) | 蓝牙为正在开启状态 | 无 | 
| btConnectionStateChanged | Boolean(true/false) | 蓝牙连接状态发生变化 | 无 | 
| btConnectionStateConnected | Boolean(true/false) | 蓝牙为已连接状态 | 无 | 
| btConnectionStateConnecting | Boolean(true/false) | 蓝牙为正在连接状态 | 无 | 
| btConnectionStateDisconnected | Boolean(true/false) | 蓝牙为断开连接状态 | 无 | 
| btConnectionStateDisconnecting | Boolean(true/false) | 蓝牙为正在断开连接状态 | 无 | 
| btBoundedDevices | List of BluetoothDevice | 绑定的蓝牙设备模型列表 | 无 | 
| btBoundedDeviceAddresses | List of String | 绑定的蓝牙设备地址列表 | 无 | 
| btBoundedDeviceAliasNames | List of String | 绑定的蓝牙设备Alias列表 | 无 | 
| btBoundedDeviceBatteryLevel | List of Int | 绑定的蓝牙设备电量信息列表 | 无 | 
提示: Battery level in percents from 0 to 100, or -1 if Bluetooth is disabled, or device is disconnected, or does not have any battery reportingservice, or return value is invalid
示例1:
[
  {
    "name": "BT Connection State",
    "description": "蓝牙连接状态监听,此处监听连接事件,Toast显示所有连接设备,并判断是不是连接的MDR-XB650BT",
    "priority": 2,
    "condition": "btConnectionStateChanged == true && btConnectionStateConnected == true",
    "actions": [
      "ui.showShortToast(\"蓝牙连接连接到新设备了,所有设备名称为:\" + btBoundedDeviceAliasNames);",
      "ui.showShortToast(\"蓝牙连接连接到新设备了,包含MDR-XB650BT设备吗?\" + btBoundedDeviceAliasNames.contains(\"MDR-XB650BT\"));"
    ]
  }
]
示例2:
[
  {
    "name": "BT Connection State Advanced",
    "description": "同蓝牙连接状态监听,只是使用了btBoundedDevices:BluetoothDevice参数",
    "priority": 2,
    "condition": "btConnectionStateChanged == true && btConnectionStateConnected == true",
    "actions": [
      "ui.showShortToast(\"蓝牙连接连接到新设备了,第一个设备名称为:\" + btBoundedDevices.get(0).getAddress());"
    ]
  }
]
0.4.11. Wifi状态变化
Wifi状态变化时发出的事件。(Since Thanox 2.5-2)
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| wifiStateChanged | Boolean(true/false) | Wifi状态是否改变 | 无 | 
| wifiState | WifiState | 状态 | 无 | 
WifiState:
data class WifiState(
  // 是否是开启状态
  val enabled: Boolean, 
  // 状态信息(例如:No network)
  val statusLabel: String?, 
  // SSID(例如:ChinaNet-d2Xq-5G)
  val ssid: String?
)
0.4.12. 系统启动
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| systemReady | Boolean(true/false) | 系统启动完成 | 无 | 
0.4.13. 推送消息
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| fcmPushMessageArrived | Boolean(true/false) | 收到GCM/FCM消息推送 | 无 | 
| pkgName | String(字符串) | 应用包名 | 无 | 
0.4.14. 通知
| 参数名 | 类型 | 含义 | 示例 | 
|---|---|---|---|
| notificationAdded | Boolean(true/false) | 新通知到达 | 无 | 
| notificationUpdated | Boolean(true/false) | 通知更新 | 无 | 
| notificationRemoved | Boolean(true/false) | 通知移除 | 无 | 
| pkgName | String(字符串) | 通知所属应用包名 | 无 | 
| userId | Int | 通知app的用户id | 无 | 
| notificationTitle | String(字符串) | 通知标题 | 无 | 
| notificationContent | String(字符串) | 通知内容 | 无 | 
| notification | NotificationRecord | 通知记录,该模型包含更详细的信息,查看模型定义 | 无 | 
示例:
[
  {
    "name": "Notification events",
    "description": "通知事件",
    "priority": 1,
    "condition": "notificationAdded || notificationRemoved || notificationUpdated",
    "actions": [
      "ui.showShortToast(\"通知事件 \" + pkgName + notificationContent);"
    ]
  }
]
0.5.15 快捷方式
你可以创建一个有”意义的“桌面快捷方式,当你点击这个桌面快捷方式的时候,Thanox会发布这个快捷方式代表的事实。
例如;实现一个一键锁屏快捷方式,即:点击桌面一键锁屏快捷方式时锁屏。
首先创建一个快捷方式引擎:
 
 
接下来,添加一个情景模式,监听这个快捷方式的启动事件,并指定锁屏命令:
[
  {
    "name": "Profile shortcut",
    "description": "监听一个快捷方式启动事件,以一键锁屏为例",
    "priority": 2,
    "condition": "shortcutLaunched == true && shortcutValue == \"turn screen off\"",
    "actions": [
      "power.sleep(0);"
    ]
  }
]
保存之后,点击桌面上的一键锁屏快捷方式即可实现一键锁屏功能了。
0.5. Handle
Thanox会提供一部分执行动作所需要的handle能力。例如ui,专门用于做界面显示相关的动作。
你可以使用handle.action(params)来执行自定义的动作。
下面是目前支持的Handle能力。
0.5.1. killer
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| killPackage | 杀死应用 | 包名 | killer.killPackage(“com.tencent.mm”) | Boolean(true/false) | 
接口定义:
@HandlerName("killer")
interface IKiller {
    boolean killPackage(String pkgName);
}
举例:
"actions": [
  // 杀死微信
  "killer.killPackage(\"com.tencent.mm\")"
]
0.5.2. activity
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| launchProcessForPackage | 启动应用进程 | 包名 | 如下 | Boolean(true/false) | 
| launchMainActivityForPackage | 打开应用主界面 | 包名 | 如下 | Boolean(true/false) | 
| getLaunchIntentForPackage | 获取应用的启动Intent | 包名 | 如下 | Intent | 
| getFrontAppPackage | 获取当前前台应用包名 | 无 | 如下 | String(字符串) | 
| getFrontAppPackageComponent | 获取当前前台应用组件 | 无 | 如下 | ComponentName | 
接口定义:
@HandlerName("activity")
interface IActivity {
    boolean launchProcessForPackage(String pkgName);
    boolean launchActivity(Intent intent);
    boolean launchMainActivityForPackage(String pkgName);
    Intent getLaunchIntentForPackage(String pkgName);
    String getFrontAppPackage();
    ComponentName getFrontAppPackageComponent();
}
举例:
"actions": [
  // 启动微信进程
  "activity.launchProcessForPackage(\"com.tencent.mm\")",
  // 打开微信主界面
  "activity.launchMainActivityForPackage(\"com.tencent.mm\")",
  // 吐司显示目前前台应用包名
  "toast.showShortToast(activity.getFrontAppPackage())"
]
0.5.3. power
电源相关能力
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| sleep | 休眠(锁屏) | 延迟的毫秒数 | 如下 | 无 | 
| wakeup | 唤醒 | 延迟的毫秒数 | 如下 | 无 | 
| setBrightness | 设置屏幕亮度 | 亮度Level值(0~255) | 如下 | 无 | 
| getBrightness | 获取当前屏幕亮度 | 无 | 如下 | 度Level值(0~255) | 
| setAutoBrightnessEnabled | 设置自动亮度开关 | true/false | 如下 | 无 | 
| isAutoBrightnessEnabled | 是否开启自动亮度 | 无 | 如下 | true/false | 
接口定义:
@HandlerName("power")
interface IPower {
    void sleep(long delay);
    void wakeup(long delay);
  
    void setBrightness(int level);
    int getBrightness();
    void setAutoBrightnessEnabled(boolean enable);
    boolean isAutoBrightnessEnabled();
}
举例:
{
    "actions": [
        // 立即锁屏
        "power.sleep(0)",
        // 1秒后亮屏
        "power.wakeup(1000)",
        "power.setAutoBrightnessEnabled(false)",
        "power.setBrightness(power.getBrightness() + 1)",
    ]
}
0.5.4. task
任务相关能力
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| removeTasksForPackage | 移除应用的最近任务 | 包名 | 如下 | 无 | 
| hasTaskFromPackage | 应用是否有最近任务 | 包名 | 如下 | Boolean(true/false) | 
| clearBackgroundTasks | 调用thanox的任务清理功能,清理所有最近任务 | 无 | 如下 | 无 | 
接口定义:
@HandlerName("task")
interface ITask {
    void removeTasksForPackage(String pkgName);
    boolean hasTaskFromPackage(String pkgName);
    void clearBackgroundTasks();
}
举例:
{
  	// 判断微信是否有任务
    "condition": "true && task.hasTaskFromPackage(\"com.tencent.mm\")",
    "actions": [
        // 移除微信的最近任务
        "task.removeTasksForPackage(\"com.tencent.mm\")"
    ]
}
0.5.5. ui
界面相关
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| showShortToast | 显示提示 | 无 | 如下 | 无 | 
| showLongToast | 显示时间较短的提示 | 无 | 如下 | 无 | 
| showDialog | 显示对话框 | 标题文本,信息文本,确认按钮文本 | 如下 | 无 | 
| showNotification | 显示通知 | 标签(可用于取消通知)标题文本,信息文本,是否重要 | 如下 | 无 | 
| cancelNotification | 取消通知 | 标签 | 如下 | 无 | 
| showDanmu | 显示一条弹幕 [since Thanox4.0.9] | 弹幕文本 | 如下 | 无 | 
| showDanmu | 显示一条带图标的弹幕 [since Thanox4.0.9] | 图标,弹幕文本 | 如下 | 无 | 
接口定义:
@HandlerName("ui")
interface IUI {
    void showShortToast(@NonNull String msg);
    void showLongToast(@NonNull String msg);
    void showDialog(@Nullable String title,
                    @NonNull String msg,
                    @Nullable String yes);
    void showNotification(
            @NonNull String notificationTag,
            @NonNull String title,
            @NonNull String msg,
            boolean important);
    void cancelNotification(@NonNull String notificationTag);
    
    void showDanmu(@NonNull Object msg);
    /**
     * Show a danmu on your screen.
     *
     * @param icon Icon for danmu, supported format:
     *             app icon: app://app.package.name
     * @param msg  The text to show
     */
    void showDanmu(@Nullable String icon, @NonNull Object msg);
}
使用弹幕API的例子:
[
  {
    "name": "弹幕通知 Danmu notification",
    "description": "收到通知时用弹幕展示 Show Danmu on notification posted",
    "priority": 1,
    "condition": "notificationAdded && !notification.isForegroundService && pkgName != \"android\"",
    "actions": [
      "ui.showDanmu(\"app://\" + pkgName, thanos.pkgManager.getAppInfo(pkgName).appLabel + \" \" + notificationTitle + \"\n\" + notificationContent);"
    ]
  }
]
0.5.6. hw
硬件操作能力
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| enableWifi | 看名字 | 包名 | 如下 | Boolean(true/false) | 
| disableWifi | 看名字 | 无 | 如下 | Boolean(true/false) | 
| isWifiEnabled | 看名字 | 无 | 如下 | Boolean(true/false) | 
| enableLocation | 看名字 | 无 | 如下 | Boolean(true/false) | 
| disableLocation | 看名字 | 无 | 如下 | Boolean(true/false) | 
| isLocationEnabled | 看名字 | 无 | 如下 | Boolean(true/false) | 
| enableBT | 看名字 | 无 | 如下 | Boolean(true/false) | 
| disableBT | 看名字 | 无 | 如下 | Boolean(true/false) | 
| isBTEnabled | 看名字 | 无 | 如下 | Boolean(true/false) | 
| enableNfc | 看名字 | 无 | 如下 | Boolean(true/false) | 
| disableNfc | 看名字 | 无 | 如下 | Boolean(true/false) | 
| isNfcEnabled | 看名字 | 无 | 如下 | Boolean(true/false) | 
| enabledFlashlight | 看名字 | 无 | 如下 | Boolean(true/false) | 
| disableFlashlight | 看名字 | 无 | 如下 | Boolean(true/false) | 
| isFlashlightEnabled | 看名字 | 无 | 如下 | Boolean(true/false) | 
| isFlashlightAvailable | 手电筒是否可用(被占用?无硬件?) | 无 | 如下 | Boolean(true/false) | 
接口定义:
@HandlerName("hw")
interface IHW {
    boolean enableWifi();
    boolean disableWifi();
    boolean isWifiEnabled();
    boolean enableLocation();
    boolean disableLocation();
    boolean isLocationEnabled();
    boolean enableBT();
    boolean disableBT();
    boolean isBTEnabled();
    boolean enableNfc();
    boolean disableNfc();
    boolean isNfcEnabled();
  
    boolean enabledFlashlight();
    boolean disableFlashlight();
    boolean isFlashlightEnabled();
    boolean isFlashlightAvailable();
}
举例:
[
  {
    "name": "Enable BT",
    "description": "打开微信时,打开蓝牙",
    "priority": 2,
    "condition": "frontPkgChanged == true && to == \"com.tencent.mm\"",
    "actions": [
      "ui.showShortToast(\"蓝牙状态\" + (hw.isBTEnabled() ? \"开启\" : \"关闭\"));",
      "ui.showShortToast(\"正在打开蓝牙...\");",
      "ui.showShortToast(\"蓝牙打开\" + (hw.enableBT() ? \"成功\" : \"失败\"));",
      // 打开GPS
      "hw.enableLocation()",
      "hw.enableWifi()"
    ]
  }
]
0.5.7. io
文件读写能力。
注意:受限于文件权限,所有文件的根目录为/data/system/thanos_xxx/profile_user_io
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| read | 读取文件 | 文件相对路径 | 略 | String | 
| write | 写内容到文件 | 文件相对路径 | 略 | Boolean | 
| writeAppend | 写内容到文件,追加 | 文件相对路径 | 略 | Boolean | 
接口定义:
@HandlerName("io")
interface IIO {
    String read(String path);
    boolean write(String path, String content);
    boolean writeAppend(String path, String content);
}
0.5.8. data
移动数据相关能力。
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| setDataEnabled | 设置移动数据开启状态 | true打开,false关闭 | 如下 | Boolean(true/false) | 
| setDataEnabled | 设置移动数据开启状态(可以指定卡序号) | 卡序号,true打开,false关闭 | 如下 | 无 | 
| setDataEnabledForSlot | 设置移动数据开启状态(可以指定卡槽号) | 卡序号,true打开,false关闭 | 如下 | 无 | 
| isDataEnabled | 获取移动数据开启状态 | true打开,false关闭 | 如下 | Boolean(true/false) | 
| isDataEnabledForSlot | 获取移动数据开启状态(可以指定卡槽号) | true打开,false关闭 | 如下 | Boolean(true/false) | 
| setDataNetworkType | 设置网络模式 | type | 如下 | 无 | 
| setDataNetworkTypeForPhone | 设置网络模式(指定某个卡) | phoneId,type | 如下 | 无 | 
| setDataNetworkTypeForSlot | 设置网络模式(指定某个卡槽号) | slotId,type | 如下 | 无 | 
| getCurrentPreferredNetworkMode | 获取当前默认卡的网络模式 | 无 | 如下 | int | 
| getCurrentPreferredNetworkMode | 获取某subId的网络模式 | subId | 如下 | int | 
| getCurrentPreferredNetworkModeForSlot | 获取某卡槽的网络模式 | slotId | 如下 | int | 
| isAirplaneModeEnabled | 是否开启了飞行模式 | 无 | 无 | Boolean | 
接口定义:
@HandlerName("data")
interface IData {
    void setDataEnabled(boolean enable);
    void setDataEnabled(int subId, boolean enable);
    void setDataEnabledForSlot(int slotId, boolean enable);
    boolean isDataEnabled();
    boolean isDataEnabledForSlot(int slotId);
    void setDataNetworkType(int type);
    void setDataNetworkTypeForPhone(int phoneId, int type);
    void setDataNetworkTypeForSlot(int slotId, int type);
    int getCurrentPreferredNetworkMode();
    int getCurrentPreferredNetworkMode(int subId);
    int getCurrentPreferredNetworkModeForSlot(int slotId);
}
数据网络模式类型:
// Network type enums, primarily used by android/telephony/TelephonyManager.java.
// Do not add negative types.
enum NetworkTypeEnum {
    NETWORK_TYPE_UNKNOWN = 0;
    NETWORK_TYPE_GPRS = 1;
    NETWORK_TYPE_EDGE = 2;
    NETWORK_TYPE_UMTS = 3;
    NETWORK_TYPE_CDMA = 4;
    NETWORK_TYPE_EVDO_0 = 5;
    NETWORK_TYPE_EVDO_A = 6;
    NETWORK_TYPE_1XRTT = 7;
    NETWORK_TYPE_HSDPA = 8;
    NETWORK_TYPE_HSUPA = 9;
    NETWORK_TYPE_HSPA = 10;
    NETWORK_TYPE_IDEN = 11;
    NETWORK_TYPE_EVDO_B = 12;
    NETWORK_TYPE_LTE = 13;
    NETWORK_TYPE_EHRPD = 14;
    NETWORK_TYPE_HSPAP = 15;
    NETWORK_TYPE_GSM = 16;
    NETWORK_TYPE_TD_SCDMA = 17;
    NETWORK_TYPE_IWLAN = 18;
    NETWORK_TYPE_LTE_CA = 19;
    NETWORK_TYPE_NR = 20;
}
举例:
[
  {
    "name": "Enable Data",
    "description": "打开微信时,打开移动数据",
    "priority": 2,
    "condition": "frontPkgChanged == true && to == \"com.tencent.mm\"",
    "actions": [
      "ui.showShortToast(\"移动数据当前\" + (data.isDataEnabled() ? \"开启\" : \"关闭\"));",
      "ui.showShortToast(\"正在打开移动数据...\");",
      "data.setDataEnabled(true)"
    ]
  }
]
0.5.9. ringtone
铃音振动能力。
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| dingdingding | 看名字 | 无或者重复次数 | 如下 | 无 | 
| wengwengweng | 看名字 | 无或者重复次数 | 如下 | 无 | 
接口定义:
@HandlerName("ringtone")
interface IRingtone {
    void dingdingding();
    void wengwengweng();
    void dingdingding(int repeat);
    void wengwengweng(int repeat);
}
0.5.10. sh
Shell sh能力。
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| exe | 执行sh命令 | 命令字符串 | 无 | 结果 | 
接口定义:
@HandlerName("sh")
interface ISh {
    CommandResult exe(String command);
}
0.5.11. input
按键输入能力。
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| injectKey | 执行sh命令 | 命令字符串 | 无 | 结果 | 
| getLastKey | 返回上次按键码 | 无 | 无 | 按键码 | 
| getLastKeyTime | 返回上次按键的系统时间 | 无 | 无 | 系统时间mills | 
接口定义:
@HandlerName("input")
interface IInput {
    boolean injectKey(int code);
    int getLastKey();
    long getLastKeyTime();
}
0.5.12. pkg
包管理能力。
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| disableApplication | 冻结应用 | 包名 | 无 | 无 | 
| enableApplication | 解冻应用 | 包名 | 无 | 无 | 
| isApplicationEnabled | 应用是否为非冻结状态 | 包名 | 无 | Boolean(true/false) | 
接口定义:
@HandlerName("pkg")
interface IPkg {
    void disableApplication(String pkg);
    void enableApplication(String pkg);
    boolean isApplicationEnabled(String pkg);
}
0.5.13. Log
日志打印工具。
使用示例:
log.log("Log message");
接口定义:
@HandlerName("log")
public interface ILog {
    void log(String content);
}
0.5.14. Audio
声音管理相关。
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| getRingerMode | 获取铃音模式 | 无 | 无 | 模式的int值 | 
| setRingerMode | 设置铃音模式 | 模式的int值 | 无 | 无 | 
铃音模式的int值标识:https://developer.android.com/reference/android/media/AudioManager#RINGER_MODE_SILENT
int RINGER_MODE_SILENT = 0; int RINGER_MODE_VIBRATE = 1; int RINGER_MODE_NORMAL = 2;
接口定义:
@HandlerName("audio")
interface IAudio {
    int getRingerMode();
  
  	// https://developer.android.com/reference/android/media/AudioManager#setRingerMode(int)
    void setRingerMode(int ringerMode);
}
0.5.15. Battery
Battery相关。
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| getBatteryState | 获取电池状态 | 无 | 参考下方例子 | BatteryState | 
BatteryState类型定义:
data class BatteryState(
    // 电量
    val batteryLevel: Int = 0,
    // 是否在充电
    val isCharging: Boolean = false,
    // 是否在AC充电
    val isAcCharge: Boolean = false,
    // 是否在USB充电
    val isUsbCharge: Boolean = false,
)
接口定义:
@HandlerName("battery")
public interface IBattery {
    BatteryState getBatteryState();
}
使用举例,获取电池电量:battery.getBatteryState().batteryLevel 
0.5.16. Context
Android System Context,Android系统上下文。 基于Context可以实现更丰富的功能调用。举例:
[
  {
    "name": "Use System Context",
    "description": "调用Context,获取当前User信息",
    "priority": 1,
    "condition": "screenOn == true",
    "actions": [
      "ui.showShortToast(\"User info: \" + context.getSystemService(context.USER_SERVICE).getUserInfo(android.os.UserHandle.getCallingUserId()).name);"
    ]
  }
]
0.5.17. Thanos
你可以使用thanox或thanos来调用Thanos API,举例:
[
  {
    "name": "Thanos API",
    "description": "Example actions with thanos API",
    "priority": 2,
    "condition": "frontPkgChanged == true && to == \"com.tencent.mm\"",
    "actions": [
      "thanos.getProfileManager().enableRuleByName(\"my_we_chat_rule\");"
    ]
  }
]
0.5.18. Actor(废弃)
情景模式Action相关,目前支持Action的延迟执行。
Actor已被废弃:请使用delay属性实现延迟效果。例如:
[
  {
    "name": "Delayed action example",
    "description": "...",
    "priority": 1,
    "delay": 2000,
    "condition": "...",
    "actions": [...]
  }
]
| 能力 | 含义 | 参数 | 举例 | 返回值 | 
|---|---|---|---|---|
| delayed | 延迟执行一个Action | 延迟毫秒数,Action表达式 | 无 | 无 | 
接口定义:
@HandlerName("actor")
public interface IActor {
    void delayed(long delayMillis, String action);
}
举例:
[
  {
    "name": "Delayed action example",
    "description": "Execute the action delay 2s: show a short toast and log the event 2s after app switched.",
    "priority": 1,
    "condition": "frontPkgChanged == true",
    "actions": [
      "actor.delayed(2000, \"ui.showShortToast(\\\"App switched 2s ago\\\")\")",
      "actor.delayed(2000, \"log.log(to)\")"
    ]
  }
]
0.6. 全局变量
全局变量:name-List
可用于条件判断,事件处理等。
Thanox支持创建,导入全局变量。发布事实时,你可以用过globalVarOf$拼接变量名来访问。以变量apps为例:
[
  {
    "name": "Use var example",
    "description": "应用切换时,如果当前前台应用在定义的变量列表apps中,Toast使用输出包名",
    "priority": 1,
    "condition": "frontPkgChanged == true && globalVarOf$apps.contains(to)",
    "actions": [
      "ui.showShortToast(to);"
    ]
  }
]