情景模式

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优先级,决定执行顺序
delayaction 动作执行的延迟,时间单位为毫秒
condition触发条件,支持mvel表达式,条件可选的基于事实的facts-param请参考下面的章节
语法注意:双引号需要使用\转移字符转义
actions要执行的动作,支持mvel表达式在新窗口中打开 ,可以设置多个,动作可选的handle请参考下面的章节
语法注意:双引号需要使用\转移字符转义

0.4. Fatcs-params

除了提供规则引擎之外,Thanox也会提供常用的事实与参数,用于condition条件判断。

0.4.1. 应用安装、卸载、更新

应用安装、卸载、更新之后,thanox会发布这个事实,并注入一些参数,你可以使用这些参数做条件判断,或者执行动作时作为参数使用。

参数名类型含义示例
pkgAddedBoolean新应用已经安装如下
pkgRemovedBoolean应用被卸载如下
pkgUpdatedBoolean应用已更新如下
pkgNameString安装的应用包名如下

pkgAdded 示例

  • 作为条件判断:

    "condition":  "pkgAdded == true"
    

pkgName示例

  • 作为条件判断:

    "condition":  "pkgAdded == true && pkgName == \"com.tencent.mm\""
    
  • 作为动作参数:

    "ui.showShortToast(pkgName);"
    

0.4.2. 应用切换

前台应用切换时,thanox也会发布这个事实,参数如下。

参数名类型含义示例
frontPkgChangedBoolean(true/false)前台应用已切换如下
fromString(字符串)从哪个应用切换的,包名如下
toString(字符串)切换到哪个应用,包名

frontPkgChanged示例

  • 作为条件判断:

    "condition":  "frontPkgChanged == true"
    

from示例

  • 作为条件判断,微信是否回到了后台:

    "condition":  "frontPkgChanged == true && from == \"com.tencent.mm\""
    

0.4.3. 任务清理

当某个应用的任务被移除时,一般场景为最近任务中,该任务被用户划掉。此时thanox也会发布这个事实,参数如下。

参数名类型含义示例
taskRemovedBoolean(true/false)任务已移除如下
pkgNameString(字符串)从哪个应用切换的,包名如下

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

参数名类型含义示例
activityCreatedBoolean(true/false)活动页已经创建好如下
componentNameAsStringString(字符串)活动的组件全名,Thanox的显示当前活动复制来的名字就是这个如下
componentNameAsShortStringString(字符串)活动的组件缩名如下
componentNameComponentName活动的组件如下
pkgNameString(字符串)应用的包名如下

0.4.5. Activity Resumed

通常一个应用的活动页已经显示,可以称为Activity Resumed。此时thanox也会发布这个事实,参数如下。

参数名类型含义示例
activityResumedBoolean(true/false)活动已经显示如下
componentNameAsStringString(字符串)活动的组件全名,Thanox的显示当前活动复制来的名字就是这个如下
componentNameAsShortStringString(字符串)活动的组件缩名如下
componentNameComponentName活动的组件如下
pkgNameString(字符串)应用的包名如下

通常很多应用启动首页会有一个首页显示广告,有个跳过按钮可以点击,下面是使用该事实实现的广告跳过示例:

[
  {
    "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)

参数名类型含义示例
frontActivityChangedBoolean(true/false)前台Activity改变
fromActivityComponentName活动的组件
toActivityComponentName活动的组件

ComponentName在新窗口中打开 是活动组件名称。

例如:com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity

Thanox的开发者设置中,"显示当前Activity"功能也可以显示当前activity的ComponentName。

0.4.7. 应用停止运行

应用被杀死或者其他原因停止运行,Thanox会发布该事实。

参数名类型含义示例
pkgKilledBoolean(true/false)任务已移除如下
pkgNameString(字符串)应用包名如下

0.4.8. 屏幕开关

参数名类型含义示例
screenOnBoolean(true/false)亮屏事件
screenOffBoolean(true/false)灭屏事件
userPresentBoolean(true/false)解锁事件

0.4.9. 电量变化

参数名类型含义示例
batteryChangedBoolean(true/false)电量发生变化
batteryLevelint电量
isChargingBoolean(true/false)是否在充电
isAcChargeBoolean(true/false)是否为AC
isUsbChargeBoolean(true/false)是否为USB

0.4.10. 蓝牙事件

参数名类型含义示例
btStateChangedBoolean(true/false)蓝牙开关状态发生变化
btStateOffBoolean(true/false)蓝牙为关闭状态
btStateTurningOffBoolean(true/false)蓝牙为正在关闭状态
btStateOnBoolean(true/false)蓝牙为开启状态
btStateTurningOnBoolean(true/false)蓝牙为正在开启状态
btConnectionStateChangedBoolean(true/false)蓝牙连接状态发生变化
btConnectionStateConnectedBoolean(true/false)蓝牙为已连接状态
btConnectionStateConnectingBoolean(true/false)蓝牙为正在连接状态
btConnectionStateDisconnectedBoolean(true/false)蓝牙为断开连接状态
btConnectionStateDisconnectingBoolean(true/false)蓝牙为正在断开连接状态
btBoundedDevicesList of BluetoothDevice绑定的蓝牙设备模型列表
btBoundedDeviceAddressesList of String绑定的蓝牙设备地址列表
btBoundedDeviceAliasNamesList of String绑定的蓝牙设备Alias列表
btBoundedDeviceBatteryLevelList 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)

参数名类型含义示例
wifiStateChangedBoolean(true/false)Wifi状态是否改变
wifiStateWifiState状态

WifiState:

data class WifiState(
  // 是否是开启状态
  val enabled: Boolean, 
  // 状态信息(例如:No network)
  val statusLabel: String?, 
  // SSID(例如:ChinaNet-d2Xq-5G)
  val ssid: String?
)

0.4.12. 系统启动

参数名类型含义示例
systemReadyBoolean(true/false)系统启动完成

0.4.13. 推送消息

参数名类型含义示例
fcmPushMessageArrivedBoolean(true/false)收到GCM/FCM消息推送
pkgNameString(字符串)应用包名

0.4.14. 通知

参数名类型含义示例
notificationAddedBoolean(true/false)新通知到达
notificationUpdatedBoolean(true/false)通知更新
notificationRemovedBoolean(true/false)通知移除
pkgNameString(字符串)通知所属应用包名
userIdInt通知app的用户id
notificationTitleString(字符串)通知标题
notificationContentString(字符串)通知内容
notificationNotificationRecord通知记录,该模型包含更详细的信息,查看模型定义在新窗口中打开

示例:

[
  {
    "name": "Notification events",
    "description": "通知事件",
    "priority": 1,
    "condition": "notificationAdded || notificationRemoved || notificationUpdated",
    "actions": [
      "ui.showShortToast(\"通知事件 \" + pkgName + notificationContent);"
    ]
  }
]

0.5.15 快捷方式

你可以创建一个有”意义的“桌面快捷方式,当你点击这个桌面快捷方式的时候,Thanox会发布这个快捷方式代表的事实。

例如;实现一个一键锁屏快捷方式,即:点击桌面一键锁屏快捷方式时锁屏。

首先创建一个快捷方式引擎:

prlfile-shortcut-create

接下来,添加一个情景模式,监听这个快捷方式的启动事件,并指定锁屏命令:

[
  {
    "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(String),名字---字符串列表

可用于条件判断,事件处理等。

Thanox支持创建,导入全局变量。发布事实时,你可以用过globalVarOf$拼接变量名来访问。以变量apps为例:

[
  {
    "name": "Use var example",
    "description": "应用切换时,如果当前前台应用在定义的变量列表apps中,Toast使用输出包名",
    "priority": 1,
    "condition": "frontPkgChanged == true && globalVarOf$apps.contains(to)",
    "actions": [
      "ui.showShortToast(to);"
    ]
  }
]