2014-02-11 15:32:09 +01:00
|
|
|
/*
|
|
|
|
* This is the source code of Telegram for Android v. 1.3.x.
|
|
|
|
* It is licensed under GNU GPL v. 2 or later.
|
|
|
|
* You should have received a copy of the license in this archive (see LICENSE).
|
|
|
|
*
|
2019-01-23 18:03:33 +01:00
|
|
|
* Copyright Nikolai Kudashov, 2013-2018.
|
2014-02-11 15:32:09 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
package org.telegram.ui;
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.graphics.Bitmap;
|
|
|
|
import android.graphics.Canvas;
|
|
|
|
import android.graphics.Paint;
|
|
|
|
import android.graphics.drawable.BitmapDrawable;
|
2014-03-04 20:29:32 +01:00
|
|
|
import android.net.Uri;
|
2014-02-11 15:32:09 +01:00
|
|
|
import android.os.Bundle;
|
|
|
|
import android.view.MotionEvent;
|
|
|
|
import android.view.View;
|
|
|
|
import android.widget.FrameLayout;
|
|
|
|
|
2015-09-24 22:52:02 +02:00
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
2015-10-29 18:10:07 +01:00
|
|
|
import org.telegram.messenger.Bitmaps;
|
2015-09-24 22:52:02 +02:00
|
|
|
import org.telegram.messenger.ImageLoader;
|
2014-02-11 15:32:09 +01:00
|
|
|
import org.telegram.messenger.FileLog;
|
2015-09-24 22:52:02 +02:00
|
|
|
import org.telegram.messenger.LocaleController;
|
2014-02-11 15:32:09 +01:00
|
|
|
import org.telegram.messenger.R;
|
2014-11-13 21:10:14 +01:00
|
|
|
import org.telegram.ui.ActionBar.ActionBar;
|
|
|
|
import org.telegram.ui.ActionBar.ActionBarMenu;
|
|
|
|
import org.telegram.ui.ActionBar.BaseFragment;
|
2016-04-22 15:49:00 +02:00
|
|
|
import org.telegram.ui.ActionBar.Theme;
|
2015-05-03 13:48:36 +02:00
|
|
|
import org.telegram.ui.Components.LayoutHelper;
|
2014-02-11 15:32:09 +01:00
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
|
|
|
|
public class PhotoCropActivity extends BaseFragment {
|
|
|
|
|
2015-02-01 19:51:02 +01:00
|
|
|
public interface PhotoEditActivityDelegate {
|
2015-10-29 18:10:07 +01:00
|
|
|
void didFinishEdit(Bitmap bitmap);
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private class PhotoCropView extends FrameLayout {
|
|
|
|
|
|
|
|
Paint rectPaint = null;
|
|
|
|
Paint circlePaint = null;
|
|
|
|
Paint halfPaint = null;
|
2015-02-01 19:51:02 +01:00
|
|
|
float rectSizeX = 600;
|
|
|
|
float rectSizeY = 600;
|
2014-02-11 15:32:09 +01:00
|
|
|
float rectX = -1, rectY = -1;
|
|
|
|
int draggingState = 0;
|
|
|
|
float oldX = 0, oldY = 0;
|
|
|
|
int bitmapWidth, bitmapHeight, bitmapX, bitmapY;
|
|
|
|
int viewWidth, viewHeight;
|
2015-02-01 19:51:02 +01:00
|
|
|
boolean freeform;
|
2014-02-11 15:32:09 +01:00
|
|
|
|
|
|
|
public PhotoCropView(Context context) {
|
|
|
|
super(context);
|
|
|
|
init();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void init() {
|
|
|
|
rectPaint = new Paint();
|
2015-02-01 19:51:02 +01:00
|
|
|
rectPaint.setColor(0x3ffafafa);
|
2014-07-03 00:39:05 +02:00
|
|
|
rectPaint.setStrokeWidth(AndroidUtilities.dp(2));
|
2014-02-11 15:32:09 +01:00
|
|
|
rectPaint.setStyle(Paint.Style.STROKE);
|
|
|
|
circlePaint = new Paint();
|
2015-02-01 19:51:02 +01:00
|
|
|
circlePaint.setColor(0xffffffff);
|
2014-02-11 15:32:09 +01:00
|
|
|
halfPaint = new Paint();
|
2015-02-01 19:51:02 +01:00
|
|
|
halfPaint.setColor(0xc8000000);
|
|
|
|
setBackgroundColor(0xff333333);
|
2014-02-11 15:32:09 +01:00
|
|
|
|
2021-09-20 07:54:41 +02:00
|
|
|
setOnTouchListener((view, motionEvent) -> {
|
|
|
|
float x = motionEvent.getX();
|
|
|
|
float y = motionEvent.getY();
|
|
|
|
int cornerSide = AndroidUtilities.dp(14);
|
|
|
|
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
|
|
|
|
if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide < y && rectY + cornerSide > y) {
|
|
|
|
draggingState = 1;
|
|
|
|
} else if (rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x && rectY - cornerSide < y && rectY + cornerSide > y) {
|
|
|
|
draggingState = 2;
|
|
|
|
} else if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) {
|
|
|
|
draggingState = 3;
|
|
|
|
} else if (rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) {
|
|
|
|
draggingState = 4;
|
|
|
|
} else if (rectX < x && rectX + rectSizeX > x && rectY < y && rectY + rectSizeY > y) {
|
|
|
|
draggingState = 5;
|
|
|
|
} else {
|
2014-02-11 15:32:09 +01:00
|
|
|
draggingState = 0;
|
2021-09-20 07:54:41 +02:00
|
|
|
}
|
|
|
|
if (draggingState != 0) {
|
|
|
|
PhotoCropView.this.requestDisallowInterceptTouchEvent(true);
|
|
|
|
}
|
|
|
|
oldX = x;
|
|
|
|
oldY = y;
|
|
|
|
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
|
|
|
|
draggingState = 0;
|
|
|
|
} else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE && draggingState != 0) {
|
|
|
|
float diffX = x - oldX;
|
|
|
|
float diffY = y - oldY;
|
|
|
|
if (draggingState == 5) {
|
|
|
|
rectX += diffX;
|
|
|
|
rectY += diffY;
|
2014-02-11 15:32:09 +01:00
|
|
|
|
2021-09-20 07:54:41 +02:00
|
|
|
if (rectX < bitmapX) {
|
|
|
|
rectX = bitmapX;
|
|
|
|
} else if (rectX + rectSizeX > bitmapX + bitmapWidth) {
|
|
|
|
rectX = bitmapX + bitmapWidth - rectSizeX;
|
|
|
|
}
|
|
|
|
if (rectY < bitmapY) {
|
|
|
|
rectY = bitmapY;
|
|
|
|
} else if (rectY + rectSizeY > bitmapY + bitmapHeight) {
|
|
|
|
rectY = bitmapY + bitmapHeight - rectSizeY;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (draggingState == 1) {
|
|
|
|
if (rectSizeX - diffX < 160) {
|
|
|
|
diffX = rectSizeX - 160;
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
if (rectX + diffX < bitmapX) {
|
|
|
|
diffX = bitmapX - rectX;
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
if (!freeform) {
|
|
|
|
if (rectY + diffX < bitmapY) {
|
|
|
|
diffX = bitmapY - rectY;
|
2015-02-01 19:51:02 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
rectX += diffX;
|
|
|
|
rectY += diffX;
|
|
|
|
rectSizeX -= diffX;
|
|
|
|
rectSizeY -= diffX;
|
|
|
|
} else {
|
|
|
|
if (rectSizeY - diffY < 160) {
|
|
|
|
diffY = rectSizeY - 160;
|
2015-02-01 19:51:02 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
if (rectY + diffY < bitmapY) {
|
|
|
|
diffY = bitmapY - rectY;
|
2015-02-01 19:51:02 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
rectX += diffX;
|
|
|
|
rectY += diffY;
|
|
|
|
rectSizeX -= diffX;
|
|
|
|
rectSizeY -= diffY;
|
|
|
|
}
|
|
|
|
} else if (draggingState == 2) {
|
|
|
|
if (rectSizeX + diffX < 160) {
|
|
|
|
diffX = -(rectSizeX - 160);
|
|
|
|
}
|
|
|
|
if (rectX + rectSizeX + diffX > bitmapX + bitmapWidth) {
|
|
|
|
diffX = bitmapX + bitmapWidth - rectX - rectSizeX;
|
|
|
|
}
|
|
|
|
if (!freeform) {
|
|
|
|
if (rectY - diffX < bitmapY) {
|
|
|
|
diffX = rectY - bitmapY;
|
2015-02-01 19:51:02 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
rectY -= diffX;
|
|
|
|
rectSizeX += diffX;
|
|
|
|
rectSizeY += diffX;
|
|
|
|
} else {
|
|
|
|
if (rectSizeY - diffY < 160) {
|
|
|
|
diffY = rectSizeY - 160;
|
2015-02-01 19:51:02 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
if (rectY + diffY < bitmapY) {
|
|
|
|
diffY = bitmapY - rectY;
|
2015-02-01 19:51:02 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
rectY += diffY;
|
|
|
|
rectSizeX += diffX;
|
|
|
|
rectSizeY -= diffY;
|
|
|
|
}
|
|
|
|
} else if (draggingState == 3) {
|
|
|
|
if (rectSizeX - diffX < 160) {
|
|
|
|
diffX = rectSizeX - 160;
|
|
|
|
}
|
|
|
|
if (rectX + diffX < bitmapX) {
|
|
|
|
diffX = bitmapX - rectX;
|
|
|
|
}
|
|
|
|
if (!freeform) {
|
|
|
|
if (rectY + rectSizeX - diffX > bitmapY + bitmapHeight) {
|
|
|
|
diffX = rectY + rectSizeX - bitmapY - bitmapHeight;
|
2015-02-01 19:51:02 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
rectX += diffX;
|
|
|
|
rectSizeX -= diffX;
|
|
|
|
rectSizeY -= diffX;
|
|
|
|
} else {
|
|
|
|
if (rectY + rectSizeY + diffY > bitmapY + bitmapHeight) {
|
|
|
|
diffY = bitmapY + bitmapHeight - rectY - rectSizeY;
|
2015-02-01 19:51:02 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
rectX += diffX;
|
|
|
|
rectSizeX -= diffX;
|
|
|
|
rectSizeY += diffY;
|
2015-02-01 19:51:02 +01:00
|
|
|
if (rectSizeY < 160) {
|
|
|
|
rectSizeY = 160;
|
|
|
|
}
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
} else if (draggingState == 4) {
|
|
|
|
if (rectX + rectSizeX + diffX > bitmapX + bitmapWidth) {
|
|
|
|
diffX = bitmapX + bitmapWidth - rectX - rectSizeX;
|
|
|
|
}
|
|
|
|
if (!freeform) {
|
|
|
|
if (rectY + rectSizeX + diffX > bitmapY + bitmapHeight) {
|
|
|
|
diffX = bitmapY + bitmapHeight - rectY - rectSizeX;
|
|
|
|
}
|
|
|
|
rectSizeX += diffX;
|
|
|
|
rectSizeY += diffX;
|
|
|
|
} else {
|
|
|
|
if (rectY + rectSizeY + diffY > bitmapY + bitmapHeight) {
|
|
|
|
diffY = bitmapY + bitmapHeight - rectY - rectSizeY;
|
|
|
|
}
|
|
|
|
rectSizeX += diffX;
|
|
|
|
rectSizeY += diffY;
|
|
|
|
}
|
|
|
|
if (rectSizeX < 160) {
|
|
|
|
rectSizeX = 160;
|
|
|
|
}
|
|
|
|
if (rectSizeY < 160) {
|
|
|
|
rectSizeY = 160;
|
|
|
|
}
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
|
|
|
|
oldX = x;
|
|
|
|
oldY = y;
|
|
|
|
invalidate();
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
return true;
|
2014-02-11 15:32:09 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
private void updateBitmapSize() {
|
2014-04-03 23:18:54 +02:00
|
|
|
if (viewWidth == 0 || viewHeight == 0 || imageToCrop == null) {
|
2014-02-11 15:32:09 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
float percX = (rectX - bitmapX) / bitmapWidth;
|
|
|
|
float percY = (rectY - bitmapY) / bitmapHeight;
|
2015-02-01 19:51:02 +01:00
|
|
|
float percSizeX = rectSizeX / bitmapWidth;
|
|
|
|
float percSizeY = rectSizeY / bitmapHeight;
|
2014-02-11 15:32:09 +01:00
|
|
|
float w = imageToCrop.getWidth();
|
|
|
|
float h = imageToCrop.getHeight();
|
|
|
|
float scaleX = viewWidth / w;
|
|
|
|
float scaleY = viewHeight / h;
|
|
|
|
if (scaleX > scaleY) {
|
|
|
|
bitmapHeight = viewHeight;
|
2021-09-20 07:54:41 +02:00
|
|
|
bitmapWidth = (int) Math.ceil(w * scaleY);
|
2014-02-11 15:32:09 +01:00
|
|
|
} else {
|
|
|
|
bitmapWidth = viewWidth;
|
2021-09-20 07:54:41 +02:00
|
|
|
bitmapHeight = (int) Math.ceil(h * scaleX);
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
2015-02-01 19:51:02 +01:00
|
|
|
bitmapX = (viewWidth - bitmapWidth) / 2 + AndroidUtilities.dp(14);
|
|
|
|
bitmapY = (viewHeight - bitmapHeight) / 2 + AndroidUtilities.dp(14);
|
2014-02-11 15:32:09 +01:00
|
|
|
|
|
|
|
if (rectX == -1 && rectY == -1) {
|
2015-02-01 19:51:02 +01:00
|
|
|
if (freeform) {
|
2014-02-11 15:32:09 +01:00
|
|
|
rectY = bitmapY;
|
|
|
|
rectX = bitmapX;
|
2015-02-01 19:51:02 +01:00
|
|
|
rectSizeX = bitmapWidth;
|
|
|
|
rectSizeY = bitmapHeight;
|
|
|
|
} else {
|
|
|
|
if (bitmapWidth > bitmapHeight) {
|
|
|
|
rectY = bitmapY;
|
|
|
|
rectX = (viewWidth - bitmapHeight) / 2 + AndroidUtilities.dp(14);
|
|
|
|
rectSizeX = bitmapHeight;
|
|
|
|
rectSizeY = bitmapHeight;
|
|
|
|
} else {
|
|
|
|
rectX = bitmapX;
|
|
|
|
rectY = (viewHeight - bitmapWidth) / 2 + AndroidUtilities.dp(14);
|
|
|
|
rectSizeX = bitmapWidth;
|
|
|
|
rectSizeY = bitmapWidth;
|
|
|
|
}
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
rectX = percX * bitmapWidth + bitmapX;
|
|
|
|
rectY = percY * bitmapHeight + bitmapY;
|
2015-02-01 19:51:02 +01:00
|
|
|
rectSizeX = percSizeX * bitmapWidth;
|
|
|
|
rectSizeY = percSizeY * bitmapHeight;
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
|
|
|
super.onLayout(changed, left, top, right, bottom);
|
2015-02-01 19:51:02 +01:00
|
|
|
viewWidth = right - left - AndroidUtilities.dp(28);
|
|
|
|
viewHeight = bottom - top - AndroidUtilities.dp(28);
|
2014-02-11 15:32:09 +01:00
|
|
|
updateBitmapSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Bitmap getBitmap() {
|
|
|
|
float percX = (rectX - bitmapX) / bitmapWidth;
|
|
|
|
float percY = (rectY - bitmapY) / bitmapHeight;
|
2015-02-01 19:51:02 +01:00
|
|
|
float percSizeX = rectSizeX / bitmapWidth;
|
|
|
|
float percSizeY = rectSizeY / bitmapWidth;
|
2021-09-20 07:54:41 +02:00
|
|
|
int x = (int) (percX * imageToCrop.getWidth());
|
|
|
|
int y = (int) (percY * imageToCrop.getHeight());
|
|
|
|
int sizeX = (int) (percSizeX * imageToCrop.getWidth());
|
|
|
|
int sizeY = (int) (percSizeY * imageToCrop.getWidth());
|
2015-02-26 02:32:51 +01:00
|
|
|
if (x < 0) {
|
|
|
|
x = 0;
|
|
|
|
}
|
|
|
|
if (y < 0) {
|
|
|
|
y = 0;
|
|
|
|
}
|
2015-02-01 19:51:02 +01:00
|
|
|
if (x + sizeX > imageToCrop.getWidth()) {
|
|
|
|
sizeX = imageToCrop.getWidth() - x;
|
2014-03-05 17:42:10 +01:00
|
|
|
}
|
2015-02-01 19:51:02 +01:00
|
|
|
if (y + sizeY > imageToCrop.getHeight()) {
|
|
|
|
sizeY = imageToCrop.getHeight() - y;
|
2014-03-05 17:42:10 +01:00
|
|
|
}
|
2014-02-11 15:32:09 +01:00
|
|
|
try {
|
2015-10-29 18:10:07 +01:00
|
|
|
return Bitmaps.createBitmap(imageToCrop, x, y, sizeX, sizeY);
|
2014-11-21 11:59:05 +01:00
|
|
|
} catch (Throwable e) {
|
2018-07-30 04:07:02 +02:00
|
|
|
FileLog.e(e);
|
2014-02-11 15:32:09 +01:00
|
|
|
System.gc();
|
|
|
|
try {
|
2015-10-29 18:10:07 +01:00
|
|
|
return Bitmaps.createBitmap(imageToCrop, x, y, sizeX, sizeY);
|
2014-11-21 11:59:05 +01:00
|
|
|
} catch (Throwable e2) {
|
2017-03-31 01:58:05 +02:00
|
|
|
FileLog.e(e2);
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onDraw(Canvas canvas) {
|
|
|
|
if (drawable != null) {
|
2015-10-29 18:10:07 +01:00
|
|
|
try {
|
|
|
|
drawable.setBounds(bitmapX, bitmapY, bitmapX + bitmapWidth, bitmapY + bitmapHeight);
|
|
|
|
drawable.draw(canvas);
|
|
|
|
} catch (Throwable e) {
|
2017-03-31 01:58:05 +02:00
|
|
|
FileLog.e(e);
|
2015-10-29 18:10:07 +01:00
|
|
|
}
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
canvas.drawRect(bitmapX, bitmapY, bitmapX + bitmapWidth, rectY, halfPaint);
|
2015-02-01 19:51:02 +01:00
|
|
|
canvas.drawRect(bitmapX, rectY, rectX, rectY + rectSizeY, halfPaint);
|
|
|
|
canvas.drawRect(rectX + rectSizeX, rectY, bitmapX + bitmapWidth, rectY + rectSizeY, halfPaint);
|
|
|
|
canvas.drawRect(bitmapX, rectY + rectSizeY, bitmapX + bitmapWidth, bitmapY + bitmapHeight, halfPaint);
|
|
|
|
|
|
|
|
canvas.drawRect(rectX, rectY, rectX + rectSizeX, rectY + rectSizeY, rectPaint);
|
|
|
|
|
|
|
|
int side = AndroidUtilities.dp(1);
|
|
|
|
canvas.drawRect(rectX + side, rectY + side, rectX + side + AndroidUtilities.dp(20), rectY + side * 3, circlePaint);
|
|
|
|
canvas.drawRect(rectX + side, rectY + side, rectX + side * 3, rectY + side + AndroidUtilities.dp(20), circlePaint);
|
|
|
|
|
|
|
|
canvas.drawRect(rectX + rectSizeX - side - AndroidUtilities.dp(20), rectY + side, rectX + rectSizeX - side, rectY + side * 3, circlePaint);
|
|
|
|
canvas.drawRect(rectX + rectSizeX - side * 3, rectY + side, rectX + rectSizeX - side, rectY + side + AndroidUtilities.dp(20), circlePaint);
|
2014-02-11 15:32:09 +01:00
|
|
|
|
2015-02-01 19:51:02 +01:00
|
|
|
canvas.drawRect(rectX + side, rectY + rectSizeY - side - AndroidUtilities.dp(20), rectX + side * 3, rectY + rectSizeY - side, circlePaint);
|
|
|
|
canvas.drawRect(rectX + side, rectY + rectSizeY - side * 3, rectX + side + AndroidUtilities.dp(20), rectY + rectSizeY - side, circlePaint);
|
2014-02-11 15:32:09 +01:00
|
|
|
|
2015-02-01 19:51:02 +01:00
|
|
|
canvas.drawRect(rectX + rectSizeX - side - AndroidUtilities.dp(20), rectY + rectSizeY - side * 3, rectX + rectSizeX - side, rectY + rectSizeY - side, circlePaint);
|
|
|
|
canvas.drawRect(rectX + rectSizeX - side * 3, rectY + rectSizeY - side - AndroidUtilities.dp(20), rectX + rectSizeX - side, rectY + rectSizeY - side, circlePaint);
|
|
|
|
|
|
|
|
for (int a = 1; a < 3; a++) {
|
|
|
|
canvas.drawRect(rectX + rectSizeX / 3 * a, rectY + side, rectX + side + rectSizeX / 3 * a, rectY + rectSizeY - side, circlePaint);
|
|
|
|
canvas.drawRect(rectX + side, rectY + rectSizeY / 3 * a, rectX - side + rectSizeX, rectY + rectSizeY / 3 * a + side, circlePaint);
|
|
|
|
}
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private Bitmap imageToCrop;
|
|
|
|
private BitmapDrawable drawable;
|
2015-02-01 19:51:02 +01:00
|
|
|
private PhotoEditActivityDelegate delegate = null;
|
2014-02-11 15:32:09 +01:00
|
|
|
private PhotoCropView view;
|
|
|
|
private boolean sameBitmap = false;
|
|
|
|
private boolean doneButtonPressed = false;
|
2015-02-01 19:51:02 +01:00
|
|
|
private String bitmapKey;
|
2014-02-11 15:32:09 +01:00
|
|
|
|
2014-11-13 21:10:14 +01:00
|
|
|
private final static int done_button = 1;
|
|
|
|
|
2014-06-04 01:31:48 +02:00
|
|
|
public PhotoCropActivity(Bundle args) {
|
|
|
|
super(args);
|
|
|
|
}
|
|
|
|
|
2014-02-11 15:32:09 +01:00
|
|
|
@Override
|
|
|
|
public boolean onFragmentCreate() {
|
2015-02-01 19:51:02 +01:00
|
|
|
if (imageToCrop == null) {
|
|
|
|
String photoPath = getArguments().getString("photoPath");
|
|
|
|
Uri photoUri = getArguments().getParcelable("photoUri");
|
|
|
|
if (photoPath == null && photoUri == null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (photoPath != null) {
|
|
|
|
File f = new File(photoPath);
|
|
|
|
if (!f.exists()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2015-07-22 20:56:37 +02:00
|
|
|
int size;
|
2015-02-01 19:51:02 +01:00
|
|
|
if (AndroidUtilities.isTablet()) {
|
|
|
|
size = AndroidUtilities.dp(520);
|
|
|
|
} else {
|
|
|
|
size = Math.max(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y);
|
|
|
|
}
|
|
|
|
imageToCrop = ImageLoader.loadBitmap(photoPath, photoUri, size, size, true);
|
|
|
|
if (imageToCrop == null) {
|
2014-03-04 20:29:32 +01:00
|
|
|
return false;
|
|
|
|
}
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
drawable = new BitmapDrawable(imageToCrop);
|
2014-06-04 01:31:48 +02:00
|
|
|
super.onFragmentCreate();
|
2014-02-11 15:32:09 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onFragmentDestroy() {
|
|
|
|
super.onFragmentDestroy();
|
2015-02-01 19:51:02 +01:00
|
|
|
if (bitmapKey != null) {
|
2019-07-18 15:01:39 +02:00
|
|
|
if (ImageLoader.getInstance().decrementUseCount(bitmapKey) && !ImageLoader.getInstance().isInMemCache(bitmapKey, false)) {
|
2015-02-01 19:51:02 +01:00
|
|
|
bitmapKey = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (bitmapKey == null && imageToCrop != null && !sameBitmap) {
|
2014-02-11 15:32:09 +01:00
|
|
|
imageToCrop.recycle();
|
|
|
|
imageToCrop = null;
|
|
|
|
}
|
2015-10-29 18:10:07 +01:00
|
|
|
drawable = null;
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2015-07-22 20:56:37 +02:00
|
|
|
public View createView(Context context) {
|
2016-04-22 15:49:00 +02:00
|
|
|
actionBar.setBackgroundColor(Theme.ACTION_BAR_MEDIA_PICKER_COLOR);
|
2017-03-31 01:58:05 +02:00
|
|
|
actionBar.setItemsBackgroundColor(Theme.ACTION_BAR_PICKER_SELECTOR_COLOR, false);
|
|
|
|
actionBar.setTitleColor(0xffffffff);
|
2019-06-04 12:14:50 +02:00
|
|
|
actionBar.setItemsColor(0xffffffff, false);
|
2015-04-09 20:00:14 +02:00
|
|
|
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
|
|
|
|
actionBar.setAllowOverlayTitle(true);
|
|
|
|
actionBar.setTitle(LocaleController.getString("CropImage", R.string.CropImage));
|
|
|
|
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
|
|
|
|
@Override
|
|
|
|
public void onItemClick(int id) {
|
|
|
|
if (id == -1) {
|
|
|
|
finishFragment();
|
|
|
|
} else if (id == done_button) {
|
|
|
|
if (delegate != null && !doneButtonPressed) {
|
|
|
|
Bitmap bitmap = view.getBitmap();
|
|
|
|
if (bitmap == imageToCrop) {
|
|
|
|
sameBitmap = true;
|
2014-06-04 01:31:48 +02:00
|
|
|
}
|
2015-10-29 18:10:07 +01:00
|
|
|
delegate.didFinishEdit(bitmap);
|
2015-04-09 20:00:14 +02:00
|
|
|
doneButtonPressed = true;
|
2014-06-04 01:31:48 +02:00
|
|
|
}
|
2015-04-09 20:00:14 +02:00
|
|
|
finishFragment();
|
2014-06-04 01:31:48 +02:00
|
|
|
}
|
2015-04-09 20:00:14 +02:00
|
|
|
}
|
|
|
|
});
|
2014-06-04 01:31:48 +02:00
|
|
|
|
2015-04-09 20:00:14 +02:00
|
|
|
ActionBarMenu menu = actionBar.createMenu();
|
2020-12-24 06:36:01 +01:00
|
|
|
menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56), LocaleController.getString("Done", R.string.Done));
|
2015-04-09 20:00:14 +02:00
|
|
|
|
|
|
|
fragmentView = view = new PhotoCropView(context);
|
|
|
|
((PhotoCropView) fragmentView).freeform = getArguments().getBoolean("freeform", false);
|
2015-05-03 13:48:36 +02:00
|
|
|
fragmentView.setLayoutParams(new FrameLayout.LayoutParams(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
2014-06-04 01:31:48 +02:00
|
|
|
|
2014-02-11 15:32:09 +01:00
|
|
|
return fragmentView;
|
|
|
|
}
|
|
|
|
|
2020-02-13 19:26:53 +01:00
|
|
|
@Override
|
|
|
|
public boolean isSwipeBackEnabled(MotionEvent event) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-02-01 19:51:02 +01:00
|
|
|
public void setDelegate(PhotoEditActivityDelegate delegate) {
|
2014-06-04 01:31:48 +02:00
|
|
|
this.delegate = delegate;
|
2014-02-11 15:32:09 +01:00
|
|
|
}
|
|
|
|
}
|