feat: Image compression before upload
diff --git a/app/build.gradle b/app/build.gradle
index bc98fd0..fc40ba3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -129,6 +129,9 @@
     //Sticky header RecyclerView
     implementation 'org.zakariya.stickyheaders:stickyheaders:0.7.6'
 
+    // Compressor for Image Compression
+    implementation 'id.zelory:compressor:2.1.0'
+
     //Material Stepper UI library
     implementation 'com.stepstone.stepper:material-stepper:3.3.0'
 
diff --git a/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardBottomSheet.java b/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardBottomSheet.java
index 86180fa..2779125 100644
--- a/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardBottomSheet.java
+++ b/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardBottomSheet.java
@@ -8,7 +8,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
+import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
 import android.provider.MediaStore;
@@ -16,6 +16,7 @@
 import android.support.design.widget.BottomSheetBehavior;
 import android.support.design.widget.BottomSheetDialog;
 import android.support.design.widget.TextInputLayout;
+import android.support.v4.content.FileProvider;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.util.Log;
@@ -32,7 +33,6 @@
 import org.apache.fineract.utils.ValidationUtil;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 
 import javax.inject.Inject;
@@ -40,10 +40,11 @@
 import butterknife.BindView;
 import butterknife.ButterKnife;
 import butterknife.OnClick;
+import id.zelory.compressor.Compressor;
 
 /**
  * @author Rajan Maurya
- *         On 01/08/17.
+ * On 01/08/17.
  */
 public class UploadIdentificationCardBottomSheet extends FineractBaseBottomSheetDialogFragment
         implements UploadIdentificationCardContract.View, TextWatcher {
@@ -73,10 +74,12 @@
     @Inject
     UploadIdentificationCardPresenter uploadIdentificationCardPresenter;
 
+    private Compressor imageCompressor;
+
     View rootView;
 
     private BottomSheetBehavior behavior;
-    private File cachePath;
+    private File cameraImage, compressedImage;
     private String customerIdentifier;
     private String identificationNumber;
 
@@ -92,6 +95,7 @@
         behavior = BottomSheetBehavior.from((View) rootView.getParent());
         ((FineractBaseActivity) getActivity()).getActivityComponent().inject(this);
         uploadIdentificationCardPresenter.attachView(this);
+        imageCompressor = new Compressor(getActivity());
         ButterKnife.bind(this, rootView);
 
         showUserInterface();
@@ -112,7 +116,7 @@
 
             uploadIdentificationCardPresenter.uploadIdentificationCardScan(customerIdentifier,
                     identificationNumber, etIdentifier.getText().toString().trim(),
-                    etDescription.getText().toString().trim(), cachePath);
+                    etDescription.getText().toString().trim(), compressedImage);
         }
     }
 
@@ -138,8 +142,22 @@
 
     @Override
     public void openCamera() {
+
         Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+
         if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
+
+            cameraImage = new File(getActivity().getExternalCacheDir() +
+                    File.separator + "scan.png");
+
+            if (cameraImage.exists()) {
+                cameraImage.delete();
+            }
+
+            Uri photoURI = FileProvider.getUriForFile(getActivity(),
+                    "org.apache.fineract.fileprovider", cameraImage);
+
+            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
             startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
         }
     }
@@ -147,10 +165,12 @@
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
-            Bundle extras = data.getExtras();
-            Bitmap imageBitmap = (Bitmap) extras.get("data");
             etSelectFile.setText(getString(R.string.scan_file));
-            saveImageInCache(imageBitmap);
+            try {
+                compressedImage = imageCompressor.compressToFile(cameraImage);
+            } catch (IOException e) {
+                Log.d(UploadIdentificationCardBottomSheet.class.getSimpleName(), e.toString());
+            }
         }
     }
 
@@ -168,22 +188,6 @@
     }
 
     @Override
-    public void saveImageInCache(Bitmap bitmap) {
-        try {
-            File outputDir = getActivity().getCacheDir();
-            File outputFile = File.createTempFile("scan", "png", outputDir);
-            cachePath = outputFile;
-
-            // overwrites this image every time
-            FileOutputStream stream = new FileOutputStream(outputFile);
-            bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
-            stream.close();
-        } catch (IOException e) {
-            Log.d(LOG_TAG, e.getLocalizedMessage());
-        }
-    }
-
-    @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
             @NonNull int[] grantResults) {
         switch (requestCode) {
diff --git a/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardContract.java b/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardContract.java
index 03e0c3a..823fc58 100644
--- a/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardContract.java
+++ b/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardContract.java
@@ -1,7 +1,5 @@
 package org.apache.fineract.ui.online.identification.uploadidentificationscan;
 
-import android.graphics.Bitmap;
-
 import org.apache.fineract.ui.base.MvpView;
 
 import java.io.File;
@@ -22,8 +20,6 @@
 
         void requestPermission();
 
-        void saveImageInCache(Bitmap bitmap);
-
         void showScanUploadedSuccessfully();
 
         void showProgressDialog();
diff --git a/app/src/main/res/xml/filepaths.xml b/app/src/main/res/xml/filepaths.xml
index a0bcef4..9388ff0 100644
--- a/app/src/main/res/xml/filepaths.xml
+++ b/app/src/main/res/xml/filepaths.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <paths xmlns:android="http://schemas.android.com/apk/res/android">
-    <cache-path name="shared_images" path="images/"/>
+    <external-cache-path name="cache" path="/" />
 </paths>