package bg.mentormate.academy.radarapp.activities;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.parse.ParseFile;
import com.parse.ParseImageView;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import bg.mentormate.academy.radarapp.Constants;
import bg.mentormate.academy.radarapp.R;
import bg.mentormate.academy.radarapp.data.LocalDb;
import bg.mentormate.academy.radarapp.models.User;
public class EditProfileActivity extends ActionBarActivity implements View.OnClickListener {
private static final int SELECT_PHOTO = 100;
private static final int DEFAULT_IMG_SIZE_X = 100;
private static final int DEFAULT_IMG_SIZE_Y = 100;
private static final int DEFAULT_QUALITY_FACTOR = 90;
private static final int GET_CAM_IMG = 0;
private static final int GET_GAL_IMG = 100;
private String currentPhotoPath;
private ParseFile mNewAvatar;
private LocalDb mLocalDb;
private User mUser;
private Bitmap mAvatarBitmap;
private boolean mAvatarChanged;
private ParseImageView mPivAvatar;
private Button mBtnSaveChanges;
private Button mBtnChangeAvatar;
private Button mBtnTakePic;
private EditText mEtChangePassword;
private EditText mEtConfirmPassword;
private EditText mEtEmail;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_profile);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
init();
}
private void init() {
mAvatarChanged = false;
mLocalDb = LocalDb.getInstance();
mUser = mLocalDb.getCurrentUser();
mPivAvatar = (ParseImageView) findViewById(R.id.ivAvatar);
mEtChangePassword = (EditText) findViewById(R.id.etChangePassword);
mEtConfirmPassword = (EditText) findViewById(R.id.etConfirmPass);
mEtEmail = (EditText) findViewById(R.id.editChangeEmail);
mEtEmail.setHint(mUser.getEmail());
mBtnSaveChanges = (Button) findViewById(R.id.btnSaveChanges);
mBtnChangeAvatar = (Button) findViewById(R.id.btnChangeAvatar);
mBtnTakePic = (Button) findViewById(R.id.btnTakePic);
mBtnSaveChanges.setOnClickListener(this);
mBtnChangeAvatar.setOnClickListener(this);
mBtnTakePic.setOnClickListener(this);
mPivAvatar.setParseFile(mUser.getAvatar());
mPivAvatar.loadInBackground();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_edit_profile, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:
this.finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btnSaveChanges:
onSaveClicked();
break;
case R.id.btnChangeAvatar:
onChangeAvatarClicked();
break;
case R.id.btnTakePic:
onTakePictureClicked();
break;
}
}
private void onTakePictureClicked() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = Constants.JPEG_FILE_PREFIX + timeStamp;
File albumFolder = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
albumFolder = new File(Environment.getExternalStorageDirectory() + Constants.CAMERA_DIR + Constants.ALBUM_NAME);
if (albumFolder != null) {
if (!albumFolder.mkdirs()) {
if (!albumFolder.exists()) {
Log.d(EditProfileActivity.class.getSimpleName(), "failed to create directory");
albumFolder = null;
}
}
}
} else {
Log.d(EditProfileActivity.class.getSimpleName(), "External storage is not mounted READ/WRITE.");
}
File photoFile = new File(albumFolder, imageFileName + Constants.JPEG_FILE_SUFFIX);
currentPhotoPath = photoFile.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, Constants.ACTION_TAKE_PHOTO);
}
private void onChangeAvatarClicked() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);
}
private void onSaveClicked() {
boolean emailChanged = false;
boolean passChanged = false;
boolean passChangeAttempt = false;
String newEmail = mEtEmail.getText().toString();
String pass = mEtChangePassword.getText().toString();
String confirmPass = mEtConfirmPassword.getText().toString();
if(mAvatarChanged){
mNewAvatar = new ParseFile(getBitmapAsByteArray(mAvatarBitmap));
mUser.setAvatar(mNewAvatar);
}
if(!newEmail.isEmpty() && newEmail.contains("@") && newEmail.contains(".")){
mUser.setEmail(newEmail.trim());
emailChanged = true;
}
if(!pass.isEmpty() && !confirmPass.isEmpty()) {
if (pass.equals(confirmPass)) {
mUser.setPassword(pass.trim());
passChanged = true;
} else {
passChangeAttempt = true;
}
}
if(emailChanged || passChanged || mAvatarChanged){
mUser.saveInBackground();
if(passChangeAttempt) {
Toast.makeText(getApplicationContext(),
getString(R.string.detailsHaveBeenSaved),
Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(),
getString(R.string.allDetailsHaveBeenSaved),
Toast.LENGTH_SHORT).show();
this.finish();
}
}
}
private byte[] getBitmapAsByteArray(Bitmap image) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, stream);
return stream.toByteArray();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (resultCode == -1) {
switch (requestCode) {
case GET_CAM_IMG:
retrieveAvatarFromCamera();
break;
case GET_GAL_IMG:
retrieveAvatarFromGallery(intent);
break;
}
}
}
private void retrieveAvatarFromCamera() {
if (currentPhotoPath != null) {
mAvatarBitmap = BitmapFactory.decodeFile(currentPhotoPath);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
if (mAvatarBitmap != null) {
mAvatarBitmap.compress(Bitmap.CompressFormat.JPEG, DEFAULT_QUALITY_FACTOR, byteArrayOutputStream);
byte[] image = byteArrayOutputStream.toByteArray();
InputStream stream = new ByteArrayInputStream(image);
mAvatarChanged = true;
mAvatarBitmap = BitmapFactory.decodeStream(stream);
mAvatarBitmap = getResizedBitmap(mAvatarBitmap, DEFAULT_IMG_SIZE_X, DEFAULT_IMG_SIZE_Y);
mPivAvatar.setImageBitmap(mAvatarBitmap);
mPivAvatar.setVisibility(View.VISIBLE);
}
mAvatarChanged = true;
}
}
private void retrieveAvatarFromGallery(Intent intent) {
mAvatarBitmap = getImageFromGallery(intent);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
if (mAvatarBitmap != null) {
mAvatarBitmap.compress(Bitmap.CompressFormat.JPEG, DEFAULT_QUALITY_FACTOR, byteArrayOutputStream);
byte[] image = byteArrayOutputStream.toByteArray();
InputStream stream = new ByteArrayInputStream(image);
mAvatarBitmap = BitmapFactory.decodeStream(stream);
mAvatarBitmap = getResizedBitmap(mAvatarBitmap, DEFAULT_IMG_SIZE_X, DEFAULT_IMG_SIZE_Y);
mPivAvatar.setImageBitmap(mAvatarBitmap);
mPivAvatar.setVisibility(View.VISIBLE);
mAvatarChanged = true;
}
}
private Bitmap getImageFromGallery(Intent intent) {
Uri selectedImageUri = intent.getData();
Bitmap bmp_image = null;
if (Build.VERSION.SDK_INT < 19) {
String selectedImagePath = getPath(selectedImageUri);
bmp_image = BitmapFactory.decodeFile(selectedImagePath);
} else {
ParcelFileDescriptor parcelFileDescriptor;
try {
parcelFileDescriptor = getContentResolver().openFileDescriptor(selectedImageUri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
bmp_image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bmp_image;
}
private String getPath(Uri uri) {
if (uri == null) {
return null;
}
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(uri, projection, null, null, null);
if (cursor != null) {
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
return uri.getPath();
}
public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
return resizedBitmap;
}
}