Quellcode durchsuchen

feat 射线法改为jts包方法判断

lihao1 vor 3 Jahren
Ursprung
Commit
90044614f8

+ 2 - 0
demo/src/main/AndroidManifest.xml

@@ -22,6 +22,8 @@
 
     <uses-feature android:name="android.hardware.camera" />
     <uses-feature android:name="android.hardware.camera.autofocus" />
+    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
+        tools:ignore="ScopedStorage"/>
 
     <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
 

+ 87 - 11
demo/src/main/java/com/sybotan/android/demo/activities/EquipDetailActivity.kt

@@ -10,6 +10,7 @@ import android.util.Log
 import android.view.Gravity
 import android.view.MotionEvent
 import android.view.View
+import android.view.WindowManager
 import android.widget.*
 import androidx.appcompat.widget.SwitchCompat
 import androidx.core.widget.NestedScrollView
@@ -66,7 +67,8 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
     private val REQUEST_CODE_PIC = 0X102
     private val REQUEST_EQUIP_CODE = 0X103
 
-    private lateinit var info: Infos
+    private var info: Infos? = null
+    private var currentPosition: Int? = 0
     private lateinit var recycler: RecyclerView
     private lateinit var viewRecycler: RecyclerView
     private lateinit var mtextContent: EditText
@@ -80,6 +82,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
     private lateinit var equipClass: ListItemView
     private lateinit var root: NestedScrollView
     private lateinit var btnSubmit: TextView
+    private lateinit var pasteDetail: TextView
     private lateinit var stateName: TextView
     private lateinit var expandLvPipe: SuperExpandableListView
     private lateinit var expandLvRelation: SuperExpandableListView
@@ -121,6 +124,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
         setContentView(R.layout.activity_equip_detail)
         initView()
         initData()
@@ -142,6 +146,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
         scale = bundle.getFloat("scale", 0f)
         centerPoint = bundle.getParcelable("centerPoint")!!
         uuid = IdGenerator.getId(projectId, IdGenerator.EQUIPMENT)
+        pasteDetail = findViewById(R.id.pasteDetail)
         recycler = findViewById(R.id.recycler)
         height = findViewById(R.id.height)
         locationWhere = findViewById(R.id.locationWhere)
@@ -171,7 +176,10 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
         beans.add(photo)
         pictureAdapter = PictureAdapter(this, beans, "", false, 0, 85)
         viewRecycler.adapter = pictureAdapter
-        pictureAdapter.setOnPicAdd { addPic() }
+        pictureAdapter.setOnPicAdd {
+            this.info = null
+            addPic()
+        }
         height.setTvRight(position?.z?.offset)
         locationWhere.setTvRight(position?.z?.region)
         location.setTvRight("(x=${position?.x},y=${position?.y})")
@@ -180,6 +188,23 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
             equipClass.isEnabled = false
             location.isEnabled = false
         }
+        if (TextUtils.isEmpty(deviceId)) {
+            pasteDetail.alpha = 1.0f
+            pasteDetail.isEnabled = true
+        }
+        pasteDetail.setOnClickListener {
+            staticInfoAdapter.hashMap = Constant.infoMap
+            staticInfoAdapter.valueList.clear()
+            staticInfoAdapter.notifyDataSetChanged()
+            if (staticInfoAdapter.hashMap != null && staticInfoAdapter.hashMap.get("compType") != null) {
+                val compCode = staticInfoAdapter.hashMap.get("compType")
+                compType.setTvRight(compCode.toString())
+
+            }
+            if (!TextUtils.isEmpty(Constant.equipCode)) {
+                findCurrentEquipCode()
+            }
+        }
         doneSwitch.addSwitchObserver { switchView, state ->
             when (state) {
                 RMSwitch.STATE_LEFT -> {
@@ -243,6 +268,21 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
         }
     }
 
+    private fun findCurrentEquipCode() {
+        for (eq in equips) {
+            if (eq.code == Constant.equipCode) {
+                this.equipEntity = eq
+                pasteDetail.alpha = 1.0f
+                pasteDetail.isEnabled = true
+                equipVM.getRelConfig(eq, deviceId, uuid)
+                equipClass.setTvRight(equipEntity!!.systemName + "/" + equipEntity!!.name + "-" + equipEntity!!.code)
+                equipVM.getEquipInfosConfig(equipEntity!!)
+                equipVM.getEquipment(deviceId)
+                break
+            }
+        }
+    }
+
     //重写onTouch方法
     override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
         //触摸的是EditText控件,且当前EditText可以滚动,则将事件交给EditText处理;否则将事件交由其父类处理
@@ -271,16 +311,23 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
         dialog = EquipListDialog(this)
         dialog.setOnSubmit {
             this.equipEntity = it
+            if (it.code == Constant.equipCode) {
+                pasteDetail.alpha = 1.0f
+                pasteDetail.isEnabled = true
+            }
             equipClass.setTvRight(it.systemName + "/" + it.name + "-" + it.code)
             equipVM.getEquipInfosConfig(it)
             equipVM.getRelConfig(it, deviceId, uuid)
 
         }
         staticInfoAdapter = StaticInfoAdapter(this, list)
-        staticInfoAdapter.setOnAddPic {
-            addPic()
-            this.info = it
-        }
+        staticInfoAdapter.setOnAddPic(object : StaticInfoAdapter.AddPic {
+            override fun onAddPic(info: Infos?, currentPosition: Int) {
+                addPic()
+                this@EquipDetailActivity.info = info
+                this@EquipDetailActivity.currentPosition = currentPosition
+            }
+        })
         staticInfoAdapter.setOnAddDeliveryCode {
             if (equipEntity == null) {
                 ToastUtils.showMyToast("请先选择设备类型")
@@ -400,6 +447,10 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                             }
                         }
                     }
+                    if (Constant.equipCode != equipEntity?.code) {
+                        pasteDetail.alpha = 0.5f
+                        pasteDetail.isEnabled = false
+                    }
                 }
                 EquipDetailVM.EQUIP_REL -> {
                     val hashMap = params as HashMap<String, Any>
@@ -616,7 +667,21 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                                         photos.itemType = 0
                                         photos.path = path
                                         photos.key = key
-                                        beans.add(photos)
+                                        if (info == null) {
+                                            beans.add(photos)
+                                        } else {
+                                            val photosList = ArrayList<Photos>()
+                                            if (staticInfoAdapter.hashMap[info!!.code] != null) {
+                                                val value = Gson().fromJson<ArrayList<Photos>>(
+                                                    Gson().toJson(staticInfoAdapter.hashMap[info!!.code]), object : TypeToken<List<Photos?>?>() {}.type
+                                                )
+                                                photosList.addAll(value)
+                                            }
+                                            photosList.add(photos)
+                                            staticInfoAdapter.hashMap.put(info!!.code, photosList)
+                                            staticInfoAdapter.valueList.remove(info?.code)
+                                            runOnUiThread { staticInfoAdapter.notifyItemChanged(currentPosition!!) }
+                                        }
                                     }
                                 }
                             } else {
@@ -624,7 +689,21 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                                 photos.itemType = 0
                                 photos.path = path
                                 photos.key = key
-                                beans.add(photos)
+                                if (info == null) {
+                                    beans.add(photos)
+                                } else {
+                                    val photosList = ArrayList<Photos>()
+                                    if (staticInfoAdapter.hashMap[info!!.code] != null) {
+                                        val value = Gson().fromJson<ArrayList<Photos>>(
+                                            staticInfoAdapter.hashMap[info!!.code] as String, object : TypeToken<List<Photos?>?>() {}.type
+                                        )
+                                        photosList.addAll(value)
+                                    }
+                                    photosList.add(photos)
+                                    staticInfoAdapter.hashMap.put(info!!.code, photosList)
+                                    staticInfoAdapter.valueList.remove(info?.code)
+                                    runOnUiThread { staticInfoAdapter.notifyItemChanged(currentPosition!!) }
+                                }
                             }
                         }
                     }
@@ -632,9 +711,6 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                 }
                 DEAL_DATA_NEXT -> {
                     ToastUtils.showMyToast("图片上传完毕")
-                    pictureAdapter.notifyDataSetChanged()
-                    staticInfoAdapter.valueList.clear()
-                    staticInfoAdapter.notifyDataSetChanged()
 //                    if (info != null) {
 //                        staticInfoAdapter.hashMap.put(info.code, beans)
 //                    }

+ 13 - 0
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -225,6 +225,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
     private lateinit var equipContainer: TextView
     private lateinit var equipDelete: TextView
     private lateinit var sift: TextView
+    private lateinit var copyDetail: TextView
     private lateinit var checkAll: CheckBox
     private lateinit var onlySpace: CheckBox
     private lateinit var root: LinearLayout
@@ -380,6 +381,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         onlySpace = findViewById(R.id.onlySpace)
         sift = findViewById(R.id.sift)
         root = findViewById(R.id.root)
+        copyDetail = findViewById(R.id.copyDetail)
 
     }
 
@@ -655,9 +657,11 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                         }
                     }
                     if (!hasChooseEquip) {
+                        copyDetail.alpha = 0.5f
                         equipDetail.alpha = 0.5f
                         equipContainer.alpha = 0.5f
                         equipDelete.alpha = 0.5f
+                        copyDetail.isEnabled = false
                         equipDetail.isEnabled = false
                         equipContainer.isEnabled = false
                         equipDelete.isEnabled = false
@@ -919,8 +923,10 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
     }
 
     private fun initEquipDetail(point: EquipItem) {
+        copyDetail.alpha = 1f
         equipDetail.alpha = 1f
         equipDelete.alpha = 1f
+        copyDetail.isEnabled = true
         equipDetail.isEnabled = true
         equipDelete.isEnabled = true
         graphyVM.getContainer(point.data.deviceId!!)
@@ -998,6 +1004,9 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
 
 
         }
+        copyDetail.setOnClickListener {
+            graphyVM.copyDetail(point.data.deviceId)
+        }
     }
 
     private fun checkSdCardEnabled(): Boolean {
@@ -1908,9 +1917,11 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                 }
             }
             position.z = z
+            copyDetail.alpha = 0.5f
             equipDetail.alpha = 0.5f
             equipContainer.alpha = 0.5f
             equipDelete.alpha = 0.5f
+            copyDetail.isEnabled = false
             equipDetail.isEnabled = false
             equipContainer.isEnabled = false
             equipDelete.isEnabled = false
@@ -1922,9 +1933,11 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
             equipLl.visibility = View.GONE
             scene.eqItem?.let { it1 -> scene.removeItem(it1) }
             scene.type = "normal"
+            copyDetail.alpha = 0.5f
             equipDetail.alpha = 0.5f
             equipContainer.alpha = 0.5f
             equipDelete.alpha = 0.5f
+            copyDetail.isEnabled = false
             equipDetail.isEnabled = false
             equipContainer.isEnabled = false
             equipDelete.isEnabled = false

+ 18 - 1
demo/src/main/java/com/sybotan/android/demo/activities/PocActivity.kt

@@ -3,9 +3,13 @@ package com.sybotan.android.demo.activities
 import android.Manifest
 import android.app.AlertDialog
 import android.app.ProgressDialog
+import android.content.Intent
 import android.content.SharedPreferences
 import android.content.pm.PackageManager
+import android.net.Uri
 import android.os.Bundle
+import android.os.Environment
+import android.provider.Settings
 import android.widget.Button
 import android.widget.TextView
 import androidx.constraintlayout.widget.ConstraintLayout
@@ -215,10 +219,23 @@ class PocActivity : BaseActivity(), DIAware {
                 this,
                 arrayOf(
                     Manifest.permission.WRITE_EXTERNAL_STORAGE,
-                    Manifest.permission.READ_PHONE_STATE
+//                    Manifest.permission.READ_PHONE_STATE,
+                    Manifest.permission.MANAGE_EXTERNAL_STORAGE
                 ),
                 1
             )
         }
+
+        if (Environment.isExternalStorageManager()) {
+
+// If you don't have access, launch a new activity to show the user the system's dialog
+// to allow access to the external storage
+        } else {
+            val intent = Intent()
+            intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
+            val uri: Uri = Uri.fromParts("package", this.packageName, null)
+            intent.setData(uri)
+            startActivity(intent)
+        }
     }
 }

+ 8 - 5
demo/src/main/java/com/sybotan/android/demo/activities/Space3DActivity.kt

@@ -28,9 +28,12 @@ import kotlin.reflect.jvm.internal.impl.load.kotlin.JvmType
 class Space3DActivity : BaseActivity(), DIAware {
 
     override val di: DI by closestDI()
-    lateinit var viewModel: Space3DVM
 
-    private lateinit var webview: WebView
+    companion object {
+        private lateinit var webview: WebView
+        lateinit var viewModel: Space3DVM
+    }
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 //        setContentView(R.layout.activity_space3_dactivity)
@@ -59,9 +62,6 @@ class Space3DActivity : BaseActivity(), DIAware {
         da.click.setOnClickListener {
 //            webview.loadUrl("javascript:GetInitSceneData(${map})")
 //            webview.loadUrl("javascript:GetInitSceneData(" + "12345" + ")")
-            viewModel.getFloorSpace()
-            webview.loadUrl("javascript:OpenTestData()")
-            webview.loadUrl("javascript:LoadAllModelWithFloor()")
 
 
         }
@@ -89,6 +89,9 @@ class Space3DActivity : BaseActivity(), DIAware {
 
         override fun onPageFinished(view: WebView, url: String) {
             super.onPageFinished(view, url)
+            viewModel.getFloorSpace()
+            webview.loadUrl("javascript:OpenTestData()")
+            webview.loadUrl("javascript:LoadAllModelWithFloor()")
         }
     }
 }

+ 8 - 4
demo/src/main/java/com/sybotan/android/demo/activities/SpaceDetailActivity.kt

@@ -41,6 +41,7 @@ import java.util.HashMap
  */
 class SpaceDetailActivity : BaseActivity() {
     private lateinit var info: Infos
+    private var currentPosition: Int = 0
 
     /** 建筑Id */
     private lateinit var buildingId: String
@@ -84,10 +85,13 @@ class SpaceDetailActivity : BaseActivity() {
     private lateinit var staticInfoAdapter: StaticInfoAdapter
 
     private fun initData() {
-        staticInfoAdapter.setOnAddPic {
-            addPic()
-            this.info = it
-        }
+        staticInfoAdapter.setOnAddPic(object :StaticInfoAdapter.AddPic{
+            override fun onAddPic(info: Infos?, currentPosition: Int) {
+                addPic()
+                this@SpaceDetailActivity.info = info!!
+                this@SpaceDetailActivity.currentPosition = currentPosition
+            }
+        })
         staticInfoAdapter.setOnAddDeliveryCode {
             val intent = Intent(this, SpaceDeliveryCodeActivity::class.java)
             val bundle = Bundle()

+ 27 - 18
demo/src/main/java/com/sybotan/android/demo/adapter/StaticInfoAdapter.java

@@ -34,6 +34,7 @@ import com.sybotan.android.demo.view.CommonNumberControl;
 import com.sybotan.android.demo.view.ListItemView;
 import com.sybotan.android.demo.view.SelectListPopupWindow;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
@@ -166,6 +167,9 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                 initEditTextTouch(numberControl.getEditText(), info);
                 break;
             case "photo":
+                TextView picTitle = holder.getView(R.id.picTitle);
+                String label = TextUtils.isEmpty(info.getLabel()) ? "" : info.getLabel();
+                picTitle.setText(label + unit);
                 List<Photos> beans = new ArrayList<>();
                 Photos photo = new Photos();
                 photo.itemType = 1;
@@ -173,36 +177,40 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
 
                 if (!valueList.contains(info.getCode())) {
                     if (hashMap != null && hashMap.get(info.getCode()) != null) {
-                        ArrayList<Photos> value = new Gson().fromJson((String) hashMap.get(info.getCode()), new TypeToken<List<Photos>>() {
+                        ArrayList<Photos> value = new Gson().fromJson(new Gson().toJson(hashMap.get(info.getCode())), new TypeToken<List<Photos>>() {
                         }.getType());
                         ArrayList<Photos> photos = value;
                         beans.addAll(photos);
                     }
+                    PictureAdapter pictureAdapter = new PictureAdapter(mContext, beans, "", false, holder.getCurrentPosition(), 85);
+                    pictureAdapter.setOnPicAdd(new PictureAdapter.PicAdd() {
+                        @Override
+                        public void onPicAdd() {
+                            if (addPic != null) {
+                                addPic.onAddPic(info, holder.getCurrentPosition());
+                            }
+                        }
+                    });
+                    RecyclerView recycler = holder.getView(R.id.viewRecycler);
+                    recycler.setLayoutManager(new GridLayoutManager(mContext, 3));
+                    recycler.setAdapter(pictureAdapter);
                 }
                 valueList.add(info.getCode());
 
-                PictureAdapter pictureAdapter = new PictureAdapter(mContext, beans, "", false, holder.getCurrentPosition(), 85);
-                pictureAdapter.setOnPicAdd(new PictureAdapter.PicAdd() {
-                    @Override
-                    public void onPicAdd() {
-                        if (addPic != null) {
-                            addPic.onAddPic(info);
-                        }
-                    }
-                });
-                RecyclerView recycler = holder.getView(R.id.viewRecycler);
-                recycler.setLayoutManager(new GridLayoutManager(mContext, 3));
-                recycler.setAdapter(pictureAdapter);
 //                return PICTURE;
                 break;
             case "date":
 //                return DATE;
                 ListItemView listItemView = holder.getView(R.id.view_date);
                 listItemView.setTvLeft(info.getLabel() + unit);
+                TextView tv = (TextView) listItemView.getView(R.id.tv_right);
+                if (hashMap != null && hashMap.get(info.getCode()) != null) {
+                    tv.setText(hashMap.get(info.getCode()).toString());
+                }
                 listItemView.getView(R.id.tv_right).setOnClickListener(v -> {
                     pvTime.show(true);
                 });
-                initTimePicker();
+                initTimePicker(info.getCode(), holder.getCurrentPosition());
                 break;
             case "digitalDeliveryCode":
                 ListItemView codeItemView = holder.getView(R.id.view_text);
@@ -393,14 +401,15 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
         }
     }
 
-    public void initTimePicker() {
+    public void initTimePicker(String code, int currentPosition) {
         Calendar currentDate = Calendar.getInstance();
         Calendar endDate = Calendar.getInstance();
         endDate.set(3000, 12, 31);
         //初始化时间选择器
         pvTime = new TimePickerBuilder(mContext, (date, v) -> {//选中事件回调
-            long timeBegin = 0;
-            long timeEnd = 0;
+            hashMap.put(code, new SimpleDateFormat("yyyyMMdd").format(date));
+            valueList.remove(code);
+            notifyItemChanged(currentPosition);
         }).setLayoutRes(R.layout.pickerview_custom_time, v -> {
             Button btnSubmit = v.findViewById(R.id.btnSubmit);
             Button btnCancel = v.findViewById(R.id.btnCancel);
@@ -428,7 +437,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
     }
 
     public interface AddPic {
-        void onAddPic(Infos info);
+        void onAddPic(Infos info, int currentPosition);
     }
 
     public void setOnAddPic(AddPic addPic) {

+ 5 - 0
demo/src/main/java/com/sybotan/android/demo/retrofit/Constant.java

@@ -1,5 +1,8 @@
 package com.sybotan.android.demo.retrofit;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Created by weimo on 2020/7/13.
  */
@@ -18,6 +21,8 @@ public class Constant {
     //地图服务器地址
     public static final String ServerMapIP = "http://adm.sagacloud.cn/image-service/common/file_get?systemId=revit&key=";
 
+    public static HashMap<String, Object> infoMap = new HashMap<>();
+    public static String equipCode = "";
 
     public static final String TYPE1 = "option";
     public static final String TYPE2 = "equip";

+ 8 - 1
demo/src/main/java/com/sybotan/android/demo/tools/DownLoadApk.java

@@ -1,6 +1,7 @@
 package com.sybotan.android.demo.tools;
 
 import android.app.ProgressDialog;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
@@ -8,6 +9,7 @@ import android.os.Build;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.Message;
+import android.os.ParcelFileDescriptor;
 
 import androidx.core.content.FileProvider;
 
@@ -102,7 +104,7 @@ public class DownLoadApk implements Runnable {
 
         try {
             if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
-                String sdPath = Environment.getExternalStorageDirectory() + "/";
+                String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
 //                      文件保存路径
                 mSavePath = sdPath + "meos";
 
@@ -117,6 +119,11 @@ public class DownLoadApk implements Runnable {
                 int length = conn.getContentLength();
 
                 File apkFile = new File(mSavePath, build);
+
+                File apkFiles = new File(mSavePath);
+                if (!apkFiles.exists()) {
+                    apkFiles.mkdirs();
+                }
                 FileOutputStream fos = new FileOutputStream(apkFile);
 
                 int count = 0;

+ 6 - 2
demo/src/main/java/com/sybotan/android/demo/viewmodel/EquipDetailVM.kt

@@ -68,8 +68,12 @@ class EquipDetailVM(
             if (!TextUtils.isEmpty(deviceId)) {
                 var equip = repo.getObject(deviceId)
                 val infos = gson.fromJson(equip!!.infos, HashMap::class.java) as HashMap<String, Any>
-                infos.put("localId", equip.localId.toString())
-                infos.put("localName", equip.localName.toString())
+                if (!TextUtils.isEmpty(equip.localId)) {
+                    infos.put("localId", equip.localId.toString())
+                }
+                if (!TextUtils.isEmpty(equip.localName)) {
+                    infos.put("localName", equip.localName.toString())
+                }
                 mEmitter.SendDirective(SPACE_INFOS, infos)
                 mEmitter.SendDirective(Equip_INFOS, equip)
             }

+ 18 - 0
demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt

@@ -34,6 +34,7 @@ import java.util.*
 import kotlin.collections.ArrayList
 import kotlin.collections.HashMap
 import com.sybotan.android.demo.bean.*
+import com.sybotan.android.demo.retrofit.Constant
 import com.sybotan.android.demo.tools.Lasso
 import com.sybotan.android.demo.tools.ObjectNameUtils
 import com.sybotan.base.extensions.toInt
@@ -505,7 +506,24 @@ class GraphyVM(
         }
     }
 
+    fun copyDetail(deviceId: String?) {
+        viewModelScope.launch {
+            val equip = repo.getObject(deviceId!!)
+            val hashMap = gson.fromJson(equip!!.infos, HashMap::class.java) as HashMap<String, Any>
+            hashMap.remove("localId")
+            hashMap.remove("equipPhoto")
+            hashMap.remove("equipCheck")
+            hashMap.remove("equipContent")
+            hashMap.remove("location")
+            hashMap.remove("zRegion")
+            Constant.infoMap = hashMap
+            Constant.equipCode = equip.classCode
+            ToastUtils.showMyToast("复制成功")
+        }
+    }
+
     companion object {
+
         //app版本更新
         const val UPDATE_APP = "UPDATE_APP"
 

+ 14 - 0
demo/src/main/res/layout/activity_equip_detail.xml

@@ -32,6 +32,20 @@
                 android:text="设备详情"
                 android:textColor="@color/black_272727"
                 android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/pasteDetail"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_centerVertical="true"
+                android:layout_marginRight="16dp"
+                android:alpha="0.5"
+                android:enabled="false"
+                android:paddingTop="4dp"
+                android:paddingBottom="4dp"
+                android:text="粘贴设备信息"
+                android:textColor="@color/blue_2F48B7" />
         </RelativeLayout>
 
         <com.sybotan.android.demo.view.ListItemView

+ 33 - 14
demo/src/main/res/layout/activity_graphy.xml

@@ -276,21 +276,40 @@
                     android:textSize="14sp" />
             </androidx.appcompat.widget.LinearLayoutCompat>
 
-            <TextView
-                android:id="@+id/equipDelete"
-                android:layout_width="wrap_content"
+            <RelativeLayout
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_gravity="center_horizontal"
-                android:layout_marginTop="5dp"
-                android:alpha="0.5"
-                android:background="@drawable/bg_blue_3bacb2"
-                android:paddingLeft="16dp"
-                android:paddingTop="2dp"
-                android:paddingRight="16dp"
-                android:paddingBottom="2dp"
-                android:text="删除设备/标记多余"
-                android:textColor="@color/white_ffffff"
-                android:textSize="14sp" />
+                android:layout_marginTop="5dp">
+
+                <TextView
+                    android:id="@+id/copyDetail"
+                    android:textColor="@color/white_ffffff"
+                    android:paddingTop="2dp"
+                    android:paddingBottom="2dp"
+                    android:paddingLeft="6dp"
+                    android:paddingRight="6dp"
+                    android:layout_marginLeft="16dp"
+                    android:background="@drawable/bg_toast"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="复制设备信息"/>
+
+                <TextView
+                    android:id="@+id/equipDelete"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_centerInParent="true"
+                    android:layout_gravity="center_horizontal"
+                    android:alpha="0.5"
+                    android:background="@drawable/bg_blue_3bacb2"
+                    android:paddingLeft="16dp"
+                    android:paddingTop="2dp"
+                    android:paddingRight="16dp"
+                    android:paddingBottom="2dp"
+                    android:text="删除设备/标记多余"
+                    android:textColor="@color/white_ffffff"
+                    android:textSize="14sp" />
+            </RelativeLayout>
 
             <CheckBox
                 android:id="@+id/sceneCheckBox"

+ 13 - 3
demo/src/main/res/layout/view_picture.xml

@@ -1,11 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:background="@drawable/common_line_ffffff_single_all">
+    android:background="@drawable/common_line_ffffff_single_all"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/picTitle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="16dp"
+        android:layout_marginTop="5dp"
+        android:textColor="@color/black_272727"
+        android:textSize="16sp" />
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/viewRecycler"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
-</RelativeLayout>
+</LinearLayout>

+ 2 - 2
gradle.properties

@@ -17,14 +17,14 @@ SAGA_SERVICE_VERSION=1.4.140
 MAVEN_REPO_RELEASE_URL=http\://dev.dp.sagacloud.cn\:8082/repository/maven-releases/
 EVENTBUS_VERSION=3.1.1
 EASYPERMISSIONS_VERSION=1.2.0
-SAGA_ANDROID_VERSION=1.0.3
+SAGA_ANDROID_VERSION=1.0.4
 JUNIT_VERSION=5.3.1
 KOTLIN_VERSION=1.5.31
 SAGA_GROUP=cn.sagacloud
 SYBOTAN_KOTLIN_VERSION=1.2.42
 android.useAndroidX=true
 LICENSE_NAME=The Apache Software License, Version 2.0
-SAGA_CODE=15
+SAGA_CODE=16
 MAVEN_REPO_SNAPSHOT_URL=http\://dev.dp.sagacloud.cn\:8082/repository/maven-snapshots/
 NEXUS_USERNAME=saga
 DEVELOPER_ID=Andy.Sybotan