From ec6193939600ca7930193b1d5942b1700baf9e06 Mon Sep 17 00:00:00 2001 From: zuoxiao <470321431@qq.com> Date: 星期五, 21 二月 2025 09:20:15 +0800 Subject: [PATCH] 1.巡检记录列表页的实现 2.巡检记录地图展示路径的详情页。 3.处理巡检记录详情页因打开同一个网址导致的webView不显示问题。 4.实现地图页搜索后的地图跳转功能。 5.巡检记录详情页数据加载的优化,默认加载本地数据,当本地没有数据时从服务端获取数据。 --- app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java | 316 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 300 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java index fb91e02..3ff4f31 100644 --- a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java +++ b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java @@ -1,36 +1,65 @@ package com.dayu.pipirrapp.activity; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; +import static com.dayu.pipirrapp.net.Constants.BASE_URL; + +import android.content.Context; +import android.content.Intent; import android.os.Bundle; -import android.provider.MediaStore; +import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.lifecycle.Observer; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; +import com.dayu.pipirrapp.MyApplication; import com.dayu.pipirrapp.adapter.AddPictureAdapter; +import com.dayu.pipirrapp.bean.db.LatLonBean; +import com.dayu.pipirrapp.bean.net.AddProcessingRequest; +import com.dayu.pipirrapp.bean.net.InsectionResult; +import com.dayu.pipirrapp.bean.net.UplodFileState; import com.dayu.pipirrapp.databinding.ActivityOrderDealBinding; +import com.dayu.pipirrapp.fragment.OrderFragment; +import com.dayu.pipirrapp.net.ApiManager; +import com.dayu.pipirrapp.net.BaseResponse; +import com.dayu.pipirrapp.net.subscribers.SubscriberListener; +import com.dayu.pipirrapp.tool.FileUploadUtils; import com.dayu.pipirrapp.tool.FullyGridLayoutManager; import com.dayu.pipirrapp.tool.GlideEngine; +import com.dayu.pipirrapp.tool.ImageFileCompressEngine; +import com.dayu.pipirrapp.utils.CommonKeyName; +import com.dayu.pipirrapp.utils.MyLog; +import com.dayu.pipirrapp.utils.ServiceUtils; +import com.dayu.pipirrapp.utils.ToastUtil; +import com.dayu.pipirrapp.view.TitleBar; +import com.jeremyliao.liveeventbus.LiveEventBus; +import com.loper7.date_time_picker.DateTimeConfig; +import com.loper7.date_time_picker.dialog.CardDatePickerDialog; import com.luck.picture.lib.basic.PictureSelectionModel; import com.luck.picture.lib.basic.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; import com.luck.picture.lib.config.SelectMimeType; -import com.luck.picture.lib.config.SelectModeConfig; import com.luck.picture.lib.decoration.GridSpacingItemDecoration; +import com.luck.picture.lib.engine.ImageEngine; import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.interfaces.OnGridItemSelectAnimListener; -import com.luck.picture.lib.interfaces.OnQueryFilterListener; -import com.luck.picture.lib.interfaces.OnSelectAnimListener; +import com.luck.picture.lib.entity.MediaExtraInfo; +import com.luck.picture.lib.interfaces.OnExternalPreviewEventListener; import com.luck.picture.lib.utils.DensityUtil; +import com.luck.picture.lib.utils.MediaUtils; +import com.luck.picture.lib.utils.PictureFileUtils; +import com.tencent.bugly.crashreport.CrashReport; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; + +import retrofit2.Call; /** * OrderDealDetailActivity - @@ -41,24 +70,70 @@ * @since 2024-11-27 */ public class OrderDealActivity extends BaseActivity { - + private final String TAG = "OrderDealActivity"; ActivityOrderDealBinding binding; RecyclerView mRecyclerView; AddPictureAdapter mAdapter; int maxSelectNum = 10;//鏈�澶х収鐗� int maxSelectVideoNum = 0;//鏈�澶ц棰� + int videoMaxSecond = 60; private final List<LocalMedia> mData = new ArrayList<>(); + private ActivityResultLauncher<Intent> launcherResult; + private ImageEngine imageEngine; + // List<UplodFileState> uplodFileStates = new ArrayList<>(); + Map<String, UplodFileState> uplodFileStates = new HashMap<>(); + String workOrderId; + LatLonBean latLonBean; + String strCompleteTime; + + /** + * 瀹氫綅鐩戝惉 + */ + private Observer<Object> locationObserver = new Observer<Object>() { + @Override + public void onChanged(Object o) { + MyLog.d("OrderDealActivity>>>locationObserver>>"); + latLonBean = (LatLonBean) o; + } + }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityOrderDealBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); + workOrderId = this.getIntent().getStringExtra("workOrderId"); + launcherResult = createActivityResultLauncher(); initView(); + startLocation(); } void initView() { + new TitleBar(this).setTitleText("澶勭悊宸ュ崟").setLeftIco().setLeftIcoListening(v -> OrderDealActivity.this.finish()); + binding.timeLL.setOnClickListener(v -> { + long time = System.currentTimeMillis(); + List<Integer> list = new ArrayList<>(); + list.add(DateTimeConfig.YEAR); + list.add(DateTimeConfig.MONTH); + list.add(DateTimeConfig.DAY); + list.add(DateTimeConfig.HOUR); + list.add(DateTimeConfig.MIN); + new CardDatePickerDialog.Builder(this) + .setTitle("閫夋嫨澶勭悊鏃堕棿") + .setOnChoose("纭畾", aLong -> { + //aLong = millisecond + strCompleteTime = com.dayu.pipirrapp.utils.DateUtils.formatTimestamp(aLong); + binding.timeData.setText(strCompleteTime); + return null; + }) + .showBackNow(true) + .setDefaultTime(time) + .setMaxTime(time) + .setMinTime(time - 365L * 24 * 60 * 60 * 1000) // 璁剧疆鏈�灏忔椂闂翠负涓�骞村墠 + .setDisplayType(list) + .build().show(); + }); mRecyclerView = binding.recycler; FullyGridLayoutManager manager = new FullyGridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false); @@ -69,33 +144,242 @@ } mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4, DensityUtil.dip2px(this, 8), false)); - mAdapter = new AddPictureAdapter(this, mData); + mAdapter = new AddPictureAdapter(this, mData, uplodFileStates); mAdapter.setSelectMax(maxSelectNum + maxSelectVideoNum); mRecyclerView.setAdapter(mAdapter); + imageEngine = GlideEngine.createGlideEngine(); mAdapter.setOnItemClickListener(new AddPictureAdapter.OnItemClickListener() { @Override public void onItemClick(View v, int position) { - + // 棰勮鍥剧墖銆佽棰戙�侀煶棰� + PictureSelector.create(OrderDealActivity.this) + .openPreview() + .setImageEngine(imageEngine) + .setExternalPreviewEventListener(new MyExternalPreviewEventListener()) + .startActivityPreview(position, true, mAdapter.getData()); } @Override public void openPicture() { + //娣诲姞鍥剧墖 mOpenPicture(); + } + + @Override + public void onDeleteClick(int position) { + deleteItem(position); + } + + @Override + public void onReUpload(UplodFileState uplodFileState) { + FileUploadUtils.uploadFile(OrderDealActivity.this, uplodFileState, uplodFileStates, mAdapter); + } + }); + binding.dealButton.setOnClickListener(v -> { + boolean isAllPost = true; + for (UplodFileState imgData : uplodFileStates.values()) { + if (imgData.getState() == 0) { + isAllPost = false; + } + } + + if (!TextUtils.isEmpty(binding.contentET.getText().toString())) { + if (isAllPost) { + if (uplodFileStates.size() > 0) { + postData(); + } else { + ToastUtil.showToast(OrderDealActivity.this, "璇蜂笂浼犲浘鐗�"); + } + } else { + ToastUtil.showToast(OrderDealActivity.this, "鍥剧墖姝e湪涓婁紶璇风◢鍚庢彁浜�"); + } + } else { + ToastUtil.showToast(OrderDealActivity.this, "璇疯緭鍏ュ弽棣堝唴瀹�"); } }); } + /** + * 娣诲姞鍥剧墖 + */ private void mOpenPicture() { // 杩涘叆鐩稿唽 PictureSelectionModel selectionModel = PictureSelector.create(this) - .openGallery(SelectMimeType.ofImage()) + .openGallery(SelectMimeType.ofAll()) .setMaxSelectNum(maxSelectNum) .setMaxVideoSelectNum(maxSelectVideoNum) - .setImageEngine(GlideEngine.createGlideEngine()) + .setImageEngine(imageEngine) + //璁剧疆鍥剧墖鍘嬬缉 + .setCompressEngine(new ImageFileCompressEngine()) + //璁剧疆瑙嗛鍥剧墖涓�璧峰湪鐩稿唽閫夋嫨 + .isWithSelectVideoImage(true) + //璁剧疆鏈�澶ц棰戞椂闀� + .setRecordVideoMaxSecond(videoMaxSecond) + // 杩囨护瑙嗛鏈�澶ф椂闀� + .setFilterVideoMaxSecond(videoMaxSecond) + // 鎷嶇収鏄惁绾犳鏃嬭浆鍥剧墖 + .isCameraRotateImage(true) .setSelectedData(mAdapter.getData()); - selectionModel.forResult(PictureConfig.CHOOSE_REQUEST); + selectionModel.forResult(launcherResult); + } + + /** + * 鍒涘缓涓�涓狝ctivityResultLauncher + * + * @return + */ + private ActivityResultLauncher<Intent> createActivityResultLauncher() { + return registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + result -> { + int resultCode = result.getResultCode(); + if (resultCode == RESULT_OK) { + ArrayList<LocalMedia> selectList = PictureSelector.obtainSelectorList(result.getData()); + analyticalSelectResults(selectList); + } else if (resultCode == RESULT_CANCELED) { + Log.i(TAG, "onActivityResult PictureSelector Cancel"); + } + }); + } + + /** + * 澶栭儴棰勮鐩戝惉浜嬩欢 + */ + private class MyExternalPreviewEventListener implements OnExternalPreviewEventListener { + + @Override + public void onPreviewDelete(int position) { + deleteItem(position); + mAdapter.remove(position); + mAdapter.notifyItemRemoved(position); + } + + @Override + public boolean onLongPressDownload(Context context, LocalMedia media) { + return false; + } + } + + /** + * 澶勭悊閫夋嫨缁撴灉 + * + * @param result + */ + private void analyticalSelectResults(ArrayList<LocalMedia> result) { + for (LocalMedia media : result) { + if (media.getWidth() == 0 || media.getHeight() == 0) { + if (PictureMimeType.isHasImage(media.getMimeType())) { + MediaExtraInfo imageExtraInfo = MediaUtils.getImageSize(this, media.getPath()); + media.setWidth(imageExtraInfo.getWidth()); + media.setHeight(imageExtraInfo.getHeight()); + } else if (PictureMimeType.isHasVideo(media.getMimeType())) { + MediaExtraInfo videoExtraInfo = MediaUtils.getVideoSize(this, media.getPath()); + media.setWidth(videoExtraInfo.getWidth()); + media.setHeight(videoExtraInfo.getHeight()); + } + } + Log.i(TAG, "鏂囦欢鍚�: " + media.getFileName()); + Log.i(TAG, "鏄惁鍘嬬缉:" + media.isCompressed()); + Log.i(TAG, "鍘嬬缉:" + media.getCompressPath()); + Log.i(TAG, "鍒濆璺緞:" + media.getPath()); + Log.i(TAG, "缁濆璺緞:" + media.getRealPath()); + Log.i(TAG, "鏄惁瑁佸壀:" + media.isCut()); + Log.i(TAG, "瑁佸壀璺緞:" + media.getCutPath()); + Log.i(TAG, "鏄惁寮�鍚師鍥�:" + media.isOriginal()); + Log.i(TAG, "鍘熷浘璺緞:" + media.getOriginalPath()); + Log.i(TAG, "娌欑洅璺緞:" + media.getSandboxPath()); + Log.i(TAG, "姘村嵃璺緞:" + media.getWatermarkPath()); + Log.i(TAG, "瑙嗛缂╃暐鍥�:" + media.getVideoThumbnailPath()); + Log.i(TAG, "鍘熷瀹介珮: " + media.getWidth() + "x" + media.getHeight()); + Log.i(TAG, "瑁佸壀瀹介珮: " + media.getCropImageWidth() + "x" + media.getCropImageHeight()); + Log.i(TAG, "鏂囦欢澶у皬: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize())); + Log.i(TAG, "鏂囦欢鏃堕暱: " + media.getDuration()); + Log.i(TAG, "鎵╁睍鍚�: " + media.getMimeType()); + FileUploadUtils.creatAndUploadFile(this, media, uplodFileStates, mAdapter); + } + // 鑾峰彇 result 涓病鏈夎�� uplodFileStates 涓湁鐨勫湴鍧� + FileUploadUtils.cancelRemovedUploads(result, uplodFileStates); + // 鏇存柊UI + FileUploadUtils.updateUI(result, mAdapter); } + + /** + * 涓婃姤澶勭悊缁撴灉 + */ + private void postData() { + AddProcessingRequest result = new AddProcessingRequest(); + result.setImages(uplodFileStates); + result.setContent(binding.contentET.getText().toString()); + result.setInspectorId(MyApplication.myApplication.userId); + result.setWorkOrderId(workOrderId); + result.setCompleteTime(strCompleteTime); + if (latLonBean != null) { + result.setLat(String.valueOf(latLonBean.getLatitude())); + result.setLng(String.valueOf(latLonBean.getLongitude())); + } + ApiManager.getInstance().requestPostHideLoading(this, BASE_URL + "/app/workOrder/addProcessingResult", InsectionResult.class, result.toMap(result), new SubscriberListener<BaseResponse<List<InsectionResult>>>() { + @Override + public void onNext(BaseResponse<List<InsectionResult>> t) { + try { + if (t.isSuccess()) { + ToastUtil.showToastLong(OrderDealActivity.this, "涓婃姤鎴愬姛"); + setResult(OrderFragment.RESULT_REFRESH); + OrderDealActivity.this.finish(); + } else { + + } + } catch (Exception e) { + e.printStackTrace(); + CrashReport.postCatchedException(e); + } + + } + }); + } + + /** + * 寮�濮嬪畾浣嶇浉鍏抽�昏緫 + */ + private void startLocation() { + ServiceUtils.startLocationService(this, true); + //鑾峰彇瀹氫綅鏈嶅姟浼犺繃鏉ョ殑鍧愭爣鐐� + LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver); + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver); + FileUploadUtils.cancelAllCall(uplodFileStates); + } + + /** + * 棰勮鍜屽浘鐗囧垪琛ㄥ垹闄ゅ浘鐗囨椂澶勭悊鍒犻櫎浜嬩欢 + */ + private void deleteItem(int position) { + LocalMedia localMedia = mAdapter.getData().get(position); + String path; + UplodFileState uplodFileState; + if (TextUtils.isEmpty(localMedia.getCompressPath())) { + uplodFileState = uplodFileStates.get(localMedia.getRealPath()); + } else { + uplodFileState = uplodFileStates.get(localMedia.getCompressPath()); + } + if (uplodFileState != null) { + path = uplodFileState.getFilePath(); + try { + Call mCall = uplodFileStates.get(path).getThisCall(); + if (mCall != null) { + mCall.cancel(); + MyLog.d("progressRequestBody>>>" + "cancel銆嬨�嬨�媝ath:" + path); + } + } catch (Exception e) { + e.printStackTrace(); + } + uplodFileStates.remove(path); + } + } } -- Gitblit v1.8.0