diff --git a/.idea/misc.xml b/.idea/misc.xml index efa70ac..56a7b97 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -96,6 +96,7 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index efa70ac..56a7b97 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -96,6 +96,7 @@ + diff --git a/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java index b6ec664..7d60cb0 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java @@ -3,6 +3,9 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.view.View; @@ -10,6 +13,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -36,6 +40,7 @@ import com.pengxh.androidx.lite.hub.IntHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; @@ -58,6 +63,15 @@ private String typeCode = ""; private String typeDetailCode = "";//默认值,防止用户不选择直接跳过 private String gridId; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060301) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher quickCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -118,11 +132,15 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { largeTypeBeans = new ArrayList<>(); smallTypeBeans = new ArrayList<>(); + weakReferenceHandler = new WeakReferenceHandler(callback); + caseViewModel = new ViewModelProvider(this).get(CaseViewModel.class); commonDataViewModel = new ViewModelProvider(this).get(CommonDataViewModel.class); @@ -279,11 +297,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060301; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -313,6 +345,10 @@ }); } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); + } + /** * 案卷提交 */ diff --git a/.idea/misc.xml b/.idea/misc.xml index efa70ac..56a7b97 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -96,6 +96,7 @@ + diff --git a/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java index b6ec664..7d60cb0 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java @@ -3,6 +3,9 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.view.View; @@ -10,6 +13,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -36,6 +40,7 @@ import com.pengxh.androidx.lite.hub.IntHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; @@ -58,6 +63,15 @@ private String typeCode = ""; private String typeDetailCode = "";//默认值,防止用户不选择直接跳过 private String gridId; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060301) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher quickCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -118,11 +132,15 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { largeTypeBeans = new ArrayList<>(); smallTypeBeans = new ArrayList<>(); + weakReferenceHandler = new WeakReferenceHandler(callback); + caseViewModel = new ViewModelProvider(this).get(CaseViewModel.class); commonDataViewModel = new ViewModelProvider(this).get(CommonDataViewModel.class); @@ -279,11 +297,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060301; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -313,6 +345,10 @@ }); } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); + } + /** * 案卷提交 */ diff --git a/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java index 876933a..cef73f8 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java @@ -3,6 +3,9 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.view.View; @@ -10,6 +13,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -33,6 +37,7 @@ import com.pengxh.androidx.lite.hub.IntHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import java.io.File; @@ -48,6 +53,15 @@ private CaseViewModel caseViewModel; private EditableImageAdapter imageAdapter; private String gridId, shopID; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060302) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher packageCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -101,8 +115,12 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { + weakReferenceHandler = new WeakReferenceHandler(callback); + uploadViewModel = new ViewModelProvider(this).get(UploadViewModel.class); uploadViewModel.imageModel.observe(this, new Observer() { @Override @@ -147,11 +165,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060302; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -181,6 +213,10 @@ }); } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); + } + /** * 案卷提交 */ diff --git a/.idea/misc.xml b/.idea/misc.xml index efa70ac..56a7b97 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -96,6 +96,7 @@ + diff --git a/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java index b6ec664..7d60cb0 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java @@ -3,6 +3,9 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.view.View; @@ -10,6 +13,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -36,6 +40,7 @@ import com.pengxh.androidx.lite.hub.IntHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; @@ -58,6 +63,15 @@ private String typeCode = ""; private String typeDetailCode = "";//默认值,防止用户不选择直接跳过 private String gridId; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060301) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher quickCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -118,11 +132,15 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { largeTypeBeans = new ArrayList<>(); smallTypeBeans = new ArrayList<>(); + weakReferenceHandler = new WeakReferenceHandler(callback); + caseViewModel = new ViewModelProvider(this).get(CaseViewModel.class); commonDataViewModel = new ViewModelProvider(this).get(CommonDataViewModel.class); @@ -279,11 +297,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060301; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -313,6 +345,10 @@ }); } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); + } + /** * 案卷提交 */ diff --git a/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java index 876933a..cef73f8 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java @@ -3,6 +3,9 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.view.View; @@ -10,6 +13,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -33,6 +37,7 @@ import com.pengxh.androidx.lite.hub.IntHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import java.io.File; @@ -48,6 +53,15 @@ private CaseViewModel caseViewModel; private EditableImageAdapter imageAdapter; private String gridId, shopID; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060302) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher packageCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -101,8 +115,12 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { + weakReferenceHandler = new WeakReferenceHandler(callback); + uploadViewModel = new ViewModelProvider(this).get(UploadViewModel.class); uploadViewModel.imageModel.observe(this, new Observer() { @Override @@ -147,11 +165,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060302; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -181,6 +213,10 @@ }); } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); + } + /** * 案卷提交 */ diff --git a/app/src/main/java/com/casic/dcms/view/upload/CommonCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/CommonCaseActivity.java index 92b5e14..55ee5c0 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/CommonCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/CommonCaseActivity.java @@ -6,6 +6,9 @@ import android.content.Context; import android.content.Intent; import android.media.MediaMetadataRetriever; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; @@ -20,6 +23,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.core.content.res.ResourcesCompat; import androidx.lifecycle.Observer; @@ -53,6 +57,7 @@ import com.pengxh.androidx.lite.hub.LongHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import com.pengxh.androidx.lite.widget.audio.AudioPopupWindow; import com.pengxh.androidx.lite.widget.audio.AudioRecodeHelper; @@ -89,6 +94,15 @@ private String gridId; private String audioUrl, videoUrl; private boolean isFirstEnter = true; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060303) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher uploadCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -149,11 +163,15 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { largeTypeBeans = new ArrayList<>(); smallTypeBeans = new ArrayList<>(); + weakReferenceHandler = new WeakReferenceHandler(callback); + caseViewModel = new ViewModelProvider(this).get(CaseViewModel.class); commonDataViewModel = new ViewModelProvider(this).get(CommonDataViewModel.class); @@ -253,6 +271,73 @@ viewBinding.addImageRecyclerView.setAdapter(imageAdapter); } + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = LocaleConstant.DEFAULT_WIDTH / 2; + height = LocaleConstant.DEFAULT_HEIGHT / 2; + } else { + width = LocaleConstant.DEFAULT_HEIGHT / 2; + height = LocaleConstant.DEFAULT_WIDTH / 2; + } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = LocaleConstant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, LocaleConstant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); + } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadViewModel.uploadVideo(new File(outputVideoFile)); + } else { + StringHub.show(CommonCaseActivity.this, "请先选择案卷类型"); + } + progressDialog.dismiss(); + } + }); + } + + /** + * 首次进入页面显示引导Popup + */ + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (isFirstEnter) { + TextView textView = new TextView(this); + int padding = QMUIDisplayHelper.dp2px(this, 10); + textView.setPadding(padding, padding, padding, padding); + textView.setGravity(Gravity.CENTER); + textView.setText("按住即可开始录音"); + QMUIPopups.popup(this, QMUIDisplayHelper.dp2px(this, 150)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(textView) + .shadow(true) + .arrow(true) + .animStyle(QMUIPopup.ANIM_AUTO) + .dimAmount(0.6f)//60%透明度 + .onDismiss(null) + .show(viewBinding.recodeAudioButton); + isFirstEnter = false; + } + } + @SuppressLint("ClickableViewAccessibility") @Override public void initEvent() { @@ -470,11 +555,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060303; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -504,71 +603,8 @@ }); } - /** - * 6.0以上视频压缩 - */ - private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { - Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); - String outputVideoFile = FileUtils.getOutputVideoFile(); - int width, height, bitrate; - if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 - width = LocaleConstant.DEFAULT_WIDTH / 2; - height = LocaleConstant.DEFAULT_HEIGHT / 2; - } else { - width = LocaleConstant.DEFAULT_HEIGHT / 2; - height = LocaleConstant.DEFAULT_WIDTH / 2; - } - if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { - bitrate = LocaleConstant.BITRATE; - } else { - bitrate = Integer.parseInt(defaultBitrate) / 2; - } - VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, LocaleConstant.BITRATE, new VideoSlimmer.ProgressListener() { - @Override - public void onStart() { - progressDialog.show(); - } - - @Override - public void onProgress(float percent) { - progressDialog.setProgress((int) percent); - } - - @Override - public void onFinish(boolean result) { - if (result) { - uploadViewModel.uploadVideo(new File(outputVideoFile)); - } else { - StringHub.show(CommonCaseActivity.this, "请先选择案卷类型"); - } - progressDialog.dismiss(); - } - }); - } - - /** - * 首次进入页面显示引导Popup - */ - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - if (isFirstEnter) { - TextView textView = new TextView(this); - int padding = QMUIDisplayHelper.dp2px(this, 10); - textView.setPadding(padding, padding, padding, padding); - textView.setGravity(Gravity.CENTER); - textView.setText("按住即可开始录音"); - QMUIPopups.popup(this, QMUIDisplayHelper.dp2px(this, 150)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(textView) - .shadow(true) - .arrow(true) - .animStyle(QMUIPopup.ANIM_AUTO) - .dimAmount(0.6f)//60%透明度 - .onDismiss(null) - .show(viewBinding.recodeAudioButton); - isFirstEnter = false; - } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); } /** diff --git a/.idea/misc.xml b/.idea/misc.xml index efa70ac..56a7b97 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -96,6 +96,7 @@ + diff --git a/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java index b6ec664..7d60cb0 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/BriefCaseActivity.java @@ -3,6 +3,9 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.view.View; @@ -10,6 +13,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -36,6 +40,7 @@ import com.pengxh.androidx.lite.hub.IntHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; @@ -58,6 +63,15 @@ private String typeCode = ""; private String typeDetailCode = "";//默认值,防止用户不选择直接跳过 private String gridId; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060301) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher quickCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -118,11 +132,15 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { largeTypeBeans = new ArrayList<>(); smallTypeBeans = new ArrayList<>(); + weakReferenceHandler = new WeakReferenceHandler(callback); + caseViewModel = new ViewModelProvider(this).get(CaseViewModel.class); commonDataViewModel = new ViewModelProvider(this).get(CommonDataViewModel.class); @@ -279,11 +297,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060301; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -313,6 +345,10 @@ }); } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); + } + /** * 案卷提交 */ diff --git a/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java index 876933a..cef73f8 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/BusinessCaseActivity.java @@ -3,6 +3,9 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.view.View; @@ -10,6 +13,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -33,6 +37,7 @@ import com.pengxh.androidx.lite.hub.IntHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import java.io.File; @@ -48,6 +53,15 @@ private CaseViewModel caseViewModel; private EditableImageAdapter imageAdapter; private String gridId, shopID; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060302) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher packageCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -101,8 +115,12 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { + weakReferenceHandler = new WeakReferenceHandler(callback); + uploadViewModel = new ViewModelProvider(this).get(UploadViewModel.class); uploadViewModel.imageModel.observe(this, new Observer() { @Override @@ -147,11 +165,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060302; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -181,6 +213,10 @@ }); } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); + } + /** * 案卷提交 */ diff --git a/app/src/main/java/com/casic/dcms/view/upload/CommonCaseActivity.java b/app/src/main/java/com/casic/dcms/view/upload/CommonCaseActivity.java index 92b5e14..55ee5c0 100644 --- a/app/src/main/java/com/casic/dcms/view/upload/CommonCaseActivity.java +++ b/app/src/main/java/com/casic/dcms/view/upload/CommonCaseActivity.java @@ -6,6 +6,9 @@ import android.content.Context; import android.content.Intent; import android.media.MediaMetadataRetriever; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; @@ -20,6 +23,7 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.core.content.res.ResourcesCompat; import androidx.lifecycle.Observer; @@ -53,6 +57,7 @@ import com.pengxh.androidx.lite.hub.LongHub; import com.pengxh.androidx.lite.hub.StringHub; import com.pengxh.androidx.lite.utils.ImmerseStatusBarManager; +import com.pengxh.androidx.lite.utils.WeakReferenceHandler; import com.pengxh.androidx.lite.vm.LoadState; import com.pengxh.androidx.lite.widget.audio.AudioPopupWindow; import com.pengxh.androidx.lite.widget.audio.AudioRecodeHelper; @@ -89,6 +94,15 @@ private String gridId; private String audioUrl, videoUrl; private boolean isFirstEnter = true; + private final Handler.Callback callback = new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if (msg.what == 2023060303) { + handleSelectResult((LocalMedia) msg.obj); + } + return true; + } + }; private final ActivityResultLauncher uploadCaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -149,11 +163,15 @@ }); } + private WeakReferenceHandler weakReferenceHandler; + @Override public void initData() { largeTypeBeans = new ArrayList<>(); smallTypeBeans = new ArrayList<>(); + weakReferenceHandler = new WeakReferenceHandler(callback); + caseViewModel = new ViewModelProvider(this).get(CaseViewModel.class); commonDataViewModel = new ViewModelProvider(this).get(CommonDataViewModel.class); @@ -253,6 +271,73 @@ viewBinding.addImageRecyclerView.setAdapter(imageAdapter); } + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = LocaleConstant.DEFAULT_WIDTH / 2; + height = LocaleConstant.DEFAULT_HEIGHT / 2; + } else { + width = LocaleConstant.DEFAULT_HEIGHT / 2; + height = LocaleConstant.DEFAULT_WIDTH / 2; + } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = LocaleConstant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, LocaleConstant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); + } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadViewModel.uploadVideo(new File(outputVideoFile)); + } else { + StringHub.show(CommonCaseActivity.this, "请先选择案卷类型"); + } + progressDialog.dismiss(); + } + }); + } + + /** + * 首次进入页面显示引导Popup + */ + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (isFirstEnter) { + TextView textView = new TextView(this); + int padding = QMUIDisplayHelper.dp2px(this, 10); + textView.setPadding(padding, padding, padding, padding); + textView.setGravity(Gravity.CENTER); + textView.setText("按住即可开始录音"); + QMUIPopups.popup(this, QMUIDisplayHelper.dp2px(this, 150)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(textView) + .shadow(true) + .arrow(true) + .animStyle(QMUIPopup.ANIM_AUTO) + .dimAmount(0.6f)//60%透明度 + .onDismiss(null) + .show(viewBinding.recodeAudioButton); + isFirstEnter = false; + } + } + @SuppressLint("ClickableViewAccessibility") @Override public void initEvent() { @@ -470,11 +555,25 @@ @Override public void onSuccess(ArrayList result) { if (result.size() == 1) { - uploadViewModel.uploadImage(new File(result.get(0).getRealPath())); + handleSelectResult(result.get(0)); } else { - for (LocalMedia localMedia : result) { - uploadViewModel.uploadImage(new File(localMedia.getRealPath())); - } + int sum = (result.size() * 500); + new CountDownTimer(sum, 500) { + + @Override + public void onTick(long millisUntilFinished) { + int i = (int) (millisUntilFinished / 500); + Message message = weakReferenceHandler.obtainMessage(); + message.obj = result.get(i); + message.what = 2023060303; + weakReferenceHandler.handleMessage(message); + } + + @Override + public void onFinish() { + + } + }.start(); } } }); @@ -504,71 +603,8 @@ }); } - /** - * 6.0以上视频压缩 - */ - private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { - Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); - String outputVideoFile = FileUtils.getOutputVideoFile(); - int width, height, bitrate; - if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 - width = LocaleConstant.DEFAULT_WIDTH / 2; - height = LocaleConstant.DEFAULT_HEIGHT / 2; - } else { - width = LocaleConstant.DEFAULT_HEIGHT / 2; - height = LocaleConstant.DEFAULT_WIDTH / 2; - } - if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { - bitrate = LocaleConstant.BITRATE; - } else { - bitrate = Integer.parseInt(defaultBitrate) / 2; - } - VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, LocaleConstant.BITRATE, new VideoSlimmer.ProgressListener() { - @Override - public void onStart() { - progressDialog.show(); - } - - @Override - public void onProgress(float percent) { - progressDialog.setProgress((int) percent); - } - - @Override - public void onFinish(boolean result) { - if (result) { - uploadViewModel.uploadVideo(new File(outputVideoFile)); - } else { - StringHub.show(CommonCaseActivity.this, "请先选择案卷类型"); - } - progressDialog.dismiss(); - } - }); - } - - /** - * 首次进入页面显示引导Popup - */ - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - if (isFirstEnter) { - TextView textView = new TextView(this); - int padding = QMUIDisplayHelper.dp2px(this, 10); - textView.setPadding(padding, padding, padding, padding); - textView.setGravity(Gravity.CENTER); - textView.setText("按住即可开始录音"); - QMUIPopups.popup(this, QMUIDisplayHelper.dp2px(this, 150)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(textView) - .shadow(true) - .arrow(true) - .animStyle(QMUIPopup.ANIM_AUTO) - .dimAmount(0.6f)//60%透明度 - .onDismiss(null) - .show(viewBinding.recodeAudioButton); - isFirstEnter = false; - } + private void handleSelectResult(LocalMedia obj) { + uploadViewModel.uploadImage(new File(obj.getRealPath())); } /** diff --git a/app/src/main/java/com/casic/dcms/vm/UploadViewModel.java b/app/src/main/java/com/casic/dcms/vm/UploadViewModel.java index 9734377..73ba9b8 100644 --- a/app/src/main/java/com/casic/dcms/vm/UploadViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/UploadViewModel.java @@ -64,55 +64,51 @@ } public void uploadImage(File file) { - loadState.setValue(LoadState.Loading); //改为上传带水印的图片 Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); ImageHelper.drawTextToRightBottom(bitmap, new IWaterMarkAddListener() { @Override public void onSuccess(File file) { - if (file != null) { - Observable observable = RetrofitServiceManager.uploadImage(file); - ObserverSubscriber.addSubscribe(observable, new OnObserverCallback() { - @Override - public void onCompleted() { - loadState.setValue(LoadState.Success); - } + loadState.setValue(LoadState.Loading); + Observable observable = RetrofitServiceManager.uploadImage(file); + ObserverSubscriber.addSubscribe(observable, new OnObserverCallback() { + @Override + public void onCompleted() { + loadState.setValue(LoadState.Success); + } - @Override - public void onError(Throwable e) { - loadState.setValue(LoadState.Fail); + @Override + public void onError(Throwable e) { + loadState.setValue(LoadState.Fail); + if (e instanceof ConnectException) { + StringHub.show(BaseApplication.get(), "连接失败,请检查网络或者服务器"); + } else { + StringHub.show(BaseApplication.get(), "服务器异常,请联系管理员"); } + } - @Override - public void onNext(ResponseBody responseBody) { - try { - String response = responseBody.string(); - int responseCode = StringHelper.separateResponseCode(response); - if (responseCode == 200) { - ActionResultBean resultBean = gson.fromJson(response, new TypeToken() { - }.getType()); - imageModel.setValue(resultBean); - } else { - loadState.setValue(LoadState.Fail); - } - } catch (IOException e) { - e.printStackTrace(); + @Override + public void onNext(ResponseBody responseBody) { + try { + String response = responseBody.string(); + int responseCode = StringHelper.separateResponseCode(response); + if (responseCode == 200) { + ActionResultBean resultBean = gson.fromJson(response, new TypeToken() { + }.getType()); + imageModel.setValue(resultBean); + } else { + loadState.setValue(LoadState.Fail); } + } catch (IOException e) { + e.printStackTrace(); } - }); - } else { - loadState.setValue(LoadState.Fail); - } + } + }); } @Override public void onError(Throwable e) { - loadState.setValue(LoadState.Fail); - if (e instanceof ConnectException) { - StringHub.show(BaseApplication.get(), "连接失败,请检查网络或者服务器"); - } else { - StringHub.show(BaseApplication.get(), "服务器异常,请联系管理员"); - } + e.printStackTrace(); } }); }