diff --git a/app/build.gradle b/app/build.gradle index 71723829368c82be507fcbb44bb893712521e2f2..38238270b3dc78672fd7bc17be2c681cdff083af 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'net.sourceforge.jexcelapi:jxl:2.6.12' implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4' - implementation files('libs/WmAceKG_v1.0.59_sdk.aar') + implementation files('libs/WmAceKG_v1.0.59.2_sdk.aar') testImplementation 'junit:junit:4.+' def room_version = '2.3.0' implementation "androidx.room:room-runtime:$room_version" diff --git a/app/libs/WmAceKG_v1.0.59_sdk.aar b/app/libs/WmAceKG_v1.0.59.2_sdk.aar similarity index 70% rename from app/libs/WmAceKG_v1.0.59_sdk.aar rename to app/libs/WmAceKG_v1.0.59.2_sdk.aar index 5dd9cfd5e48974f106a58bec9d8acb2b92478629..75bcfa7f5115cb7d42130dcc22c3d3917928edf3 100644 Binary files a/app/libs/WmAceKG_v1.0.59_sdk.aar and b/app/libs/WmAceKG_v1.0.59.2_sdk.aar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 68004f7680ea858042dc858ef23d11bc6010f60e..37ce90d4503318dcf464602d80dca7046f653e93 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,7 +34,7 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> - <activity android:name=".ui.CropPicActivity" /> <!-- é€‚é… Android 7.0 文件æ„图 --> + <!-- é€‚é… Android 7.0 文件æ„图 --> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" diff --git a/app/src/main/assets/list_product.txt b/app/src/main/assets/list_product.txt index 16ffcce9329c357eeb4389a44cc318ba1436da36..9dc1f51788d630e823574b1b95c701c4987542a5 100644 --- a/app/src/main/assets/list_product.txt +++ b/app/src/main/assets/list_product.txt @@ -1997,4 +1997,10 @@ 2237436 JP散装è‰å¤´ 2261035 JPè¿·ä½ èƒ¡èåœ 2236280 JPç²¾å“芦蒿 -2236523 JP散装薄è·å¶ \ No newline at end of file +2236523 JP散装薄è·å¶ +2000001 红苹果 +2000002 长茄å +2000003 è¿·ä½ èƒ¡èåœ +2000004 黄瓜 +2000005 水晶梨 +2000006 山东红富士 \ No newline at end of file diff --git a/app/src/main/java/com/wmdigit/wmposdemo/WmPosDemoApp.java b/app/src/main/java/com/wmdigit/wmposdemo/WmPosDemoApp.java index aed98f703d7d5bae4e59c2df6a4ed6f944fa937b..e0b58867968feb850baf397e906c82b645087605 100644 --- a/app/src/main/java/com/wmdigit/wmposdemo/WmPosDemoApp.java +++ b/app/src/main/java/com/wmdigit/wmposdemo/WmPosDemoApp.java @@ -21,7 +21,7 @@ public class WmPosDemoApp extends MultiDexApplication { * 在manifestæ·»åŠ android:largeHeap="true" * 注æ„ç¬¬äºŒä¸ªå‚æ•°è¦ä¼ false */ - int code = WmAceKG.init(this,false,0,0.85f); + int code = WmAceKG.init(this,false,0,0.80f); } @Override diff --git a/app/src/main/java/com/wmdigit/wmposdemo/adapter/ButtonAdapter.java b/app/src/main/java/com/wmdigit/wmposdemo/adapter/ButtonAdapter.java index 14f339f37d6cece814964ff880fd20039c427268..c2e6262a76580d3a745f436c5cd334c1cd548750 100644 --- a/app/src/main/java/com/wmdigit/wmposdemo/adapter/ButtonAdapter.java +++ b/app/src/main/java/com/wmdigit/wmposdemo/adapter/ButtonAdapter.java @@ -1,5 +1,11 @@ package com.wmdigit.wmposdemo.adapter; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.widget.EditText; + import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.wmdigit.wmposdemo.R; @@ -35,5 +41,42 @@ public class ButtonAdapter extends BaseQuickAdapter<ApiButton, BaseViewHolder> { baseViewHolder.setTextColorRes(R.id.tv_level, R.color.gray); break; } + // 傿•°è¾“入框 + if (apiButton.isEditTextEnable()){ + baseViewHolder.setVisible(R.id.edt_params, true); + baseViewHolder.setVisible(R.id.tv_interface_title_3, true); + baseViewHolder.setText(R.id.edt_params, apiButton.getDefaultParams()); + } + else{ + baseViewHolder.setGone(R.id.edt_params, true); + baseViewHolder.setGone(R.id.tv_interface_title_3, true); + baseViewHolder.setText(R.id.edt_params, ""); + } + TextWatcher watcher = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (TextUtils.isEmpty(s.toString())) { + apiButton.setDefaultParams(""); + } else { + apiButton.setDefaultParams(s.toString().trim()); + } + } + }; + EditText edtParams = baseViewHolder.getView(R.id.edt_params); + if (edtParams.getTag() instanceof TextWatcher){ + edtParams.removeTextChangedListener((TextWatcher) edtParams.getTag()); + } + edtParams.addTextChangedListener(watcher); + edtParams.setTag(watcher); } } diff --git a/app/src/main/java/com/wmdigit/wmposdemo/model/AiSupport.java b/app/src/main/java/com/wmdigit/wmposdemo/model/AiSupport.java index 1c4324bbd2186eff90dd376157689ff6778eb160..14ed1ee598dd687c0cf01aa4b1a77dc0d8222316 100644 --- a/app/src/main/java/com/wmdigit/wmposdemo/model/AiSupport.java +++ b/app/src/main/java/com/wmdigit/wmposdemo/model/AiSupport.java @@ -1,5 +1,7 @@ package com.wmdigit.wmposdemo.model; +import android.view.View; + public interface AiSupport { void initPosPage(); void setCameraId(); @@ -25,6 +27,6 @@ public interface AiSupport { void learnLocalVectorDataI(); void correctI(); void autoMatchProduct(); - void checkSnCodeVerification(); + void checkSnCodeVerification(View v); void preLearningData(); } diff --git a/app/src/main/java/com/wmdigit/wmposdemo/model/bean/ApiButton.java b/app/src/main/java/com/wmdigit/wmposdemo/model/bean/ApiButton.java index 0cc3240472ce3fccb3de0be78cb3ddc116dc71bb..6fa699c2d3ee0fdab5ec5bb519bdc140958016a6 100644 --- a/app/src/main/java/com/wmdigit/wmposdemo/model/bean/ApiButton.java +++ b/app/src/main/java/com/wmdigit/wmposdemo/model/bean/ApiButton.java @@ -5,12 +5,15 @@ public class ApiButton { private String methodName; private String methodDesc; private ApiLevel level; + private boolean editTextEnable; + private String defaultParams = ""; public ApiButton(String methodNo, String methodName, String methodDesc) { this.methodNo = methodNo; this.methodName = methodName; this.methodDesc = methodDesc; this.level = ApiLevel.LEVEL_NORMAL; + this.editTextEnable = false; } public ApiButton(String methodNo, String methodName,String methodDesc, ApiLevel level) { @@ -18,6 +21,31 @@ public class ApiButton { this.methodName = methodName; this.methodDesc = methodDesc; this.level = level; + this.editTextEnable = false; + } + + public ApiButton(String methodNo, String methodName,String methodDesc, ApiLevel level, boolean editTextEnable) { + this.methodNo = methodNo; + this.methodName = methodName; + this.methodDesc = methodDesc; + this.level = level; + this.editTextEnable = editTextEnable; + } + + public String getDefaultParams() { + return defaultParams; + } + + public void setDefaultParams(String defaultParams) { + this.defaultParams = defaultParams; + } + + public boolean isEditTextEnable() { + return editTextEnable; + } + + public void setEditTextEnable(boolean editTextEnable) { + this.editTextEnable = editTextEnable; } public String getMethodName() { diff --git a/app/src/main/java/com/wmdigit/wmposdemo/model/data/Constant.java b/app/src/main/java/com/wmdigit/wmposdemo/model/data/Constant.java index 123e6403e712bd0de5c30b4105866813436cbf96..5d0c45fe7031bc345f46da5ea308ffe1d784ed09 100644 --- a/app/src/main/java/com/wmdigit/wmposdemo/model/data/Constant.java +++ b/app/src/main/java/com/wmdigit/wmposdemo/model/data/Constant.java @@ -10,7 +10,7 @@ public class Constant { // false-æ£å¼çŽ¯å¢ƒ;true-测试环境 通常情况下,请用æ£å¼çŽ¯å¢ƒfalse public static final boolean isDebug = false; // 这三æ¡ä¸ºæ³¨å†Œä¿¡æ¯ï¼Œè°ƒè¯•时请更æ¢ä¸ºæˆ‘们通过邮件å‘ç»™ä½ çš„ä¿¡æ¯ï¼Œå…¶ä¸POS_CODEå¯è‡ªå®šä¹‰ï¼Œä½†ä¸è¦é‡å¤ - public static final String SN_CODE = "C15936F9-ECBD-4DBD-8EED-FD0A83D6042A"; +// public static final String SN_CODE = "C15936F9-ECBD-4DBD-8EED-FD0A83D6042A"; public static final String POS_CODE = "0022_0095"; public static final String TENANT = "demo"; // 压力测试用,PLUéšæœºèŒƒå›´ @@ -46,7 +46,7 @@ public class Constant { add(new ApiButton("3.27","learnLocalVectorData", "å¦ä¹ æœ¬åœ°ç‰¹å¾æ•°æ®")); add(new ApiButton("3.28","correct", "çº é”™")); add(new ApiButton("3.29","thumbnailsAutoMatch","商å“自动é…图")); - add(new ApiButton("3.30","checkSnCodeVerification","æ ¡éªŒSNç åˆæ³•性")); + add(new ApiButton("3.30","checkSnCodeVerification","æ ¡éªŒSNç åˆæ³•性", ApiLevel.LEVEL_NORMAL, true)); add(new ApiButton("3.31","preLearning","预å¦ä¹ 商哿•°æ®")); } }; diff --git a/app/src/main/java/com/wmdigit/wmposdemo/ui/CropPicActivity.java b/app/src/main/java/com/wmdigit/wmposdemo/ui/CropPicActivity.java deleted file mode 100644 index 4dd3d58ae08e9b106463948f2af0d6120f9c4ca5..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/wmdigit/wmposdemo/ui/CropPicActivity.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.wmdigit.wmposdemo.ui; - -import android.content.Intent; -import android.graphics.Bitmap; -import android.os.Bundle; -import android.view.TextureView; -import android.view.View; -import android.widget.Toast; - -import androidx.databinding.DataBindingUtil; - - -import com.wmdigit.wmpos.WmAceKG; -import com.wmdigit.wmpos.ai.support.AiSupportActivity; -import com.wmdigit.wmpos.bean.ScaleBitmap; -import com.wmdigit.wmpos.bean.ScaleSetting; -import com.wmdigit.wmpos.cam.support.CamSupportActivity; -import com.wmdigit.wmposdemo.R; -import com.wmdigit.wmposdemo.databinding.ActivityCropPicBinding; -import com.wmdigit.wmposdemo.view.CropView; - -public class CropPicActivity extends AiSupportActivity implements View.OnClickListener { - - private ActivityCropPicBinding dataBinding; - TextureView textCameraView; - - @Override - public void onCreate(Bundle savedInstanceState) { - dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_crop_pic); -// setContentView(R.layout.activity_crop_pic); - textCameraView = findViewById(R.id.text_camera_view); - super.onCreate(savedInstanceState); - dataBinding.tvSure.setOnClickListener(this); - dataBinding.tvCancel.setOnClickListener(this); - dataBinding.tvCrop.setOnClickListener(this); - } - - @Override - public TextureView getTextureView() { - return textCameraView; - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.tv_crop: - dataBinding.rlPreview.setVisibility(View.GONE); - dataBinding.rlCrop.setVisibility(View.VISIBLE); - final ScaleBitmap clearestScaleBitmap = getScaleBitmap(false); - Bitmap raw = clearestScaleBitmap.getRaw(); - dataBinding.cropImg.setImageBitmap(raw); - break; - case R.id.tv_sure: - dataBinding.cropImg.cropImage(new CropView.OnCropListener() { - @Override - public void onCropFinished(final Bitmap bitmap, final int left, final int top, final int width, final int height) { - runOnUiThread(new Runnable() { - @Override - public void run() { - ScaleSetting scaleSetting = new ScaleSetting(left, top, width, height); - - int code = WmAceKG.saveScaleSetting(scaleSetting); - if (code == 0) { - Toast.makeText(CropPicActivity.this, "设置æˆåŠŸ", Toast.LENGTH_SHORT).show(); - Intent intent = new Intent(CropPicActivity.this, WeighingActivity.class); - startActivity(intent); - finish(); - } else { - Toast.makeText(CropPicActivity.this, "设置失敗,错误ç :" + code, Toast.LENGTH_SHORT).show(); - } - } - }); - } - }); - break; - case R.id.tv_cancel: - finish(); - break; - } - } - - -} diff --git a/app/src/main/java/com/wmdigit/wmposdemo/ui/MainActivity.java b/app/src/main/java/com/wmdigit/wmposdemo/ui/MainActivity.java index cb5812d32aec029d6b4f4e983a32fcdaa035111b..f0c0a6a28ce2830d30dda9b86d5590715e7f29ef 100644 --- a/app/src/main/java/com/wmdigit/wmposdemo/ui/MainActivity.java +++ b/app/src/main/java/com/wmdigit/wmposdemo/ui/MainActivity.java @@ -37,22 +37,13 @@ public class MainActivity extends AppCompatActivity { binding.tvRecognition.setOnClickListener(v -> { boolean isBind = SPStaticUtils.getBoolean(Constant.BIND, false); if (isBind) { - boolean isScale = WmAceKG.getScaleSetting(); - if (!isScale) { - toast("您还未è£å‰ªç§¤ç›˜,为您跳转至è£å‰ªé¡µ"); - Intent intent = new Intent(MainActivity.this, CropPicActivity.class); - startActivity(intent); - finish(); - } else { - toast("获å–ç§¤ç›˜ä¿¡æ¯æˆåŠŸ,为您跳转至识别功能页"); - Intent intent1 = new Intent(MainActivity.this, WeighingActivity.class); - startActivity(intent1); - } + Intent intent1 = new Intent(MainActivity.this, WeighingActivity.class); + startActivity(intent1); } else { - toast("您还未给pos机绑定SNå·,为您跳转至注册页"); Intent intent = new Intent(this, RegisterActivity.class); startActivity(intent); } + finish(); }); binding.tvRegister.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/com/wmdigit/wmposdemo/ui/RegisterActivity.java b/app/src/main/java/com/wmdigit/wmposdemo/ui/RegisterActivity.java index 030d65ce974cd2f0a32243d663a31b2ab69ee8a3..0389eece7d4a7ccfbab6e1b0f8f7cfd6a27b2718 100644 --- a/app/src/main/java/com/wmdigit/wmposdemo/ui/RegisterActivity.java +++ b/app/src/main/java/com/wmdigit/wmposdemo/ui/RegisterActivity.java @@ -34,7 +34,7 @@ public class RegisterActivity extends AppCompatActivity { WmAceKG.queryPosByMac(new OnQueryPosRegisterInfoListener() { @Override public void onSuccess(String posId, String snCode, String tenant) { - Toast.makeText(RegisterActivity.this, "èŽ·å–æ³¨å†Œä¿¡æ¯æˆåŠŸ,已为您自动填写", Toast.LENGTH_SHORT).show(); + Toast.makeText(RegisterActivity.this, "èŽ·å–æ³¨å†Œä¿¡æ¯æˆåŠŸ", Toast.LENGTH_SHORT).show(); binding.posEdit.setText(posId); binding.posSnCode.setText(snCode); binding.accountCompany.setText(tenant); @@ -79,16 +79,10 @@ public class RegisterActivity extends AppCompatActivity { SPStaticUtils.put(Constant.POS_CODE, pos); SPStaticUtils.put(Constant.SN_CODE, snCode); SPStaticUtils.put(Constant.BIND, true); - boolean isScale = WmAceKG.getScaleSetting(); - if (!isScale) { - Toast.makeText(RegisterActivity.this, "您未è£å‰ªç§¤ç›˜,为您跳转至è£å‰ªé¡µ", Toast.LENGTH_SHORT).show(); - Intent intent = new Intent(RegisterActivity.this, CropPicActivity.class); - startActivity(intent); - finish(); - } else { - Intent intent1 = new Intent(RegisterActivity.this, WeighingActivity.class); - startActivity(intent1); - } + + Intent intent1 = new Intent(RegisterActivity.this, WeighingActivity.class); + startActivity(intent1); + finish(); } }); }); diff --git a/app/src/main/java/com/wmdigit/wmposdemo/ui/WeighingActivity.java b/app/src/main/java/com/wmdigit/wmposdemo/ui/WeighingActivity.java index b2a8a67cb35dd6cc718da1b615cf128f7fb37fbc..016de3172e9d7b024e037557d1950fd19b810db2 100644 --- a/app/src/main/java/com/wmdigit/wmposdemo/ui/WeighingActivity.java +++ b/app/src/main/java/com/wmdigit/wmposdemo/ui/WeighingActivity.java @@ -1,5 +1,7 @@ package com.wmdigit.wmposdemo.ui; +import static com.wmdigit.wmposdemo.utils.Constant.SN_CODE; + import android.content.Context; import android.content.Intent; import android.content.res.AssetManager; @@ -12,6 +14,7 @@ import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.TextureView; import android.view.View; +import android.widget.EditText; import android.widget.Toast; import androidx.annotation.NonNull; @@ -29,6 +32,7 @@ import com.wmdigit.wmpos.bean.ImageProductBean; import com.wmdigit.wmpos.bean.ProductMatch; import com.wmdigit.wmpos.bean.ScaleBitmap; import com.wmdigit.wmpos.bean.ScaleSetting; +import com.wmdigit.wmpos.dao.repository.impl.ProductSelfLearnRepository; import com.wmdigit.wmpos.http.OnCheckSnCodeVerificationListener; import com.wmdigit.wmpos.http.OnProductMatchListener; import com.wmdigit.wmpos.http.OnQueryPosRegisterInfoListener; @@ -36,6 +40,7 @@ import com.wmdigit.wmpos.http.OnUnBindPosListener; import com.wmdigit.wmpos.listener.OnBitmapSaveListener; import com.wmdigit.wmpos.listener.OnDataExportListener; import com.wmdigit.wmpos.listener.OnPreLearningListener; +import com.wmdigit.wmpos.utils.SPStaticUtils; import com.wmdigit.wmpos.utils.StopWatch; import com.wmdigit.wmposdemo.R; import com.wmdigit.wmposdemo.adapter.ButtonAdapter; @@ -154,7 +159,10 @@ public class WeighingActivity extends AiSupportActivity implements OnItemClickLi public void initData() { context = this; random = new Random(1); + // åˆå§‹åŒ–data buttonList = Constant.API_BUTTONS; + buttonList.get(28).setDefaultParams(SPStaticUtils.getString(SN_CODE, "")); + adapter = new ButtonAdapter(R.layout.item_button, Constant.API_BUTTONS); weighingBinding.rvButtons.setAdapter(adapter); GridLayoutManager gridLayoutManager = new GridLayoutManager(this, ScreenUtils.isScreenLandscape(this) ? 5 : 3); @@ -268,7 +276,7 @@ public class WeighingActivity extends AiSupportActivity implements OnItemClickLi case "3.30": // æ ¡éªŒSNåˆæ³•性 - checkSnCodeVerification(); + checkSnCodeVerification(view); break; case "3.31": @@ -338,7 +346,7 @@ public class WeighingActivity extends AiSupportActivity implements OnItemClickLi @Override public void unBindPos() { - WmAceKG.unBindPos(Constant.TENANT, Constant.SN_CODE, new OnUnBindPosListener() { + WmAceKG.unBindPos(Constant.TENANT, SN_CODE, new OnUnBindPosListener() { @Override public void unBindFail(int code, String message) { weighingBinding.tvInfo.setText("解绑失败:" + code + "," + message); @@ -645,10 +653,9 @@ public class WeighingActivity extends AiSupportActivity implements OnItemClickLi } @Override - public void checkSnCodeVerification() { + public void checkSnCodeVerification(View view) { // 检验SNåˆæ³•性 - // todo snCodeè¯·æ›¿æ¢æˆè®¾å¤‡çœŸå®žSN - String snCode = "77C4AD47-04B3-47B7-B9DF-A55D91F9E0BA"; + String snCode = ((EditText)view.findViewById(R.id.edt_params)).getText().toString(); weighingBinding.tvInfo.setText("æ£åœ¨æ ¡éªŒSNåˆæ³•性:" + snCode + "\n"); // ç¬¬äºŒä¸ªå‚æ•°ä¸ºæŽ¥å£ç½‘络请求的超时时间 WmAceKG.checkSnCodeVerification(snCode, 1L, new OnCheckSnCodeVerificationListener() { diff --git a/app/src/main/res/drawable/rect_5_white_gray.xml b/app/src/main/res/drawable/rect_5_white_gray.xml new file mode 100644 index 0000000000000000000000000000000000000000..07eadfdd3fb143e2cac98f1a6cb0473a54a579ab --- /dev/null +++ b/app/src/main/res/drawable/rect_5_white_gray.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + + <corners android:radius="5dp"/> + + <solid android:color="@color/white"/> + + <stroke android:width="1dp" + android:color="@color/gray"/> + +</shape> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml index a9845181ef5774970ddff36acd3eb2c1de8979a9..998f47f934c43a854c24645924eeda33afa04299 100644 --- a/app/src/main/res/layout/activity_register.xml +++ b/app/src/main/res/layout/activity_register.xml @@ -156,6 +156,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" + android:padding="10dp" android:text="3.26 查询POS注册信æ¯" android:layout_marginTop="10dp" android:textSize="20sp" diff --git a/app/src/main/res/layout/item_button.xml b/app/src/main/res/layout/item_button.xml index 96d8b03ab358cae6025a72eebb395a4183096c23..c05487d2a9c12e11bd728ab2690dcb6bf52cdd56 100644 --- a/app/src/main/res/layout/item_button.xml +++ b/app/src/main/res/layout/item_button.xml @@ -101,6 +101,32 @@ app:layout_constraintEnd_toEndOf="parent" /> + <TextView + android:id="@+id/tv_interface_title_3" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="傿•°ï¼š" + android:textSize="18sp" + android:textColor="#787878" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/edt_params" + app:layout_constraintBottom_toBottomOf="@+id/edt_params" + /> + + <EditText + android:id="@+id/edt_params" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:textSize="18sp" + android:textColor="@color/black" + android:background="@drawable/rect_5_white_gray" + android:padding="8dp" + android:layout_marginTop="5dp" + android:singleLine="true" + app:layout_constraintStart_toStartOf="@+id/tv_interface_desc" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_interface_desc"/> + </androidx.constraintlayout.widget.ConstraintLayout> </androidx.cardview.widget.CardView> \ No newline at end of file