diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java new file mode 100644 index 0000000..4903490 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -0,0 +1,591 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseActivity; +import com.casic.dcms.bean.CaseDetailBean; +import com.casic.dcms.bean.CaseLargeClassBean; +import com.casic.dcms.bean.CaseSmallClassBean; +import com.casic.dcms.bean.SubmitResultBean; +import com.casic.dcms.bean.UploadResultBean; +import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseLargeClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSmallClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseDetailView; +import com.casic.dcms.mvp.view.ICaseLargeClassView; +import com.casic.dcms.mvp.view.ICaseSmallClassView; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.ColorHelper; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StatusBarColorUtil; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.google.gson.Gson; +import com.gyf.immersionbar.ImmersionBar; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + +public class CaseVerifyDetailActivity extends BaseActivity implements ICaseDetailView, View.OnClickListener, + ICaseLargeClassView, ICaseSmallClassView, IUploadFileView, ICaseSubmitCaseView { + + private static final String TAG = "CaseVerifyDetail"; + private Context context = this; + @BindView(R.id.leftBackView) + ImageView leftBackView; + @BindView(R.id.caseNumberView) + TextView caseNumberView; + @BindView(R.id.caseTypeView) + TextView caseTypeView; + @BindView(R.id.caseLargeTypeView) + TextView caseLargeTypeView; + @BindView(R.id.caseSmallTypeView) + TextView caseSmallTypeView; + @BindView(R.id.caseCommunityView) + TextView caseCommunityView; + @BindView(R.id.casePlaceView) + TextView casePlaceView; + @BindView(R.id.caseSituationView) + EditText caseSituationView; + @BindView(R.id.caseHandleView) + EditText caseHandleView; + @BindView(R.id.caseStartTimeView) + TextView caseStartTimeView; + @BindView(R.id.caseEndTimeView) + TextView caseEndTimeView; + @BindView(R.id.casePicRecyclerView) + RecyclerView casePicRecyclerView; + @BindView(R.id.emptyImageView) + TextView emptyImageView; + @BindView(R.id.caseAudioView) + TextView caseAudioView; + @BindView(R.id.videoPlayerView) + JCVideoPlayerStandard videoPlayerView; + @BindView(R.id.emptyVideoView) + TextView emptyVideoView; + @BindView(R.id.caseOpinionView) + EditText caseOpinionView; + @BindView(R.id.caseConditionView) + Spinner caseConditionView; + @BindView(R.id.caseVerifyRecyclerView) + RecyclerView caseVerifyRecyclerView; + @BindView(R.id.addImageView) + ImageView addImageView; + + private CaseDetailPresenterImpl caseDetailPresenter; + private Gson gson; + private CaseLargeClassPresenterImpl caseLargeClassPresenter; + private List largeClassBeans; + private CaseSmallClassPresenterImpl caseSmallClassPresenter; + private List smallClassBeans; + private String eorc; + private String typeCode; + private String typeDetailCode; + private MediaPlayer mediaPlayer; + private UploadImagePresenterImpl uploadImagePresenter; + private QMUITipDialog submitDialog; + private List realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private CaseSubmitPresenterImpl caseSubmitPresenter; + + @Override + public int initLayoutView() { + return R.layout.activity_case_verify_detail; + } + + @Override + protected void setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)); + ImmersionBar.with(this).statusBarDarkFont(false).init(); + leftBackView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + gson = new Gson(); + mediaPlayer = new MediaPlayer(); + largeClassBeans = new ArrayList<>(); + smallClassBeans = new ArrayList<>(); + + String id = getIntent().getStringExtra("id"); + caseDetailPresenter = new CaseDetailPresenterImpl(this); + caseDetailPresenter.onReadyRetrofitRequest(id); + caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); + caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); + uploadImagePresenter = new UploadImagePresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + } + + @Override + public void initEvent() { + ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Constant.CATEGORY); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + caseConditionView.setAdapter(spinnerAdapter); + } + + @Override + public void obtainCaseDetailData(CaseDetailBean resultBean) { +// Log.d(TAG, "obtainCaseDetailData: " + gson.toJson(resultBean)); + if (resultBean.isSuccess()) { + CaseDetailBean.DataBean data = resultBean.getData().get(0); + caseNumberView.setText(data.getCaseid()); + caseTypeView.setText(data.getEorcName()); + caseLargeTypeView.setText(data.getCasetypeName()); + caseSmallTypeView.setText(data.getCasetypeDetailName()); + caseCommunityView.setText(data.getCommunityName()); + casePlaceView.setText(data.getFieldintro()); + caseStartTimeView.setText(data.getCreateTime()); + caseEndTimeView.setText(data.getNodeLimittime()); + caseSituationView.setText(data.getDescription()); + + //图片 + String images = data.getFileIdVerify(); + if (!TextUtils.isEmpty(images)) { + List urls = new ArrayList<>(); + String[] split = images.split(","); + for (String s : split) { + urls.add(StringHelper.appendCompleteURL(s)); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(urls); + casePicRecyclerView.setVisibility(View.VISIBLE); + casePicRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + casePicRecyclerView.addItemDecoration(new ItemDecorationSpace()); + casePicRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(urls.get(position)); + } + }); + imageAdapter.setDeleteView(false); + } else { + emptyImageView.setVisibility(View.VISIBLE); + emptyImageView.setText("该案卷无图片材料"); + emptyImageView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + + //音频 + String audioFile = data.getAudioIdVerify(); + if (TextUtils.isEmpty(audioFile)) { + caseAudioView.setText("该案卷无音频材料"); + caseAudioView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } else { + String audioUrl; + if (audioFile.contains(",")) { + audioUrl = StringHelper.appendCompleteURL(audioFile.split(",")[0]); + } else { + audioUrl = StringHelper.appendCompleteURL(audioFile); + } + caseAudioView.setText("播放音频材料"); + caseAudioView.setTextColor(ColorHelper.getResourcesColor(this, R.color.mainThemeColor)); + try { + mediaPlayer.setDataSource(audioUrl); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.prepareAsync(); + } catch (IOException e) { + e.printStackTrace(); + } + caseAudioView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } + } + }); + } + + //视频 + String videoFile = data.getVideoIdVerify(); + if (!TextUtils.isEmpty(audioFile)) { + videoPlayerView.setVisibility(View.VISIBLE); + String videoUrl; + if (videoFile.contains(",")) { + videoUrl = StringHelper.appendCompleteURL(videoFile.split(",")[0]); + } else { + videoUrl = StringHelper.appendCompleteURL(videoFile); + } + videoPlayerView.setUp(videoUrl, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); + //设置第一帧为封面 + Glide.with(this) + .setDefaultRequestOptions(new RequestOptions().frame(4000000)) + .load(videoUrl) + .into(videoPlayerView.thumbImageView); + } else { + emptyVideoView.setVisibility(View.VISIBLE); + emptyVideoView.setText("该案卷无视频材料"); + emptyVideoView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + } + } + + private void showBigImage(String path) { + Intent intent = new Intent(this, BigPictureActivity.class); + intent.putExtra("path", path); + startActivity(intent); + } + + @OnClick({R.id.caseClassLayout, R.id.caseLargeClassLayout, R.id.caseSmallClassLayout, R.id.locationMapView, R.id.addImageView}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.caseClassLayout: + new QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("案卷类型") + .addItem("事件") + .addItem("部件") + .setGravityCenter(true) + .setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + caseTypeView.setText(tag); + //获取案卷大类 + caseLargeClassPresenter.onReadyRetrofitRequest(String.valueOf(position + 1)); + } + }).build().show(); + break; + case R.id.caseLargeClassLayout: + if (largeClassBeans != null) { + if (largeClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷大类"); + for (CaseLargeClassBean.DataBean dataBean : largeClassBeans) { + sheetBuilder.addItem(dataBean.getTypeName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeCode = largeClassBeans.get(position).getTypeCode(); + + caseLargeTypeView.setText(tag); + + //获取案卷小类 + CaseLargeClassBean.DataBean dataBean = largeClassBeans.get(position); + eorc = dataBean.getEorc(); + String typeId = dataBean.getId(); + caseSmallClassPresenter.onReadyRetrofitRequest(eorc, typeId); + } + }).build().show(); + } + } + break; + case R.id.caseSmallClassLayout: + if (smallClassBeans != null) { + if (smallClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷小类"); + for (CaseSmallClassBean.DataBean dataBean : smallClassBeans) { + sheetBuilder.addItem(dataBean.getTypeDetailName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeDetailCode = smallClassBeans.get(position).getTypeDetailCode(); + + caseSmallTypeView.setText(tag); + } + }).build().show(); + } + } + break; + case R.id.locationMapView: + //根据情况加载不同图层 + String type = caseTypeView.getText().toString(); + if (type.equals("请选择")) { + ToastHelper.showToast("请先选择案卷类型", ToastHelper.WARING); + return; + } + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", type); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .create().show(); + break; + case R.id.submitButton: + submitCase();//案卷提交 + break; + default: + break; + } + } + + private void submitCase() { +// String longitude = longitudeView.getText().toString(); +// String latitude = latitudeView.getText().toString(); +// +// String fieldIntro = caseLocationView.getText().toString(); +// if (TextUtils.isEmpty(fieldIntro)) { +// ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); +// } +// String description = caseDetailEditView.getText().toString(); +// if (TextUtils.isEmpty(description)) { +// ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); +// } + if (mediaList.size() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } +// caseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, +// "1", "1", eorc, typeCode, typeDetailCode, +// gridId.substring(0, 6), +// gridId.substring(0, 9), +// communityNameView.getText().toString(), +// gridId, description, fieldIntro, +// gson.toJson(mediaList), 0, 0); + } + + @Override + public void obtainLargeClassData(CaseLargeClassBean largeClassBean) { + if (largeClassBean.isSuccess()) { + //设置大类数据 + this.largeClassBeans = largeClassBean.getData(); + if (largeClassBeans.size() == 0) { + caseLargeTypeView.setText("无小类"); + } else { + caseLargeTypeView.setText(largeClassBeans.get(0).getTypeName());//默认选择第一个 + } + caseSmallTypeView.setText("请选择"); + } + } + + @Override + public void obtainSmallClassData(CaseSmallClassBean smallClassBean) { + if (smallClassBean.isSuccess()) { + //设置大类数据 + this.smallClassBeans = smallClassBean.getData(); + if (smallClassBeans.size() == 0) { + caseSmallTypeView.setText("无小类"); + } else { + caseSmallTypeView.setText(smallClassBeans.get(0).getTypeDetailName());//默认选择第一个 + } + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } +// gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String casePlace = data.getStringExtra("pos"); + caseCommunityView.setText(community); + if (TextUtils.isEmpty(casePlace)) { + casePlaceView.setText(community); + } else { + casePlaceView.setText(casePlace); + } + SaveKeyValues.removeKey("CommunityName"); + break; + default: + break; + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (caseDetailPresenter != null) { + caseDetailPresenter.disposeRetrofitRequest(); + } + if (caseLargeClassPresenter != null) { + caseLargeClassPresenter.disposeRetrofitRequest(); + } + if (caseSmallClassPresenter != null) { + caseSmallClassPresenter.disposeRetrofitRequest(); + } + if (caseSubmitPresenter != null) { + caseSubmitPresenter.disposeRetrofitRequest(); + } + if (uploadImagePresenter != null) { + uploadImagePresenter.disposeRetrofitRequest(); + } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.hide(); + } + + @Override + public void obtainSubmitResult(SubmitResultBean resultBean) { + + } + + @Override + public void obtainUploadAudioResult(UploadResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(UploadResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(realPaths); + caseVerifyRecyclerView.setVisibility(View.VISIBLE); + caseVerifyRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + caseVerifyRecyclerView.addItemDecoration(new ItemDecorationSpace()); + caseVerifyRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(realPaths.get(position)); + } + }); + //删除按钮点击事件 + imageAdapter.setDeleteView(true); + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + @Override + public void obtainUploadVideoResult(UploadResultBean resultBean) { + + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java new file mode 100644 index 0000000..4903490 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -0,0 +1,591 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseActivity; +import com.casic.dcms.bean.CaseDetailBean; +import com.casic.dcms.bean.CaseLargeClassBean; +import com.casic.dcms.bean.CaseSmallClassBean; +import com.casic.dcms.bean.SubmitResultBean; +import com.casic.dcms.bean.UploadResultBean; +import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseLargeClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSmallClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseDetailView; +import com.casic.dcms.mvp.view.ICaseLargeClassView; +import com.casic.dcms.mvp.view.ICaseSmallClassView; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.ColorHelper; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StatusBarColorUtil; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.google.gson.Gson; +import com.gyf.immersionbar.ImmersionBar; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + +public class CaseVerifyDetailActivity extends BaseActivity implements ICaseDetailView, View.OnClickListener, + ICaseLargeClassView, ICaseSmallClassView, IUploadFileView, ICaseSubmitCaseView { + + private static final String TAG = "CaseVerifyDetail"; + private Context context = this; + @BindView(R.id.leftBackView) + ImageView leftBackView; + @BindView(R.id.caseNumberView) + TextView caseNumberView; + @BindView(R.id.caseTypeView) + TextView caseTypeView; + @BindView(R.id.caseLargeTypeView) + TextView caseLargeTypeView; + @BindView(R.id.caseSmallTypeView) + TextView caseSmallTypeView; + @BindView(R.id.caseCommunityView) + TextView caseCommunityView; + @BindView(R.id.casePlaceView) + TextView casePlaceView; + @BindView(R.id.caseSituationView) + EditText caseSituationView; + @BindView(R.id.caseHandleView) + EditText caseHandleView; + @BindView(R.id.caseStartTimeView) + TextView caseStartTimeView; + @BindView(R.id.caseEndTimeView) + TextView caseEndTimeView; + @BindView(R.id.casePicRecyclerView) + RecyclerView casePicRecyclerView; + @BindView(R.id.emptyImageView) + TextView emptyImageView; + @BindView(R.id.caseAudioView) + TextView caseAudioView; + @BindView(R.id.videoPlayerView) + JCVideoPlayerStandard videoPlayerView; + @BindView(R.id.emptyVideoView) + TextView emptyVideoView; + @BindView(R.id.caseOpinionView) + EditText caseOpinionView; + @BindView(R.id.caseConditionView) + Spinner caseConditionView; + @BindView(R.id.caseVerifyRecyclerView) + RecyclerView caseVerifyRecyclerView; + @BindView(R.id.addImageView) + ImageView addImageView; + + private CaseDetailPresenterImpl caseDetailPresenter; + private Gson gson; + private CaseLargeClassPresenterImpl caseLargeClassPresenter; + private List largeClassBeans; + private CaseSmallClassPresenterImpl caseSmallClassPresenter; + private List smallClassBeans; + private String eorc; + private String typeCode; + private String typeDetailCode; + private MediaPlayer mediaPlayer; + private UploadImagePresenterImpl uploadImagePresenter; + private QMUITipDialog submitDialog; + private List realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private CaseSubmitPresenterImpl caseSubmitPresenter; + + @Override + public int initLayoutView() { + return R.layout.activity_case_verify_detail; + } + + @Override + protected void setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)); + ImmersionBar.with(this).statusBarDarkFont(false).init(); + leftBackView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + gson = new Gson(); + mediaPlayer = new MediaPlayer(); + largeClassBeans = new ArrayList<>(); + smallClassBeans = new ArrayList<>(); + + String id = getIntent().getStringExtra("id"); + caseDetailPresenter = new CaseDetailPresenterImpl(this); + caseDetailPresenter.onReadyRetrofitRequest(id); + caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); + caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); + uploadImagePresenter = new UploadImagePresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + } + + @Override + public void initEvent() { + ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Constant.CATEGORY); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + caseConditionView.setAdapter(spinnerAdapter); + } + + @Override + public void obtainCaseDetailData(CaseDetailBean resultBean) { +// Log.d(TAG, "obtainCaseDetailData: " + gson.toJson(resultBean)); + if (resultBean.isSuccess()) { + CaseDetailBean.DataBean data = resultBean.getData().get(0); + caseNumberView.setText(data.getCaseid()); + caseTypeView.setText(data.getEorcName()); + caseLargeTypeView.setText(data.getCasetypeName()); + caseSmallTypeView.setText(data.getCasetypeDetailName()); + caseCommunityView.setText(data.getCommunityName()); + casePlaceView.setText(data.getFieldintro()); + caseStartTimeView.setText(data.getCreateTime()); + caseEndTimeView.setText(data.getNodeLimittime()); + caseSituationView.setText(data.getDescription()); + + //图片 + String images = data.getFileIdVerify(); + if (!TextUtils.isEmpty(images)) { + List urls = new ArrayList<>(); + String[] split = images.split(","); + for (String s : split) { + urls.add(StringHelper.appendCompleteURL(s)); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(urls); + casePicRecyclerView.setVisibility(View.VISIBLE); + casePicRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + casePicRecyclerView.addItemDecoration(new ItemDecorationSpace()); + casePicRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(urls.get(position)); + } + }); + imageAdapter.setDeleteView(false); + } else { + emptyImageView.setVisibility(View.VISIBLE); + emptyImageView.setText("该案卷无图片材料"); + emptyImageView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + + //音频 + String audioFile = data.getAudioIdVerify(); + if (TextUtils.isEmpty(audioFile)) { + caseAudioView.setText("该案卷无音频材料"); + caseAudioView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } else { + String audioUrl; + if (audioFile.contains(",")) { + audioUrl = StringHelper.appendCompleteURL(audioFile.split(",")[0]); + } else { + audioUrl = StringHelper.appendCompleteURL(audioFile); + } + caseAudioView.setText("播放音频材料"); + caseAudioView.setTextColor(ColorHelper.getResourcesColor(this, R.color.mainThemeColor)); + try { + mediaPlayer.setDataSource(audioUrl); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.prepareAsync(); + } catch (IOException e) { + e.printStackTrace(); + } + caseAudioView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } + } + }); + } + + //视频 + String videoFile = data.getVideoIdVerify(); + if (!TextUtils.isEmpty(audioFile)) { + videoPlayerView.setVisibility(View.VISIBLE); + String videoUrl; + if (videoFile.contains(",")) { + videoUrl = StringHelper.appendCompleteURL(videoFile.split(",")[0]); + } else { + videoUrl = StringHelper.appendCompleteURL(videoFile); + } + videoPlayerView.setUp(videoUrl, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); + //设置第一帧为封面 + Glide.with(this) + .setDefaultRequestOptions(new RequestOptions().frame(4000000)) + .load(videoUrl) + .into(videoPlayerView.thumbImageView); + } else { + emptyVideoView.setVisibility(View.VISIBLE); + emptyVideoView.setText("该案卷无视频材料"); + emptyVideoView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + } + } + + private void showBigImage(String path) { + Intent intent = new Intent(this, BigPictureActivity.class); + intent.putExtra("path", path); + startActivity(intent); + } + + @OnClick({R.id.caseClassLayout, R.id.caseLargeClassLayout, R.id.caseSmallClassLayout, R.id.locationMapView, R.id.addImageView}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.caseClassLayout: + new QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("案卷类型") + .addItem("事件") + .addItem("部件") + .setGravityCenter(true) + .setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + caseTypeView.setText(tag); + //获取案卷大类 + caseLargeClassPresenter.onReadyRetrofitRequest(String.valueOf(position + 1)); + } + }).build().show(); + break; + case R.id.caseLargeClassLayout: + if (largeClassBeans != null) { + if (largeClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷大类"); + for (CaseLargeClassBean.DataBean dataBean : largeClassBeans) { + sheetBuilder.addItem(dataBean.getTypeName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeCode = largeClassBeans.get(position).getTypeCode(); + + caseLargeTypeView.setText(tag); + + //获取案卷小类 + CaseLargeClassBean.DataBean dataBean = largeClassBeans.get(position); + eorc = dataBean.getEorc(); + String typeId = dataBean.getId(); + caseSmallClassPresenter.onReadyRetrofitRequest(eorc, typeId); + } + }).build().show(); + } + } + break; + case R.id.caseSmallClassLayout: + if (smallClassBeans != null) { + if (smallClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷小类"); + for (CaseSmallClassBean.DataBean dataBean : smallClassBeans) { + sheetBuilder.addItem(dataBean.getTypeDetailName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeDetailCode = smallClassBeans.get(position).getTypeDetailCode(); + + caseSmallTypeView.setText(tag); + } + }).build().show(); + } + } + break; + case R.id.locationMapView: + //根据情况加载不同图层 + String type = caseTypeView.getText().toString(); + if (type.equals("请选择")) { + ToastHelper.showToast("请先选择案卷类型", ToastHelper.WARING); + return; + } + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", type); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .create().show(); + break; + case R.id.submitButton: + submitCase();//案卷提交 + break; + default: + break; + } + } + + private void submitCase() { +// String longitude = longitudeView.getText().toString(); +// String latitude = latitudeView.getText().toString(); +// +// String fieldIntro = caseLocationView.getText().toString(); +// if (TextUtils.isEmpty(fieldIntro)) { +// ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); +// } +// String description = caseDetailEditView.getText().toString(); +// if (TextUtils.isEmpty(description)) { +// ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); +// } + if (mediaList.size() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } +// caseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, +// "1", "1", eorc, typeCode, typeDetailCode, +// gridId.substring(0, 6), +// gridId.substring(0, 9), +// communityNameView.getText().toString(), +// gridId, description, fieldIntro, +// gson.toJson(mediaList), 0, 0); + } + + @Override + public void obtainLargeClassData(CaseLargeClassBean largeClassBean) { + if (largeClassBean.isSuccess()) { + //设置大类数据 + this.largeClassBeans = largeClassBean.getData(); + if (largeClassBeans.size() == 0) { + caseLargeTypeView.setText("无小类"); + } else { + caseLargeTypeView.setText(largeClassBeans.get(0).getTypeName());//默认选择第一个 + } + caseSmallTypeView.setText("请选择"); + } + } + + @Override + public void obtainSmallClassData(CaseSmallClassBean smallClassBean) { + if (smallClassBean.isSuccess()) { + //设置大类数据 + this.smallClassBeans = smallClassBean.getData(); + if (smallClassBeans.size() == 0) { + caseSmallTypeView.setText("无小类"); + } else { + caseSmallTypeView.setText(smallClassBeans.get(0).getTypeDetailName());//默认选择第一个 + } + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } +// gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String casePlace = data.getStringExtra("pos"); + caseCommunityView.setText(community); + if (TextUtils.isEmpty(casePlace)) { + casePlaceView.setText(community); + } else { + casePlaceView.setText(casePlace); + } + SaveKeyValues.removeKey("CommunityName"); + break; + default: + break; + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (caseDetailPresenter != null) { + caseDetailPresenter.disposeRetrofitRequest(); + } + if (caseLargeClassPresenter != null) { + caseLargeClassPresenter.disposeRetrofitRequest(); + } + if (caseSmallClassPresenter != null) { + caseSmallClassPresenter.disposeRetrofitRequest(); + } + if (caseSubmitPresenter != null) { + caseSubmitPresenter.disposeRetrofitRequest(); + } + if (uploadImagePresenter != null) { + uploadImagePresenter.disposeRetrofitRequest(); + } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.hide(); + } + + @Override + public void obtainSubmitResult(SubmitResultBean resultBean) { + + } + + @Override + public void obtainUploadAudioResult(UploadResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(UploadResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(realPaths); + caseVerifyRecyclerView.setVisibility(View.VISIBLE); + caseVerifyRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + caseVerifyRecyclerView.addItemDecoration(new ItemDecorationSpace()); + caseVerifyRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(realPaths.get(position)); + } + }); + //删除按钮点击事件 + imageAdapter.setDeleteView(true); + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + @Override + public void obtainUploadVideoResult(UploadResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java index 891b7a3..ea69349 100644 --- a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java @@ -106,10 +106,6 @@ PublicKey publicKey = RSAUtils.keyStrToPublicKey(TokenHelper.getPublicKey()); String oldPassKey = RSAUtils.encryptDataByPublicKey(oldPassword.getBytes(), publicKey); String newPassKey = RSAUtils.encryptDataByPublicKey(newPassword.getBytes(), publicKey); - -// ChangeNewPasswordBean passwordBean = new ChangeNewPasswordBean(); -// passwordBean.setOldPwd(oldPassKey.replace("=\n", "=")); -// passwordBean.setNewPwd(newPassKey.replace("=\n", "=")); changePasswordPresenter.onReadyRetrofitRequest(oldPassKey, newPassKey); } @@ -117,7 +113,7 @@ public void obtainChangePassResult(ChangePasswordResultBean resultBean) { Log.d(TAG, "obtainChangePassResult: " + new Gson().toJson(resultBean)); if (resultBean.isSuccess()) { - ToastHelper.showToast("密码修改成功", ToastHelper.WARING); + ToastHelper.showToast("密码修改成功", ToastHelper.SUCCESS); finish(); } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java new file mode 100644 index 0000000..4903490 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -0,0 +1,591 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseActivity; +import com.casic.dcms.bean.CaseDetailBean; +import com.casic.dcms.bean.CaseLargeClassBean; +import com.casic.dcms.bean.CaseSmallClassBean; +import com.casic.dcms.bean.SubmitResultBean; +import com.casic.dcms.bean.UploadResultBean; +import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseLargeClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSmallClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseDetailView; +import com.casic.dcms.mvp.view.ICaseLargeClassView; +import com.casic.dcms.mvp.view.ICaseSmallClassView; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.ColorHelper; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StatusBarColorUtil; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.google.gson.Gson; +import com.gyf.immersionbar.ImmersionBar; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + +public class CaseVerifyDetailActivity extends BaseActivity implements ICaseDetailView, View.OnClickListener, + ICaseLargeClassView, ICaseSmallClassView, IUploadFileView, ICaseSubmitCaseView { + + private static final String TAG = "CaseVerifyDetail"; + private Context context = this; + @BindView(R.id.leftBackView) + ImageView leftBackView; + @BindView(R.id.caseNumberView) + TextView caseNumberView; + @BindView(R.id.caseTypeView) + TextView caseTypeView; + @BindView(R.id.caseLargeTypeView) + TextView caseLargeTypeView; + @BindView(R.id.caseSmallTypeView) + TextView caseSmallTypeView; + @BindView(R.id.caseCommunityView) + TextView caseCommunityView; + @BindView(R.id.casePlaceView) + TextView casePlaceView; + @BindView(R.id.caseSituationView) + EditText caseSituationView; + @BindView(R.id.caseHandleView) + EditText caseHandleView; + @BindView(R.id.caseStartTimeView) + TextView caseStartTimeView; + @BindView(R.id.caseEndTimeView) + TextView caseEndTimeView; + @BindView(R.id.casePicRecyclerView) + RecyclerView casePicRecyclerView; + @BindView(R.id.emptyImageView) + TextView emptyImageView; + @BindView(R.id.caseAudioView) + TextView caseAudioView; + @BindView(R.id.videoPlayerView) + JCVideoPlayerStandard videoPlayerView; + @BindView(R.id.emptyVideoView) + TextView emptyVideoView; + @BindView(R.id.caseOpinionView) + EditText caseOpinionView; + @BindView(R.id.caseConditionView) + Spinner caseConditionView; + @BindView(R.id.caseVerifyRecyclerView) + RecyclerView caseVerifyRecyclerView; + @BindView(R.id.addImageView) + ImageView addImageView; + + private CaseDetailPresenterImpl caseDetailPresenter; + private Gson gson; + private CaseLargeClassPresenterImpl caseLargeClassPresenter; + private List largeClassBeans; + private CaseSmallClassPresenterImpl caseSmallClassPresenter; + private List smallClassBeans; + private String eorc; + private String typeCode; + private String typeDetailCode; + private MediaPlayer mediaPlayer; + private UploadImagePresenterImpl uploadImagePresenter; + private QMUITipDialog submitDialog; + private List realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private CaseSubmitPresenterImpl caseSubmitPresenter; + + @Override + public int initLayoutView() { + return R.layout.activity_case_verify_detail; + } + + @Override + protected void setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)); + ImmersionBar.with(this).statusBarDarkFont(false).init(); + leftBackView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + gson = new Gson(); + mediaPlayer = new MediaPlayer(); + largeClassBeans = new ArrayList<>(); + smallClassBeans = new ArrayList<>(); + + String id = getIntent().getStringExtra("id"); + caseDetailPresenter = new CaseDetailPresenterImpl(this); + caseDetailPresenter.onReadyRetrofitRequest(id); + caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); + caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); + uploadImagePresenter = new UploadImagePresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + } + + @Override + public void initEvent() { + ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Constant.CATEGORY); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + caseConditionView.setAdapter(spinnerAdapter); + } + + @Override + public void obtainCaseDetailData(CaseDetailBean resultBean) { +// Log.d(TAG, "obtainCaseDetailData: " + gson.toJson(resultBean)); + if (resultBean.isSuccess()) { + CaseDetailBean.DataBean data = resultBean.getData().get(0); + caseNumberView.setText(data.getCaseid()); + caseTypeView.setText(data.getEorcName()); + caseLargeTypeView.setText(data.getCasetypeName()); + caseSmallTypeView.setText(data.getCasetypeDetailName()); + caseCommunityView.setText(data.getCommunityName()); + casePlaceView.setText(data.getFieldintro()); + caseStartTimeView.setText(data.getCreateTime()); + caseEndTimeView.setText(data.getNodeLimittime()); + caseSituationView.setText(data.getDescription()); + + //图片 + String images = data.getFileIdVerify(); + if (!TextUtils.isEmpty(images)) { + List urls = new ArrayList<>(); + String[] split = images.split(","); + for (String s : split) { + urls.add(StringHelper.appendCompleteURL(s)); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(urls); + casePicRecyclerView.setVisibility(View.VISIBLE); + casePicRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + casePicRecyclerView.addItemDecoration(new ItemDecorationSpace()); + casePicRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(urls.get(position)); + } + }); + imageAdapter.setDeleteView(false); + } else { + emptyImageView.setVisibility(View.VISIBLE); + emptyImageView.setText("该案卷无图片材料"); + emptyImageView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + + //音频 + String audioFile = data.getAudioIdVerify(); + if (TextUtils.isEmpty(audioFile)) { + caseAudioView.setText("该案卷无音频材料"); + caseAudioView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } else { + String audioUrl; + if (audioFile.contains(",")) { + audioUrl = StringHelper.appendCompleteURL(audioFile.split(",")[0]); + } else { + audioUrl = StringHelper.appendCompleteURL(audioFile); + } + caseAudioView.setText("播放音频材料"); + caseAudioView.setTextColor(ColorHelper.getResourcesColor(this, R.color.mainThemeColor)); + try { + mediaPlayer.setDataSource(audioUrl); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.prepareAsync(); + } catch (IOException e) { + e.printStackTrace(); + } + caseAudioView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } + } + }); + } + + //视频 + String videoFile = data.getVideoIdVerify(); + if (!TextUtils.isEmpty(audioFile)) { + videoPlayerView.setVisibility(View.VISIBLE); + String videoUrl; + if (videoFile.contains(",")) { + videoUrl = StringHelper.appendCompleteURL(videoFile.split(",")[0]); + } else { + videoUrl = StringHelper.appendCompleteURL(videoFile); + } + videoPlayerView.setUp(videoUrl, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); + //设置第一帧为封面 + Glide.with(this) + .setDefaultRequestOptions(new RequestOptions().frame(4000000)) + .load(videoUrl) + .into(videoPlayerView.thumbImageView); + } else { + emptyVideoView.setVisibility(View.VISIBLE); + emptyVideoView.setText("该案卷无视频材料"); + emptyVideoView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + } + } + + private void showBigImage(String path) { + Intent intent = new Intent(this, BigPictureActivity.class); + intent.putExtra("path", path); + startActivity(intent); + } + + @OnClick({R.id.caseClassLayout, R.id.caseLargeClassLayout, R.id.caseSmallClassLayout, R.id.locationMapView, R.id.addImageView}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.caseClassLayout: + new QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("案卷类型") + .addItem("事件") + .addItem("部件") + .setGravityCenter(true) + .setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + caseTypeView.setText(tag); + //获取案卷大类 + caseLargeClassPresenter.onReadyRetrofitRequest(String.valueOf(position + 1)); + } + }).build().show(); + break; + case R.id.caseLargeClassLayout: + if (largeClassBeans != null) { + if (largeClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷大类"); + for (CaseLargeClassBean.DataBean dataBean : largeClassBeans) { + sheetBuilder.addItem(dataBean.getTypeName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeCode = largeClassBeans.get(position).getTypeCode(); + + caseLargeTypeView.setText(tag); + + //获取案卷小类 + CaseLargeClassBean.DataBean dataBean = largeClassBeans.get(position); + eorc = dataBean.getEorc(); + String typeId = dataBean.getId(); + caseSmallClassPresenter.onReadyRetrofitRequest(eorc, typeId); + } + }).build().show(); + } + } + break; + case R.id.caseSmallClassLayout: + if (smallClassBeans != null) { + if (smallClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷小类"); + for (CaseSmallClassBean.DataBean dataBean : smallClassBeans) { + sheetBuilder.addItem(dataBean.getTypeDetailName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeDetailCode = smallClassBeans.get(position).getTypeDetailCode(); + + caseSmallTypeView.setText(tag); + } + }).build().show(); + } + } + break; + case R.id.locationMapView: + //根据情况加载不同图层 + String type = caseTypeView.getText().toString(); + if (type.equals("请选择")) { + ToastHelper.showToast("请先选择案卷类型", ToastHelper.WARING); + return; + } + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", type); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .create().show(); + break; + case R.id.submitButton: + submitCase();//案卷提交 + break; + default: + break; + } + } + + private void submitCase() { +// String longitude = longitudeView.getText().toString(); +// String latitude = latitudeView.getText().toString(); +// +// String fieldIntro = caseLocationView.getText().toString(); +// if (TextUtils.isEmpty(fieldIntro)) { +// ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); +// } +// String description = caseDetailEditView.getText().toString(); +// if (TextUtils.isEmpty(description)) { +// ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); +// } + if (mediaList.size() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } +// caseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, +// "1", "1", eorc, typeCode, typeDetailCode, +// gridId.substring(0, 6), +// gridId.substring(0, 9), +// communityNameView.getText().toString(), +// gridId, description, fieldIntro, +// gson.toJson(mediaList), 0, 0); + } + + @Override + public void obtainLargeClassData(CaseLargeClassBean largeClassBean) { + if (largeClassBean.isSuccess()) { + //设置大类数据 + this.largeClassBeans = largeClassBean.getData(); + if (largeClassBeans.size() == 0) { + caseLargeTypeView.setText("无小类"); + } else { + caseLargeTypeView.setText(largeClassBeans.get(0).getTypeName());//默认选择第一个 + } + caseSmallTypeView.setText("请选择"); + } + } + + @Override + public void obtainSmallClassData(CaseSmallClassBean smallClassBean) { + if (smallClassBean.isSuccess()) { + //设置大类数据 + this.smallClassBeans = smallClassBean.getData(); + if (smallClassBeans.size() == 0) { + caseSmallTypeView.setText("无小类"); + } else { + caseSmallTypeView.setText(smallClassBeans.get(0).getTypeDetailName());//默认选择第一个 + } + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } +// gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String casePlace = data.getStringExtra("pos"); + caseCommunityView.setText(community); + if (TextUtils.isEmpty(casePlace)) { + casePlaceView.setText(community); + } else { + casePlaceView.setText(casePlace); + } + SaveKeyValues.removeKey("CommunityName"); + break; + default: + break; + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (caseDetailPresenter != null) { + caseDetailPresenter.disposeRetrofitRequest(); + } + if (caseLargeClassPresenter != null) { + caseLargeClassPresenter.disposeRetrofitRequest(); + } + if (caseSmallClassPresenter != null) { + caseSmallClassPresenter.disposeRetrofitRequest(); + } + if (caseSubmitPresenter != null) { + caseSubmitPresenter.disposeRetrofitRequest(); + } + if (uploadImagePresenter != null) { + uploadImagePresenter.disposeRetrofitRequest(); + } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.hide(); + } + + @Override + public void obtainSubmitResult(SubmitResultBean resultBean) { + + } + + @Override + public void obtainUploadAudioResult(UploadResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(UploadResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(realPaths); + caseVerifyRecyclerView.setVisibility(View.VISIBLE); + caseVerifyRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + caseVerifyRecyclerView.addItemDecoration(new ItemDecorationSpace()); + caseVerifyRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(realPaths.get(position)); + } + }); + //删除按钮点击事件 + imageAdapter.setDeleteView(true); + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + @Override + public void obtainUploadVideoResult(UploadResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java index 891b7a3..ea69349 100644 --- a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java @@ -106,10 +106,6 @@ PublicKey publicKey = RSAUtils.keyStrToPublicKey(TokenHelper.getPublicKey()); String oldPassKey = RSAUtils.encryptDataByPublicKey(oldPassword.getBytes(), publicKey); String newPassKey = RSAUtils.encryptDataByPublicKey(newPassword.getBytes(), publicKey); - -// ChangeNewPasswordBean passwordBean = new ChangeNewPasswordBean(); -// passwordBean.setOldPwd(oldPassKey.replace("=\n", "=")); -// passwordBean.setNewPwd(newPassKey.replace("=\n", "=")); changePasswordPresenter.onReadyRetrofitRequest(oldPassKey, newPassKey); } @@ -117,7 +113,7 @@ public void obtainChangePassResult(ChangePasswordResultBean resultBean) { Log.d(TAG, "obtainChangePassResult: " + new Gson().toJson(resultBean)); if (resultBean.isSuccess()) { - ToastHelper.showToast("密码修改成功", ToastHelper.WARING); + ToastHelper.showToast("密码修改成功", ToastHelper.SUCCESS); finish(); } } diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java index df4a68c..1ce23d9 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Handler; import android.os.Message; @@ -16,6 +17,7 @@ import com.casic.dcms.bean.CaseVerifyBean; import com.casic.dcms.mvp.presenter.CaseVerifyPresenterImpl; import com.casic.dcms.mvp.view.ICaseVerifyView; +import com.casic.dcms.ui.CaseVerifyDetailActivity; import com.casic.dcms.utils.ToastHelper; import com.qmuiteam.qmui.widget.QMUIEmptyView; import com.scwang.smartrefresh.layout.SmartRefreshLayout; @@ -130,10 +132,9 @@ adapter.setOnItemClickListener(new CaseVerifyResultAdapter.OnItemClickListener() { @Override public void onClick(int position) { -// Intent intent = new Intent(context, CaseDetailActivity.class); -// intent.putExtra("id", dataRows.get(position).getId()); -// startActivity( intent); - ToastHelper.showToast("详情页正在完善中", ToastHelper.ERROR); + Intent intent = new Intent(context, CaseVerifyDetailActivity.class); + intent.putExtra("id", dataBeans.get(position).getId()); + startActivity(intent); } }); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java new file mode 100644 index 0000000..4903490 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -0,0 +1,591 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseActivity; +import com.casic.dcms.bean.CaseDetailBean; +import com.casic.dcms.bean.CaseLargeClassBean; +import com.casic.dcms.bean.CaseSmallClassBean; +import com.casic.dcms.bean.SubmitResultBean; +import com.casic.dcms.bean.UploadResultBean; +import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseLargeClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSmallClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseDetailView; +import com.casic.dcms.mvp.view.ICaseLargeClassView; +import com.casic.dcms.mvp.view.ICaseSmallClassView; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.ColorHelper; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StatusBarColorUtil; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.google.gson.Gson; +import com.gyf.immersionbar.ImmersionBar; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + +public class CaseVerifyDetailActivity extends BaseActivity implements ICaseDetailView, View.OnClickListener, + ICaseLargeClassView, ICaseSmallClassView, IUploadFileView, ICaseSubmitCaseView { + + private static final String TAG = "CaseVerifyDetail"; + private Context context = this; + @BindView(R.id.leftBackView) + ImageView leftBackView; + @BindView(R.id.caseNumberView) + TextView caseNumberView; + @BindView(R.id.caseTypeView) + TextView caseTypeView; + @BindView(R.id.caseLargeTypeView) + TextView caseLargeTypeView; + @BindView(R.id.caseSmallTypeView) + TextView caseSmallTypeView; + @BindView(R.id.caseCommunityView) + TextView caseCommunityView; + @BindView(R.id.casePlaceView) + TextView casePlaceView; + @BindView(R.id.caseSituationView) + EditText caseSituationView; + @BindView(R.id.caseHandleView) + EditText caseHandleView; + @BindView(R.id.caseStartTimeView) + TextView caseStartTimeView; + @BindView(R.id.caseEndTimeView) + TextView caseEndTimeView; + @BindView(R.id.casePicRecyclerView) + RecyclerView casePicRecyclerView; + @BindView(R.id.emptyImageView) + TextView emptyImageView; + @BindView(R.id.caseAudioView) + TextView caseAudioView; + @BindView(R.id.videoPlayerView) + JCVideoPlayerStandard videoPlayerView; + @BindView(R.id.emptyVideoView) + TextView emptyVideoView; + @BindView(R.id.caseOpinionView) + EditText caseOpinionView; + @BindView(R.id.caseConditionView) + Spinner caseConditionView; + @BindView(R.id.caseVerifyRecyclerView) + RecyclerView caseVerifyRecyclerView; + @BindView(R.id.addImageView) + ImageView addImageView; + + private CaseDetailPresenterImpl caseDetailPresenter; + private Gson gson; + private CaseLargeClassPresenterImpl caseLargeClassPresenter; + private List largeClassBeans; + private CaseSmallClassPresenterImpl caseSmallClassPresenter; + private List smallClassBeans; + private String eorc; + private String typeCode; + private String typeDetailCode; + private MediaPlayer mediaPlayer; + private UploadImagePresenterImpl uploadImagePresenter; + private QMUITipDialog submitDialog; + private List realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private CaseSubmitPresenterImpl caseSubmitPresenter; + + @Override + public int initLayoutView() { + return R.layout.activity_case_verify_detail; + } + + @Override + protected void setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)); + ImmersionBar.with(this).statusBarDarkFont(false).init(); + leftBackView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + gson = new Gson(); + mediaPlayer = new MediaPlayer(); + largeClassBeans = new ArrayList<>(); + smallClassBeans = new ArrayList<>(); + + String id = getIntent().getStringExtra("id"); + caseDetailPresenter = new CaseDetailPresenterImpl(this); + caseDetailPresenter.onReadyRetrofitRequest(id); + caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); + caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); + uploadImagePresenter = new UploadImagePresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + } + + @Override + public void initEvent() { + ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Constant.CATEGORY); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + caseConditionView.setAdapter(spinnerAdapter); + } + + @Override + public void obtainCaseDetailData(CaseDetailBean resultBean) { +// Log.d(TAG, "obtainCaseDetailData: " + gson.toJson(resultBean)); + if (resultBean.isSuccess()) { + CaseDetailBean.DataBean data = resultBean.getData().get(0); + caseNumberView.setText(data.getCaseid()); + caseTypeView.setText(data.getEorcName()); + caseLargeTypeView.setText(data.getCasetypeName()); + caseSmallTypeView.setText(data.getCasetypeDetailName()); + caseCommunityView.setText(data.getCommunityName()); + casePlaceView.setText(data.getFieldintro()); + caseStartTimeView.setText(data.getCreateTime()); + caseEndTimeView.setText(data.getNodeLimittime()); + caseSituationView.setText(data.getDescription()); + + //图片 + String images = data.getFileIdVerify(); + if (!TextUtils.isEmpty(images)) { + List urls = new ArrayList<>(); + String[] split = images.split(","); + for (String s : split) { + urls.add(StringHelper.appendCompleteURL(s)); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(urls); + casePicRecyclerView.setVisibility(View.VISIBLE); + casePicRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + casePicRecyclerView.addItemDecoration(new ItemDecorationSpace()); + casePicRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(urls.get(position)); + } + }); + imageAdapter.setDeleteView(false); + } else { + emptyImageView.setVisibility(View.VISIBLE); + emptyImageView.setText("该案卷无图片材料"); + emptyImageView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + + //音频 + String audioFile = data.getAudioIdVerify(); + if (TextUtils.isEmpty(audioFile)) { + caseAudioView.setText("该案卷无音频材料"); + caseAudioView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } else { + String audioUrl; + if (audioFile.contains(",")) { + audioUrl = StringHelper.appendCompleteURL(audioFile.split(",")[0]); + } else { + audioUrl = StringHelper.appendCompleteURL(audioFile); + } + caseAudioView.setText("播放音频材料"); + caseAudioView.setTextColor(ColorHelper.getResourcesColor(this, R.color.mainThemeColor)); + try { + mediaPlayer.setDataSource(audioUrl); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.prepareAsync(); + } catch (IOException e) { + e.printStackTrace(); + } + caseAudioView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } + } + }); + } + + //视频 + String videoFile = data.getVideoIdVerify(); + if (!TextUtils.isEmpty(audioFile)) { + videoPlayerView.setVisibility(View.VISIBLE); + String videoUrl; + if (videoFile.contains(",")) { + videoUrl = StringHelper.appendCompleteURL(videoFile.split(",")[0]); + } else { + videoUrl = StringHelper.appendCompleteURL(videoFile); + } + videoPlayerView.setUp(videoUrl, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); + //设置第一帧为封面 + Glide.with(this) + .setDefaultRequestOptions(new RequestOptions().frame(4000000)) + .load(videoUrl) + .into(videoPlayerView.thumbImageView); + } else { + emptyVideoView.setVisibility(View.VISIBLE); + emptyVideoView.setText("该案卷无视频材料"); + emptyVideoView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + } + } + + private void showBigImage(String path) { + Intent intent = new Intent(this, BigPictureActivity.class); + intent.putExtra("path", path); + startActivity(intent); + } + + @OnClick({R.id.caseClassLayout, R.id.caseLargeClassLayout, R.id.caseSmallClassLayout, R.id.locationMapView, R.id.addImageView}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.caseClassLayout: + new QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("案卷类型") + .addItem("事件") + .addItem("部件") + .setGravityCenter(true) + .setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + caseTypeView.setText(tag); + //获取案卷大类 + caseLargeClassPresenter.onReadyRetrofitRequest(String.valueOf(position + 1)); + } + }).build().show(); + break; + case R.id.caseLargeClassLayout: + if (largeClassBeans != null) { + if (largeClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷大类"); + for (CaseLargeClassBean.DataBean dataBean : largeClassBeans) { + sheetBuilder.addItem(dataBean.getTypeName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeCode = largeClassBeans.get(position).getTypeCode(); + + caseLargeTypeView.setText(tag); + + //获取案卷小类 + CaseLargeClassBean.DataBean dataBean = largeClassBeans.get(position); + eorc = dataBean.getEorc(); + String typeId = dataBean.getId(); + caseSmallClassPresenter.onReadyRetrofitRequest(eorc, typeId); + } + }).build().show(); + } + } + break; + case R.id.caseSmallClassLayout: + if (smallClassBeans != null) { + if (smallClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷小类"); + for (CaseSmallClassBean.DataBean dataBean : smallClassBeans) { + sheetBuilder.addItem(dataBean.getTypeDetailName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeDetailCode = smallClassBeans.get(position).getTypeDetailCode(); + + caseSmallTypeView.setText(tag); + } + }).build().show(); + } + } + break; + case R.id.locationMapView: + //根据情况加载不同图层 + String type = caseTypeView.getText().toString(); + if (type.equals("请选择")) { + ToastHelper.showToast("请先选择案卷类型", ToastHelper.WARING); + return; + } + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", type); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .create().show(); + break; + case R.id.submitButton: + submitCase();//案卷提交 + break; + default: + break; + } + } + + private void submitCase() { +// String longitude = longitudeView.getText().toString(); +// String latitude = latitudeView.getText().toString(); +// +// String fieldIntro = caseLocationView.getText().toString(); +// if (TextUtils.isEmpty(fieldIntro)) { +// ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); +// } +// String description = caseDetailEditView.getText().toString(); +// if (TextUtils.isEmpty(description)) { +// ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); +// } + if (mediaList.size() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } +// caseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, +// "1", "1", eorc, typeCode, typeDetailCode, +// gridId.substring(0, 6), +// gridId.substring(0, 9), +// communityNameView.getText().toString(), +// gridId, description, fieldIntro, +// gson.toJson(mediaList), 0, 0); + } + + @Override + public void obtainLargeClassData(CaseLargeClassBean largeClassBean) { + if (largeClassBean.isSuccess()) { + //设置大类数据 + this.largeClassBeans = largeClassBean.getData(); + if (largeClassBeans.size() == 0) { + caseLargeTypeView.setText("无小类"); + } else { + caseLargeTypeView.setText(largeClassBeans.get(0).getTypeName());//默认选择第一个 + } + caseSmallTypeView.setText("请选择"); + } + } + + @Override + public void obtainSmallClassData(CaseSmallClassBean smallClassBean) { + if (smallClassBean.isSuccess()) { + //设置大类数据 + this.smallClassBeans = smallClassBean.getData(); + if (smallClassBeans.size() == 0) { + caseSmallTypeView.setText("无小类"); + } else { + caseSmallTypeView.setText(smallClassBeans.get(0).getTypeDetailName());//默认选择第一个 + } + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } +// gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String casePlace = data.getStringExtra("pos"); + caseCommunityView.setText(community); + if (TextUtils.isEmpty(casePlace)) { + casePlaceView.setText(community); + } else { + casePlaceView.setText(casePlace); + } + SaveKeyValues.removeKey("CommunityName"); + break; + default: + break; + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (caseDetailPresenter != null) { + caseDetailPresenter.disposeRetrofitRequest(); + } + if (caseLargeClassPresenter != null) { + caseLargeClassPresenter.disposeRetrofitRequest(); + } + if (caseSmallClassPresenter != null) { + caseSmallClassPresenter.disposeRetrofitRequest(); + } + if (caseSubmitPresenter != null) { + caseSubmitPresenter.disposeRetrofitRequest(); + } + if (uploadImagePresenter != null) { + uploadImagePresenter.disposeRetrofitRequest(); + } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.hide(); + } + + @Override + public void obtainSubmitResult(SubmitResultBean resultBean) { + + } + + @Override + public void obtainUploadAudioResult(UploadResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(UploadResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(realPaths); + caseVerifyRecyclerView.setVisibility(View.VISIBLE); + caseVerifyRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + caseVerifyRecyclerView.addItemDecoration(new ItemDecorationSpace()); + caseVerifyRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(realPaths.get(position)); + } + }); + //删除按钮点击事件 + imageAdapter.setDeleteView(true); + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + @Override + public void obtainUploadVideoResult(UploadResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java index 891b7a3..ea69349 100644 --- a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java @@ -106,10 +106,6 @@ PublicKey publicKey = RSAUtils.keyStrToPublicKey(TokenHelper.getPublicKey()); String oldPassKey = RSAUtils.encryptDataByPublicKey(oldPassword.getBytes(), publicKey); String newPassKey = RSAUtils.encryptDataByPublicKey(newPassword.getBytes(), publicKey); - -// ChangeNewPasswordBean passwordBean = new ChangeNewPasswordBean(); -// passwordBean.setOldPwd(oldPassKey.replace("=\n", "=")); -// passwordBean.setNewPwd(newPassKey.replace("=\n", "=")); changePasswordPresenter.onReadyRetrofitRequest(oldPassKey, newPassKey); } @@ -117,7 +113,7 @@ public void obtainChangePassResult(ChangePasswordResultBean resultBean) { Log.d(TAG, "obtainChangePassResult: " + new Gson().toJson(resultBean)); if (resultBean.isSuccess()) { - ToastHelper.showToast("密码修改成功", ToastHelper.WARING); + ToastHelper.showToast("密码修改成功", ToastHelper.SUCCESS); finish(); } } diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java index df4a68c..1ce23d9 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Handler; import android.os.Message; @@ -16,6 +17,7 @@ import com.casic.dcms.bean.CaseVerifyBean; import com.casic.dcms.mvp.presenter.CaseVerifyPresenterImpl; import com.casic.dcms.mvp.view.ICaseVerifyView; +import com.casic.dcms.ui.CaseVerifyDetailActivity; import com.casic.dcms.utils.ToastHelper; import com.qmuiteam.qmui.widget.QMUIEmptyView; import com.scwang.smartrefresh.layout.SmartRefreshLayout; @@ -130,10 +132,9 @@ adapter.setOnItemClickListener(new CaseVerifyResultAdapter.OnItemClickListener() { @Override public void onClick(int position) { -// Intent intent = new Intent(context, CaseDetailActivity.class); -// intent.putExtra("id", dataRows.get(position).getId()); -// startActivity( intent); - ToastHelper.showToast("详情页正在完善中", ToastHelper.ERROR); + Intent intent = new Intent(context, CaseVerifyDetailActivity.class); + intent.putExtra("id", dataBeans.get(position).getId()); + startActivity(intent); } }); } diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index 5abe4b7..233b5d1 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -29,6 +29,8 @@ "问题来源", "案卷状态", "高发问题", "街道统计", "处理统计", "趋势分析"); + public static final List CATEGORY = Arrays.asList("请选择", "情况属实", "情况不属实"); + public static final String[] USER_PERMISSIONS = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java new file mode 100644 index 0000000..4903490 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -0,0 +1,591 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseActivity; +import com.casic.dcms.bean.CaseDetailBean; +import com.casic.dcms.bean.CaseLargeClassBean; +import com.casic.dcms.bean.CaseSmallClassBean; +import com.casic.dcms.bean.SubmitResultBean; +import com.casic.dcms.bean.UploadResultBean; +import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseLargeClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSmallClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseDetailView; +import com.casic.dcms.mvp.view.ICaseLargeClassView; +import com.casic.dcms.mvp.view.ICaseSmallClassView; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.ColorHelper; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StatusBarColorUtil; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.google.gson.Gson; +import com.gyf.immersionbar.ImmersionBar; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + +public class CaseVerifyDetailActivity extends BaseActivity implements ICaseDetailView, View.OnClickListener, + ICaseLargeClassView, ICaseSmallClassView, IUploadFileView, ICaseSubmitCaseView { + + private static final String TAG = "CaseVerifyDetail"; + private Context context = this; + @BindView(R.id.leftBackView) + ImageView leftBackView; + @BindView(R.id.caseNumberView) + TextView caseNumberView; + @BindView(R.id.caseTypeView) + TextView caseTypeView; + @BindView(R.id.caseLargeTypeView) + TextView caseLargeTypeView; + @BindView(R.id.caseSmallTypeView) + TextView caseSmallTypeView; + @BindView(R.id.caseCommunityView) + TextView caseCommunityView; + @BindView(R.id.casePlaceView) + TextView casePlaceView; + @BindView(R.id.caseSituationView) + EditText caseSituationView; + @BindView(R.id.caseHandleView) + EditText caseHandleView; + @BindView(R.id.caseStartTimeView) + TextView caseStartTimeView; + @BindView(R.id.caseEndTimeView) + TextView caseEndTimeView; + @BindView(R.id.casePicRecyclerView) + RecyclerView casePicRecyclerView; + @BindView(R.id.emptyImageView) + TextView emptyImageView; + @BindView(R.id.caseAudioView) + TextView caseAudioView; + @BindView(R.id.videoPlayerView) + JCVideoPlayerStandard videoPlayerView; + @BindView(R.id.emptyVideoView) + TextView emptyVideoView; + @BindView(R.id.caseOpinionView) + EditText caseOpinionView; + @BindView(R.id.caseConditionView) + Spinner caseConditionView; + @BindView(R.id.caseVerifyRecyclerView) + RecyclerView caseVerifyRecyclerView; + @BindView(R.id.addImageView) + ImageView addImageView; + + private CaseDetailPresenterImpl caseDetailPresenter; + private Gson gson; + private CaseLargeClassPresenterImpl caseLargeClassPresenter; + private List largeClassBeans; + private CaseSmallClassPresenterImpl caseSmallClassPresenter; + private List smallClassBeans; + private String eorc; + private String typeCode; + private String typeDetailCode; + private MediaPlayer mediaPlayer; + private UploadImagePresenterImpl uploadImagePresenter; + private QMUITipDialog submitDialog; + private List realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private CaseSubmitPresenterImpl caseSubmitPresenter; + + @Override + public int initLayoutView() { + return R.layout.activity_case_verify_detail; + } + + @Override + protected void setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)); + ImmersionBar.with(this).statusBarDarkFont(false).init(); + leftBackView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + gson = new Gson(); + mediaPlayer = new MediaPlayer(); + largeClassBeans = new ArrayList<>(); + smallClassBeans = new ArrayList<>(); + + String id = getIntent().getStringExtra("id"); + caseDetailPresenter = new CaseDetailPresenterImpl(this); + caseDetailPresenter.onReadyRetrofitRequest(id); + caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); + caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); + uploadImagePresenter = new UploadImagePresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + } + + @Override + public void initEvent() { + ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Constant.CATEGORY); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + caseConditionView.setAdapter(spinnerAdapter); + } + + @Override + public void obtainCaseDetailData(CaseDetailBean resultBean) { +// Log.d(TAG, "obtainCaseDetailData: " + gson.toJson(resultBean)); + if (resultBean.isSuccess()) { + CaseDetailBean.DataBean data = resultBean.getData().get(0); + caseNumberView.setText(data.getCaseid()); + caseTypeView.setText(data.getEorcName()); + caseLargeTypeView.setText(data.getCasetypeName()); + caseSmallTypeView.setText(data.getCasetypeDetailName()); + caseCommunityView.setText(data.getCommunityName()); + casePlaceView.setText(data.getFieldintro()); + caseStartTimeView.setText(data.getCreateTime()); + caseEndTimeView.setText(data.getNodeLimittime()); + caseSituationView.setText(data.getDescription()); + + //图片 + String images = data.getFileIdVerify(); + if (!TextUtils.isEmpty(images)) { + List urls = new ArrayList<>(); + String[] split = images.split(","); + for (String s : split) { + urls.add(StringHelper.appendCompleteURL(s)); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(urls); + casePicRecyclerView.setVisibility(View.VISIBLE); + casePicRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + casePicRecyclerView.addItemDecoration(new ItemDecorationSpace()); + casePicRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(urls.get(position)); + } + }); + imageAdapter.setDeleteView(false); + } else { + emptyImageView.setVisibility(View.VISIBLE); + emptyImageView.setText("该案卷无图片材料"); + emptyImageView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + + //音频 + String audioFile = data.getAudioIdVerify(); + if (TextUtils.isEmpty(audioFile)) { + caseAudioView.setText("该案卷无音频材料"); + caseAudioView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } else { + String audioUrl; + if (audioFile.contains(",")) { + audioUrl = StringHelper.appendCompleteURL(audioFile.split(",")[0]); + } else { + audioUrl = StringHelper.appendCompleteURL(audioFile); + } + caseAudioView.setText("播放音频材料"); + caseAudioView.setTextColor(ColorHelper.getResourcesColor(this, R.color.mainThemeColor)); + try { + mediaPlayer.setDataSource(audioUrl); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.prepareAsync(); + } catch (IOException e) { + e.printStackTrace(); + } + caseAudioView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } + } + }); + } + + //视频 + String videoFile = data.getVideoIdVerify(); + if (!TextUtils.isEmpty(audioFile)) { + videoPlayerView.setVisibility(View.VISIBLE); + String videoUrl; + if (videoFile.contains(",")) { + videoUrl = StringHelper.appendCompleteURL(videoFile.split(",")[0]); + } else { + videoUrl = StringHelper.appendCompleteURL(videoFile); + } + videoPlayerView.setUp(videoUrl, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); + //设置第一帧为封面 + Glide.with(this) + .setDefaultRequestOptions(new RequestOptions().frame(4000000)) + .load(videoUrl) + .into(videoPlayerView.thumbImageView); + } else { + emptyVideoView.setVisibility(View.VISIBLE); + emptyVideoView.setText("该案卷无视频材料"); + emptyVideoView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + } + } + + private void showBigImage(String path) { + Intent intent = new Intent(this, BigPictureActivity.class); + intent.putExtra("path", path); + startActivity(intent); + } + + @OnClick({R.id.caseClassLayout, R.id.caseLargeClassLayout, R.id.caseSmallClassLayout, R.id.locationMapView, R.id.addImageView}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.caseClassLayout: + new QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("案卷类型") + .addItem("事件") + .addItem("部件") + .setGravityCenter(true) + .setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + caseTypeView.setText(tag); + //获取案卷大类 + caseLargeClassPresenter.onReadyRetrofitRequest(String.valueOf(position + 1)); + } + }).build().show(); + break; + case R.id.caseLargeClassLayout: + if (largeClassBeans != null) { + if (largeClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷大类"); + for (CaseLargeClassBean.DataBean dataBean : largeClassBeans) { + sheetBuilder.addItem(dataBean.getTypeName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeCode = largeClassBeans.get(position).getTypeCode(); + + caseLargeTypeView.setText(tag); + + //获取案卷小类 + CaseLargeClassBean.DataBean dataBean = largeClassBeans.get(position); + eorc = dataBean.getEorc(); + String typeId = dataBean.getId(); + caseSmallClassPresenter.onReadyRetrofitRequest(eorc, typeId); + } + }).build().show(); + } + } + break; + case R.id.caseSmallClassLayout: + if (smallClassBeans != null) { + if (smallClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷小类"); + for (CaseSmallClassBean.DataBean dataBean : smallClassBeans) { + sheetBuilder.addItem(dataBean.getTypeDetailName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeDetailCode = smallClassBeans.get(position).getTypeDetailCode(); + + caseSmallTypeView.setText(tag); + } + }).build().show(); + } + } + break; + case R.id.locationMapView: + //根据情况加载不同图层 + String type = caseTypeView.getText().toString(); + if (type.equals("请选择")) { + ToastHelper.showToast("请先选择案卷类型", ToastHelper.WARING); + return; + } + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", type); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .create().show(); + break; + case R.id.submitButton: + submitCase();//案卷提交 + break; + default: + break; + } + } + + private void submitCase() { +// String longitude = longitudeView.getText().toString(); +// String latitude = latitudeView.getText().toString(); +// +// String fieldIntro = caseLocationView.getText().toString(); +// if (TextUtils.isEmpty(fieldIntro)) { +// ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); +// } +// String description = caseDetailEditView.getText().toString(); +// if (TextUtils.isEmpty(description)) { +// ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); +// } + if (mediaList.size() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } +// caseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, +// "1", "1", eorc, typeCode, typeDetailCode, +// gridId.substring(0, 6), +// gridId.substring(0, 9), +// communityNameView.getText().toString(), +// gridId, description, fieldIntro, +// gson.toJson(mediaList), 0, 0); + } + + @Override + public void obtainLargeClassData(CaseLargeClassBean largeClassBean) { + if (largeClassBean.isSuccess()) { + //设置大类数据 + this.largeClassBeans = largeClassBean.getData(); + if (largeClassBeans.size() == 0) { + caseLargeTypeView.setText("无小类"); + } else { + caseLargeTypeView.setText(largeClassBeans.get(0).getTypeName());//默认选择第一个 + } + caseSmallTypeView.setText("请选择"); + } + } + + @Override + public void obtainSmallClassData(CaseSmallClassBean smallClassBean) { + if (smallClassBean.isSuccess()) { + //设置大类数据 + this.smallClassBeans = smallClassBean.getData(); + if (smallClassBeans.size() == 0) { + caseSmallTypeView.setText("无小类"); + } else { + caseSmallTypeView.setText(smallClassBeans.get(0).getTypeDetailName());//默认选择第一个 + } + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } +// gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String casePlace = data.getStringExtra("pos"); + caseCommunityView.setText(community); + if (TextUtils.isEmpty(casePlace)) { + casePlaceView.setText(community); + } else { + casePlaceView.setText(casePlace); + } + SaveKeyValues.removeKey("CommunityName"); + break; + default: + break; + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (caseDetailPresenter != null) { + caseDetailPresenter.disposeRetrofitRequest(); + } + if (caseLargeClassPresenter != null) { + caseLargeClassPresenter.disposeRetrofitRequest(); + } + if (caseSmallClassPresenter != null) { + caseSmallClassPresenter.disposeRetrofitRequest(); + } + if (caseSubmitPresenter != null) { + caseSubmitPresenter.disposeRetrofitRequest(); + } + if (uploadImagePresenter != null) { + uploadImagePresenter.disposeRetrofitRequest(); + } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.hide(); + } + + @Override + public void obtainSubmitResult(SubmitResultBean resultBean) { + + } + + @Override + public void obtainUploadAudioResult(UploadResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(UploadResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(realPaths); + caseVerifyRecyclerView.setVisibility(View.VISIBLE); + caseVerifyRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + caseVerifyRecyclerView.addItemDecoration(new ItemDecorationSpace()); + caseVerifyRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(realPaths.get(position)); + } + }); + //删除按钮点击事件 + imageAdapter.setDeleteView(true); + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + @Override + public void obtainUploadVideoResult(UploadResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java index 891b7a3..ea69349 100644 --- a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java @@ -106,10 +106,6 @@ PublicKey publicKey = RSAUtils.keyStrToPublicKey(TokenHelper.getPublicKey()); String oldPassKey = RSAUtils.encryptDataByPublicKey(oldPassword.getBytes(), publicKey); String newPassKey = RSAUtils.encryptDataByPublicKey(newPassword.getBytes(), publicKey); - -// ChangeNewPasswordBean passwordBean = new ChangeNewPasswordBean(); -// passwordBean.setOldPwd(oldPassKey.replace("=\n", "=")); -// passwordBean.setNewPwd(newPassKey.replace("=\n", "=")); changePasswordPresenter.onReadyRetrofitRequest(oldPassKey, newPassKey); } @@ -117,7 +113,7 @@ public void obtainChangePassResult(ChangePasswordResultBean resultBean) { Log.d(TAG, "obtainChangePassResult: " + new Gson().toJson(resultBean)); if (resultBean.isSuccess()) { - ToastHelper.showToast("密码修改成功", ToastHelper.WARING); + ToastHelper.showToast("密码修改成功", ToastHelper.SUCCESS); finish(); } } diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java index df4a68c..1ce23d9 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Handler; import android.os.Message; @@ -16,6 +17,7 @@ import com.casic.dcms.bean.CaseVerifyBean; import com.casic.dcms.mvp.presenter.CaseVerifyPresenterImpl; import com.casic.dcms.mvp.view.ICaseVerifyView; +import com.casic.dcms.ui.CaseVerifyDetailActivity; import com.casic.dcms.utils.ToastHelper; import com.qmuiteam.qmui.widget.QMUIEmptyView; import com.scwang.smartrefresh.layout.SmartRefreshLayout; @@ -130,10 +132,9 @@ adapter.setOnItemClickListener(new CaseVerifyResultAdapter.OnItemClickListener() { @Override public void onClick(int position) { -// Intent intent = new Intent(context, CaseDetailActivity.class); -// intent.putExtra("id", dataRows.get(position).getId()); -// startActivity( intent); - ToastHelper.showToast("详情页正在完善中", ToastHelper.ERROR); + Intent intent = new Intent(context, CaseVerifyDetailActivity.class); + intent.putExtra("id", dataBeans.get(position).getId()); + startActivity(intent); } }); } diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index 5abe4b7..233b5d1 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -29,6 +29,8 @@ "问题来源", "案卷状态", "高发问题", "街道统计", "处理统计", "趋势分析"); + public static final List CATEGORY = Arrays.asList("请选择", "情况属实", "情况不属实"); + public static final String[] USER_PERMISSIONS = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index 4bbfadb..f14a8c2 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -1,9 +1,12 @@ package com.casic.dcms.utils; import android.text.TextUtils; +import android.util.Log; public class StringHelper { + private static final String TAG = "StringHelper"; + public static void saveUserName(String name) { SaveKeyValues.putValue("userName", name); } @@ -51,7 +54,7 @@ public static String appendCompleteURL(String url) { if (TextUtils.isEmpty(url)) { - ToastHelper.showToast("上传路径不对", ToastHelper.ERROR); + Log.d(TAG, "文件路径不对 => " + url); return ""; } String data = url.replace("\\", "/"); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java new file mode 100644 index 0000000..4903490 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -0,0 +1,591 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseActivity; +import com.casic.dcms.bean.CaseDetailBean; +import com.casic.dcms.bean.CaseLargeClassBean; +import com.casic.dcms.bean.CaseSmallClassBean; +import com.casic.dcms.bean.SubmitResultBean; +import com.casic.dcms.bean.UploadResultBean; +import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseLargeClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSmallClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseDetailView; +import com.casic.dcms.mvp.view.ICaseLargeClassView; +import com.casic.dcms.mvp.view.ICaseSmallClassView; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.ColorHelper; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StatusBarColorUtil; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.google.gson.Gson; +import com.gyf.immersionbar.ImmersionBar; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + +public class CaseVerifyDetailActivity extends BaseActivity implements ICaseDetailView, View.OnClickListener, + ICaseLargeClassView, ICaseSmallClassView, IUploadFileView, ICaseSubmitCaseView { + + private static final String TAG = "CaseVerifyDetail"; + private Context context = this; + @BindView(R.id.leftBackView) + ImageView leftBackView; + @BindView(R.id.caseNumberView) + TextView caseNumberView; + @BindView(R.id.caseTypeView) + TextView caseTypeView; + @BindView(R.id.caseLargeTypeView) + TextView caseLargeTypeView; + @BindView(R.id.caseSmallTypeView) + TextView caseSmallTypeView; + @BindView(R.id.caseCommunityView) + TextView caseCommunityView; + @BindView(R.id.casePlaceView) + TextView casePlaceView; + @BindView(R.id.caseSituationView) + EditText caseSituationView; + @BindView(R.id.caseHandleView) + EditText caseHandleView; + @BindView(R.id.caseStartTimeView) + TextView caseStartTimeView; + @BindView(R.id.caseEndTimeView) + TextView caseEndTimeView; + @BindView(R.id.casePicRecyclerView) + RecyclerView casePicRecyclerView; + @BindView(R.id.emptyImageView) + TextView emptyImageView; + @BindView(R.id.caseAudioView) + TextView caseAudioView; + @BindView(R.id.videoPlayerView) + JCVideoPlayerStandard videoPlayerView; + @BindView(R.id.emptyVideoView) + TextView emptyVideoView; + @BindView(R.id.caseOpinionView) + EditText caseOpinionView; + @BindView(R.id.caseConditionView) + Spinner caseConditionView; + @BindView(R.id.caseVerifyRecyclerView) + RecyclerView caseVerifyRecyclerView; + @BindView(R.id.addImageView) + ImageView addImageView; + + private CaseDetailPresenterImpl caseDetailPresenter; + private Gson gson; + private CaseLargeClassPresenterImpl caseLargeClassPresenter; + private List largeClassBeans; + private CaseSmallClassPresenterImpl caseSmallClassPresenter; + private List smallClassBeans; + private String eorc; + private String typeCode; + private String typeDetailCode; + private MediaPlayer mediaPlayer; + private UploadImagePresenterImpl uploadImagePresenter; + private QMUITipDialog submitDialog; + private List realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private CaseSubmitPresenterImpl caseSubmitPresenter; + + @Override + public int initLayoutView() { + return R.layout.activity_case_verify_detail; + } + + @Override + protected void setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)); + ImmersionBar.with(this).statusBarDarkFont(false).init(); + leftBackView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + gson = new Gson(); + mediaPlayer = new MediaPlayer(); + largeClassBeans = new ArrayList<>(); + smallClassBeans = new ArrayList<>(); + + String id = getIntent().getStringExtra("id"); + caseDetailPresenter = new CaseDetailPresenterImpl(this); + caseDetailPresenter.onReadyRetrofitRequest(id); + caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); + caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); + uploadImagePresenter = new UploadImagePresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + } + + @Override + public void initEvent() { + ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Constant.CATEGORY); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + caseConditionView.setAdapter(spinnerAdapter); + } + + @Override + public void obtainCaseDetailData(CaseDetailBean resultBean) { +// Log.d(TAG, "obtainCaseDetailData: " + gson.toJson(resultBean)); + if (resultBean.isSuccess()) { + CaseDetailBean.DataBean data = resultBean.getData().get(0); + caseNumberView.setText(data.getCaseid()); + caseTypeView.setText(data.getEorcName()); + caseLargeTypeView.setText(data.getCasetypeName()); + caseSmallTypeView.setText(data.getCasetypeDetailName()); + caseCommunityView.setText(data.getCommunityName()); + casePlaceView.setText(data.getFieldintro()); + caseStartTimeView.setText(data.getCreateTime()); + caseEndTimeView.setText(data.getNodeLimittime()); + caseSituationView.setText(data.getDescription()); + + //图片 + String images = data.getFileIdVerify(); + if (!TextUtils.isEmpty(images)) { + List urls = new ArrayList<>(); + String[] split = images.split(","); + for (String s : split) { + urls.add(StringHelper.appendCompleteURL(s)); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(urls); + casePicRecyclerView.setVisibility(View.VISIBLE); + casePicRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + casePicRecyclerView.addItemDecoration(new ItemDecorationSpace()); + casePicRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(urls.get(position)); + } + }); + imageAdapter.setDeleteView(false); + } else { + emptyImageView.setVisibility(View.VISIBLE); + emptyImageView.setText("该案卷无图片材料"); + emptyImageView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + + //音频 + String audioFile = data.getAudioIdVerify(); + if (TextUtils.isEmpty(audioFile)) { + caseAudioView.setText("该案卷无音频材料"); + caseAudioView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } else { + String audioUrl; + if (audioFile.contains(",")) { + audioUrl = StringHelper.appendCompleteURL(audioFile.split(",")[0]); + } else { + audioUrl = StringHelper.appendCompleteURL(audioFile); + } + caseAudioView.setText("播放音频材料"); + caseAudioView.setTextColor(ColorHelper.getResourcesColor(this, R.color.mainThemeColor)); + try { + mediaPlayer.setDataSource(audioUrl); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.prepareAsync(); + } catch (IOException e) { + e.printStackTrace(); + } + caseAudioView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } + } + }); + } + + //视频 + String videoFile = data.getVideoIdVerify(); + if (!TextUtils.isEmpty(audioFile)) { + videoPlayerView.setVisibility(View.VISIBLE); + String videoUrl; + if (videoFile.contains(",")) { + videoUrl = StringHelper.appendCompleteURL(videoFile.split(",")[0]); + } else { + videoUrl = StringHelper.appendCompleteURL(videoFile); + } + videoPlayerView.setUp(videoUrl, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); + //设置第一帧为封面 + Glide.with(this) + .setDefaultRequestOptions(new RequestOptions().frame(4000000)) + .load(videoUrl) + .into(videoPlayerView.thumbImageView); + } else { + emptyVideoView.setVisibility(View.VISIBLE); + emptyVideoView.setText("该案卷无视频材料"); + emptyVideoView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + } + } + + private void showBigImage(String path) { + Intent intent = new Intent(this, BigPictureActivity.class); + intent.putExtra("path", path); + startActivity(intent); + } + + @OnClick({R.id.caseClassLayout, R.id.caseLargeClassLayout, R.id.caseSmallClassLayout, R.id.locationMapView, R.id.addImageView}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.caseClassLayout: + new QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("案卷类型") + .addItem("事件") + .addItem("部件") + .setGravityCenter(true) + .setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + caseTypeView.setText(tag); + //获取案卷大类 + caseLargeClassPresenter.onReadyRetrofitRequest(String.valueOf(position + 1)); + } + }).build().show(); + break; + case R.id.caseLargeClassLayout: + if (largeClassBeans != null) { + if (largeClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷大类"); + for (CaseLargeClassBean.DataBean dataBean : largeClassBeans) { + sheetBuilder.addItem(dataBean.getTypeName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeCode = largeClassBeans.get(position).getTypeCode(); + + caseLargeTypeView.setText(tag); + + //获取案卷小类 + CaseLargeClassBean.DataBean dataBean = largeClassBeans.get(position); + eorc = dataBean.getEorc(); + String typeId = dataBean.getId(); + caseSmallClassPresenter.onReadyRetrofitRequest(eorc, typeId); + } + }).build().show(); + } + } + break; + case R.id.caseSmallClassLayout: + if (smallClassBeans != null) { + if (smallClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷小类"); + for (CaseSmallClassBean.DataBean dataBean : smallClassBeans) { + sheetBuilder.addItem(dataBean.getTypeDetailName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeDetailCode = smallClassBeans.get(position).getTypeDetailCode(); + + caseSmallTypeView.setText(tag); + } + }).build().show(); + } + } + break; + case R.id.locationMapView: + //根据情况加载不同图层 + String type = caseTypeView.getText().toString(); + if (type.equals("请选择")) { + ToastHelper.showToast("请先选择案卷类型", ToastHelper.WARING); + return; + } + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", type); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .create().show(); + break; + case R.id.submitButton: + submitCase();//案卷提交 + break; + default: + break; + } + } + + private void submitCase() { +// String longitude = longitudeView.getText().toString(); +// String latitude = latitudeView.getText().toString(); +// +// String fieldIntro = caseLocationView.getText().toString(); +// if (TextUtils.isEmpty(fieldIntro)) { +// ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); +// } +// String description = caseDetailEditView.getText().toString(); +// if (TextUtils.isEmpty(description)) { +// ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); +// } + if (mediaList.size() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } +// caseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, +// "1", "1", eorc, typeCode, typeDetailCode, +// gridId.substring(0, 6), +// gridId.substring(0, 9), +// communityNameView.getText().toString(), +// gridId, description, fieldIntro, +// gson.toJson(mediaList), 0, 0); + } + + @Override + public void obtainLargeClassData(CaseLargeClassBean largeClassBean) { + if (largeClassBean.isSuccess()) { + //设置大类数据 + this.largeClassBeans = largeClassBean.getData(); + if (largeClassBeans.size() == 0) { + caseLargeTypeView.setText("无小类"); + } else { + caseLargeTypeView.setText(largeClassBeans.get(0).getTypeName());//默认选择第一个 + } + caseSmallTypeView.setText("请选择"); + } + } + + @Override + public void obtainSmallClassData(CaseSmallClassBean smallClassBean) { + if (smallClassBean.isSuccess()) { + //设置大类数据 + this.smallClassBeans = smallClassBean.getData(); + if (smallClassBeans.size() == 0) { + caseSmallTypeView.setText("无小类"); + } else { + caseSmallTypeView.setText(smallClassBeans.get(0).getTypeDetailName());//默认选择第一个 + } + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } +// gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String casePlace = data.getStringExtra("pos"); + caseCommunityView.setText(community); + if (TextUtils.isEmpty(casePlace)) { + casePlaceView.setText(community); + } else { + casePlaceView.setText(casePlace); + } + SaveKeyValues.removeKey("CommunityName"); + break; + default: + break; + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (caseDetailPresenter != null) { + caseDetailPresenter.disposeRetrofitRequest(); + } + if (caseLargeClassPresenter != null) { + caseLargeClassPresenter.disposeRetrofitRequest(); + } + if (caseSmallClassPresenter != null) { + caseSmallClassPresenter.disposeRetrofitRequest(); + } + if (caseSubmitPresenter != null) { + caseSubmitPresenter.disposeRetrofitRequest(); + } + if (uploadImagePresenter != null) { + uploadImagePresenter.disposeRetrofitRequest(); + } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.hide(); + } + + @Override + public void obtainSubmitResult(SubmitResultBean resultBean) { + + } + + @Override + public void obtainUploadAudioResult(UploadResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(UploadResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(realPaths); + caseVerifyRecyclerView.setVisibility(View.VISIBLE); + caseVerifyRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + caseVerifyRecyclerView.addItemDecoration(new ItemDecorationSpace()); + caseVerifyRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(realPaths.get(position)); + } + }); + //删除按钮点击事件 + imageAdapter.setDeleteView(true); + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + @Override + public void obtainUploadVideoResult(UploadResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java index 891b7a3..ea69349 100644 --- a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java @@ -106,10 +106,6 @@ PublicKey publicKey = RSAUtils.keyStrToPublicKey(TokenHelper.getPublicKey()); String oldPassKey = RSAUtils.encryptDataByPublicKey(oldPassword.getBytes(), publicKey); String newPassKey = RSAUtils.encryptDataByPublicKey(newPassword.getBytes(), publicKey); - -// ChangeNewPasswordBean passwordBean = new ChangeNewPasswordBean(); -// passwordBean.setOldPwd(oldPassKey.replace("=\n", "=")); -// passwordBean.setNewPwd(newPassKey.replace("=\n", "=")); changePasswordPresenter.onReadyRetrofitRequest(oldPassKey, newPassKey); } @@ -117,7 +113,7 @@ public void obtainChangePassResult(ChangePasswordResultBean resultBean) { Log.d(TAG, "obtainChangePassResult: " + new Gson().toJson(resultBean)); if (resultBean.isSuccess()) { - ToastHelper.showToast("密码修改成功", ToastHelper.WARING); + ToastHelper.showToast("密码修改成功", ToastHelper.SUCCESS); finish(); } } diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java index df4a68c..1ce23d9 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Handler; import android.os.Message; @@ -16,6 +17,7 @@ import com.casic.dcms.bean.CaseVerifyBean; import com.casic.dcms.mvp.presenter.CaseVerifyPresenterImpl; import com.casic.dcms.mvp.view.ICaseVerifyView; +import com.casic.dcms.ui.CaseVerifyDetailActivity; import com.casic.dcms.utils.ToastHelper; import com.qmuiteam.qmui.widget.QMUIEmptyView; import com.scwang.smartrefresh.layout.SmartRefreshLayout; @@ -130,10 +132,9 @@ adapter.setOnItemClickListener(new CaseVerifyResultAdapter.OnItemClickListener() { @Override public void onClick(int position) { -// Intent intent = new Intent(context, CaseDetailActivity.class); -// intent.putExtra("id", dataRows.get(position).getId()); -// startActivity( intent); - ToastHelper.showToast("详情页正在完善中", ToastHelper.ERROR); + Intent intent = new Intent(context, CaseVerifyDetailActivity.class); + intent.putExtra("id", dataBeans.get(position).getId()); + startActivity(intent); } }); } diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index 5abe4b7..233b5d1 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -29,6 +29,8 @@ "问题来源", "案卷状态", "高发问题", "街道统计", "处理统计", "趋势分析"); + public static final List CATEGORY = Arrays.asList("请选择", "情况属实", "情况不属实"); + public static final String[] USER_PERMISSIONS = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index 4bbfadb..f14a8c2 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -1,9 +1,12 @@ package com.casic.dcms.utils; import android.text.TextUtils; +import android.util.Log; public class StringHelper { + private static final String TAG = "StringHelper"; + public static void saveUserName(String name) { SaveKeyValues.putValue("userName", name); } @@ -51,7 +54,7 @@ public static String appendCompleteURL(String url) { if (TextUtils.isEmpty(url)) { - ToastHelper.showToast("上传路径不对", ToastHelper.ERROR); + Log.d(TAG, "文件路径不对 => " + url); return ""; } String data = url.replace("\\", "/"); diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 003a919..0f6f190 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -328,4 +328,14 @@ @Query("deptid") String deptid, @Query("roleTips") String roleTips, @Query("isOnLine") String isOnLine); + + /** + * 设备定位信息上传 + */ + @FormUrlEncoded + @POST("/devicePositionLog/positionUpload") + Observable uploadDevicePosition(@Header("token") String token, + @Field("imei") String imei, + @Field("positionLat") String positionLat, + @Field("positionLng") String positionLng); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java new file mode 100644 index 0000000..4903490 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -0,0 +1,591 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseActivity; +import com.casic.dcms.bean.CaseDetailBean; +import com.casic.dcms.bean.CaseLargeClassBean; +import com.casic.dcms.bean.CaseSmallClassBean; +import com.casic.dcms.bean.SubmitResultBean; +import com.casic.dcms.bean.UploadResultBean; +import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseLargeClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSmallClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseDetailView; +import com.casic.dcms.mvp.view.ICaseLargeClassView; +import com.casic.dcms.mvp.view.ICaseSmallClassView; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.ColorHelper; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StatusBarColorUtil; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.google.gson.Gson; +import com.gyf.immersionbar.ImmersionBar; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + +public class CaseVerifyDetailActivity extends BaseActivity implements ICaseDetailView, View.OnClickListener, + ICaseLargeClassView, ICaseSmallClassView, IUploadFileView, ICaseSubmitCaseView { + + private static final String TAG = "CaseVerifyDetail"; + private Context context = this; + @BindView(R.id.leftBackView) + ImageView leftBackView; + @BindView(R.id.caseNumberView) + TextView caseNumberView; + @BindView(R.id.caseTypeView) + TextView caseTypeView; + @BindView(R.id.caseLargeTypeView) + TextView caseLargeTypeView; + @BindView(R.id.caseSmallTypeView) + TextView caseSmallTypeView; + @BindView(R.id.caseCommunityView) + TextView caseCommunityView; + @BindView(R.id.casePlaceView) + TextView casePlaceView; + @BindView(R.id.caseSituationView) + EditText caseSituationView; + @BindView(R.id.caseHandleView) + EditText caseHandleView; + @BindView(R.id.caseStartTimeView) + TextView caseStartTimeView; + @BindView(R.id.caseEndTimeView) + TextView caseEndTimeView; + @BindView(R.id.casePicRecyclerView) + RecyclerView casePicRecyclerView; + @BindView(R.id.emptyImageView) + TextView emptyImageView; + @BindView(R.id.caseAudioView) + TextView caseAudioView; + @BindView(R.id.videoPlayerView) + JCVideoPlayerStandard videoPlayerView; + @BindView(R.id.emptyVideoView) + TextView emptyVideoView; + @BindView(R.id.caseOpinionView) + EditText caseOpinionView; + @BindView(R.id.caseConditionView) + Spinner caseConditionView; + @BindView(R.id.caseVerifyRecyclerView) + RecyclerView caseVerifyRecyclerView; + @BindView(R.id.addImageView) + ImageView addImageView; + + private CaseDetailPresenterImpl caseDetailPresenter; + private Gson gson; + private CaseLargeClassPresenterImpl caseLargeClassPresenter; + private List largeClassBeans; + private CaseSmallClassPresenterImpl caseSmallClassPresenter; + private List smallClassBeans; + private String eorc; + private String typeCode; + private String typeDetailCode; + private MediaPlayer mediaPlayer; + private UploadImagePresenterImpl uploadImagePresenter; + private QMUITipDialog submitDialog; + private List realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private CaseSubmitPresenterImpl caseSubmitPresenter; + + @Override + public int initLayoutView() { + return R.layout.activity_case_verify_detail; + } + + @Override + protected void setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)); + ImmersionBar.with(this).statusBarDarkFont(false).init(); + leftBackView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + gson = new Gson(); + mediaPlayer = new MediaPlayer(); + largeClassBeans = new ArrayList<>(); + smallClassBeans = new ArrayList<>(); + + String id = getIntent().getStringExtra("id"); + caseDetailPresenter = new CaseDetailPresenterImpl(this); + caseDetailPresenter.onReadyRetrofitRequest(id); + caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); + caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); + uploadImagePresenter = new UploadImagePresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + } + + @Override + public void initEvent() { + ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Constant.CATEGORY); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + caseConditionView.setAdapter(spinnerAdapter); + } + + @Override + public void obtainCaseDetailData(CaseDetailBean resultBean) { +// Log.d(TAG, "obtainCaseDetailData: " + gson.toJson(resultBean)); + if (resultBean.isSuccess()) { + CaseDetailBean.DataBean data = resultBean.getData().get(0); + caseNumberView.setText(data.getCaseid()); + caseTypeView.setText(data.getEorcName()); + caseLargeTypeView.setText(data.getCasetypeName()); + caseSmallTypeView.setText(data.getCasetypeDetailName()); + caseCommunityView.setText(data.getCommunityName()); + casePlaceView.setText(data.getFieldintro()); + caseStartTimeView.setText(data.getCreateTime()); + caseEndTimeView.setText(data.getNodeLimittime()); + caseSituationView.setText(data.getDescription()); + + //图片 + String images = data.getFileIdVerify(); + if (!TextUtils.isEmpty(images)) { + List urls = new ArrayList<>(); + String[] split = images.split(","); + for (String s : split) { + urls.add(StringHelper.appendCompleteURL(s)); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(urls); + casePicRecyclerView.setVisibility(View.VISIBLE); + casePicRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + casePicRecyclerView.addItemDecoration(new ItemDecorationSpace()); + casePicRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(urls.get(position)); + } + }); + imageAdapter.setDeleteView(false); + } else { + emptyImageView.setVisibility(View.VISIBLE); + emptyImageView.setText("该案卷无图片材料"); + emptyImageView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + + //音频 + String audioFile = data.getAudioIdVerify(); + if (TextUtils.isEmpty(audioFile)) { + caseAudioView.setText("该案卷无音频材料"); + caseAudioView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } else { + String audioUrl; + if (audioFile.contains(",")) { + audioUrl = StringHelper.appendCompleteURL(audioFile.split(",")[0]); + } else { + audioUrl = StringHelper.appendCompleteURL(audioFile); + } + caseAudioView.setText("播放音频材料"); + caseAudioView.setTextColor(ColorHelper.getResourcesColor(this, R.color.mainThemeColor)); + try { + mediaPlayer.setDataSource(audioUrl); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.prepareAsync(); + } catch (IOException e) { + e.printStackTrace(); + } + caseAudioView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } + } + }); + } + + //视频 + String videoFile = data.getVideoIdVerify(); + if (!TextUtils.isEmpty(audioFile)) { + videoPlayerView.setVisibility(View.VISIBLE); + String videoUrl; + if (videoFile.contains(",")) { + videoUrl = StringHelper.appendCompleteURL(videoFile.split(",")[0]); + } else { + videoUrl = StringHelper.appendCompleteURL(videoFile); + } + videoPlayerView.setUp(videoUrl, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); + //设置第一帧为封面 + Glide.with(this) + .setDefaultRequestOptions(new RequestOptions().frame(4000000)) + .load(videoUrl) + .into(videoPlayerView.thumbImageView); + } else { + emptyVideoView.setVisibility(View.VISIBLE); + emptyVideoView.setText("该案卷无视频材料"); + emptyVideoView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + } + } + + private void showBigImage(String path) { + Intent intent = new Intent(this, BigPictureActivity.class); + intent.putExtra("path", path); + startActivity(intent); + } + + @OnClick({R.id.caseClassLayout, R.id.caseLargeClassLayout, R.id.caseSmallClassLayout, R.id.locationMapView, R.id.addImageView}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.caseClassLayout: + new QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("案卷类型") + .addItem("事件") + .addItem("部件") + .setGravityCenter(true) + .setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + caseTypeView.setText(tag); + //获取案卷大类 + caseLargeClassPresenter.onReadyRetrofitRequest(String.valueOf(position + 1)); + } + }).build().show(); + break; + case R.id.caseLargeClassLayout: + if (largeClassBeans != null) { + if (largeClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷大类"); + for (CaseLargeClassBean.DataBean dataBean : largeClassBeans) { + sheetBuilder.addItem(dataBean.getTypeName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeCode = largeClassBeans.get(position).getTypeCode(); + + caseLargeTypeView.setText(tag); + + //获取案卷小类 + CaseLargeClassBean.DataBean dataBean = largeClassBeans.get(position); + eorc = dataBean.getEorc(); + String typeId = dataBean.getId(); + caseSmallClassPresenter.onReadyRetrofitRequest(eorc, typeId); + } + }).build().show(); + } + } + break; + case R.id.caseSmallClassLayout: + if (smallClassBeans != null) { + if (smallClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷小类"); + for (CaseSmallClassBean.DataBean dataBean : smallClassBeans) { + sheetBuilder.addItem(dataBean.getTypeDetailName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeDetailCode = smallClassBeans.get(position).getTypeDetailCode(); + + caseSmallTypeView.setText(tag); + } + }).build().show(); + } + } + break; + case R.id.locationMapView: + //根据情况加载不同图层 + String type = caseTypeView.getText().toString(); + if (type.equals("请选择")) { + ToastHelper.showToast("请先选择案卷类型", ToastHelper.WARING); + return; + } + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", type); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .create().show(); + break; + case R.id.submitButton: + submitCase();//案卷提交 + break; + default: + break; + } + } + + private void submitCase() { +// String longitude = longitudeView.getText().toString(); +// String latitude = latitudeView.getText().toString(); +// +// String fieldIntro = caseLocationView.getText().toString(); +// if (TextUtils.isEmpty(fieldIntro)) { +// ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); +// } +// String description = caseDetailEditView.getText().toString(); +// if (TextUtils.isEmpty(description)) { +// ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); +// } + if (mediaList.size() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } +// caseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, +// "1", "1", eorc, typeCode, typeDetailCode, +// gridId.substring(0, 6), +// gridId.substring(0, 9), +// communityNameView.getText().toString(), +// gridId, description, fieldIntro, +// gson.toJson(mediaList), 0, 0); + } + + @Override + public void obtainLargeClassData(CaseLargeClassBean largeClassBean) { + if (largeClassBean.isSuccess()) { + //设置大类数据 + this.largeClassBeans = largeClassBean.getData(); + if (largeClassBeans.size() == 0) { + caseLargeTypeView.setText("无小类"); + } else { + caseLargeTypeView.setText(largeClassBeans.get(0).getTypeName());//默认选择第一个 + } + caseSmallTypeView.setText("请选择"); + } + } + + @Override + public void obtainSmallClassData(CaseSmallClassBean smallClassBean) { + if (smallClassBean.isSuccess()) { + //设置大类数据 + this.smallClassBeans = smallClassBean.getData(); + if (smallClassBeans.size() == 0) { + caseSmallTypeView.setText("无小类"); + } else { + caseSmallTypeView.setText(smallClassBeans.get(0).getTypeDetailName());//默认选择第一个 + } + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } +// gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String casePlace = data.getStringExtra("pos"); + caseCommunityView.setText(community); + if (TextUtils.isEmpty(casePlace)) { + casePlaceView.setText(community); + } else { + casePlaceView.setText(casePlace); + } + SaveKeyValues.removeKey("CommunityName"); + break; + default: + break; + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (caseDetailPresenter != null) { + caseDetailPresenter.disposeRetrofitRequest(); + } + if (caseLargeClassPresenter != null) { + caseLargeClassPresenter.disposeRetrofitRequest(); + } + if (caseSmallClassPresenter != null) { + caseSmallClassPresenter.disposeRetrofitRequest(); + } + if (caseSubmitPresenter != null) { + caseSubmitPresenter.disposeRetrofitRequest(); + } + if (uploadImagePresenter != null) { + uploadImagePresenter.disposeRetrofitRequest(); + } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.hide(); + } + + @Override + public void obtainSubmitResult(SubmitResultBean resultBean) { + + } + + @Override + public void obtainUploadAudioResult(UploadResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(UploadResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(realPaths); + caseVerifyRecyclerView.setVisibility(View.VISIBLE); + caseVerifyRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + caseVerifyRecyclerView.addItemDecoration(new ItemDecorationSpace()); + caseVerifyRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(realPaths.get(position)); + } + }); + //删除按钮点击事件 + imageAdapter.setDeleteView(true); + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + @Override + public void obtainUploadVideoResult(UploadResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java index 891b7a3..ea69349 100644 --- a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java @@ -106,10 +106,6 @@ PublicKey publicKey = RSAUtils.keyStrToPublicKey(TokenHelper.getPublicKey()); String oldPassKey = RSAUtils.encryptDataByPublicKey(oldPassword.getBytes(), publicKey); String newPassKey = RSAUtils.encryptDataByPublicKey(newPassword.getBytes(), publicKey); - -// ChangeNewPasswordBean passwordBean = new ChangeNewPasswordBean(); -// passwordBean.setOldPwd(oldPassKey.replace("=\n", "=")); -// passwordBean.setNewPwd(newPassKey.replace("=\n", "=")); changePasswordPresenter.onReadyRetrofitRequest(oldPassKey, newPassKey); } @@ -117,7 +113,7 @@ public void obtainChangePassResult(ChangePasswordResultBean resultBean) { Log.d(TAG, "obtainChangePassResult: " + new Gson().toJson(resultBean)); if (resultBean.isSuccess()) { - ToastHelper.showToast("密码修改成功", ToastHelper.WARING); + ToastHelper.showToast("密码修改成功", ToastHelper.SUCCESS); finish(); } } diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java index df4a68c..1ce23d9 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Handler; import android.os.Message; @@ -16,6 +17,7 @@ import com.casic.dcms.bean.CaseVerifyBean; import com.casic.dcms.mvp.presenter.CaseVerifyPresenterImpl; import com.casic.dcms.mvp.view.ICaseVerifyView; +import com.casic.dcms.ui.CaseVerifyDetailActivity; import com.casic.dcms.utils.ToastHelper; import com.qmuiteam.qmui.widget.QMUIEmptyView; import com.scwang.smartrefresh.layout.SmartRefreshLayout; @@ -130,10 +132,9 @@ adapter.setOnItemClickListener(new CaseVerifyResultAdapter.OnItemClickListener() { @Override public void onClick(int position) { -// Intent intent = new Intent(context, CaseDetailActivity.class); -// intent.putExtra("id", dataRows.get(position).getId()); -// startActivity( intent); - ToastHelper.showToast("详情页正在完善中", ToastHelper.ERROR); + Intent intent = new Intent(context, CaseVerifyDetailActivity.class); + intent.putExtra("id", dataBeans.get(position).getId()); + startActivity(intent); } }); } diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index 5abe4b7..233b5d1 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -29,6 +29,8 @@ "问题来源", "案卷状态", "高发问题", "街道统计", "处理统计", "趋势分析"); + public static final List CATEGORY = Arrays.asList("请选择", "情况属实", "情况不属实"); + public static final String[] USER_PERMISSIONS = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index 4bbfadb..f14a8c2 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -1,9 +1,12 @@ package com.casic.dcms.utils; import android.text.TextUtils; +import android.util.Log; public class StringHelper { + private static final String TAG = "StringHelper"; + public static void saveUserName(String name) { SaveKeyValues.putValue("userName", name); } @@ -51,7 +54,7 @@ public static String appendCompleteURL(String url) { if (TextUtils.isEmpty(url)) { - ToastHelper.showToast("上传路径不对", ToastHelper.ERROR); + Log.d(TAG, "文件路径不对 => " + url); return ""; } String data = url.replace("\\", "/"); diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 003a919..0f6f190 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -328,4 +328,14 @@ @Query("deptid") String deptid, @Query("roleTips") String roleTips, @Query("isOnLine") String isOnLine); + + /** + * 设备定位信息上传 + */ + @FormUrlEncoded + @POST("/devicePositionLog/positionUpload") + Observable uploadDevicePosition(@Header("token") String token, + @Field("imei") String imei, + @Field("positionLat") String positionLat, + @Field("positionLng") String positionLng); } diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 04d4159..b49b5e0 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -372,4 +372,13 @@ RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainOnlinePerson(TokenHelper.getToken(), deptid, roleTips, isOnLine); } + + /** + * 设备定位信息上传 + */ + public static Observable getPositionUploadResult(String imei, String positionLat, String positionLng) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.uploadDevicePosition(TokenHelper.getToken(), imei, positionLat, positionLng); + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c47228..2838a72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,9 @@ android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" android:usesCleartextTraffic="true"> - + @@ -66,6 +68,7 @@ + { private Context context; + private boolean isShow = true; private List mediaList = new ArrayList<>(); public ImageRecycleViewAdapter(Context mContext) { @@ -38,6 +39,10 @@ notifyDataSetChanged(); } + public void setDeleteView(boolean isShow) { + this.isShow = isShow; + } + @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -64,12 +69,17 @@ itemClickListener.onClick(position); } }); - holder.deleteView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteClickListener.onClick(position); - } - }); + if (isShow) { + holder.deleteView.setVisibility(View.VISIBLE); + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + deleteClickListener.onClick(position); + } + }); + } else { + holder.deleteView.setVisibility(View.INVISIBLE); + } } static class ItemViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java index c7191e4..5a8065f 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/CaseSubmitPresenterImpl.java @@ -15,8 +15,8 @@ private ICaseSubmitCaseView view; private CaseSubmitModelImpl actionModel; - public CaseSubmitPresenterImpl(ICaseSubmitCaseView caseTypeView) { - this.view = caseTypeView; + public CaseSubmitPresenterImpl(ICaseSubmitCaseView submitCaseView) { + this.view = submitCaseView; actionModel = new CaseSubmitModelImpl(this); } diff --git a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java index e1ec347..7e9fe92 100644 --- a/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ArcGISMapActivity.java @@ -269,7 +269,7 @@ }.getType(); UnitFeatureBean unitFeatureBean = gson.fromJson(gson.toJson(msg.obj), unitType); - arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(unitFeatureBean.getBGID(), communityName, communityName); break; case 202104262: Type gridType = new TypeToken>() { @@ -283,7 +283,7 @@ @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - arcGISMapActivity.showDialog(featureBean.getBGID(), communityName); + arcGISMapActivity.showDialog(featureBean.getBGID(), communityName, featureBean.getOBJPOS()); } }); } @@ -342,7 +342,7 @@ .create().show(); } - private void showDialog(String gridId, String communityName) { + private void showDialog(String gridId, String communityName, String pos) { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("该事件所在地点网格为[" + gridId + "]确认提交?") @@ -357,6 +357,7 @@ intent.putExtra("longitude", clickPoint.getX()); intent.putExtra("community", communityName); intent.putExtra("gridId", gridId); + intent.putExtra("pos", pos); setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index 26aed87..e402e4d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -538,7 +538,7 @@ mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(StringHelper.appendCompleteURL(audioUrl)); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.prepare(); + mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } @@ -599,12 +599,13 @@ addVideoView.setVisibility(View.GONE); videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); - videoPlayerView.setUp(StringHelper.appendCompleteURL(videoUrl), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + String completeURL = StringHelper.appendCompleteURL(videoUrl); + videoPlayerView.setUp(completeURL, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) - .load(videoUrl) + .load(completeURL) .into(videoPlayerView.thumbImageView); } } @@ -679,6 +680,11 @@ if (uploadAudioPresenter != null) { uploadAudioPresenter.disposeRetrofitRequest(); } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } } @Override diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java new file mode 100644 index 0000000..4903490 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -0,0 +1,591 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseActivity; +import com.casic.dcms.bean.CaseDetailBean; +import com.casic.dcms.bean.CaseLargeClassBean; +import com.casic.dcms.bean.CaseSmallClassBean; +import com.casic.dcms.bean.SubmitResultBean; +import com.casic.dcms.bean.UploadResultBean; +import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseLargeClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSmallClassPresenterImpl; +import com.casic.dcms.mvp.presenter.CaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseDetailView; +import com.casic.dcms.mvp.view.ICaseLargeClassView; +import com.casic.dcms.mvp.view.ICaseSmallClassView; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.ColorHelper; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StatusBarColorUtil; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.google.gson.Gson; +import com.gyf.immersionbar.ImmersionBar; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + +public class CaseVerifyDetailActivity extends BaseActivity implements ICaseDetailView, View.OnClickListener, + ICaseLargeClassView, ICaseSmallClassView, IUploadFileView, ICaseSubmitCaseView { + + private static final String TAG = "CaseVerifyDetail"; + private Context context = this; + @BindView(R.id.leftBackView) + ImageView leftBackView; + @BindView(R.id.caseNumberView) + TextView caseNumberView; + @BindView(R.id.caseTypeView) + TextView caseTypeView; + @BindView(R.id.caseLargeTypeView) + TextView caseLargeTypeView; + @BindView(R.id.caseSmallTypeView) + TextView caseSmallTypeView; + @BindView(R.id.caseCommunityView) + TextView caseCommunityView; + @BindView(R.id.casePlaceView) + TextView casePlaceView; + @BindView(R.id.caseSituationView) + EditText caseSituationView; + @BindView(R.id.caseHandleView) + EditText caseHandleView; + @BindView(R.id.caseStartTimeView) + TextView caseStartTimeView; + @BindView(R.id.caseEndTimeView) + TextView caseEndTimeView; + @BindView(R.id.casePicRecyclerView) + RecyclerView casePicRecyclerView; + @BindView(R.id.emptyImageView) + TextView emptyImageView; + @BindView(R.id.caseAudioView) + TextView caseAudioView; + @BindView(R.id.videoPlayerView) + JCVideoPlayerStandard videoPlayerView; + @BindView(R.id.emptyVideoView) + TextView emptyVideoView; + @BindView(R.id.caseOpinionView) + EditText caseOpinionView; + @BindView(R.id.caseConditionView) + Spinner caseConditionView; + @BindView(R.id.caseVerifyRecyclerView) + RecyclerView caseVerifyRecyclerView; + @BindView(R.id.addImageView) + ImageView addImageView; + + private CaseDetailPresenterImpl caseDetailPresenter; + private Gson gson; + private CaseLargeClassPresenterImpl caseLargeClassPresenter; + private List largeClassBeans; + private CaseSmallClassPresenterImpl caseSmallClassPresenter; + private List smallClassBeans; + private String eorc; + private String typeCode; + private String typeDetailCode; + private MediaPlayer mediaPlayer; + private UploadImagePresenterImpl uploadImagePresenter; + private QMUITipDialog submitDialog; + private List realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private CaseSubmitPresenterImpl caseSubmitPresenter; + + @Override + public int initLayoutView() { + return R.layout.activity_case_verify_detail; + } + + @Override + protected void setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)); + ImmersionBar.with(this).statusBarDarkFont(false).init(); + leftBackView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + gson = new Gson(); + mediaPlayer = new MediaPlayer(); + largeClassBeans = new ArrayList<>(); + smallClassBeans = new ArrayList<>(); + + String id = getIntent().getStringExtra("id"); + caseDetailPresenter = new CaseDetailPresenterImpl(this); + caseDetailPresenter.onReadyRetrofitRequest(id); + caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); + caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); + uploadImagePresenter = new UploadImagePresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + } + + @Override + public void initEvent() { + ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Constant.CATEGORY); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + caseConditionView.setAdapter(spinnerAdapter); + } + + @Override + public void obtainCaseDetailData(CaseDetailBean resultBean) { +// Log.d(TAG, "obtainCaseDetailData: " + gson.toJson(resultBean)); + if (resultBean.isSuccess()) { + CaseDetailBean.DataBean data = resultBean.getData().get(0); + caseNumberView.setText(data.getCaseid()); + caseTypeView.setText(data.getEorcName()); + caseLargeTypeView.setText(data.getCasetypeName()); + caseSmallTypeView.setText(data.getCasetypeDetailName()); + caseCommunityView.setText(data.getCommunityName()); + casePlaceView.setText(data.getFieldintro()); + caseStartTimeView.setText(data.getCreateTime()); + caseEndTimeView.setText(data.getNodeLimittime()); + caseSituationView.setText(data.getDescription()); + + //图片 + String images = data.getFileIdVerify(); + if (!TextUtils.isEmpty(images)) { + List urls = new ArrayList<>(); + String[] split = images.split(","); + for (String s : split) { + urls.add(StringHelper.appendCompleteURL(s)); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(urls); + casePicRecyclerView.setVisibility(View.VISIBLE); + casePicRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + casePicRecyclerView.addItemDecoration(new ItemDecorationSpace()); + casePicRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(urls.get(position)); + } + }); + imageAdapter.setDeleteView(false); + } else { + emptyImageView.setVisibility(View.VISIBLE); + emptyImageView.setText("该案卷无图片材料"); + emptyImageView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + + //音频 + String audioFile = data.getAudioIdVerify(); + if (TextUtils.isEmpty(audioFile)) { + caseAudioView.setText("该案卷无音频材料"); + caseAudioView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } else { + String audioUrl; + if (audioFile.contains(",")) { + audioUrl = StringHelper.appendCompleteURL(audioFile.split(",")[0]); + } else { + audioUrl = StringHelper.appendCompleteURL(audioFile); + } + caseAudioView.setText("播放音频材料"); + caseAudioView.setTextColor(ColorHelper.getResourcesColor(this, R.color.mainThemeColor)); + try { + mediaPlayer.setDataSource(audioUrl); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.prepareAsync(); + } catch (IOException e) { + e.printStackTrace(); + } + caseAudioView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } + } + }); + } + + //视频 + String videoFile = data.getVideoIdVerify(); + if (!TextUtils.isEmpty(audioFile)) { + videoPlayerView.setVisibility(View.VISIBLE); + String videoUrl; + if (videoFile.contains(",")) { + videoUrl = StringHelper.appendCompleteURL(videoFile.split(",")[0]); + } else { + videoUrl = StringHelper.appendCompleteURL(videoFile); + } + videoPlayerView.setUp(videoUrl, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL); + videoPlayerView.tinyBackImageView.setVisibility(View.INVISIBLE); + //设置第一帧为封面 + Glide.with(this) + .setDefaultRequestOptions(new RequestOptions().frame(4000000)) + .load(videoUrl) + .into(videoPlayerView.thumbImageView); + } else { + emptyVideoView.setVisibility(View.VISIBLE); + emptyVideoView.setText("该案卷无视频材料"); + emptyVideoView.setText(ColorHelper.getResourcesColor(this, R.color.darkGray)); + } + } + } + + private void showBigImage(String path) { + Intent intent = new Intent(this, BigPictureActivity.class); + intent.putExtra("path", path); + startActivity(intent); + } + + @OnClick({R.id.caseClassLayout, R.id.caseLargeClassLayout, R.id.caseSmallClassLayout, R.id.locationMapView, R.id.addImageView}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.caseClassLayout: + new QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("案卷类型") + .addItem("事件") + .addItem("部件") + .setGravityCenter(true) + .setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + caseTypeView.setText(tag); + //获取案卷大类 + caseLargeClassPresenter.onReadyRetrofitRequest(String.valueOf(position + 1)); + } + }).build().show(); + break; + case R.id.caseLargeClassLayout: + if (largeClassBeans != null) { + if (largeClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷大类"); + for (CaseLargeClassBean.DataBean dataBean : largeClassBeans) { + sheetBuilder.addItem(dataBean.getTypeName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeCode = largeClassBeans.get(position).getTypeCode(); + + caseLargeTypeView.setText(tag); + + //获取案卷小类 + CaseLargeClassBean.DataBean dataBean = largeClassBeans.get(position); + eorc = dataBean.getEorc(); + String typeId = dataBean.getId(); + caseSmallClassPresenter.onReadyRetrofitRequest(eorc, typeId); + } + }).build().show(); + } + } + break; + case R.id.caseSmallClassLayout: + if (smallClassBeans != null) { + if (smallClassBeans.size() > 1) { + QMUIBottomSheet.BottomListSheetBuilder sheetBuilder = new QMUIBottomSheet.BottomListSheetBuilder(this); + sheetBuilder.setTitle("案卷小类"); + for (CaseSmallClassBean.DataBean dataBean : smallClassBeans) { + sheetBuilder.addItem(dataBean.getTypeDetailName()); + } + sheetBuilder.setGravityCenter(true).setOnSheetItemClickListener(new QMUIBottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() { + @Override + public void onClick(QMUIBottomSheet dialog, View itemView, int position, String tag) { + dialog.dismiss(); + typeDetailCode = smallClassBeans.get(position).getTypeDetailCode(); + + caseSmallTypeView.setText(tag); + } + }).build().show(); + } + } + break; + case R.id.locationMapView: + //根据情况加载不同图层 + String type = caseTypeView.getText().toString(); + if (type.equals("请选择")) { + ToastHelper.showToast("请先选择案卷类型", ToastHelper.WARING); + return; + } + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", type); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .create().show(); + break; + case R.id.submitButton: + submitCase();//案卷提交 + break; + default: + break; + } + } + + private void submitCase() { +// String longitude = longitudeView.getText().toString(); +// String latitude = latitudeView.getText().toString(); +// +// String fieldIntro = caseLocationView.getText().toString(); +// if (TextUtils.isEmpty(fieldIntro)) { +// ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); +// } +// String description = caseDetailEditView.getText().toString(); +// if (TextUtils.isEmpty(description)) { +// ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); +// } + if (mediaList.size() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } +// caseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, +// "1", "1", eorc, typeCode, typeDetailCode, +// gridId.substring(0, 6), +// gridId.substring(0, 9), +// communityNameView.getText().toString(), +// gridId, description, fieldIntro, +// gson.toJson(mediaList), 0, 0); + } + + @Override + public void obtainLargeClassData(CaseLargeClassBean largeClassBean) { + if (largeClassBean.isSuccess()) { + //设置大类数据 + this.largeClassBeans = largeClassBean.getData(); + if (largeClassBeans.size() == 0) { + caseLargeTypeView.setText("无小类"); + } else { + caseLargeTypeView.setText(largeClassBeans.get(0).getTypeName());//默认选择第一个 + } + caseSmallTypeView.setText("请选择"); + } + } + + @Override + public void obtainSmallClassData(CaseSmallClassBean smallClassBean) { + if (smallClassBean.isSuccess()) { + //设置大类数据 + this.smallClassBeans = smallClassBean.getData(); + if (smallClassBeans.size() == 0) { + caseSmallTypeView.setText("无小类"); + } else { + caseSmallTypeView.setText(smallClassBeans.get(0).getTypeDetailName());//默认选择第一个 + } + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } +// gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String casePlace = data.getStringExtra("pos"); + caseCommunityView.setText(community); + if (TextUtils.isEmpty(casePlace)) { + casePlaceView.setText(community); + } else { + casePlaceView.setText(casePlace); + } + SaveKeyValues.removeKey("CommunityName"); + break; + default: + break; + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (caseDetailPresenter != null) { + caseDetailPresenter.disposeRetrofitRequest(); + } + if (caseLargeClassPresenter != null) { + caseLargeClassPresenter.disposeRetrofitRequest(); + } + if (caseSmallClassPresenter != null) { + caseSmallClassPresenter.disposeRetrofitRequest(); + } + if (caseSubmitPresenter != null) { + caseSubmitPresenter.disposeRetrofitRequest(); + } + if (uploadImagePresenter != null) { + uploadImagePresenter.disposeRetrofitRequest(); + } + if (mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.hide(); + } + + @Override + public void obtainSubmitResult(SubmitResultBean resultBean) { + + } + + @Override + public void obtainUploadAudioResult(UploadResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(UploadResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + ImageRecycleViewAdapter imageAdapter = new ImageRecycleViewAdapter(this); + imageAdapter.setMediaList(realPaths); + caseVerifyRecyclerView.setVisibility(View.VISIBLE); + caseVerifyRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + caseVerifyRecyclerView.addItemDecoration(new ItemDecorationSpace()); + caseVerifyRecyclerView.setAdapter(imageAdapter); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + //查看大图 + showBigImage(realPaths.get(position)); + } + }); + //删除按钮点击事件 + imageAdapter.setDeleteView(true); + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + @Override + public void obtainUploadVideoResult(UploadResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java index 891b7a3..ea69349 100644 --- a/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/ChangePasswordActivity.java @@ -106,10 +106,6 @@ PublicKey publicKey = RSAUtils.keyStrToPublicKey(TokenHelper.getPublicKey()); String oldPassKey = RSAUtils.encryptDataByPublicKey(oldPassword.getBytes(), publicKey); String newPassKey = RSAUtils.encryptDataByPublicKey(newPassword.getBytes(), publicKey); - -// ChangeNewPasswordBean passwordBean = new ChangeNewPasswordBean(); -// passwordBean.setOldPwd(oldPassKey.replace("=\n", "=")); -// passwordBean.setNewPwd(newPassKey.replace("=\n", "=")); changePasswordPresenter.onReadyRetrofitRequest(oldPassKey, newPassKey); } @@ -117,7 +113,7 @@ public void obtainChangePassResult(ChangePasswordResultBean resultBean) { Log.d(TAG, "obtainChangePassResult: " + new Gson().toJson(resultBean)); if (resultBean.isSuccess()) { - ToastHelper.showToast("密码修改成功", ToastHelper.WARING); + ToastHelper.showToast("密码修改成功", ToastHelper.SUCCESS); finish(); } } diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java index df4a68c..1ce23d9 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/verify/CaseVerifyFragment.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Handler; import android.os.Message; @@ -16,6 +17,7 @@ import com.casic.dcms.bean.CaseVerifyBean; import com.casic.dcms.mvp.presenter.CaseVerifyPresenterImpl; import com.casic.dcms.mvp.view.ICaseVerifyView; +import com.casic.dcms.ui.CaseVerifyDetailActivity; import com.casic.dcms.utils.ToastHelper; import com.qmuiteam.qmui.widget.QMUIEmptyView; import com.scwang.smartrefresh.layout.SmartRefreshLayout; @@ -130,10 +132,9 @@ adapter.setOnItemClickListener(new CaseVerifyResultAdapter.OnItemClickListener() { @Override public void onClick(int position) { -// Intent intent = new Intent(context, CaseDetailActivity.class); -// intent.putExtra("id", dataRows.get(position).getId()); -// startActivity( intent); - ToastHelper.showToast("详情页正在完善中", ToastHelper.ERROR); + Intent intent = new Intent(context, CaseVerifyDetailActivity.class); + intent.putExtra("id", dataBeans.get(position).getId()); + startActivity(intent); } }); } diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index 5abe4b7..233b5d1 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -29,6 +29,8 @@ "问题来源", "案卷状态", "高发问题", "街道统计", "处理统计", "趋势分析"); + public static final List CATEGORY = Arrays.asList("请选择", "情况属实", "情况不属实"); + public static final String[] USER_PERMISSIONS = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index 4bbfadb..f14a8c2 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -1,9 +1,12 @@ package com.casic.dcms.utils; import android.text.TextUtils; +import android.util.Log; public class StringHelper { + private static final String TAG = "StringHelper"; + public static void saveUserName(String name) { SaveKeyValues.putValue("userName", name); } @@ -51,7 +54,7 @@ public static String appendCompleteURL(String url) { if (TextUtils.isEmpty(url)) { - ToastHelper.showToast("上传路径不对", ToastHelper.ERROR); + Log.d(TAG, "文件路径不对 => " + url); return ""; } String data = url.replace("\\", "/"); diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 003a919..0f6f190 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -328,4 +328,14 @@ @Query("deptid") String deptid, @Query("roleTips") String roleTips, @Query("isOnLine") String isOnLine); + + /** + * 设备定位信息上传 + */ + @FormUrlEncoded + @POST("/devicePositionLog/positionUpload") + Observable uploadDevicePosition(@Header("token") String token, + @Field("imei") String imei, + @Field("positionLat") String positionLat, + @Field("positionLng") String positionLng); } diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 04d4159..b49b5e0 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -372,4 +372,13 @@ RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainOnlinePerson(TokenHelper.getToken(), deptid, roleTips, isOnLine); } + + /** + * 设备定位信息上传 + */ + public static Observable getPositionUploadResult(String imei, String positionLat, String positionLng) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.uploadDevicePosition(TokenHelper.getToken(), imei, positionLat, positionLng); + } } diff --git a/app/src/main/res/layout/activity_case_verify_detail.xml b/app/src/main/res/layout/activity_case_verify_detail.xml new file mode 100644 index 0000000..13dfa4b --- /dev/null +++ b/app/src/main/res/layout/activity_case_verify_detail.xml @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file