Browse Source

Image cropping flow added

master
preyearegmi 6 years ago
parent
commit
72934398bc
  1. 14
      app/src/main/AndroidManifest.xml
  2. 37
      app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV2/view/KYCFormV2Activity.java
  3. 145
      app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV2/view/view3/KYCView3Fragment.java
  4. 10
      app/src/main/java/com/gmeremit/online/gmeremittance_native/utils/Utils.java
  5. 2
      app/src/main/res/xml/file_paths.xml

14
app/src/main/AndroidManifest.xml

@ -40,6 +40,20 @@
android:roundIcon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.gmeremit.online.gmeremittance_native.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar" />

37
app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV2/view/KYCFormV2Activity.java

@ -1,5 +1,6 @@
package com.gmeremit.online.gmeremittance_native.kycV2.view; package com.gmeremit.online.gmeremittance_native.kycV2.view;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.TabLayout; import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
@ -21,6 +22,7 @@ import com.gmeremit.online.gmeremittance_native.kycV2.presenter.KYCV2PresenterIn
import com.gmeremit.online.gmeremittance_native.kycV2.view.view1.KYCView1Fragment; import com.gmeremit.online.gmeremittance_native.kycV2.view.view1.KYCView1Fragment;
import com.gmeremit.online.gmeremittance_native.kycV2.view.view2.KYCView2Fragment; import com.gmeremit.online.gmeremittance_native.kycV2.view.view2.KYCView2Fragment;
import com.gmeremit.online.gmeremittance_native.kycV2.view.view3.KYCView3Fragment; import com.gmeremit.online.gmeremittance_native.kycV2.view.view3.KYCView3Fragment;
import com.yalantis.ucrop.UCrop;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -31,7 +33,6 @@ import butterknife.ButterKnife;
public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListener, ViewPager.OnPageChangeListener, View.OnClickListener, KYCV2PresenterInterface.KYCV2ContractInterface { public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListener, ViewPager.OnPageChangeListener, View.OnClickListener, KYCV2PresenterInterface.KYCV2ContractInterface {
@BindView(R.id.kycFormViewPager) @BindView(R.id.kycFormViewPager)
SwipeDisabledViewPager viewPager; SwipeDisabledViewPager viewPager;
@ -49,7 +50,7 @@ public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListen
private KycViewPagerAdapter kycViewPagerAdapter; private KycViewPagerAdapter kycViewPagerAdapter;
private KYCView3Fragment kycView3; private KYCView3Fragment kycView3;
private static Interpolator interpolator=new AccelerateDecelerateInterpolator();
private static Interpolator interpolator = new AccelerateDecelerateInterpolator();
KYCV2PresenterInterface presenter; KYCV2PresenterInterface presenter;
@ -73,7 +74,7 @@ public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListen
} }
private void initialize() { private void initialize() {
presenter=new KYCV2Presenter(this);
presenter = new KYCV2Presenter(this);
backButton.setVisibility(View.VISIBLE); backButton.setVisibility(View.VISIBLE);
} }
@ -97,7 +98,7 @@ public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListen
kycView1 = new KYCView1Fragment(); kycView1 = new KYCView1Fragment();
kycView2 = new KYCView2Fragment(); kycView2 = new KYCView2Fragment();
kycView3= new KYCView3Fragment();
kycView3 = new KYCView3Fragment();
fragments.add(kycView1); fragments.add(kycView1);
fragments.add(kycView2); fragments.add(kycView2);
@ -112,7 +113,6 @@ public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListen
viewPager.setAdapter(kycViewPagerAdapter); viewPager.setAdapter(kycViewPagerAdapter);
tabLayout.setupWithViewPager(viewPager); tabLayout.setupWithViewPager(viewPager);
} }
@ -133,13 +133,12 @@ public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListen
} }
private void changeTitleInHeader(String message) { private void changeTitleInHeader(String message) {
ViewCompat.animate(kycTitleTxtView).alpha(0f).setInterpolator(interpolator).withEndAction(()->{
ViewCompat.animate(kycTitleTxtView).alpha(0f).setInterpolator(interpolator).withEndAction(() -> {
kycTitleTxtView.setText(message); kycTitleTxtView.setText(message);
ViewCompat.animate(kycTitleTxtView).alpha(1f).setInterpolator(interpolator).setDuration(170).start(); ViewCompat.animate(kycTitleTxtView).alpha(1f).setInterpolator(interpolator).setDuration(170).start();
}).setDuration(170).start(); }).setDuration(170).start();
} }
@Override @Override
@ -168,8 +167,7 @@ public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListen
@Override @Override
public void onPageSelected(int position) { public void onPageSelected(int position) {
hideKeyBoard(); hideKeyBoard();
switch(position)
{
switch (position) {
case 0: case 0:
changeTitleInHeader("Tell us a few things about yourself"); changeTitleInHeader("Tell us a few things about yourself");
changeSelectedTabTextColor(position); changeSelectedTabTextColor(position);
@ -190,10 +188,9 @@ public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListen
private void changeSelectedTabTextColor(int position) { private void changeSelectedTabTextColor(int position) {
for(int i=0;i<tabLayout.getTabCount();i++)
{
TextView tv=(TextView) tabLayout.getTabAt(i).getCustomView();
if(i==position)
for (int i = 0; i < tabLayout.getTabCount(); i++) {
TextView tv = (TextView) tabLayout.getTabAt(i).getCustomView();
if (i == position)
tv.setTextColor(ContextCompat.getColor(this, R.color.colorAccent)); tv.setTextColor(ContextCompat.getColor(this, R.color.colorAccent));
else else
tv.setTextColor(ContextCompat.getColor(this, R.color.light_gray)); tv.setTextColor(ContextCompat.getColor(this, R.color.light_gray));
@ -207,16 +204,24 @@ public class KYCFormV2Activity extends BaseActivity implements KYCV2ActionListen
@Override @Override
public void onClick(View v) { public void onClick(View v) {
switch(v.getId())
{
switch (v.getId()) {
case R.id.iv_back: case R.id.iv_back:
onBackPressed(); onBackPressed();
break; break;
} }
} }
// @Override
// protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
// if (requestCode == UCrop.REQUEST_CROP)
// kycView3.onActivityResult(requestCode, resultCode, data);
// }
@Override @Override
public KYCView1ContractInterface getView1Contract() { return kycView1; }
public KYCView1ContractInterface getView1Contract() {
return kycView1;
}
@Override @Override
public KYCView2ContractInterface getView2Contract() { public KYCView2ContractInterface getView2Contract() {

145
app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV2/view/view3/KYCView3Fragment.java

@ -14,6 +14,8 @@ import android.provider.Settings;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -26,13 +28,19 @@ import com.gmeremit.online.gmeremittance_native.R;
import com.gmeremit.online.gmeremittance_native.base.BaseFragment; import com.gmeremit.online.gmeremittance_native.base.BaseFragment;
import com.gmeremit.online.gmeremittance_native.kycV2.KYCV2ActionListener; import com.gmeremit.online.gmeremittance_native.kycV2.KYCV2ActionListener;
import com.gmeremit.online.gmeremittance_native.kycV2.presenter.KYCV2PresenterInterface; import com.gmeremit.online.gmeremittance_native.kycV2.presenter.KYCV2PresenterInterface;
import com.gmeremit.online.gmeremittance_native.kycV2.view.KYCFormV2Activity;
import com.gmeremit.online.gmeremittance_native.user_profile.view.ProfileActivity;
import com.gmeremit.online.gmeremittance_native.utils.other.DisplayUtils;
import com.gmeremit.online.gmeremittance_native.utils.other.Utility; import com.gmeremit.online.gmeremittance_native.utils.other.Utility;
import com.yalantis.ucrop.UCrop;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@ -40,6 +48,8 @@ import butterknife.OnClick;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
import static android.app.Activity.RESULT_OK;
public class KYCView3Fragment extends BaseFragment implements View.OnClickListener, KYCV2PresenterInterface.KYCV2ContractInterface.KYCView3ContractInterface { public class KYCView3Fragment extends BaseFragment implements View.OnClickListener, KYCV2PresenterInterface.KYCV2ContractInterface.KYCView3ContractInterface {
public static final int FRONT_REGID = 1; public static final int FRONT_REGID = 1;
@ -73,7 +83,6 @@ public class KYCView3Fragment extends BaseFragment implements View.OnClickListen
Bitmap frontBitmap, backtBitmap, passbookBitmap, passportBitmap, selfieBitmap; Bitmap frontBitmap, backtBitmap, passbookBitmap, passportBitmap, selfieBitmap;
Uri imageUriFront;
@BindView(R.id.btn_submit) @BindView(R.id.btn_submit)
@ -81,6 +90,8 @@ public class KYCView3Fragment extends BaseFragment implements View.OnClickListen
CompositeDisposable compositeDisposable = null; CompositeDisposable compositeDisposable = null;
private Uri photoURI=null;
private Uri croppedFileUri=null;
@Override @Override
@ -128,11 +139,48 @@ public class KYCView3Fragment extends BaseFragment implements View.OnClickListen
} }
public void takeAPicture(int requestCode, int i) { public void takeAPicture(int requestCode, int i) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUriFront);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
intent.putExtra("android.intent.extras.CAMERA_FACING", i);
startActivityForResult(intent, requestCode);
// Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUriFront);
// intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
// intent.putExtra("android.intent.extras.CAMERA_FACING", i);
// startActivityForResult(intent, requestCode);
takeAPictureV2(requestCode);
}
private void takeAPictureV2(int requestCode) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
photoURI = FileProvider.getUriForFile(getActivity(),
"com.gmeremit.online.gmeremittance_native.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, requestCode);
}
}
}
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
return image;
} }
private void galleryIntent(int requestCode) { private void galleryIntent(int requestCode) {
@ -269,26 +317,85 @@ public class KYCView3Fragment extends BaseFragment implements View.OnClickListen
break; break;
} }
} }
//
// @Override
// public void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
// Bitmap bitmap;
// try {
// if (requestCode == SELFIE_REGID_CAMERA ||
// requestCode == FRONT_REGID_CAMERA ||
// requestCode == BACK_REGID_CAMERA ||
// requestCode == PASSBOOKREQ_CAMERA ||
// requestCode == PASSPORTREQ_CAMERA)
// bitmap = (Bitmap) data.getExtras().get("data");
// else
// bitmap = createBitmapFromGallerData(data);
// } catch (NullPointerException ex) {
// ex.printStackTrace();
// return;
// }
// ((KYCV2ActionListener) getActivity()).getPresenter().checkImageStatus(requestCode, resultCode, bitmap);
// }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
Bitmap bitmap;
try { try {
if (requestCode == SELFIE_REGID_CAMERA || if (requestCode == SELFIE_REGID_CAMERA ||
requestCode == FRONT_REGID_CAMERA || requestCode == FRONT_REGID_CAMERA ||
requestCode == BACK_REGID_CAMERA || requestCode == BACK_REGID_CAMERA ||
requestCode == PASSBOOKREQ_CAMERA || requestCode == PASSBOOKREQ_CAMERA ||
requestCode == PASSPORTREQ_CAMERA)
bitmap = (Bitmap) data.getExtras().get("data");
requestCode == PASSPORTREQ_CAMERA) {
//TODO uri is available from camera
requestToCropImage();
}
else if(requestCode== UCrop.REQUEST_CROP)
{
if(resultCode==RESULT_OK){
//TODO create a thumbnail maintaining current aspect ratio and save the uri for later sending to server
}
frontRegIdImage.setImageBitmap(createBitmapFromUri(croppedFileUri));
else else
bitmap = createBitmapFromGallerData(data);
Log.d("IMAGE_FILE", UCrop.getError(data).getMessage());
}
else {
//TODO uri is available from gallery
photoURI = data.getData();
requestToCropImage();
}
} catch (NullPointerException ex) { } catch (NullPointerException ex) {
ex.printStackTrace(); ex.printStackTrace();
return;
Log.d("IMAGE_FILE", ex.getMessage());
}
}
private void requestToCropImage()
{
try {
croppedFileUri=Uri.fromFile(createImageFile());
UCrop cropper= UCrop.of(photoURI, croppedFileUri)
.withAspectRatio(16, 9)
.withMaxResultSize(400, 400);
cropper= DisplayUtils.advancedConfig(getActivity(), cropper);
cropper.start(getActivity(),this);
} }
((KYCV2ActionListener) getActivity()).getPresenter().checkImageStatus(requestCode, resultCode, bitmap);
catch (Exception e)
{
Log.d("IMAGE_FILE", e.getMessage());
} }
}
private Bitmap createBitmapFromGallerData(Intent data) { private Bitmap createBitmapFromGallerData(Intent data) {
@ -320,6 +427,20 @@ public class KYCView3Fragment extends BaseFragment implements View.OnClickListen
} }
return bm; return bm;
} }
private Bitmap createBitmapFromUri(Uri data) {
Bitmap bm = null;
if (data != null) {
try {
bm = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), data);
} catch (IOException e) {
e.printStackTrace();
}
}
return bm;
}
@OnClick(R.id.selfieImage_layout) @OnClick(R.id.selfieImage_layout)

10
app/src/main/java/com/gmeremit/online/gmeremittance_native/utils/Utils.java

@ -2,7 +2,9 @@ package com.gmeremit.online.gmeremittance_native.utils;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
@ -551,4 +553,12 @@ public class Utils {
} }
} }
public static boolean isIntentAvailable(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> list =
packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
} }

2
app/src/main/res/xml/file_paths.xml

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/kycRelatedDataModel/com.example.package.name/files/Pictures" />
<external-files-path name="my_images" path="/" />
</paths> </paths>
Loading…
Cancel
Save