private void loadProjectPhoto() { Bitmap bitmap = picassoCache.getPlaceholder(project.getBigPhotoUrl()); boolean bigPhotoMustBeFetched = bitmap == null; if (bigPhotoMustBeFetched) { bitmap = picassoCache.getPlaceholder(project.getPhotoUrl()); boolean placeholderAlreadyFetched = bitmap != null; if (placeholderAlreadyFetched) { binding.projectPhotoIv.setImageBitmap(bitmap); } } // Make sure that transition starts soon even if image is not ready. binding.projectPhotoIv.postDelayed( this::supportStartPostponedEnterTransition, MAX_TRANSITION_DELAY); Picasso.with(this) .load(project.getBigPhotoUrl()) .resize(imageWidth, imageHeight) .onlyScaleDown() .centerCrop() .transform(PaletteAndAplaTransformation.instance()) .into( binding.projectPhotoIv, new Callback() { @Override public void onSuccess() { Bitmap bitmap = ((BitmapDrawable) binding.projectPhotoIv.getDrawable()).getBitmap(); // Ew! Palette palette = PaletteAndAplaTransformation.getPalette(bitmap); binding.detailsContainer.setBackgroundColor( palette.getDarkVibrantColor(Color.BLACK)); supportStartPostponedEnterTransition(); } @Override public void onError() { supportStartPostponedEnterTransition(); } }); }