diff --git a/app/src/main/java/com/nynja/mobile/communicator/camera/camera/NynjaCameraFragment.java b/app/src/main/java/com/nynja/mobile/communicator/camera/camera/NynjaCameraFragment.java index bfa584914b9157cf30becc619f08cbff80a78c52..fca00e17062752fb05305d29bde646968c24efed 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/camera/camera/NynjaCameraFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/camera/camera/NynjaCameraFragment.java @@ -124,6 +124,33 @@ public class NynjaCameraFragment extends BaseFragment private Handler mTypingHandler = new Handler(); private TakingMediaRunnable mTakingMediaRunnable = new TakingMediaRunnable(); + private CameraListener cameraListener = new CameraListener() { + + public void onCameraOpened(CameraOptions options) { + onOpened(); + } + + public void onPictureTaken(byte[] jpeg) { + Timber.d("Captured snapshot"); + if (isSnapshotCapturing) { + isSnapshotCapturing = false; + camera.setPlaySounds(true); + blurFrame(jpeg); + } else { + onPicture(jpeg); + } + } + + @Override public void onVideoTaken(File video) { + super.onVideoTaken(video); + onVideo(video); + } + + @Override public void onCameraError(@NonNull CameraException exception) { + camera.removeCameraListener(this); + Timber.e(exception); + } + }; private FrameProcessor mFrameProcessor = new FrameProcessor() { @Override public void process(@NonNull Frame frame) { @@ -222,33 +249,7 @@ public class NynjaCameraFragment extends BaseFragment if (mCurrentCameraType.equals(CameraHelper.CameraType.CHAT)) { mChooseModeTl.addTab(mChooseModeTl.newTab().setText(R.string.video), CameraPresenter.VIDEO); } - camera.addCameraListener(new CameraListener() { - - public void onCameraOpened(CameraOptions options) { - onOpened(); - } - - public void onPictureTaken(byte[] jpeg) { - Timber.d("Captured snapshot"); - if (isSnapshotCapturing) { - isSnapshotCapturing = false; - camera.setPlaySounds(true); - blurFrame(jpeg); - } else { - onPicture(jpeg); - } - } - - @Override public void onVideoTaken(File video) { - super.onVideoTaken(video); - onVideo(video); - } - - @Override public void onCameraError(@NonNull CameraException exception) { -// camera.removeCameraListener(this); - Timber.e(exception); - } - }); + camera.addCameraListener(cameraListener); camera.clearGesture(Gesture.SCROLL_HORIZONTAL); camera.setVideoCodec(VideoCodec.H_264); ArrayList formats = new ArrayList<>(); @@ -515,7 +516,9 @@ public class NynjaCameraFragment extends BaseFragment Bitmap blurredBitmap = BlurBuilder.blur(getActivity(), bitmap); bitmap.recycle(); mBlurredIv.post(() -> { - fadeInBlurredView(blurredBitmap); + if (mBlurredIv != null) { + fadeInBlurredView(blurredBitmap); + } if (onBlurredShownCallback != null) { onBlurredShownCallback.onShown(); } @@ -623,7 +626,11 @@ public class NynjaCameraFragment extends BaseFragment addDisposable(mRxPermissions.requestEachCombined(Manifest.permission.CAMERA) .subscribe(permission -> { if (permission.granted) { - camera.post(() -> camera.start()); + camera.post(() -> { + if (camera != null) { + camera.start(); + } + }); } else if (!permission.shouldShowRequestPermissionRationale) { PermissionHelper.getInstance().showPermissionDialog(getActivity(), mPresenter.getPermissionDialogListener(), Manifest.permission.CAMERA); @@ -653,8 +660,12 @@ public class NynjaCameraFragment extends BaseFragment // } @Override public void onDestroyView() { - camera.destroy(); + camera.clearFrameProcessors(); + camera.removeCameraListener(cameraListener); + camera.clearCameraListeners(); stopTimer(); + mTypingHandler.removeCallbacksAndMessages(null); + camera.destroy(); super.onDestroyView(); } @@ -833,7 +844,12 @@ public class NynjaCameraFragment extends BaseFragment } private void onImageCaptured(File imageFile) { - mRecordBtn.postDelayed(() -> mRecordBtn.setEnabled(true), 500); //to disallow take second photo during transition + if (getActivity() == null || !isAdded() || mRecordBtn== null) return; + mRecordBtn.postDelayed(() -> { + if (mRecordBtn != null) { + mRecordBtn.setEnabled(true); + } + }, 500); //to disallow take second photo during transition mPresenter.onMediaReady(imageFile, mCurrentCameraType, false); camera.stop(); recreatePictureFile(); @@ -844,9 +860,14 @@ public class NynjaCameraFragment extends BaseFragment if (videoFile == null || !videoFile.exists()) { return; } - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(videoFile.getPath()); - String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); + String time = null; + try { + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(videoFile.getPath()); + time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); + } catch (Exception ex) { + Timber.e(ex); + } if (time == null) { return; } @@ -927,7 +948,8 @@ public class NynjaCameraFragment extends BaseFragment @Override protected void onPostExecute(String s) { super.onPostExecute(s); - if (mContextWeakReference != null && mContextWeakReference.get() != null) { + if (mContextWeakReference != null && + mContextWeakReference.get() != null ) { mContextWeakReference.get().onImageCaptured(mPictureFile); } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/navigation/NynjaFragment.java b/app/src/main/java/com/nynja/mobile/communicator/navigation/NynjaFragment.java index 4feca7b03df4179df817e62f7c107b75d42d1632..60fe07a2c249c90db1df16feb0477348addf5dc7 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/navigation/NynjaFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/navigation/NynjaFragment.java @@ -88,7 +88,7 @@ public abstract class NynjaFragment extends BaseNynjaFragment implements View.On } @Override public void onFragmentDestroy() { - if (LIFECYCLE_LOG) Timber.d(this.getClass().getSimpleName() + ":onCreateView()"); + if (LIFECYCLE_LOG) Timber.d(this.getClass().getSimpleName() + ":onFragmentDestroy()"); super.onFragmentDestroy(); if (isCreated()) { getMvpDelegate().onDestroyView(); @@ -100,7 +100,7 @@ public abstract class NynjaFragment extends BaseNynjaFragment implements View.On } @java.lang.Deprecated public void onDestroyView() { - if (LIFECYCLE_LOG) Timber.d(this.getClass().getSimpleName() + ":onFragmentDestroy()"); + if (LIFECYCLE_LOG) Timber.d(this.getClass().getSimpleName() + ":onDestroyView()"); }