package im.actor.sdk.controllers.fragment.preview; import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.PersistableBundle; import android.provider.MediaStore; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.soundcloud.android.crop.Crop; import java.io.File; import im.actor.core.entity.Avatar; import im.actor.core.entity.Peer; import im.actor.core.entity.PeerType; import im.actor.core.viewmodel.AvatarUploadState; import im.actor.core.viewmodel.FileVM; import im.actor.core.viewmodel.FileVMCallback; import im.actor.runtime.Log; import im.actor.sdk.ActorSDK; import im.actor.sdk.R; import im.actor.sdk.controllers.Intents; import im.actor.sdk.controllers.activity.BaseActivity; import im.actor.sdk.util.Files; import im.actor.sdk.util.images.common.ImageLoadException; import im.actor.sdk.util.images.ops.ImageLoading; import im.actor.runtime.files.FileSystemReference; import im.actor.runtime.mvvm.ValueChangedListener; import im.actor.runtime.mvvm.ValueDoubleChangedListener; import im.actor.runtime.mvvm.Value; import uk.co.senab.photoview.PhotoView; import static im.actor.sdk.util.ViewUtils.goneView; import static im.actor.sdk.util.ViewUtils.showView; import static im.actor.sdk.util.ActorSDKMessenger.groups; import static im.actor.sdk.util.ActorSDKMessenger.messenger; import static im.actor.sdk.util.ActorSDKMessenger.myUid; import static im.actor.sdk.util.ActorSDKMessenger.users; public class ViewAvatarActivity extends BaseActivity { private static final int REQUEST_GALLERY = 1; private static final int REQUEST_PHOTO = 2; private static final int PERMISSIONS_REQUEST_CAMERA = 3; private String externalFile; private String avatarPath; private Peer peer; private PhotoView photoView; private View progress; private TextView noPhoto; private FileVM bindedDownloadFile; public static Intent viewAvatar(int uid, Context context) { Intent res = new Intent(context, ViewAvatarActivity.class); res.putExtra(Intents.EXTRA_CHAT_PEER, Peer.user(uid).getUnuqueId()); return res; } public static Intent viewGroupAvatar(int gid, Context context) { Intent res = new Intent(context, ViewAvatarActivity.class); res.putExtra(Intents.EXTRA_CHAT_PEER, Peer.group(gid).getUnuqueId()); return res; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); peer = Peer.fromUniqueId(getIntent().getLongExtra(Intents.EXTRA_CHAT_PEER, 0)); getSupportActionBar().setDisplayShowHomeEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(true); getSupportActionBar().setDisplayShowCustomEnabled(false); if (savedInstanceState != null) { externalFile = savedInstanceState.getString("externalFile", null); avatarPath = savedInstanceState.getString("avatarPath", null); } if (peer.getPeerType() == PeerType.PRIVATE) { if (peer.getPeerId() == myUid()) { getSupportActionBar().setTitle(R.string.avatar_title_your); } else { getSupportActionBar().setTitle(R.string.avatar_title_person); } } else { getSupportActionBar().setTitle(R.string.avatar_title_group); } setContentView(R.layout.activity_avatar); photoView = (PhotoView) findViewById(R.id.avatar); progress = findViewById(R.id.uploadProgress); noPhoto = (TextView) findViewById(R.id.noPhoto); noPhoto.setTextColor(ActorSDK.sharedActor().style.getTextPrimaryInvColor()); } @Override protected void onResume() { super.onResume(); if (peer.getPeerType() == PeerType.PRIVATE && peer.getPeerId() == myUid()) { bind(getAvatar(), messenger().getOwnAvatarVM().getUploadState(), new ValueDoubleChangedListener<Avatar, AvatarUploadState>() { @Override public void onChanged(Avatar val, Value<Avatar> Value, AvatarUploadState val2, Value<AvatarUploadState> Value2) { performBind(val, val2); } }); } else if (peer.getPeerType() == PeerType.GROUP) { bind(getAvatar(), messenger().getGroupAvatarVM(peer.getPeerId()).getUploadState(), new ValueDoubleChangedListener<Avatar, AvatarUploadState>() { @Override public void onChanged(Avatar val, Value<Avatar> Value, AvatarUploadState val2, Value<AvatarUploadState> Value2) { performBind(val, val2); } }); } else if (peer.getPeerType() == PeerType.PRIVATE) { bind(getAvatar(), new ValueChangedListener<Avatar>() { @Override public void onChanged(Avatar val, Value<Avatar> Value) { performBind(val, null); } }); } else { throw new RuntimeException("Unknown peer type:" + peer.getPeerType()); } } private Value<Avatar> getAvatar() { if (peer.getPeerType() == PeerType.GROUP) { return groups().get(peer.getPeerId()).getAvatar(); } else { return users().get(peer.getPeerId()).getAvatar(); } } private void performBind(Avatar avatar, AvatarUploadState uploadState) { unbind(); if (uploadState != null && uploadState.isUploading()) { if (uploadState.getDescriptor() != null) { photoView.setImageURI(Uri.fromFile(new File(uploadState.getDescriptor()))); } else { photoView.setImageURI(null); } showView(progress); goneView(noPhoto); return; } if (avatar == null || avatar.getFullImage() == null) { photoView.setImageBitmap(null); showView(noPhoto); goneView(progress); } else { goneView(noPhoto); // Large image String file = messenger().findDownloadedDescriptor(avatar.getFullImage().getFileReference().getFileId()); if (file != null) { try { Bitmap bitmap = ImageLoading.loadBitmapOptimized(file); photoView.setImageBitmap(bitmap); photoView.setZoomable(true); goneView(progress); return; } catch (ImageLoadException e) { e.printStackTrace(); } } // Full image not available: showing progress showView(progress); // Trying to show preview first boolean isAppliedPreview = false; String largeFile = messenger().findDownloadedDescriptor(avatar.getLargeImage().getFileReference().getFileId()); if (largeFile != null) { try { Bitmap bitmap = ImageLoading.loadBitmapOptimized(largeFile); photoView.setImageBitmap(bitmap); photoView.setZoomable(false); isAppliedPreview = true; } catch (ImageLoadException e) { e.printStackTrace(); } } if (!isAppliedPreview) { String smallFile = messenger().findDownloadedDescriptor(avatar.getSmallImage().getFileReference().getFileId()); if (smallFile != null) { try { Bitmap bitmap = ImageLoading.loadBitmapOptimized(smallFile); photoView.setImageBitmap(bitmap); photoView.setZoomable(false); } catch (ImageLoadException e) { e.printStackTrace(); } } } bindedDownloadFile = messenger().bindFile(avatar.getFullImage().getFileReference(), true, new FileVMCallback() { @Override public void onNotDownloaded() { } @Override public void onDownloading(float progressV) { } @Override public void onDownloaded(FileSystemReference reference) { try { Bitmap bitmap = ImageLoading.loadBitmapOptimized(reference.getDescriptor()); photoView.setImageBitmap(bitmap); photoView.setZoomable(true); showView(photoView); goneView(progress); } catch (ImageLoadException e) { e.printStackTrace(); } } }); // receiver.request(new FullAvatarTask(avatar)); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.avatar, menu); if (peer.getPeerType() == PeerType.PRIVATE && peer.getPeerId() == myUid()) { menu.findItem(R.id.editAvatar).setVisible(true); } else { menu.findItem(R.id.editAvatar).setVisible(false); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.editAvatar) { CharSequence[] args; if (getAvatar().get() != null) { args = new CharSequence[]{getString(R.string.pick_photo_camera), getString(R.string.pick_photo_gallery), getString(R.string.pick_photo_remove)}; } else { args = new CharSequence[]{getString(R.string.pick_photo_camera), getString(R.string.pick_photo_gallery)}; } new AlertDialog.Builder(this) .setItems(args, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface d, int which) { if (which == 0) { externalFile = Files.getExternalTempFile("capture", "jpg"); if (externalFile == null) { Toast.makeText(ViewAvatarActivity.this, R.string.toast_no_sdcard, Toast.LENGTH_LONG).show(); return; } if (ContextCompat.checkSelfPermission(ViewAvatarActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { Log.d("Permissions", "camera - no permission :c"); ActivityCompat.requestPermissions(ViewAvatarActivity.this, new String[]{Manifest.permission.CAMERA}, PERMISSIONS_REQUEST_CAMERA); } else { startCamera(); } } else if (which == 1) { Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); i.setType("image/*"); startActivityForResult(i, REQUEST_GALLERY); } else if (which == 2) { if (peer.getPeerType() == PeerType.PRIVATE) { if (peer.getPeerId() == myUid()) { messenger().removeMyAvatar(); } } else if (peer.getPeerType() == PeerType.GROUP) { messenger().removeGroupAvatar(peer.getPeerId()); } } } }) .show(); return true; } else if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); } private void startCamera() { startActivityForResult( new Intent(MediaStore.ACTION_IMAGE_CAPTURE) .putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(externalFile))), REQUEST_PHOTO); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_GALLERY && resultCode == Activity.RESULT_OK) { avatarPath = Files.getInternalTempFile("avatar", "jpg"); Crop.of(data.getData(), Uri.fromFile(new File(avatarPath))) .asSquare() .start(this); } else if (requestCode == REQUEST_PHOTO && resultCode == Activity.RESULT_OK) { avatarPath = Files.getInternalTempFile("avatar", "jpg"); Crop.of(Uri.fromFile(new File(externalFile)), Uri.fromFile(new File(avatarPath))) .asSquare() .start(this); } else if (requestCode == Crop.REQUEST_CROP && resultCode == Activity.RESULT_OK) { if (avatarPath == null) { return; } if (peer.getPeerType() == PeerType.PRIVATE) { if (peer.getPeerId() == myUid()) { messenger().changeMyAvatar(avatarPath); } } else if (peer.getPeerType() == PeerType.GROUP) { messenger().changeGroupAvatar(peer.getPeerId(), avatarPath); } } } @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); if (avatarPath != null) { outState.putString("avatarPath", avatarPath); } if (externalFile != null) { outState.putString("externalFile", externalFile); } } private void unbind() { if (bindedDownloadFile != null) { bindedDownloadFile.detach(); bindedDownloadFile = null; } } @Override protected void onPause() { super.onPause(); unbind(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_CAMERA) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { startCamera(); } } } }