设备详情 UI 业务包

更新时间:2024-10-29 06:24:50下载pdf

涂鸦设备详情 UI 业务包提供了以下功能:

集成业务包

创建工程

  1. 在 Android Studio 中建立您的工程,接入智能生活 App SDK,并完成业务包 框架接入

  2. 主工程的 assets 目录下,需放入 deviceDetail.jsondeviceEditConfigList.jsonthingarchercell_config.json 三个配置文件。

    有关配置文件的详情内容,可在 GitHub 下载 tuya-ui-bizbundle-android-demo,查看其 devicedetail 模块下的 assets 文件夹中对应的 JSON 文件。以下内容只对该三个配置文件的结构做简单说明:

    • deviceDetail.json

      deviceDetailtype 参数的设置顺序会影响设备详情页子功能展示的顺序。如果移除某个 type,则相应也会移除设备详情页子功能。

      以下代码只用于举例说明,完整的文件内容请查看在 GitHub 查看 tuya-ui-bizbundle-android-demo

      [
      {
          "name": "headerSection",
          "items": [
          {
              "cellType": "header"
          },
          {
              "cellType": "device_info"
          }
          ]
      },
      {
          "name": "otherSection",
          "header": {
          "cellType": "section_other"
          },
          "items": [
          {
              "cellType": "device_from"
          },
          {
              "cellType": "bind_multi_control_link"
          },
          {
              "cellType": "sub_device_migrate"
          }
          ]
      },
      {
          "name": "footerSection",
          "header": {
          "cellType": "device_detail_empty"
          },
          "items": [
          {
              "cellType": "footer"
          }
          ],
          "margin": {
          "top": 16
          }
      }
      ]
      
      参数 说明
      name 分组名称
      items 分组下的子项列表,参数 cellType 表示子项名称
      header 分组的头部内容
      footer 分组的尾部内容
      margin 分组之间的间距
    • deviceEditConfigList.json

      deviceEditConfigListtype 参数的设置顺序会影响设备基础信息子功能展示的顺序。如果移除某个 type,则相应也会移除功能入口。

      {
      "deviceEdit": [
          {
          "name": "deviceEdit",
          "items": [
              {
              "cellType": "dev_icon"
              },
              {
              "cellType": "set_icon"
              },
              {
              "cellType": "set_name"
              },
              {
              "cellType": "set_position"
              }
          ]
          }
      ]
      }
      
      deviceEdit type 设备功能
      dev_icon 设备图标
      set_icon 图标 item
      set_name 名称 item
      set_position 位置 item
    • thingarchercell_config.json

      新增 cell 或者 groupCell 时,都需要在 thingarchercell_config 中按照格式添加对应的信息。

      以下代码只用于举例说明,完整的文件内容请查看在 GitHub 查看 tuya-ui-bizbundle-android-demo

      {
      "archerGroup": [
          {
          "name": "headerSection",
          "clazz": "com.thingclips.smart.device_detail.group.HeaderGroup"
          }
      ],
      "archerCell": [
          {
          "name": "check_device_network",
          "type": 1,
          "clazz": "com.thingclips.smart.device_detail.cell.CheckDeviceNetworkArcherCell"
          },
          {
          "name": "product_instruction",
          "type": 1,
          "clazz": "com.thingclips.smart.device_detail.cell.ProductInstructionArcherCell"
          },
          {
          "name": "section_off_line_warn",
          "type": 2,
          "clazz": "com.thingclips.smart.device_detail.cell.OffLineWarnHeaderCell"
          },
          {
          "name": "location_manage",
          "type": 1,
          "clazz": "com.thingclips.smart.device_detail.cell.LocationManageArcherCell"
          },
          {
          "name": "group_edit_devices",
          "type": 1,
          "clazz": "com.thingclips.smart.device_detail.cell.GroupEditDeviceArcherCell"
          }
      ]
      }
      
      参数 说明
      name deviceDetail.json 中配置的 cellType
      type item 的类型:
      • 1:表示 item
      • 2:表示 header
      当前 section 中存在 item 显示时,header 必显示
      clazz itemclass

配置 build.gradle


dependencies {
    api enforcedPlatform("com.thingclips.smart:thingsmart-BizBundlesBom:${biz_bom_version}")
    implementation 'com.thingclips.smart:thingsmart-bizbundle-panelmore'
    api "com.thingclips.smart:thingsmart:${sdk_version}}"
}

配置Application

// 需要在项目的 Application 中增加 @HiltAndroidApp,如下面代码所示:
@HiltAndroidApp
public class ThingSmartApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
    }
 }

三方语音控制的配置

需要在 res > values > compat-colors.xml 中修改 appId,将下面代码的 1234 替换成真正的 appId。可以提交工单,申请获取 appId。如果不配置三方语音控制,页面加载可能出现问题。

<integer name="appId">1234</integer>

功能调用

参数说明

参数 说明
extra_panel_dev_id 设备 ID
extra_panel_name 设备名称
extra_panel_group_id 群组 ID

示例代码

UrlBuilder urlBuilder = new UrlBuilder(PanelMoreActivity.this, "panelMore");
String devId = edt.getText().toString().trim();
DeviceBean deviceBean = ThingHomeSdk.getDataInstance().getDeviceBean(devId);
Bundle bundle = new Bundle();
bundle.putString("extra_panel_dev_id",devId);
bundle.putString("extra_panel_name",deviceBean.getName());
bundle.putLong("extra_panel_group_id",groupId);

urlBuilder.putExtras(bundle);
UrlRouter.execute(urlBuilder);

自定义子功能

  1. configList.json 文件的 deviceDetail 插入自定义 type

    type 的值必须以 c_ 开头,例如 c_test_insert

    [
        {
        "name": "headerSection",
        "items": [
            {
            "cellType": "header"
            },
            {
            "cellType": "device_info"
            },
            {
            "cellType": "net_setting"
            },
            {
            "cellType": "group_edit_devices"
            }
        ]
        },
        {
        "name": "offLineWarnSection",
        "header": {
            "cellType": "section_off_line_warn"
        },
        "items": [
            {
            "cellType": "off_line_warn"
            }
        ]
        },
        {
        "name": "otherSection",
        "header": {
            "cellType": "section_other"
        },
        "items": [
            {
            "cellType": "bind_multi_control_link"
            },
            {
            "cellType": "group_create"
            },
            {
            "cellType": "help_and_feedback"
            },
            {
            "cellType": "add_icon_to_home_screen"
            },
            {
            "cellType": "show_infrared_gateway_sub_device"
            },
            {
            "cellType": "check_device_network"
            },
            {
            "cellType": "check_firmware_update"
            },
            {
            "cellType": "c_test_insert"
            },
            {
            "cellType": "c_test_async_insert"
            }
        ]
        },
        {
        "name": "footerSection",
        "header": {
            "cellType": "device_detail_empty"
        },
        "items": [
            {
            "cellType": "footer"
            }
        ]
        }
    ]
    
  2. 实现 com.thingclips.smart.archer.api.cell.IArcherCell 或者 com.thingclips.smart.archer.api.AbsBaseArcherCell

初始化配置

接口说明

override fun onCreate(context: Context?) {}

参数说明

参数 说明
context 安卓 context

设置显示逻辑

  • 实现为 AbsBaseArcherCell,必须通过 getContainerControl().updateCell(this) 触发更新逻辑。否则不会调用 show()

  • 实现为 IArcherCell,无法调用 getContainerControl().updateCall(this)show()方法会被自动调用。

    override suspend fun show(): Boolean {}
    

设置 View 及绑定 View

点击事件可在 onBindView 中实现。

 override fun onCreateView(parent: ViewGroup): View? {}
 override fun onBindView(view: View): ITYBaseData?{}

显示配置

deviceDetailArcherCellConfig.json 中配置当前的 class

{
      "name": "c_test_insert",
      "type": 1,
      "clazz": "com.thingclips.smart.bizubundle.panelmore.demo.CTestInsertCell"
    },
    {
      "name": "c_test_async_insert",
      "type": 1,
      "clazz": "com.thingclips.smart.bizubundle.panelmore.demo.CTestAsyncInsertCell"
    }

基于设备详情获取设备或群组信息

 val service:IPluginDeviceDetailInfoService? = MicroServiceManager.getInstance()
            .findServiceByInterface(IPluginDeviceDetailInfoService::class.java.name)
        val deviceId = service?.getCurrentDevId();
        val groupId = service?.getCurrentGroupId();

判断当前用户是否是家庭管理员

val absDevBaseInfoService: AbsDevBaseInfoService? by lazy {
        MicroServiceManager.getInstance()
            .findServiceByInterface(AbsDevBaseInfoService::class.java.name)
    }
val isAdmin = absDevBaseInfoService.getIsAdmin()

添加到主屏幕

添加主屏幕需要自行开发跳转方式,确保当前 App 已获得创建快捷方式的权限。

具体实现步骤如下:

  1. 定义 activity-alias,将入口 activity 启动模式设置为 singleTask

    <activity-alias
                android:name="com.thingclips.smart.hometab.activity.shortcut"
                android:exported="true"
                android:targetActivity=".MainActivity"> //此处为入口需跳转到 activity
    
  2. 实现 app 模块中的 RouterPresenter 路由解析的部分即可。

    if (PINNED_SHORTCUT_ALIAS.equals(intent.getComponent().getClassName())) {
                String url = null;
                try {
                    url = intent.getStringExtra("url");
                } catch (Throwable t) {
                    LogUtil.e(TAG, "get url error", t);
                }
                L.d(TAG, "schemeJump: " + url);
                if (TextUtils.isEmpty(url)) {
                    return null;
                }
                if (isInnerRouter(url)) {
                    return new RouterPresenter(url, intent.getExtras());
                }
                return null;
    
            }
            return null;
    ...
    
  3. 重写 onNewIntent 方法 调用 Router 解析路由。

  4. onResume中执行路由跳转逻辑。

红外子设备展示遥控器

接口说明

 /**
     * 获取红外子设备是否展示在首页
     *
     * @param homeId
     * @param devId
     * @return
     */
    public abstract boolean getInfraredSubDevDisplaySettings(long homeId, String devId);

参数说明

参数 说明
homeId 家庭 ID
devId 设备 ID

接口说明

    /**
     * 获取红外设备显示当前逻辑
     * @param homeId
     * @param devId
     * @return
     */
    public abstract boolean getInfraredDevDisplaySettings(long homeId, String devId);

参数说明

参数 说明
homeId 家庭 ID
devId 设备 ID(红外设备)

接口说明

    /**
     * 注册红外子设备(虚拟设备)显示设置变更监听.
     *
     * @param listener
     */
    public abstract void registerInfraredSubDevDisplaySettingsListener(OnInfraredSubDevDisplaySettingsListener listener);

    /**
     * 反注册红外子设备显示设置变更监听.
     *
     * @param listener
     */
    public abstract void unregisterInfraredSubDevDisplaySettingsListener(OnInfraredSubDevDisplaySettingsListener listener);

参数说明

参数 说明
homeId 家庭 ID
devId 设备 ID(红外设备)

示例代码


  IPluginInfraredSubDevDisplayService service = MicroServiceManager.getInstance().findServiceByInterface(IPluginInfraredSubDevDisplayService.class.getName());
        service.registerInfraredSubDevDisplaySettingsListener(new OnInfraredSubDevDisplaySettingsListener() {
            @Override
            public void onDisplaySettingsChanged(Long homeId, String gwId, Boolean shown) {
                // 更新设备列表
                // gwId 为红外设备 ID
                // devId 为红外子设备 ID
                // service.getInfraredSubDevDisplaySettings(homeId,devId) 读取当前的红外子设备是否需要显示到首页

                Log.e(TAG, " changed " + "homeId: " + homeId + " devId" + gwId + " show" + shown);
                Toast.makeText(DeviceDetailActivity.this, "infrared Changed", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onDisplaySettingsRemoved(Long homeId, String gwId) {
                Log.e(TAG, " removed " + "homeId: " + homeId + " devId" + gwId);
                Toast.makeText(DeviceDetailActivity.this, "infrared removed", Toast.LENGTH_LONG).show();
            }
        });

已废弃 API

废弃 API 替代说明
PanelMoreItemClickService.devClickItem 实现 IArcherCell 或者 AbsArcherCell
PanelMoreItemClickService.devClickItem 实现 IArcherCell 或者 AbsArcherCell
PanelMoreMenuService.insertDevMenuItemAsync 使用上述说明实现新 cell
PanelMoreMenuService.insertDevMenuItem/insertDevMenuItemAsync/insertDevMenuItem/ 使用上述说明实现新 cell
PanelMoreInfraredSubDevDisplayService IPluginInfraredSubDevDisplayService