don't automatically crop avatar

This commit is contained in:
Daniel Gultsch 2016-03-04 14:32:38 +01:00
parent 89eea3636f
commit aa24a0f779
8 changed files with 49 additions and 22 deletions

View File

@ -7,6 +7,8 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener; import android.view.View.OnLongClickListener;
@ -27,13 +29,12 @@ import eu.siacs.conversations.persistance.FileBackend;
import eu.siacs.conversations.utils.ExifHelper; import eu.siacs.conversations.utils.ExifHelper;
import eu.siacs.conversations.utils.FileUtils; import eu.siacs.conversations.utils.FileUtils;
import eu.siacs.conversations.utils.PhoneHelper; import eu.siacs.conversations.utils.PhoneHelper;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
import eu.siacs.conversations.xmpp.pep.Avatar; import eu.siacs.conversations.xmpp.pep.Avatar;
public class PublishProfilePictureActivity extends XmppActivity { public class PublishProfilePictureActivity extends XmppActivity {
private static final int REQUEST_CHOOSE_FILE = 0xac23; private static final int REQUEST_CHOOSE_FILE_AND_CROP = 0xac23;
private static final int REQUEST_CHOOSE_FILE = 0xac24;
private ImageView avatar; private ImageView avatar;
private TextView accountTextView; private TextView accountTextView;
private TextView hintOrWarning; private TextView hintOrWarning;
@ -138,7 +139,7 @@ public class PublishProfilePictureActivity extends XmppActivity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (hasStoragePermission(REQUEST_CHOOSE_FILE)) { if (hasStoragePermission(REQUEST_CHOOSE_FILE)) {
chooseAvatar(); chooseAvatar(false);
} }
} }
@ -146,32 +147,52 @@ public class PublishProfilePictureActivity extends XmppActivity {
this.defaultUri = PhoneHelper.getSefliUri(getApplicationContext()); this.defaultUri = PhoneHelper.getSefliUri(getApplicationContext());
} }
private void chooseAvatar() { private void chooseAvatar(boolean crop) {
Intent attachFileIntent = new Intent(); Intent attachFileIntent = new Intent();
attachFileIntent.setType("image/*"); attachFileIntent.setType("image/*");
attachFileIntent.setAction(Intent.ACTION_GET_CONTENT); attachFileIntent.setAction(Intent.ACTION_GET_CONTENT);
Intent chooser = Intent.createChooser(attachFileIntent, getString(R.string.attach_file)); Intent chooser = Intent.createChooser(attachFileIntent, getString(R.string.attach_file));
startActivityForResult(chooser, REQUEST_CHOOSE_FILE); startActivityForResult(chooser, crop ? REQUEST_CHOOSE_FILE_AND_CROP : REQUEST_CHOOSE_FILE);
} }
@Override @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if (grantResults.length > 0) if (grantResults.length > 0)
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (requestCode == REQUEST_CHOOSE_FILE) { if (requestCode == REQUEST_CHOOSE_FILE_AND_CROP) {
chooseAvatar(); chooseAvatar(true);
} else if (requestCode == REQUEST_CHOOSE_FILE) {
chooseAvatar(false);
} }
} else { } else {
Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show();
} }
} }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.publish_avatar, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (item.getItemId() == R.id.action_crop_image) {
if (hasStoragePermission(REQUEST_CHOOSE_FILE_AND_CROP)) {
chooseAvatar(true);
}
return true;
} else {
return onOptionsItemSelected(item);
}
}
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) { protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
switch (requestCode) { switch (requestCode) {
case REQUEST_CHOOSE_FILE: case REQUEST_CHOOSE_FILE_AND_CROP:
Uri source = data.getData(); Uri source = data.getData();
String original = FileUtils.getPath(this, source); String original = FileUtils.getPath(this, source);
if (original != null) { if (original != null) {
@ -181,9 +202,17 @@ public class PublishProfilePictureActivity extends XmppActivity {
final int size = getPixel(192); final int size = getPixel(192);
Crop.of(source, destination).asSquare().withMaxSize(size, size).start(this); Crop.of(source, destination).asSquare().withMaxSize(size, size).start(this);
break; break;
case REQUEST_CHOOSE_FILE:
this.avatarUri = data.getData();
if (xmppConnectionServiceBound) {
loadImageIntoPreview(this.avatarUri);
}
break;
case Crop.REQUEST_CROP: case Crop.REQUEST_CROP:
this.avatarUri = Uri.fromFile(new File(getCacheDir(), "croppedAvatar")); this.avatarUri = Uri.fromFile(new File(getCacheDir(), "croppedAvatar"));
if (xmppConnectionServiceBound) {
loadImageIntoPreview(this.avatarUri); loadImageIntoPreview(this.avatarUri);
}
break; break;
} }
} else { } else {
@ -248,21 +277,10 @@ public class PublishProfilePictureActivity extends XmppActivity {
} }
} }
private Bitmap loadScaledBitmap(Uri uri, int reqSize) throws FileNotFoundException {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
int rotation = ExifHelper.getOrientation(getContentResolver().openInputStream(uri));
options.inSampleSize = FileBackend.calcSampleSize(options, reqSize);
options.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
return FileBackend.rotate(bm,rotation);
}
protected void loadImageIntoPreview(Uri uri) { protected void loadImageIntoPreview(Uri uri) {
Bitmap bm = null; Bitmap bm = null;
try { try {
bm = loadScaledBitmap(uri, getPixel(192)); bm = xmppConnectionService.getFileBackend().cropCenterSquare(uri, getPixel(192));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

View File

@ -0,0 +1,8 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_crop_image"
android:showAsAction="always"
android:icon="@drawable/ic_crop_white_24dp"
android:title="@string/select_image_and_crop"/>
</menu>

View File

@ -602,4 +602,5 @@
<string name="correct_message">Correct message</string> <string name="correct_message">Correct message</string>
<string name="send_corrected_message">Send corrected message</string> <string name="send_corrected_message">Send corrected message</string>
<string name="no_keys_just_confirm">You already trust this contact. By selecting \'done\' you are just confirming that %s is part of this conference.</string> <string name="no_keys_just_confirm">You already trust this contact. By selecting \'done\' you are just confirming that %s is part of this conference.</string>
<string name="select_image_and_crop">Select image and crop</string>
</resources> </resources>