From 2302869fc5ef6c213a1ae3a61df81626ffac0009 Mon Sep 17 00:00:00 2001 From: rishabh-997 Date: Fri, 19 Jun 2020 02:28:40 +0530 Subject: [PATCH 1/4] added dependency --- openmrs-client/build.gradle | 2 ++ openmrs-client/src/main/AndroidManifest.xml | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/openmrs-client/build.gradle b/openmrs-client/build.gradle index 33b15164ff..a5b651c607 100644 --- a/openmrs-client/build.gradle +++ b/openmrs-client/build.gradle @@ -196,6 +196,8 @@ dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0' //google place api implementation 'com.google.android.libraries.places:places:2.1.0' + //Image Cropping Library + implementation 'com.github.yalantis:ucrop:2.2.5' } play { diff --git a/openmrs-client/src/main/AndroidManifest.xml b/openmrs-client/src/main/AndroidManifest.xml index a89d319535..89070d6e4e 100644 --- a/openmrs-client/src/main/AndroidManifest.xml +++ b/openmrs-client/src/main/AndroidManifest.xml @@ -283,6 +283,10 @@ android:theme="@style/AppThemeOrig" android:label="@string/contact_us"/> + + From 2722a8cfade79f4b9e57709055f1af98b86a7094 Mon Sep 17 00:00:00 2001 From: rishabh-997 Date: Sat, 20 Jun 2020 14:00:21 +0530 Subject: [PATCH 2/4] first experiment --- .../AddEditPatientFragment.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java b/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java index 8f95aef82a..eef7ef49cc 100644 --- a/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java +++ b/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java @@ -54,6 +54,7 @@ import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.StringDef; @@ -69,6 +70,7 @@ import com.google.android.material.snackbar.Snackbar; import com.google.android.material.textfield.TextInputLayout; import com.hbb20.CountryCodePicker; +import com.yalantis.ucrop.UCrop; import org.jetbrains.annotations.NotNull; import org.joda.time.DateTime; @@ -160,6 +162,7 @@ public class AddEditPatientFragment extends ACBaseFragment Date: Sat, 20 Jun 2020 15:33:49 +0530 Subject: [PATCH 3/4] added crop feature --- .../AddEditPatientFragment.java | 136 ++++++++---------- 1 file changed, 63 insertions(+), 73 deletions(-) diff --git a/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java b/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java index eef7ef49cc..01c97f22c5 100644 --- a/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java +++ b/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; @@ -29,7 +30,6 @@ import android.net.Uri; import android.os.Bundle; import android.os.Environment; -import android.os.ParcelFileDescriptor; import android.os.StrictMode; import android.provider.MediaStore; import android.text.Editable; @@ -54,11 +54,11 @@ import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.StringDef; import androidx.appcompat.app.AlertDialog; +import androidx.core.app.ActivityCompat; import com.google.android.gms.common.api.ApiException; import com.google.android.libraries.places.api.model.AutocompletePrediction; @@ -98,7 +98,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileDescriptor; import java.io.IOException; import java.lang.annotation.Retention; import java.text.SimpleDateFormat; @@ -119,16 +118,16 @@ @RuntimePermissions public class AddEditPatientFragment extends ACBaseFragment implements AddEditPatientContract.View, CameraOrGalleryPickerDialog.onInputSelected { + private final static int IMAGE_REQUEST = 1; + private final static int GALLERY_IMAGE_REQUEST = 2; private RelativeLayout relativeLayout; private LocalDate birthdate; private DateTime bdt; - private LinearLayout linearLayoutName; private RelativeLayout relativeLayoutDOB; private LinearLayout linearLayoutContactInfo; private CheckBox unidentifiedCheckBox; private Boolean isPatientUnidentified = false; - private TextInputLayout firstNameTIL; private TextInputLayout middleNameTIL; private TextInputLayout lastNameTIL; @@ -162,18 +161,12 @@ public class AddEditPatientFragment extends ACBaseFragment state_adapter = new ArrayAdapter<>(getContext(), - android.R.layout.simple_dropdown_item_1line, states); + android.R.layout.simple_dropdown_item_1line, states); edState.setAdapter(state_adapter); } } @@ -630,11 +619,11 @@ public void afterTextChanged(Editable s) { capturePhotoBtn.setOnClickListener(view -> { boolean showRemoveButton = true; - if(patientPhoto == null) + if (patientPhoto == null) showRemoveButton = false; CameraOrGalleryPickerDialog cameraOrGalleryPickerDialog = new CameraOrGalleryPickerDialog(showRemoveButton); - cameraOrGalleryPickerDialog.setTargetFragment(AddEditPatientFragment.this,1000); - cameraOrGalleryPickerDialog.show(getFragmentManager(),"tag"); + cameraOrGalleryPickerDialog.setTargetFragment(AddEditPatientFragment.this, 1000); + cameraOrGalleryPickerDialog.show(getFragmentManager(), "tag"); }); patientImageView.setOnClickListener(view -> { @@ -671,11 +660,11 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { AutocompleteSessionToken token = AutocompleteSessionToken.newInstance(); FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder() - .setCountry(mCountryCodePicker.getSelectedCountryNameCode().toLowerCase()) - .setTypeFilter(TypeFilter.CITIES) - .setSessionToken(token) - .setQuery(edCity.getText().toString()) - .build(); + .setCountry(mCountryCodePicker.getSelectedCountryNameCode().toLowerCase()) + .setTypeFilter(TypeFilter.CITIES) + .setSessionToken(token) + .setQuery(edCity.getText().toString()) + .build(); placesClient.findAutocompletePredictions(request).addOnSuccessListener(response -> { city_progressBar.setVisibility(View.GONE); @@ -727,7 +716,7 @@ public void afterTextChanged(Editable s) { }); unidentifiedCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { - if(unidentifiedCheckBox.isChecked()) { + if (unidentifiedCheckBox.isChecked()) { linearLayoutName.setVisibility(View.GONE); relativeLayoutDOB.setVisibility(View.GONE); linearLayoutContactInfo.setVisibility(View.GONE); @@ -748,6 +737,11 @@ public void performFunction(int position) { StrictMode.setVmPolicy(builder.build()); AddEditPatientFragmentPermissionsDispatcher.capturePhotoWithCheck(AddEditPatientFragment.this); } else if (position == 1) { + requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, GALLERY_IMAGE_REQUEST); + if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + return; + } + Intent i; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) i = new Intent(Intent.ACTION_OPEN_DOCUMENT); @@ -777,22 +771,22 @@ public void capturePhoto() { @OnShowRationale({Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}) public void showRationaleForCamera(final PermissionRequest request) { new AlertDialog.Builder(getActivity()) - .setMessage(R.string.permission_camera_rationale) - .setPositiveButton(R.string.button_allow, (dialog, which) -> request.proceed()) - .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel()) - .show(); + .setMessage(R.string.permission_camera_rationale) + .setPositiveButton(R.string.button_allow, (dialog, which) -> request.proceed()) + .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel()) + .show(); } @OnPermissionDenied({Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}) public void showDeniedForCamera() { createSnackbarLong(R.string.permission_camera_denied) - .show(); + .show(); } @OnNeverAskAgain({Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}) public void showNeverAskForCamera() { createSnackbarLong(R.string.permission_camera_neverask) - .show(); + .show(); } private Snackbar createSnackbarLong(int stringId) { @@ -807,49 +801,38 @@ private Snackbar createSnackbarLong(int stringId) { public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == IMAGE_REQUEST) { if (resultCode == Activity.RESULT_OK) { - patientPhoto = getResizedPortraitImage(output.getPath()); - Bitmap bitmap = ThumbnailUtils.extractThumbnail(patientPhoto, patientImageView.getWidth(), patientImageView.getHeight()); - patientImageView.setImageBitmap(bitmap); - patientImageView.invalidate(); + Uri sourceUri = Uri.fromFile(output); + openCropActivity(sourceUri, sourceUri); } else { output = null; } - } - else if (requestCode == GALLERY_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { + } else if (requestCode == GALLERY_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { Uri sourceUri = data.getData(); File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); output = new File(dir, getUniqueImageFileName()); Uri destinationUri = Uri.fromFile(output); openCropActivity(sourceUri, destinationUri); - } - else if (requestCode == UCrop.REQUEST_CROP) { - try { - ParcelFileDescriptor parcelFileDescriptor = - getActivity().getContentResolver().openFileDescriptor(data.getData(), ApplicationConstants.READ_MODE); - FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); - Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); - parcelFileDescriptor.close(); - - patientPhoto = image; + } else if (requestCode == UCrop.REQUEST_CROP) { + if (resultCode == Activity.RESULT_OK) { + patientPhoto = getResizedPortraitImage(output.getPath()); Bitmap bitmap = ThumbnailUtils.extractThumbnail(patientPhoto, patientImageView.getWidth(), patientImageView.getHeight()); patientImageView.setImageBitmap(bitmap); patientImageView.invalidate(); - } catch (Exception e) { - logger.e("Error getting image from gallery.", e); + } else { + output = null; } - } - else if (requestCode == UCrop.RESULT_ERROR) { - Toast.makeText(getContext(), "hhhhhh", Toast.LENGTH_SHORT).show(); + } else if (requestCode == UCrop.RESULT_ERROR) { + ToastUtil.error(String.valueOf(UCrop.getError(data))); } } private void openCropActivity(Uri sourceUri, Uri destinationUri) { UCrop.of(sourceUri, destinationUri) .withAspectRatio(5f, 5f) - .start(getActivity()); + .start(getActivity(), AddEditPatientFragment.this); } - private String getUniqueImageFileName() { + private String getUniqueImageFileName() { // Create an image file name @SuppressLint("SimpleDateFormat") String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); return timeStamp + "_" + ".jpg"; @@ -956,4 +939,11 @@ private void resetAction() { updatedPatient = null; output = null; } + + @Retention(SOURCE) + @StringDef({StringValue.MALE, StringValue.FEMALE}) + public @interface StringValue { + String FEMALE = "F"; + String MALE = "M"; + } } From e94d4532ca5bd4617f128d03643ee686c6571c07 Mon Sep 17 00:00:00 2001 From: rishabh-997 Date: Tue, 23 Jun 2020 22:19:30 +0530 Subject: [PATCH 4/4] requested changes --- .../addeditpatient/AddEditPatientFragment.java | 14 ++++++-------- .../mobile/utilities/ApplicationConstants.java | 3 +++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java b/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java index 01c97f22c5..ce5009bd72 100644 --- a/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java +++ b/openmrs-client/src/main/java/org/openmrs/mobile/activities/addeditpatient/AddEditPatientFragment.java @@ -118,8 +118,6 @@ @RuntimePermissions public class AddEditPatientFragment extends ACBaseFragment implements AddEditPatientContract.View, CameraOrGalleryPickerDialog.onInputSelected { - private final static int IMAGE_REQUEST = 1; - private final static int GALLERY_IMAGE_REQUEST = 2; private RelativeLayout relativeLayout; private LocalDate birthdate; private DateTime bdt; @@ -737,7 +735,7 @@ public void performFunction(int position) { StrictMode.setVmPolicy(builder.build()); AddEditPatientFragmentPermissionsDispatcher.capturePhotoWithCheck(AddEditPatientFragment.this); } else if (position == 1) { - requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, GALLERY_IMAGE_REQUEST); + requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, ApplicationConstants.RequestCodes.GALLERY_IMAGE_REQUEST); if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { return; } @@ -749,7 +747,7 @@ public void performFunction(int position) { i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); - startActivityForResult(i, GALLERY_IMAGE_REQUEST); + startActivityForResult(i, ApplicationConstants.RequestCodes.GALLERY_IMAGE_REQUEST); } else { patientImageView.setImageResource(R.drawable.ic_person_grey_500_48dp); patientImageView.invalidate(); @@ -764,7 +762,7 @@ public void capturePhoto() { File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); output = new File(dir, getUniqueImageFileName()); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output)); - startActivityForResult(takePictureIntent, IMAGE_REQUEST); + startActivityForResult(takePictureIntent, ApplicationConstants.RequestCodes.IMAGE_REQUEST); } } @@ -799,14 +797,14 @@ private Snackbar createSnackbarLong(int stringId) { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == IMAGE_REQUEST) { + if (requestCode == ApplicationConstants.RequestCodes.IMAGE_REQUEST) { if (resultCode == Activity.RESULT_OK) { Uri sourceUri = Uri.fromFile(output); openCropActivity(sourceUri, sourceUri); } else { output = null; } - } else if (requestCode == GALLERY_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { + } else if (requestCode == ApplicationConstants.RequestCodes.IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { Uri sourceUri = data.getData(); File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); output = new File(dir, getUniqueImageFileName()); @@ -828,7 +826,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { private void openCropActivity(Uri sourceUri, Uri destinationUri) { UCrop.of(sourceUri, destinationUri) - .withAspectRatio(5f, 5f) + .withAspectRatio(ApplicationConstants.ASPECT_RATIO_FOR_CROPPING, ApplicationConstants.ASPECT_RATIO_FOR_CROPPING) .start(getActivity(), AddEditPatientFragment.this); } diff --git a/openmrs-client/src/main/java/org/openmrs/mobile/utilities/ApplicationConstants.java b/openmrs-client/src/main/java/org/openmrs/mobile/utilities/ApplicationConstants.java index b90495597b..a65f611d93 100644 --- a/openmrs-client/src/main/java/org/openmrs/mobile/utilities/ApplicationConstants.java +++ b/openmrs-client/src/main/java/org/openmrs/mobile/utilities/ApplicationConstants.java @@ -51,6 +51,7 @@ public abstract class ApplicationConstants { public static final String BUNDLE = "bundle"; public static final String URI_CONTENT = "content://"; public static final String MIME_TYPE_VND = "vnd"; + public static final float ASPECT_RATIO_FOR_CROPPING = 5f; public abstract static class OpenMRSSharedPreferenceNames { public static final String SHARED_PREFERENCES_NAME = "shared_preferences"; @@ -133,6 +134,8 @@ public abstract static class RequestCodes { public static final int ADD_PROVIDER_REQ_CODE = 100; public static final int EDIT_PROVIDER_REQ_CODE = 101; public static final int START_SETTINGS_REQ_CODE = 102; + public final static int IMAGE_REQUEST = 1; + public final static int GALLERY_IMAGE_REQUEST = 2; } public abstract static class OpenMRSThemes {