接入 UI 业务包框架

更新时间:2024-11-05 07:38:48下载pdf

本文介绍涂鸦 Cube App SDK 安卓版 UI 业务包通用配置说明。更多详情,请访问 GitHub 项目 private-cloud-app-sdk-android

涂鸦已经废弃 com.tuya.android.module:tymodule-config:latestVersionclasspath。为确保更好的兼容性,建议您及时移除。

  • UI 业务包是基于涂鸦 Cube SDK 做的完整业务封装,请务必保障集成 UI 业务包之前完成涂鸦 Cube SDK 的集成,并保持两者版本一致性。
  • 由于各 UI 业务包是完整的业务实现,并不支持您自定义修改。如果您有自定义开发诉求,建议基于涂鸦 Cube SDK 自定义开发。

前提条件

业务包支持的安卓 minSdkVersion 为 23,targetSdkVersion 为 34,且仅支持通过 AndroidX 构建。

配置业务包

本小节介绍配置业务包涉及的文件介绍、修改说明及相关安卓依赖的设置。

配置文件

业务包更新时,您必须重新下载配置文件。

配置项 说明 是否必选
assets
res res/values/compat-colors.xmlres/values 为必选
主题色
您需要同时修改 colors.xmlui_theme_config.json 两个文件的内容来实现主题色配置。
否(此资源不再维护,推荐使用 主题色配置 UI 业务包

主题色 配置文件修改说明:

  • colors.xml 参数说明:

    参数 说明 默认值
    thing_theme_color_m1 正常态主题色资源 #FFFF5A28
    thing_theme_color_m1_1 禁用态主题色资源 #33FF5A28
    thing_theme_color_m1_2 按压态主题色资源 #FFFF6B3E
    thing_theme_color_m1_alpha_5 5% 透明度的主题色资源 #0DFF5A28
    thing_theme_color_m1_alpha_10 10% 透明度的主题色资源 #1AFF5A28
    thing_theme_color_m1_alpha_15 15% 透明度的主题色资源 #26FF5A28
    thing_theme_color_m1_alpha_20 20% 透明度的主题色资源 #33FF5A28
    thing_theme_color_m1_alpha_25 25% 透明度的主题色资源 #40FF5A28
    thing_theme_color_m1_alpha_30 30% 透明度的主题色资源 #4DFF5A28
    thing_theme_color_m1_alpha_35 35% 透明度的主题色资源 #59FF5A28
    thing_theme_color_m1_alpha_40 40% 透明度的主题色资源 #66FF5A28
    thing_theme_color_m1_alpha_45 45% 透明度的主题色资源 #73FF5A28
    thing_theme_color_m1_alpha_50 50% 透明度的主题色资源 #80FF5A28
    thing_theme_color_m1_alpha_55 55% 透明度的主题色资源 #8CFF5A28
    thing_theme_color_m1_alpha_60 60% 透明度的主题色资源 #99FF5A28
    thing_theme_color_m1_alpha_65 65% 透明度的主题色资源 #A6FF5A28
    thing_theme_color_m1_alpha_70 70% 透明度的主题色资源 #B3FF5A28
    thing_theme_color_m1_alpha_75 75% 透明度的主题色资源 #BFFF5A28
    thing_theme_color_m1_alpha_80 80% 透明度的主题色资源 #CCFF5A28
    thing_theme_color_m1_alpha_85 85% 透明度的主题色资源 #D9FF5A28
    thing_theme_color_m1_alpha_90 90% 透明度的主题色资源 #E6FF5A28
    thing_theme_color_m1_alpha_95 95% 透明度的主题色资源 #F2FF5A28
  • ui_theme_config.json 修改说明:

    {
        "color_alpha":{
        "N1":0.9,
        "N2":0.7,
        "N3":0.5,
        "N4":0.3,
        "N5":0.7,
        "N6":0.2,
        "N7":0.1,
        "N8":0.4
        },
        "colors":{
        "B1":"#F8F8F8",
        "B2":"#FFFFFF",
        "B3":"#FFFFFF",
        "B4":"#FFFFFF",
        "B5":"#FFFFFF",
        "M1":"#FF5A28", // M1 表示主题色配置,默认值为#FF5A28。仅 M1 支持修改为其他值,其他属性字段不支持修改
        "M2":"#FF4444",
        "M3":"#00CC99",
        "M4":"#1989FA",
        "M5":"#FF5A28"
        },
        "corner":{
        "alert_corner_type":"angle",
        "button_corner_type":"angle",
        "card_corner_type":"angle"
        },
        "font":{
        "app_bold_font":"",
        "app_font":""
        }
    }
    

Drawable 配置

bg_text_bts.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="true">
        <shape android:shape="rectangle">
            <corners android:radius="@dimen/thing_mg_2" />

            <solid android:color="@color/primary_button_select_color" />
        </shape>
    </item>
    <item android:state_selected="true">
        <shape android:shape="rectangle">
            <corners android:radius="@dimen/thing_mg_2" />

            <solid android:color="@color/primary_button_select_color" />
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="@dimen/thing_mg_2" />

            <solid android:color="@color/primary_button_select_color" />
        </shape>
    </item>
    <item android:state_enabled="true">
        <shape android:shape="rectangle">
            <corners android:radius="@dimen/thing_mg_2" />

            <solid android:color="@color/primary_button_bg_color" />
        </shape>
    </item>
    <item android:state_enabled="false">
        <shape>
            <corners android:radius="@dimen/thing_mg_2" />

            <solid android:color="@color/gray_99" />
        </shape>
    </item>
</selector>

主题(style)配置

<!-- 必选配置 -->
<!-- Base application theme. -->
<style name="Base_BizBundle_Theme" parent="AppTheme">
    <item name="status_font_color">@color/status_font_color</item>
    <item name="status_bg_color">@color/status_bg_color</item>
    <item name="navbar_font_color">@color/navbar_font_color</item>
    <item name="navbar_bg_color">@color/navbar_bg_color</item>
    <item name="app_bg_color">@color/app_bg_color</item>
    <item name="fragment_bg_color">@color/app_bg_color</item>
    <item name="list_primary_color">@color/list_primary_color</item>
    <item name="list_sub_color">@color/list_sub_color</item>
    <item name="list_secondary_color">@color/list_secondary_color</item>
    <item name="list_line_color">@color/list_line_color</item>
    <item name="list_bg_color">@color/list_bg_color</item>
    <item name="primary_button_font_color">@color/primary_button_font_color</item>
    <item name="primary_button_bg_color">@color/primary_button_bg_color</item>
    <item name="secondary_button_font_color">@color/secondary_button_font_color</item>
    <item name="secondary_button_bg_color">@color/secondary_button_bg_color</item>
    <item name="notice_font_color">@color/notice_font_color</item>
    <item name="notice_bg_color">@color/notice_bg_color</item>
    <item name="bg_normal_text_bt">@drawable/bg_text_bts</item>
    <item name="app_name">@string/app_name</item>
    <item name="is_splash_used">false</item>
    <item name="ap_default_ssid">@string/ap_mode_ssid</item>
    <item name="ap_connect_description">@string/thing_ap_connect_description</item>
    <item name="is_scan_support">@bool/is_scan_support</item>
    <item name="is_need_blemesh_support">@bool/is_need_blemesh_support</item>
    <item name="status_bg_color_75">@color/status_bg_color_75</item>
    <item name="status_bg_color_90">@color/status_bg_color_90</item>
</style>

应用清单(AndroidManifest.xml)

<!-- 必选配置 -->
<application
    android:supportsRtl="false"
    android:theme="@style/Base_BizBundle_Theme"
    tools:replace="android:theme"/>

依赖源

  • 根目录的 build.gradle 文件配置如下:

    buildscript {
        ext {
            // UI 业务包版本
            biz_bom_version = "5.9.0-cube300.8"
            // Tuya SDK 版本
            sdk_version = '5.9.0-cube'
        }
    }
    
    allprojects {
        repositories {
            maven {
                url 'https://maven-other.tuya.com/repository/maven-private/'
                credentials {
                    //请联系 PM 申请私有源
                    username ?
                    password ?
                    }
            }
            google()
            mavenCentral()
        }
    }
    
  • App 的 build.gradle 文件配置:

    NDK 配置只支持 ARM 指令架构的 CPU 版本。

    android {
        packagingOptions {
               pickFirst 'lib/*/liblog.so'
                        pickFirst 'lib/*/libc++_shared.so'
                        pickFirst 'lib/*/libyuv.so'
                        pickFirst 'lib/*/libopenh264.so'
                        pickFirst 'lib/*/libv8wrapper.so'
                        pickFirst 'lib/*/libv8android.so'
        }
    
        lintOptions {
            abortOnError false
        }
    
        defaultConfig {
            ndk { abiFilters "armeabi-v7a", "arm64-v8a" }
        }
    
        compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }
    }
    
        configurations.all {
                exclude group:"com.thingclips.smart",module:"thingplugin-annotation"
                exclude group:"com.thingclips.android.module",module:"thingmodule-annotation"
                exclude group: "com.thingclips.smart" ,module: 'thingsmart-modularCampAnno'
                }
    
    

初始化应用

在主线程初始化业务包通用设置:

// 请不要修改初始化顺序
Fresco.initialize(this);
// SDK 初始化
ThingHomeSdk.init(this);

// 业务包初始化
ThingWrapper.init(this, new RouteEventListener() {
    @Override
    public void onFaild(int errorCode, UrlBuilder urlBuilder) {
            // 路由未实现回调
            // 点击无反应表示路由未现实,需要在此实现,urlBuilder.target 目标路由,urlBuilder.params 路由参数
            Log.e("router not implement", urlBuilder.target + urlBuilder.params.toString());
    }
}, new ServiceEventListener() {
    @Override
    public void onFaild(String serviceName) {
            // 服务未实现回调
            Log.e("service not implement", serviceName);
    }
});
ThingThemeInitializer.INSTANCE.init(context);
ThingOptimusSdk.init(this);

// 注册家庭服务,商城业务包可以不注册此服务
ThingWrapper.registerService(AbsBizBundleFamilyService.class, new BizBundleFamilyServiceImpl());
    //拦截已存在的路由,通过参数跳转至自定义实现页面
    RedirectService service = MicroContext.getServiceManager().findServiceByInterface(RedirectService.class.getName());
    service.registerUrlInterceptor(new RedirectService.UrlInterceptor() {
        @Override
        public void forUrlBuilder(UrlBuilder urlBuilder, RedirectService.InterceptorCallback interceptorCallback) {
            //Such as:
            //Intercept the event of clicking the panel right menu and jump to the custom page with the parameters of urlBuilder
            //例如:拦截点击面板右上角按钮事件,通过 urlBuilder 的参数跳转至自定义页面
            if (urlBuilder.target.equals("panelAction") && urlBuilder.params.getString("action").equals("gotoPanelMore")) {
                interceptorCallback.interceptor("interceptor");
                Log.e("interceptor", urlBuilder.params.toString());
            } else {
                interceptorCallback.onContinue(urlBuilder);
            }
        }
    });

登录或退出账号

业务包接入后,请在登录和退出用户账号时分别调用如下方法:

//登录
ThingWrapper.onLogin();
//退出
ThingWrapper.onLogout(Context context);

实现家庭服务

您可以通过继承 AbsBizBundleFamilyService 抽象类,实现设置当前家庭 homeId 和当前家庭名称 homeName。示例代码如下:

public class BizBundleFamilyServiceImpl extends AbsBizBundleFamilyService {

    private long mHomeId;
    private String mHomeName;

    @Override
    public long getCurrentHomeId() {
        return mHomeId;
    }

    @Override
    public void shiftCurrentFamily(long familyId, String curName) {
        super.shiftCurrentFamily(familyId, curName);
        mHomeId = familyId;
        mHomeName = curName;
    }
}

设置家庭数据

当获取家庭列表后,通过服务化调用设置家庭 homeIdhomeName。示例代码如下:

AbsBizBundleFamilyService service = MicroServiceManager.getInstance().findServiceByInterface(AbsBizBundleFamilyService.class.getName());
// 设置为当前家庭的 homeId 和 homeName
service.shiftCurrentFamily(homeBean.getHomeId(), homeBean.getName());