HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java
@@ -166,7 +166,7 @@ } else { response.setData(new String(body, "utf-8")); } Log.i("TAG", "LinkMessageDecoder->decoder:" + response.getTopic() + "\r\n" + response.getData()); LogUtils.i("LinkMessageDecoder", "LinkMessageDecoder->decoder:" + response.getTopic() + "\r\n" + response.getData()); //解析完成,topic发送一次 EventDispatcher.getInstance().post(response.getTopic(), response); } HDLSDK_DEMO/.gitignore
New file @@ -0,0 +1,15 @@ *.iml .gradle /local.properties /.idea/caches /.idea/libraries /.idea/modules.xml /.idea/workspace.xml /.idea/navEditor.xml /.idea/assetWizardSettings.xml .DS_Store /build /captures .externalNativeBuild .cxx local.properties HDLSDK_DEMO/.idea/.gitignore
New file @@ -0,0 +1,3 @@ # Default ignored files /shelf/ /workspace.xml HDLSDK_DEMO/.idea/compiler.xml
New file @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="CompilerConfiguration"> <bytecodeTargetLevel target="1.8" /> </component> </project> HDLSDK_DEMO/.idea/gradle.xml
New file @@ -0,0 +1,24 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="GradleMigrationSettings" migrationVersion="1" /> <component name="GradleSettings"> <option name="linkedExternalProjectsSettings"> <GradleProjectSettings> <option name="testRunner" value="PLATFORM" /> <option name="distributionType" value="DEFAULT_WRAPPED" /> <option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="modules"> <set> <option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$/app" /> <option value="$PROJECT_DIR$/hdl-common" /> <option value="$PROJECT_DIR$/hdl-connect" /> <option value="$PROJECT_DIR$/hdl-socket" /> </set> </option> <option name="resolveModulePerSourceSet" value="false" /> <option name="useQualifiedModuleNames" value="true" /> </GradleProjectSettings> </option> </component> </project> HDLSDK_DEMO/.idea/jarRepositories.xml
New file @@ -0,0 +1,55 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="RemoteRepositoriesConfiguration"> <remote-repository> <option name="id" value="central" /> <option name="name" value="Maven Central repository" /> <option name="url" value="https://repo1.maven.org/maven2" /> </remote-repository> <remote-repository> <option name="id" value="jboss.community" /> <option name="name" value="JBoss Community repository" /> <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> </remote-repository> <remote-repository> <option name="id" value="maven" /> <option name="name" value="maven" /> <option name="url" value="https://maven.aliyun.com/repository/central" /> </remote-repository> <remote-repository> <option name="id" value="maven2" /> <option name="name" value="maven2" /> <option name="url" value="https://maven.aliyun.com/repository/google" /> </remote-repository> <remote-repository> <option name="id" value="maven5" /> <option name="name" value="maven5" /> <option name="url" value="https://maven.aliyun.com/repository/public/" /> </remote-repository> <remote-repository> <option name="id" value="maven4" /> <option name="name" value="maven4" /> <option name="url" value="https://maven.aliyun.com/repository/gradle-plugin" /> </remote-repository> <remote-repository> <option name="id" value="maven3" /> <option name="name" value="maven3" /> <option name="url" value="https://maven.aliyun.com/repository/jcenter" /> </remote-repository> <remote-repository> <option name="id" value="maven9" /> <option name="name" value="maven9" /> <option name="url" value="https://jitpack.io" /> </remote-repository> <remote-repository> <option name="id" value="maven8" /> <option name="name" value="maven8" /> <option name="url" value="https://maven.aliyun.com/repository/public" /> </remote-repository> <remote-repository> <option name="id" value="Google" /> <option name="name" value="Google" /> <option name="url" value="https://dl.google.com/dl/android/maven2/" /> </remote-repository> </component> </project> HDLSDK_DEMO/.idea/misc.xml
New file @@ -0,0 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="DesignSurface"> <option name="filePathToZoomLevelMap"> <map> <entry key="..\:/job/me/Android/HDLSDK/app/src/main/res/layout/activity_main.xml" value="0.1" /> <entry key="..\:/job/me/Android/HDLSDK/app/src/main/res/layout/demo_item.xml" value="0.28958333333333336" /> </map> </option> </component> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> <component name="ProjectType"> <option name="id" value="Android" /> </component> </project> HDLSDK_DEMO/app/.gitignore
New file @@ -0,0 +1 @@ /build HDLSDK_DEMO/app/build.gradle
New file @@ -0,0 +1,43 @@ plugins { id 'com.android.application' } android { compileSdk 31 defaultConfig { applicationId "com.hdl.hdlsdkdemo" minSdk 21 targetSdk 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.1' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6' implementation 'com.google.code.gson:gson:2.8.8' // implementation project(path: ':hdl-connect') } HDLSDK_DEMO/app/proguard-rules.pro
New file @@ -0,0 +1,21 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile HDLSDK_DEMO/app/src/androidTest/java/com/hdl/hdlsdk/ExampleInstrumentedTest.java
New file @@ -0,0 +1,26 @@ package com.hdl.hdlsdk; import android.content.Context; import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; /** * Instrumented test, which will execute on an Android device. * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); assertEquals("com.hdl.hdlsdk", appContext.getPackageName()); } } HDLSDK_DEMO/app/src/main/AndroidManifest.xml
New file @@ -0,0 +1,34 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.hdl.hdlsdk"> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:name=".App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.HDLSDK"> <activity android:name=".device.DevicesListActivity"></activity> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/App.java
New file @@ -0,0 +1,33 @@ package com.hdl.hdlsdk; import android.app.Application; import android.util.Log; import com.hdl.sdk.common.HDLSdk; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; /** * Created by Tong on 2021/10/8. */ public class App extends Application { private String deviceStatusUpdateTopic; @Override public void onCreate() { super.onCreate(); //初始化SDK HDLSdk.getInstance().init(this); //控制SDK日志打印 HDLSdk.getInstance().setLogEnabled(true); } @Override public void onTerminate() { super.onTerminate(); } } HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/DemoAdapter.java
New file @@ -0,0 +1,26 @@ package com.hdl.hdlsdk; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.chad.library.adapter.base.BaseMultiItemQuickAdapter; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import java.util.List; /** * Created by Tong on 2021/10/8. */ public class DemoAdapter extends BaseMultiItemQuickAdapter<DemoBean, BaseViewHolder> { public DemoAdapter(@Nullable List<DemoBean> data) { super(data); addItemType(0, R.layout.demo_item); } @Override protected void convert(@NonNull BaseViewHolder baseViewHolder, DemoBean demoBean) { baseViewHolder.setText(R.id.tv_title,demoBean.getName()); } } HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/DemoBean.java
New file @@ -0,0 +1,28 @@ package com.hdl.hdlsdk; import com.chad.library.adapter.base.entity.MultiItemEntity; /** * Created by Tong on 2021/10/8. */ public class DemoBean implements MultiItemEntity { private String name; public DemoBean(String name) { this.name = name; } @Override public int getItemType() { return 0; } public String getName() { return name; } public void setName(String name) { this.name = name; } } HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
New file @@ -0,0 +1,479 @@ package com.hdl.hdlsdk; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.Manifest; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.listener.OnItemClickListener; import com.google.gson.reflect.TypeToken; import com.hdl.hdlsdk.device.DevicesListActivity; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.IdUtils; import com.hdl.sdk.common.utils.IpUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; import com.hdl.sdk.connect.bean.request.AuthenticateRequest; import com.hdl.sdk.connect.bean.request.PropertyReadRequest; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; import com.hdl.sdk.connect.bean.response.GatewaySearchBean; import com.hdl.sdk.connect.callback.HDLLinkCallBack; import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack; import com.hdl.sdk.connect.socket.HDLAuthSocket; import com.hdl.sdk.connect.socket.HDLSocket; import com.hdl.sdk.connect.bean.request.DeviceControlRequest; import com.hdl.sdk.connect.protocol.LinkMessageDecoder; import com.hdl.sdk.connect.protocol.LinkMessageEncoder; import com.hdl.sdk.socket.SocketOptions; import com.hdl.sdk.socket.codec.MessagePipeLine; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import java.util.Map; import static com.hdl.sdk.common.config.TopicConstant.GATEWAY_SEARCH_REPLY; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private DemoAdapter demoAdapter; private RecyclerView rv; private TextView tv; private TextView responseTv; boolean isOn; private EventListener allTopicsListener; private String testLightSid = "0001010D48C71B02020100010101"; @Override protected void onDestroy() { super.onDestroy(); removeAllTopicsListener(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); responseTv = findViewById(R.id.response_tv); tv = findViewById(R.id.state_tv); rv = findViewById(R.id.rv); rv.setLayoutManager(new LinearLayoutManager(this)); checkIfCertified(); registerAllTopicsListener(); ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() { @Override public void onActivityResult(Map<String, Boolean> result) { } }); launcher.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}); final List<DemoBean> beans = new ArrayList<>(); beans.add(new DemoBean("入网认证")); beans.add(new DemoBean("搜索指定网关是否在线")); beans.add(new DemoBean("获取功能列表")); beans.add(new DemoBean("功能属性读取")); beans.add(new DemoBean("设备控制")); beans.add(new DemoBean("读取状态")); beans.add(new DemoBean("获取场景列表")); beans.add(new DemoBean("场景控制")); beans.add(new DemoBean("设备功能列表")); demoAdapter = new DemoAdapter(beans); rv.setAdapter(demoAdapter); // final SocketOptions options = new SocketOptions(); // MessagePipeLine pipeLine = new MessagePipeLine(); // options.setHandleMessage(pipeLine); // options.setEnabledHeartbeat(false); demoAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) { switch (position) { case 0: //入网认证 sendAuthenticateRequest(); break; case 1: //搜索网关 searchGatewayBroadcast(); break; case 2: //获取功能列表 getFunctionList(); break; case 3: //功能属性读取 getFunctionAttribute(); break; case 4: //设备控制 controlDecide(); break; case 5: //读取状态 propertyRead(); break; case 6: //获取场景列表 getSceneList(); break; case 7: //获取场景列表 controlScene(); break; case 8: //功能列表 startDevicesListActivity(); break; } } }); } public void showToast(String text) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); } /** * 检测是否认证过 */ void checkIfCertified(){ boolean isCertified = HDLLink.getInstance().checkIfCertified(); String mes = isCertified?"已经认证过":"未认证"; showToast(mes); tv.setText(mes); } /** * 注册所有主题数据的监听 */ void registerAllTopicsListener(){ allTopicsListener = new EventListener() { @Override public void onMessage(Object msg) { LinkResponse response = (LinkResponse)msg; if(response != null){ Log.i(TAG, "AllTopicsListener" + "\nTopic: " + response.getTopic() +"\n Data: " + response.getData()); handleLinkResponse(response); } } }; HDLLink.getInstance().registerAllTopicsListener(allTopicsListener); } /** * 处理收到的主题 * @param response */ private void handleLinkResponse(LinkResponse response){ //网关搜索回复 if(response.getTopic().contains("/user/all/custom/gateway/search_reply")){ String data = response.getData(); if (!TextUtils.isEmpty(data)) { Log.i("handleLinkResponse", "data:"+data); final BaseLocalResponse<GatewaySearchBean> bean = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() { }.getType()); GatewaySearchBean searchBean = bean.getObjects(); Log.i("handleLinkResponse", "GatewaySearchBean: "+searchBean.getGatewayId()); } }else{ //其它主题 } } private GatewaySearchBean getGatewaySearchBean(Object msg) { GatewaySearchBean searchBean = null; if (msg instanceof LinkResponse) { LinkResponse linkResponse = (LinkResponse) msg; String data = linkResponse.getData(); if (!TextUtils.isEmpty(data)) { final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() { }.getType()); searchBean = response.getObjects(); } } return searchBean; } /** * 移除所有主题数据的监听 */ void removeAllTopicsListener(){ HDLLink.getInstance().removeAllTopicsListener(allTopicsListener); } /** * 入网认证 */ void sendAuthenticateRequest(){ tv.setText("开始入网认证..."); //认证提交参数准备 String spkStr = "ir.module";//产品spk String macStr = "AA000000000000BB";//设备唯一MAC地址 String secret = "87ae414b7a853f65";//通过spk和mac提交云端认证后分配的secret String mac_key = stringToMD5(stringToMD5(macStr + secret)); String versionString = "HDL_V1.0.1";// String time = String.valueOf(System.currentTimeMillis()); //1.设置认证信息 AuthenticateRequest.RequestBean requestBean = new AuthenticateRequest.RequestBean(); requestBean.setMAC(macStr); requestBean.setSupplier("HDL"); requestBean.setFirmwareVersion(versionString); requestBean.setHardwareModel("1956F"); AuthenticateRequest.AuthBean authbean = new AuthenticateRequest.AuthBean(); authbean.setSpk(spkStr); authbean.setMACKey(mac_key); authbean.setRequest(requestBean); //2.设置设备信息 AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean(); infoBean.setDeviceMAC(macStr); infoBean.setIPMAC(macStr); infoBean.setDeviceName("红外宝");//设备名字 infoBean.setDeviceModel("HDL");// infoBean.setAccessMode("WIFI"); infoBean.setIPGateway("192.168.12.1"); infoBean.setIPAddress(IpUtils.getIP(this)); infoBean.setOID("010105000000FE08"); infoBean.setSid("010105000000FE08110100000000"); // infoBean.set AuthenticateRequest.VersionBean[] versionBeans = new AuthenticateRequest.VersionBean[]{new AuthenticateRequest.VersionBean("FW", versionString), new AuthenticateRequest.VersionBean("HW", "1956F")}; infoBean.setVersions(versionBeans); AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, infoBean, authbean); HDLLink.getInstance().startAuthenticateRequest(request, new HDLLinkCallBack() { @Override public void onError(HDLLinkException e) { tv.setText("认证失败"); responseTv.setText(e.getMsg()); Log.i("TAG", "onError: 认证失败"); } @Override public void onSuccess(String msg) { tv.setText("认证成功"); responseTv.setText(msg.toString()); } }); } String stringToMD5(String text) { byte[] hash; try { hash = MessageDigest.getInstance("MD5").digest(text.getBytes("UTF-8")); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } StringBuilder hex = new StringBuilder(hash.length * 2); for (byte b : hash) { if ((b & 0xFF) < 0x10) hex.append("0"); hex.append(Integer.toHexString(b & 0xFF)); } return hex.toString(); } /** * 如果已经认证后,搜索指定网关是否在线 * 广播搜索认证过的网关是否在线 */ void searchGatewayBroadcast(){ tv.setText("搜索网关中..."); HDLLink.getInstance().searchGatewayBroadcast(new HDLAuthSocket.SearchGatewayCallBack() { @Override public void onError(HDLLinkException e) { tv.setText("网关不在线"); responseTv.setText(e.getMsg()); } @Override public void onSuccess(GatewaySearchBean gatewaySearchBean) { tv.setText("网关在线"); responseTv.setText("搜索成功 网关id:"+gatewaySearchBean.getGatewayId()); // LogUtils.i("TAG", "onSuccess: 搜索成功:"+gatewaySearchBean.getGatewayId()); } }); } /** * 获取功能列表 */ void getFunctionList(){ tv.setText("获取功能列表中..."); responseTv.setText(""); HDLLink.getInstance().getFunctionList(new HDLLinkCallBack() { @Override public void onError(HDLLinkException error) { tv.setText(error.getMsg()); } @Override public void onSuccess(String data) { tv.setText("获取功能列表成功"); responseTv.setText(data); } }); } /** * 功能属性读取 * 支持批量读取 */ void getFunctionAttribute(){ tv.setText("功能属性读取"); List<String> sids = new ArrayList<>(); sids.add(testLightSid); HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * 读取设备状态 * 支持批量读取 */ void propertyRead(){ tv.setText("读取状态中..."); List<String> list = new ArrayList<>(); list.add(testLightSid);//要读取设备的sid HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() { @Override public void onSuccess(String data) { tv.setText("读取成功"); responseTv.setText(data); } @Override public void onError(HDLLinkException e) { tv.setText("读取失败"); responseTv.setText(e.getMsg()); } }); } /** * 控制失败 * 回复响应code为200 代表执行成功 */ void controlDecide(){ tv.setText("控制设备"); isOn = !isOn; List<DeviceControlRequest> requestList = new ArrayList<>(); DeviceControlRequest request = new DeviceControlRequest(); request.setSid(testLightSid); List<DeviceControlRequest.StatusBean> statusBeanList= new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); bean.setKey("on_off"); bean.setValue(isOn ? "on" : "off"); statusBeanList.add(bean); request.setStatus(statusBeanList); requestList.add(request); HDLLink.getInstance().propertyDown(requestList, new HDLLinkCallBack() { @Override public void onSuccess(String data) { responseTv.setText(data); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * 获取场景列表 */ void getSceneList(){ tv.setText("读取场景列表"); HDLLink.getInstance().getSceneList(new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } //场景列表 // {"id":"8a5eaa143ce943b987b577df5a66759b","time_stamp":"1637040217235","objects":[{"sid":"04010560D2C7170A0A0100000000","name":"回家模式","status":"off","group":"255","delay":"0","modify_time":"1634871490"},{"sid":"04010560D2C76E0A0A0100010000","name":"离家模式","status":"off","group":"255","delay":"0","modify_time":"1634785823"}]} /** * 控制场景 * 执行成功的话 响应code为200 */ void controlScene(){ tv.setText("场景控制"); //控制场景sid列表,支持批量控制 List<String> sids = new ArrayList<>(); isOn = !isOn; if(isOn){ sids.add("04010560D2C7170A0A0100000000"); }else{ sids.add("04010560D2C76E0A0A0100010000"); } HDLLink.getInstance().controlScene(sids,new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } void startDevicesListActivity(){ Intent intent = new Intent(this, DevicesListActivity.class); startActivity(intent); } } HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
New file @@ -0,0 +1,86 @@ package com.hdl.hdlsdk.device; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; import android.annotation.SuppressLint; import android.os.Bundle; import android.util.Log; import com.google.gson.reflect.TypeToken; import com.hdl.hdlsdk.R; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; import com.hdl.sdk.connect.callback.HDLLinkCallBack; import java.util.ArrayList; import java.util.List; public class DevicesListActivity extends AppCompatActivity { private static final String TAG = "DevicesListActivity"; private List<FunctionBean> devicesList = new ArrayList<>(); private DevicesListAdapter mDevicesListAdapter; private RecyclerView mRecyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_devices_list); initView(); initData(); } @SuppressLint("WrongConstant") private void initView() { mRecyclerView = findViewById(R.id.device_list_rv); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mDevicesListAdapter = new DevicesListAdapter(this, devicesList); mRecyclerView.setAdapter(mDevicesListAdapter); } private void initData() { getFunctionList(); } /** * 获取功能列表 */ void getFunctionList(){ HDLLink.getInstance().getFunctionList(new HDLLinkCallBack() { @Override public void onError(HDLLinkException error) { Log.e(TAG,error.getMsg()); } @Override public void onSuccess(String data) { Log.i(TAG, "获取设备列表成功"); handelFunList(data); } }); } void handelFunList(String data){ try { final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() { }.getType()); final BaseLocalResponse<List<FunctionBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<FunctionBean>>>() { }.getType()); devicesList.clear(); devicesList.addAll(bean.getObjects()); mDevicesListAdapter.notifyDataSetChanged(); }catch (Exception e){ Log.e(TAG, "handelFunList: " + e.getMessage()); } } } HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
New file @@ -0,0 +1,65 @@ package com.hdl.hdlsdk.device; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import com.hdl.hdlsdk.R; import java.util.List; public class DevicesListAdapter extends RecyclerView.Adapter<DevicesListAdapter.ViewHolder> { private LayoutInflater mInflater; private List<FunctionBean> mList = null; public DevicesListAdapter(Context context, List<FunctionBean> devicesList) { this.mInflater = LayoutInflater.from(context); this.mList = devicesList; } /** * item显示类型 * * @param parent * @param viewType * @return */ @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.item_devices_list, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } /** * 数据的绑定显示 * * @param holder * @param position */ @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.item_tv.setText(mList.get(position).getName()); } @Override public int getItemCount() { return mList.size(); } //自定义的ViewHolder,持有每个Item的的所有界面元素 public static class ViewHolder extends RecyclerView.ViewHolder { public TextView item_tv; public ViewHolder(View view) { super(view); item_tv = (TextView) view.findViewById(R.id.device_title_tv); } } } HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/device/FunctionBean.java
New file @@ -0,0 +1,106 @@ package com.hdl.hdlsdk.device; import com.chad.library.adapter.base.entity.MultiItemEntity; import java.io.Serializable; import java.util.List; /** * Created by jlchen on 12/7/21. */ public class FunctionBean implements Serializable { private String sid; private String oid; private String name; private String spk; private String omodel; private String src; private String online; private List<FunctionStatus> status; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public String getOid() { return oid; } public void setOid(String oid) { this.oid = oid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSpk() { return spk; } public void setSpk(String spk) { this.spk = spk; } public String getOmodel() { return omodel; } public void setOmodel(String omodel) { this.omodel = omodel; } public String getSrc() { return src; } public void setSrc(String src) { this.src = src; } public String getOnline() { return online; } public void setOnline(String online) { this.online = online; } public List<FunctionStatus> getStatus() { return status; } public void setStatus(List<FunctionStatus> status) { this.status = status; } public class FunctionStatus implements Serializable { private String key; private String value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } } HDLSDK_DEMO/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
New file @@ -0,0 +1,30 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt" android:width="108dp" android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> <aapt:attr name="android:fillColor"> <gradient android:endX="85.84757" android:endY="92.4963" android:startX="42.9492" android:startY="49.59793" android:type="linear"> <item android:color="#44000000" android:offset="0.0" /> <item android:color="#00000000" android:offset="1.0" /> </gradient> </aapt:attr> </path> <path android:fillColor="#FFFFFF" android:fillType="nonZero" android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" android:strokeWidth="1" android:strokeColor="#00000000" /> </vector> HDLSDK_DEMO/app/src/main/res/drawable/ic_launcher_background.xml
New file @@ -0,0 +1,170 @@ <?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="108dp" android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> <path android:fillColor="#3DDC84" android:pathData="M0,0h108v108h-108z" /> <path android:fillColor="#00000000" android:pathData="M9,0L9,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,0L19,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M29,0L29,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M39,0L39,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M49,0L49,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M59,0L59,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M69,0L69,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M79,0L79,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M89,0L89,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M99,0L99,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,9L108,9" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,19L108,19" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,29L108,29" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,39L108,39" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,49L108,49" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,59L108,59" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,69L108,69" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,79L108,79" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,89L108,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,99L108,99" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,29L89,29" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,39L89,39" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,49L89,49" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,59L89,59" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,69L89,69" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,79L89,79" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M29,19L29,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M39,19L39,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M49,19L49,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M59,19L59,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M69,19L69,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M79,19L79,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> </vector> HDLSDK_DEMO/app/src/main/res/layout/activity_devices_list.xml
New file @@ -0,0 +1,14 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".device.DevicesListActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/device_list_rv" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml
New file @@ -0,0 +1,79 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/scrollView" app:layout_constraintHorizontal_weight="1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <View android:layout_width="1dp" android:layout_height="0dp" android:background="#f4f4f4" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/scrollView" app:layout_constraintStart_toEndOf="@id/rv" app:layout_constraintTop_toTopOf="parent" /> <androidx.core.widget.NestedScrollView android:id="@+id/scrollView" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_weight="2" app:layout_constraintStart_toEndOf="@id/rv" app:layout_constraintTop_toTopOf="parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingStart="10dp" android:text="当前状态:" /> <TextView android:id="@+id/state_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="未操作" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="#f5f5f5" /> <TextView android:paddingStart="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="响应:" /> <TextView android:id="@+id/response_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" /> </LinearLayout> </androidx.core.widget.NestedScrollView> </androidx.constraintlayout.widget.ConstraintLayout> HDLSDK_DEMO/app/src/main/res/layout/demo_item.xml
New file @@ -0,0 +1,28 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="40dp"> <TextView android:id="@+id/tv_title" android:layout_width="0dp" android:layout_height="0dp" android:gravity="center" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <View android:layout_width="0dp" android:layout_height="1dp" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:background="#f5f5f5" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> HDLSDK_DEMO/app/src/main/res/layout/item_devices_list.xml
New file @@ -0,0 +1,44 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="50dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <TextView android:id="@+id/device_title_tv" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginLeft="@dimen/dp_10" android:gravity="center|left" android:text="设备" android:textColor="@color/black" android:layout_weight="1"/> <Switch android:id="@+id/device_on_off_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="@dimen/dp_10" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:background="#f5f5f5" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </LinearLayout> HDLSDK_DEMO/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@drawable/ic_launcher_background" /> <foreground android:drawable="@drawable/ic_launcher_foreground" /> </adaptive-icon> HDLSDK_DEMO/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@drawable/ic_launcher_background" /> <foreground android:drawable="@drawable/ic_launcher_foreground" /> </adaptive-icon> HDLSDK_DEMO/app/src/main/res/mipmap-hdpi/ic_launcher.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-hdpi/ic_launcher_round.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-mdpi/ic_launcher.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-mdpi/ic_launcher_round.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-xhdpi/ic_launcher.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-xxhdpi/ic_launcher.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webpBinary files differ
HDLSDK_DEMO/app/src/main/res/values-night/themes.xml
New file @@ -0,0 +1,16 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.HDLSDK" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_200</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/black</item> <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_200</item> <item name="colorOnSecondary">@color/black</item> <!-- Status bar color. --> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> <!-- Customize your theme here. --> </style> </resources> HDLSDK_DEMO/app/src/main/res/values/colors.xml
New file @@ -0,0 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <color name="purple_200">#FFBB86FC</color> <color name="purple_500">#FF6200EE</color> <color name="purple_700">#FF3700B3</color> <color name="teal_200">#FF03DAC5</color> <color name="teal_700">#FF018786</color> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> </resources> HDLSDK_DEMO/app/src/main/res/values/strings.xml
New file @@ -0,0 +1,3 @@ <resources> <string name="app_name">HDLSDK Demo</string> </resources> HDLSDK_DEMO/app/src/main/res/values/themes.xml
New file @@ -0,0 +1,16 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.HDLSDK" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/white</item> <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> <item name="colorOnSecondary">@color/black</item> <!-- Status bar color. --> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> <!-- Customize your theme here. --> </style> </resources> HDLSDK_DEMO/app/src/test/java/com/hdl/hdlsdk/ExampleUnitTest.java
New file @@ -0,0 +1,17 @@ package com.hdl.hdlsdk; import org.junit.Test; import static org.junit.Assert.*; /** * Example local unit test, which will execute on the development machine (host). * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ public class ExampleUnitTest { @Test public void addition_isCorrect() { assertEquals(4, 2 + 2); } } HDLSDK_DEMO/build.gradle
New file @@ -0,0 +1,30 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. apply from: "config.gradle" buildscript { repositories { google() mavenCentral() } dependencies { classpath "com.android.tools.build:gradle:4.2.2" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/jcenter' } maven { url 'https://maven.aliyun.com/repository/public' } google() maven { url "https://jitpack.io" } } } task clean(type: Delete) { delete rootProject.buildDir } HDLSDK_DEMO/config.gradle
New file @@ -0,0 +1,7 @@ ext { minSdkVersion = 16 targetSdkVersion = 31 compileSdkVersion = 31 versionName = "1.0.0" } HDLSDK_DEMO/gradle.properties
New file @@ -0,0 +1,19 @@ # Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app"s APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true HDLSDK_DEMO/gradle/wrapper/gradle-wrapper.jarBinary files differ
HDLSDK_DEMO/gradle/wrapper/gradle-wrapper.properties
New file @@ -0,0 +1,6 @@ #Wed Sep 15 00:34:41 CST 2021 distributionBase=GRADLE_USER_HOME distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME HDLSDK_DEMO/gradlew
New file @@ -0,0 +1,185 @@ #!/usr/bin/env sh # # Copyright 2015 the original author or authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ############################################################################## ## ## Gradle start up script for UN*X ## ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`"/$link" fi done SAVED="`pwd`" cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn () { echo "$*" } die () { echo echo "$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin or MSYS, switch paths to Windows format before running java if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in $ROOTDIRSRAW ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` else eval `echo args$i`="\"$arg\"" fi i=`expr $i + 1` done case $i in 0) set -- ;; 1) set -- "$args0" ;; 2) set -- "$args0" "$args1" ;; 3) set -- "$args0" "$args1" "$args2" ;; 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" exec "$JAVACMD" "$@" HDLSDK_DEMO/gradlew.bat
New file @@ -0,0 +1,89 @@ @rem @rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem @rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Resolve any "." and ".." in APP_HOME to make it shorter. for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega HDLSDK_DEMO/settings.gradle
New file @@ -0,0 +1,6 @@ include ':app' include ':hdl-socket' include ':hdl-connect' include ':hdl-common'