From 7780f41e2c87e052df9221304ba057b6918ef2b0 Mon Sep 17 00:00:00 2001 From: wenfei Date: Wed, 25 Feb 2026 18:51:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=85=A7=E7=89=87=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E9=A1=B5=E9=9D=A2=20=E4=B8=8A=E4=BC=A0=E7=85=A7?= =?UTF-8?q?=E7=89=87=E5=92=8C=E5=88=A0=E9=99=A4=E7=85=A7=E7=89=87=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/rehome/zhdcoa/Contans.java | 1 + .../DeviceOnlinePhotoGridViewAdapter.java | 260 ++++++++++++++++ .../zhdcoa/adapter/luck/GridImageAdapter.java | 3 +- .../DeviceOnlinePhotoManageActivity.java | 289 +++++++++++++----- .../activity_device_online_photo_manage.xml | 1 + ...activity_work_risk_list_hui_bao_detail.xml | 18 +- .../layout/adapter_device_online_photo.xml | 44 +++ 7 files changed, 531 insertions(+), 85 deletions(-) create mode 100644 app/src/main/java/com/rehome/zhdcoa/adapter/DeviceOnlinePhotoGridViewAdapter.java create mode 100644 app/src/main/res/layout/adapter_device_online_photo.xml diff --git a/app/src/main/java/com/rehome/zhdcoa/Contans.java b/app/src/main/java/com/rehome/zhdcoa/Contans.java index 5a2bd6d..961bc6b 100644 --- a/app/src/main/java/com/rehome/zhdcoa/Contans.java +++ b/app/src/main/java/com/rehome/zhdcoa/Contans.java @@ -542,6 +542,7 @@ public class Contans { public final static String DeviceOnlineStatusUrl = "dserver/device/online/data"; public final static String getDevicePhotoListUrl = "dserver/device/img"; + public final static String getImgDeviceOnlineBaseUrl = "dserver/device/img/file/"; //设备在线列表 diff --git a/app/src/main/java/com/rehome/zhdcoa/adapter/DeviceOnlinePhotoGridViewAdapter.java b/app/src/main/java/com/rehome/zhdcoa/adapter/DeviceOnlinePhotoGridViewAdapter.java new file mode 100644 index 0000000..0252b48 --- /dev/null +++ b/app/src/main/java/com/rehome/zhdcoa/adapter/DeviceOnlinePhotoGridViewAdapter.java @@ -0,0 +1,260 @@ +package com.rehome.zhdcoa.adapter; + +import static com.rehome.zhdcoa.utils.GsonUtils.GsonToBean; +import static com.rehome.zhdcoa.utils.HttpUtils.showLog; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.rehome.zhdcoa.Contans; +import com.rehome.zhdcoa.R; + +import java.util.ArrayList; +import java.util.List; + +import com.rehome.zhdcoa.adapter.luck.OnItemLongClickListener; +import com.rehome.zhdcoa.bean.DeviceOnlineStatusImgBean; +import com.rehome.zhdcoa.utils.HttpListener; +import com.rehome.zhdcoa.utils.NohttpUtils; +import com.yolanda.nohttp.NoHttp; +import com.yolanda.nohttp.RequestMethod; +import com.yolanda.nohttp.rest.CacheMode; +import com.yolanda.nohttp.rest.OnResponseListener; +import com.yolanda.nohttp.rest.Request; +import com.yolanda.nohttp.rest.RequestQueue; +import com.yolanda.nohttp.rest.Response; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; + +public class DeviceOnlinePhotoGridViewAdapter extends RecyclerView.Adapter { + //public static final int TYPE_PICTURE = 2; + private final LayoutInflater mInflater; + private final ArrayList list = new ArrayList<>(); + private Context context; + private RequestQueue queue; + private DeviceDeleteOnItemClickListener deleteItemClickListener; + + /** + * 删除 + */ +// public void delete(int position) { +// try { +// +// if (position != RecyclerView.NO_POSITION && list.size() > position) { +// list.remove(position); +// notifyItemRemoved(position); +// notifyItemRangeChanged(position, list.size()); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + + public DeviceOnlinePhotoGridViewAdapter(Context context, List result, DeviceDeleteOnItemClickListener deleteItemClickListener,OnPicItemClickListener onItemClickListener) { + this.mInflater = LayoutInflater.from(context); + this.context = context; + this.list.addAll(result); + this.deleteItemClickListener = deleteItemClickListener; + this.onItemClickListener=onItemClickListener; + queue = NoHttp.newRequestQueue(1); + } + + + public ArrayList getData() { + return list; + } + +// public void remove(int position) { +// if (position < list.size()) { +// list.remove(position); +// } +// } + + public static class ViewHolder extends RecyclerView.ViewHolder { + + ImageView mImg; + ImageView mIvDel; + TextView tvDuration; + View mView; + + public ViewHolder(View view) { + super(view); + mImg = view.findViewById(R.id.fiv); + mIvDel = view.findViewById(R.id.iv_del); + tvDuration = view.findViewById(R.id.tv_duration); + mView = view; + } + } + + @Override + public int getItemCount() { + return list.size(); + } + +// @Override +// public int getItemViewType(int position) { +// return position; +// } + + /** + * 创建ViewHolder + */ + @Override + public DeviceOnlinePhotoGridViewAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + View view = mInflater.inflate(R.layout.adapter_device_online_photo, viewGroup, false); + return new DeviceOnlinePhotoGridViewAdapter.ViewHolder(view); + } + + /** + * 设置值 + */ + @Override + public void onBindViewHolder(final DeviceOnlinePhotoGridViewAdapter.ViewHolder viewHolder, @SuppressLint("RecyclerView") final int position) { + viewHolder.mIvDel.setVisibility(View.VISIBLE); + viewHolder.mImg.setEnabled(true); +// viewHolder.mIvDel.setOnClickListener(view -> { +// int index = viewHolder.getAbsoluteAdapterPosition(); +// if (index != RecyclerView.NO_POSITION && list.size() > index) { +// list.remove(index); +// notifyItemRemoved(index); +// notifyItemRangeChanged(index, list.size()); +// } +// }); + String mediaUrl = list.get(position); + viewHolder.tvDuration.setVisibility(View.GONE); + +// Glide.with(viewHolder.itemView.getContext()) +// .load(Uri.parse(mediaUrl)) +// .centerCrop() +// .placeholder(R.color.app_color_f6) +// .diskCacheStrategy(DiskCacheStrategy.ALL) +// .into(viewHolder.mImg); + +// Glide.with(viewHolder.itemView.getContext()) +// .load(mediaUrl) +// .dontAnimate() +// .skipMemoryCache(true) +// .diskCacheStrategy(DiskCacheStrategy.NONE) +// .placeholder(R.drawable.head_photo) +// .into(viewHolder.mImg); + +// showLog(mediaUrl); +// Request request = NoHttp.createImageRequest(mediaUrl); + +// NohttpUtils.getInstance().addNoProgress(context,0, request, new HttpListener() { +// +// @Override +// public void onSucceed(int what, com.yolanda.nohttp.rest.Response response) { +// +// Bitmap picFile = response.get(); +// showLog(String.valueOf(picFile==null)); +// viewHolder.mImg.setImageBitmap(picFile); +// } +// +// @Override +// public void onFailed(int what, com.yolanda.nohttp.rest.Response response) { +// showLog("设备图片加载失败"); +// } +// }); + + Request request = NoHttp.createImageRequest(mediaUrl); + request.setCacheMode(CacheMode.NONE_CACHE_REQUEST_NETWORK); + + if (!TextUtils.isEmpty(mediaUrl)) { + Log.i("app", "fullPath is:" + mediaUrl); + if (!TextUtils.isEmpty(request.url())) { + String url = request.url(); + if (url.startsWith("https://219.131.195.3:7100") || url.startsWith("https://219.131.195.3:7011") || url.startsWith("https://219.131.195.3:7081") || url.startsWith("https://219.131.195.3:7082")) { + SSLSocketFactory socketFactory = NohttpUtils.getSSLSocketFactory(context); + if (socketFactory != null) { + request.setSSLSocketFactory(socketFactory); + request.setHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }); + } + } + } + queue.add(6, request, new OnResponseListener<>() { + @Override + public void onStart(int what) { + + } + + @Override + public void onSucceed(int what, Response response) { + Bitmap bitmap = response.get(); + Drawable drawable = new BitmapDrawable(context.getResources(), bitmap); + viewHolder.mImg.setImageDrawable(drawable); + } + + @Override + public void onFailed(int what, Response response) { + Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.head_photo); + Drawable drawable = new BitmapDrawable(context.getResources(), bitmap); + viewHolder.mImg.setImageDrawable(drawable); + } + + @Override + public void onFinish(int what) { + + } + }); + } else { + Log.i("app", "path is null"); + } + + //itemView 的点击事件 + if (deleteItemClickListener != null) { + //deleteItemClickListener.onItemClick(position); + viewHolder.mIvDel.setOnClickListener(view -> { + deleteItemClickListener.onItemClick(position); + }); + } + if(onItemClickListener != null){ + viewHolder.mImg.setOnClickListener(view -> { + onItemClickListener.onItemClick(position); + }); + } + } + + +// public void setOnItemClickListener(OnItemClickListener l) { +// this.mItemClickListener = l; +// } + + public interface DeviceDeleteOnItemClickListener { + /** + * Item click event + * + * @param position + */ + void onItemClick(int position); + } + + // 接口定义 + public interface OnPicItemClickListener { + void onItemClick(int position); + } + private OnPicItemClickListener onItemClickListener; +} diff --git a/app/src/main/java/com/rehome/zhdcoa/adapter/luck/GridImageAdapter.java b/app/src/main/java/com/rehome/zhdcoa/adapter/luck/GridImageAdapter.java index 79882f6..ab4cb8a 100644 --- a/app/src/main/java/com/rehome/zhdcoa/adapter/luck/GridImageAdapter.java +++ b/app/src/main/java/com/rehome/zhdcoa/adapter/luck/GridImageAdapter.java @@ -6,6 +6,7 @@ package com.rehome.zhdcoa.adapter.luck; * 描述: */ +import android.annotation.SuppressLint; import android.content.Context; import android.net.Uri; import android.view.LayoutInflater; @@ -132,7 +133,7 @@ public class GridImageAdapter extends RecyclerView.Adapter mData = new ArrayList<>(); private int language = LanguageConfig.UNKNOWN_LANGUAGE; @@ -214,16 +189,17 @@ public class DeviceOnlinePhotoManageActivity extends BaseActivity { private String deviceId; private String deviceName; + private ArrayList onlinePhotoList = new ArrayList<>(); private List deviceOnlineStatusImgList = new ArrayList<>(); private void findView() { - etMs = findViewById(R.id.et_ms); recycle = findViewById(R.id.recycle); cb_crop = findViewById(R.id.cb_crop); cb_compress = findViewById(R.id.cb_compress); cb_editor = findViewById(R.id.cb_editor); tv_sbmc = findViewById(R.id.tv_sbmc); recycleDevicePhotoOnline = findViewById(R.id.recycleDevicePhotoOnline); + ll_recycle = findViewById(R.id.ll_recycle); } @Override @@ -244,20 +220,83 @@ public class DeviceOnlinePhotoManageActivity extends BaseActivity { tv_sbmc.setText(deviceName); } - initToolbar("工作情况汇报", "提交", new View.OnClickListener() { + initToolbar("设备图片管理", "提交", new View.OnClickListener() { @Override public void onClick(View v) { - if(TextUtils.isEmpty(etMs.getText().toString().trim())){ - showToast("汇报内容必填"); + //提交汇报数据 + mData.clear(); + mData.addAll(mAdapter.getData()); + if(!mData.isEmpty()){ + //弹框提示 + CommitDialog dialog = new CommitDialog(context, new CommitDialog.CommitDialogListener() { + + @Override + public void confirm() { + authenticationLoginDeviceAlarmInfoRsaByUploadDevicePhoto(); + } + + @Override + public void cancel() { + + } + }); + dialog.setTvMsg("您确定要上传设备照片吗?"); + dialog.show(); }else{ - //提交汇报数据 - mData.clear(); - mData.addAll(mAdapter.getData()); - //authenticationLoginAI(); + showToast("请选择设备照片后再提交"); } } }); + deviceOnlinePhotoGridViewAdapter = new DeviceOnlinePhotoGridViewAdapter(this, onlinePhotoList, new DeviceOnlinePhotoGridViewAdapter.DeviceDeleteOnItemClickListener() { + + @Override + public void onItemClick(int position) { + //弹框提示 + CommitDialog dialog = new CommitDialog(context, new CommitDialog.CommitDialogListener() { + + @Override + public void confirm() { + authenticationLoginDeviceAlarmInfoRsaByDeleteDevicePhoto(position); + } + + @Override + public void cancel() { + + } + }); + dialog.setTvMsg("您确定要删除设备照片吗?"); + dialog.show(); + } + }, new DeviceOnlinePhotoGridViewAdapter.OnPicItemClickListener() { + @Override + public void onItemClick(int position) { + showLog(String.valueOf(position)); + DeviceOnlineStatusImgBean.DeviceOnlineStatusImg item = deviceOnlineStatusImgList.get(position); + + Intent intent = new Intent(context,PhotoRiskViewActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra("url", onlinePhotoList.get(position)); + intent.putExtra("fileName", "图片预览"); + intent.putExtra("path", "/"); + startActivity(intent); + } + }); + + FullyGridLayoutManager manager = new FullyGridLayoutManager( + this, + 4, GridLayoutManager.VERTICAL, false + ); + recycleDevicePhotoOnline.setLayoutManager(manager); + recycleDevicePhotoOnline.addItemDecoration( + new GridSpacingItemDecoration( + 4, + DensityUtil.dip2px(this, 8f), false + ) + ); + + recycleDevicePhotoOnline.setAdapter(deviceOnlinePhotoGridViewAdapter); + //初始化获取照片和视频 initTakePhoto(); } @@ -301,7 +340,7 @@ public class DeviceOnlinePhotoManageActivity extends BaseActivity { NohttpUtils.getInstance().add(this,0, request, new HttpListener() { - @SuppressLint({"SetTextI18n", "DefaultLocale"}) + @SuppressLint({"SetTextI18n", "DefaultLocale", "NotifyDataSetChanged"}) @Override public void onSucceed(int what, com.yolanda.nohttp.rest.Response response) { @@ -313,8 +352,33 @@ public class DeviceOnlinePhotoManageActivity extends BaseActivity { if(bean!=null && bean.getCode()==20000 && bean.isSuccess() && bean.getData()!=null && !bean.getData().isEmpty()){ deviceOnlineStatusImgList.clear(); deviceOnlineStatusImgList.addAll(bean.getData()); + onlinePhotoList.clear(); + ArrayList onlinePhotoListTemp = new ArrayList<>(); + String imgDeviceOnlineBaseUrl = Contans.IP + Contans.getImgDeviceOnlineBaseUrl; + for(DeviceOnlineStatusImgBean.DeviceOnlineStatusImg item : deviceOnlineStatusImgList){ + String fileName = item.getFileName(); + String imgFullUrl = imgDeviceOnlineBaseUrl+fileName; + onlinePhotoListTemp.add(imgFullUrl); + onlinePhotoList.add(imgFullUrl); + showLog(imgFullUrl); + } + showLog(String.valueOf(onlinePhotoListTemp.size())); + deviceOnlinePhotoGridViewAdapter.getData().clear(); + deviceOnlinePhotoGridViewAdapter.getData().addAll(onlinePhotoListTemp); + deviceOnlinePhotoGridViewAdapter.notifyDataSetChanged(); + if(onlinePhotoList.size()>=8){ + ll_recycle.setVisibility(View.GONE); + }else{ + ll_recycle.setVisibility(View.VISIBLE); + maxSelectNum=8-onlinePhotoList.size(); + } + }else{ + onlinePhotoList.clear(); + deviceOnlineStatusImgList.clear(); + deviceOnlinePhotoGridViewAdapter.getData().clear(); + deviceOnlinePhotoGridViewAdapter.notifyDataSetChanged(); } } @@ -325,7 +389,34 @@ public class DeviceOnlinePhotoManageActivity extends BaseActivity { }); } - public void uploadDataByReport() { + private void authenticationLoginDeviceAlarmInfoRsaByUploadDevicePhoto() { + try { + //AI三维登录接口 + String userName = Contans.SP.DeviceAlermInfoAccount; + String strPublicDecode = RSAAndroid.decryptByPublicKeyForSpiltStr( + Contans.SP.DeviceAlermInfoPwd, + RSAAndroid.publicRsaKeyLocal + ); + AuthenticationLoginAIUtils.authenticationDeviceAlermInfoRsaShowProgress(this,userName,strPublicDecode,new OnAuthenticationLoginListener(){ + @Override + public void onAuthenticationSuccess(boolean result, String token) { + if(token!=null&&token.isEmpty()){ + //登录失败 + showToast("设备状态智能监测及分析平台登录失败"); + }else{ + //登录成功 + //上传设备照片 + //http://10.19.0.17:1700/dserver/device/img?v=1770446858996 + uploadDataByDevicePhoto(); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void uploadDataByDevicePhoto() { finalList.clear(); for (LocalMedia media : mData) { if(media.getCompressPath()!=null){ @@ -337,58 +428,104 @@ public class DeviceOnlinePhotoManageActivity extends BaseActivity { } showLog(new Gson().toJson(media)); } - showLog(finalList.toString().toLowerCase()); - upLoadReport(); + upLoadPhoto(); } - //上传单条缺陷工单 - private void upLoadReport() { - String url = Contans.BASE_URL_AI_3D_SERVER + Contans.DAYLY_RISK_LIST_SUBMIT_REPORT; + //上传设备图片 + private void upLoadPhoto() { + String url = Contans.IP + Contans.getDevicePhotoListUrl; showLog(url); - Request request = NoHttp.createStringRequest(url, RequestMethod.POST); + Request request = NoHttp.createStringRequest(url, RequestMethod.POST); showLog("-----------"); -// showLog(id); showLog(username); - request.add("reporterNo", username); -// request.add("level", level); -// request.add("type", type); -// request.add("ticketId", id); - request.add("content",etMs.getText().toString().trim()); - - - if (mData!=null&&mData.size()>0) { + request.add("deviceName", deviceName); + request.add("deviceId", deviceId); + if (mData!=null&& !mData.isEmpty()) { for (LocalMedia localMedia : mData) { showLog(new Gson().toJson(localMedia)); if(localMedia.getCompressPath()!=null){ - request.add("fileList", new File(localMedia.getCompressPath())); + request.add("files", new File(localMedia.getCompressPath())); }else{ if(localMedia.getSandboxPath()!=null){ - request.add("fileList", new File(localMedia.getSandboxPath())); + request.add("files", new File(localMedia.getSandboxPath())); } } } } + NohttpUtils.getInstance().add(this,0, request, new HttpListener() { - if(Contans.BASE_URL_AI_3D_SERVER.equals(Contans.BASE_URL_AI_3D_SERVER_EXTRANET)){ - SSLSocketFactory socketFactory = NohttpUtils.getSSLSocketFactory(context); - if (socketFactory != null) { - request.setSSLSocketFactory(socketFactory); - request.setHostnameVerifier(new HostnameVerifier() { - @Override - public boolean verify(String s, SSLSession sslSession) { - return true; - } - }); + @Override + public void onSucceed(int what, Response response) { + + showLog("----------------"); + String result = response.get(); + showLog(result); + + DeviceAlarmBaseBean bean = GsonToBean(result, DeviceAlarmBaseBean.class); + if(bean!=null && bean.getCode()==20000 && bean.isSuccess()){ + //弹框提示 + BaCheckDialog dialog = new BaCheckDialog(context,"设备照片上传成功", new BaCheckDialog.AuditDialogListener() { + + @SuppressLint("NotifyDataSetChanged") + @Override + public void confirm(String notice) { + mAdapter.getData().clear(); + mAdapter.notifyDataSetChanged(); + authenticationLoginDeviceAlarmInfoRsa(); + } + }); + dialog.show(); + } } + + @Override + public void onFailed(int what, Response response) { + + } + },true,true,"请稍候..."); + } + + private void authenticationLoginDeviceAlarmInfoRsaByDeleteDevicePhoto(int position) { + try { + //设备状态智能监测及分析平台登录接口 + String userName = Contans.SP.DeviceAlermInfoAccount; + String strPublicDecode = RSAAndroid.decryptByPublicKeyForSpiltStr( + Contans.SP.DeviceAlermInfoPwd, + RSAAndroid.publicRsaKeyLocal + ); + AuthenticationLoginAIUtils.authenticationDeviceAlermInfoRsaShowProgress(this,userName,strPublicDecode,new OnAuthenticationLoginListener(){ + @Override + public void onAuthenticationSuccess(boolean result, String token) { + if(token!=null&&token.isEmpty()){ + //登录失败 + showToast("设备状态智能监测及分析平台登录失败"); + }else{ + //登录成功 + //删除设备照片 + deletePhoto(position); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); } + } + + //删除设备图片 + private void deletePhoto(int position) { + DeviceOnlineStatusImgBean.DeviceOnlineStatusImg item = deviceOnlineStatusImgList.get(position); + String url = Contans.IP + Contans.getDevicePhotoListUrl+"/"+item.getId(); + showLog(url); + Request request = NoHttp.createStringRequest(url, RequestMethod.DELETE); + showLog("------删除设备图片-----"); NohttpUtils.getInstance().add(this,0, request, new HttpListener() { @@ -399,14 +536,15 @@ public class DeviceOnlinePhotoManageActivity extends BaseActivity { String result = response.get(); showLog(result); - AIRiskListBaseBean aiRiskListBaseBean = GsonToBean(result, AIRiskListBaseBean.class); - if (aiRiskListBaseBean != null && aiRiskListBaseBean.isSuccess() && aiRiskListBaseBean.getCode()==20000) { + DeviceAlarmBaseBean bean = GsonToBean(result, DeviceAlarmBaseBean.class); + if(bean!=null && bean.getCode()==20000 && bean.isSuccess()){ //弹框提示 - BaCheckDialog dialog = new BaCheckDialog(context,"提交汇报成功", new BaCheckDialog.AuditDialogListener() { + BaCheckDialog dialog = new BaCheckDialog(context,"设备照片删除成功", new BaCheckDialog.AuditDialogListener() { + @SuppressLint("NotifyDataSetChanged") @Override public void confirm(String notice) { - finish(); + authenticationLoginDeviceAlarmInfoRsa(); } }); dialog.show(); @@ -421,7 +559,6 @@ public class DeviceOnlinePhotoManageActivity extends BaseActivity { } private void clearView() { - etMs.setText(""); mAdapter.getData().clear(); mAdapter.notifyDataSetChanged(); } diff --git a/app/src/main/res/layout/activity_device_online_photo_manage.xml b/app/src/main/res/layout/activity_device_online_photo_manage.xml index 28b19a2..809212d 100644 --- a/app/src/main/res/layout/activity_device_online_photo_manage.xml +++ b/app/src/main/res/layout/activity_device_online_photo_manage.xml @@ -61,6 +61,7 @@ + android:textSize="14sp" + android:visibility="gone" /> + + android:textSize="14sp" + android:visibility="gone" /> + + android:textSize="14sp" + android:visibility="gone" /> + + + + + + + + \ No newline at end of file