设备详情 UI 业务包

更新时间:2024-11-18 11:33:11下载pdf

涂鸦设备详情 UI 业务包支持以下功能:

集成业务包

创建工程

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

  2. 主工程的 assets 目录下,放入 deviceDetail.json 以及 [deviceEditConfigList.json] 配置文件。具体配置入下:

    [
      {
        "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"
          }
        ],
        "margin": {
          "top": 16
        }
      }
    ]
    
  • deviceEditConfigList.json

    {
    "deviceEdit": [
        {
        "name": "deviceEdit",
        "items": [
            {
            "cellType": "dev_icon"
            },
            {
            "cellType": "set_icon"
            },
            {
            "cellType": "set_name"
            },
            {
            "cellType": "set_position"
            }
        ]
        }
    ]
    }
    
    
    
    • deviceDetailtype 的顺序会影响设备详情页子功能展示的顺序。如果移除某个 type,则相应也会移除设备详情页子功能。
    • devBaseInfotype 的顺序会影响设备基础信息子功能展示的顺序。如果移除某个 type,则相应也会移除功能入口。
    deviceDetail type 设备功能
    header 查看修改设备图标、名称、位置
    device_info 显示设备信息
    net_setting 显示设备备用网络
    group_edit_devices 群组设备管理,您需要额外接入 群组管理 UI 业务包
    off_line_warn 设备离线提醒
    section_other 分区头,无实际功能
    bind_multi_control_link 多控关联
    group_create 创建群组,您需要额外接入 群组管理 UI 业务包
    help_and_feedback 常见问题与反馈,您需要额外接入 常见问题与反馈 UI 业务包
    check_firmware_update 检查设备固件升级,您需要额外接入 设备固件 OTA 升级 UI 业务包
    show_infrared_gateway_sub_device 展示遥控器
    device_detail_empty 一个空的 view,无实际功能
    footer 移除设备
    deviceEdit type 设备功能
    dev_icon 设备图标
    set_icon 图标 item
    set_name 名称 item
    set_position 位置 item

build.gradle 配置

dependencies {
	implementation 'com.tuya.smart:tuyasmart-bizbundle-panelmore:4.2.0-33'
}

功能调用

参数说明

参数 说明
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 = TuyaHomeSdk.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"
            }
        ],
        "margin": {
            "top": 16
        }
        }
    ]
    
  2. 实现 com.tuya.smart.archer.api.cell.IArcherCell 或者 com.tuya.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?{}

显示配置

tyarchercell_config 中配置当前的 class

    {
      "name": "c_test_insert",
      "type": 1,
      "clazz": "com.tuya.smart.bizubundle.panelmore.demo.CTestInsertCell"
    },
    {
      "name": "c_test_async_insert",
      "type": 1,
      "clazz": "com.tuya.smart.bizubundle.panelmore.demo.CTestAsyncInsertCell"
    }
参数 说明
name deviceDetail.json 中配置的 cellType
type item 的类型:1 表示 item2 表示 header。当前 section 中存在 item 显示,header必显示
clazz itemclass

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

 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.tuya.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