mirror of
https://github.com/oxen-io/session-android.git
synced 2024-12-02 14:35:21 +00:00
Konvert AvatarSelection
This commit is contained in:
parent
a337a90de4
commit
2028a8419e
@ -1,116 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.avatar;
|
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.provider.MediaStore;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.annotation.StringRes;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
|
|
||||||
import com.theartofdev.edmodo.cropper.CropImage;
|
|
||||||
import com.theartofdev.edmodo.cropper.CropImageView;
|
|
||||||
|
|
||||||
import org.session.libsignal.utilities.NoExternalStorageException;
|
|
||||||
import org.session.libsignal.utilities.Log;
|
|
||||||
import org.session.libsignal.utilities.ExternalStorageUtil;
|
|
||||||
import org.thoughtcrime.securesms.util.FileProviderUtil;
|
|
||||||
import org.thoughtcrime.securesms.util.IntentUtils;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import network.loki.messenger.R;
|
|
||||||
|
|
||||||
import static android.provider.MediaStore.EXTRA_OUTPUT;
|
|
||||||
|
|
||||||
public final class AvatarSelection {
|
|
||||||
|
|
||||||
private static final String TAG = AvatarSelection.class.getSimpleName();
|
|
||||||
|
|
||||||
public static final int REQUEST_CODE_CROP_IMAGE = CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE;
|
|
||||||
public static final int REQUEST_CODE_AVATAR = REQUEST_CODE_CROP_IMAGE + 1;
|
|
||||||
|
|
||||||
private AvatarSelection() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns result on {@link #REQUEST_CODE_CROP_IMAGE}
|
|
||||||
*/
|
|
||||||
public static void circularCropImage(Activity activity, Uri inputFile, Uri outputFile, @StringRes int title) {
|
|
||||||
CropImage.activity(inputFile)
|
|
||||||
.setGuidelines(CropImageView.Guidelines.ON)
|
|
||||||
.setAspectRatio(1, 1)
|
|
||||||
.setCropShape(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P ? CropImageView.CropShape.RECTANGLE : CropImageView.CropShape.OVAL)
|
|
||||||
.setOutputUri(outputFile)
|
|
||||||
.setAllowRotation(true)
|
|
||||||
.setAllowFlipping(true)
|
|
||||||
.setBackgroundColor(ContextCompat.getColor(activity, R.color.avatar_background))
|
|
||||||
.setActivityTitle(activity.getString(title))
|
|
||||||
.start(activity);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Uri getResultUri(Intent data) {
|
|
||||||
return CropImage.getActivityResult(data).getUri();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns result on {@link #REQUEST_CODE_AVATAR}
|
|
||||||
*
|
|
||||||
* @return Temporary capture file if created.
|
|
||||||
*/
|
|
||||||
public static File startAvatarSelection(Activity activity, boolean includeClear, boolean attemptToIncludeCamera) {
|
|
||||||
File captureFile = null;
|
|
||||||
boolean hasCameraPermission = ContextCompat
|
|
||||||
.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
|
|
||||||
if (attemptToIncludeCamera && hasCameraPermission) {
|
|
||||||
try {
|
|
||||||
captureFile = File.createTempFile("avatar-capture", ".jpg", ExternalStorageUtil.getImageDir(activity));
|
|
||||||
} catch (IOException | NoExternalStorageException e) {
|
|
||||||
Log.e("Cannot reserve a temporary avatar capture file.", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Intent chooserIntent = createAvatarSelectionIntent(activity, captureFile, includeClear);
|
|
||||||
activity.startActivityForResult(chooserIntent, REQUEST_CODE_AVATAR);
|
|
||||||
return captureFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Intent createAvatarSelectionIntent(Context context, @Nullable File tempCaptureFile, boolean includeClear) {
|
|
||||||
List<Intent> extraIntents = new LinkedList<>();
|
|
||||||
Intent galleryIntent = new Intent(Intent.ACTION_PICK);
|
|
||||||
galleryIntent.setDataAndType(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
|
|
||||||
|
|
||||||
if (!IntentUtils.isResolvable(context, galleryIntent)) {
|
|
||||||
galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
|
||||||
galleryIntent.setType("image/*");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tempCaptureFile != null) {
|
|
||||||
Uri uri = FileProviderUtil.getUriFor(context, tempCaptureFile);
|
|
||||||
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
|
||||||
cameraIntent.putExtra(EXTRA_OUTPUT, uri);
|
|
||||||
cameraIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
||||||
extraIntents.add(cameraIntent);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (includeClear) {
|
|
||||||
extraIntents.add(new Intent("network.loki.securesms.action.CLEAR_PROFILE_PHOTO"));
|
|
||||||
}
|
|
||||||
|
|
||||||
Intent chooserIntent = Intent.createChooser(galleryIntent, context.getString(R.string.CreateProfileActivity_profile_photo));
|
|
||||||
|
|
||||||
if (!extraIntents.isEmpty()) {
|
|
||||||
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Intent[0]));
|
|
||||||
}
|
|
||||||
|
|
||||||
return chooserIntent;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,127 @@
|
|||||||
|
package org.thoughtcrime.securesms.avatar
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
|
import android.provider.MediaStore
|
||||||
|
import androidx.annotation.StringRes
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import com.theartofdev.edmodo.cropper.CropImage
|
||||||
|
import com.theartofdev.edmodo.cropper.CropImageView
|
||||||
|
import network.loki.messenger.R
|
||||||
|
import org.session.libsignal.utilities.ExternalStorageUtil.getImageDir
|
||||||
|
import org.session.libsignal.utilities.Log
|
||||||
|
import org.session.libsignal.utilities.NoExternalStorageException
|
||||||
|
import org.thoughtcrime.securesms.util.FileProviderUtil
|
||||||
|
import org.thoughtcrime.securesms.util.IntentUtils
|
||||||
|
import java.io.File
|
||||||
|
import java.io.IOException
|
||||||
|
import java.util.LinkedList
|
||||||
|
|
||||||
|
object AvatarSelection {
|
||||||
|
private val TAG: String = AvatarSelection::class.java.simpleName
|
||||||
|
|
||||||
|
const val REQUEST_CODE_CROP_IMAGE: Int = CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE
|
||||||
|
const val REQUEST_CODE_AVATAR: Int = REQUEST_CODE_CROP_IMAGE + 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns result on [.REQUEST_CODE_CROP_IMAGE]
|
||||||
|
*/
|
||||||
|
fun circularCropImage(
|
||||||
|
activity: Activity,
|
||||||
|
inputFile: Uri?,
|
||||||
|
outputFile: Uri?,
|
||||||
|
@StringRes title: Int
|
||||||
|
) {
|
||||||
|
CropImage.activity(inputFile)
|
||||||
|
.setGuidelines(CropImageView.Guidelines.ON)
|
||||||
|
.setAspectRatio(1, 1)
|
||||||
|
.setCropShape(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) CropImageView.CropShape.RECTANGLE else CropImageView.CropShape.OVAL)
|
||||||
|
.setOutputUri(outputFile)
|
||||||
|
.setAllowRotation(true)
|
||||||
|
.setAllowFlipping(true)
|
||||||
|
.setBackgroundColor(ContextCompat.getColor(activity, R.color.avatar_background))
|
||||||
|
.setActivityTitle(activity.getString(title))
|
||||||
|
.start(activity)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getResultUri(data: Intent?): Uri {
|
||||||
|
return CropImage.getActivityResult(data).uri
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns result on [.REQUEST_CODE_AVATAR]
|
||||||
|
*
|
||||||
|
* @return Temporary capture file if created.
|
||||||
|
*/
|
||||||
|
fun startAvatarSelection(
|
||||||
|
activity: Activity,
|
||||||
|
includeClear: Boolean,
|
||||||
|
attemptToIncludeCamera: Boolean
|
||||||
|
): File? {
|
||||||
|
var captureFile: File? = null
|
||||||
|
val hasCameraPermission = ContextCompat
|
||||||
|
.checkSelfPermission(
|
||||||
|
activity,
|
||||||
|
Manifest.permission.CAMERA
|
||||||
|
) == PackageManager.PERMISSION_GRANTED
|
||||||
|
if (attemptToIncludeCamera && hasCameraPermission) {
|
||||||
|
try {
|
||||||
|
captureFile = File.createTempFile("avatar-capture", ".jpg", getImageDir(activity))
|
||||||
|
} catch (e: IOException) {
|
||||||
|
Log.e("Cannot reserve a temporary avatar capture file.", e)
|
||||||
|
} catch (e: NoExternalStorageException) {
|
||||||
|
Log.e("Cannot reserve a temporary avatar capture file.", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val chooserIntent = createAvatarSelectionIntent(activity, captureFile, includeClear)
|
||||||
|
activity.startActivityForResult(chooserIntent, REQUEST_CODE_AVATAR)
|
||||||
|
return captureFile
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createAvatarSelectionIntent(
|
||||||
|
context: Context,
|
||||||
|
tempCaptureFile: File?,
|
||||||
|
includeClear: Boolean
|
||||||
|
): Intent {
|
||||||
|
val extraIntents: MutableList<Intent> = LinkedList()
|
||||||
|
var galleryIntent = Intent(Intent.ACTION_PICK)
|
||||||
|
galleryIntent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*")
|
||||||
|
|
||||||
|
if (!IntentUtils.isResolvable(context, galleryIntent)) {
|
||||||
|
galleryIntent = Intent(Intent.ACTION_GET_CONTENT)
|
||||||
|
galleryIntent.setType("image/*")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tempCaptureFile != null) {
|
||||||
|
val uri = FileProviderUtil.getUriFor(context, tempCaptureFile)
|
||||||
|
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
|
||||||
|
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
|
||||||
|
cameraIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
|
||||||
|
extraIntents.add(cameraIntent)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (includeClear) {
|
||||||
|
extraIntents.add(Intent("network.loki.securesms.action.CLEAR_PROFILE_PHOTO"))
|
||||||
|
}
|
||||||
|
|
||||||
|
val chooserIntent = Intent.createChooser(
|
||||||
|
galleryIntent,
|
||||||
|
context.getString(R.string.CreateProfileActivity_profile_photo)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!extraIntents.isEmpty()) {
|
||||||
|
chooserIntent.putExtra(
|
||||||
|
Intent.EXTRA_INITIAL_INTENTS,
|
||||||
|
extraIntents.toTypedArray<Intent>()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return chooserIntent
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user